Commit | Line | Data |
---|---|---|
fdc7d56f | 1 | /* |
e95fc82a KB |
2 | * Copyright (c) 1983 Regents of the University of California. |
3 | * All rights reserved. | |
4 | * | |
a6547b1d | 5 | * %sccs.include.redist.c% |
fdc7d56f EW |
6 | */ |
7 | ||
77eecccb | 8 | #ifndef lint |
afd2fb5d | 9 | static char sccsid[] = "@(#)fly.c 5.8 (Berkeley) %G%"; |
e95fc82a | 10 | #endif /* not lint */ |
77eecccb EW |
11 | |
12 | #include "externs.h" | |
13 | #undef UP | |
14 | #include <curses.h> | |
15 | ||
16 | #define abs(a) ((a) < 0 ? -(a) : (a)) | |
17 | #define MIDR (LINES/2 - 1) | |
18 | #define MIDC (COLS/2 - 1) | |
19 | ||
20 | int row, column; | |
21 | int dr = 0, dc = 0; | |
22 | char destroyed; | |
23 | int clock = 120; /* time for all the flights in the game */ | |
24 | char cross = 0; | |
0deb4896 | 25 | sig_t oldsig; |
77eecccb | 26 | |
40cfa738 | 27 | void |
77eecccb EW |
28 | succumb() |
29 | { | |
d6b20910 | 30 | if (oldsig == SIG_DFL) { |
a7c71d1e EW |
31 | endfly(); |
32 | exit(1); | |
d6b20910 KB |
33 | } |
34 | if (oldsig != SIG_IGN) { | |
a7c71d1e | 35 | endfly(); |
40cfa738 | 36 | (*oldsig)(SIGINT); |
a7c71d1e | 37 | } |
77eecccb EW |
38 | } |
39 | ||
40 | visual() | |
41 | { | |
2cbad4eb | 42 | void moveenemy(); |
77eecccb EW |
43 | |
44 | destroyed = 0; | |
77eecccb EW |
45 | if(initscr() == ERR){ |
46 | puts("Whoops! No more memory..."); | |
47 | return(0); | |
48 | } | |
49 | oldsig = signal(SIGINT, succumb); | |
50 | crmode(); | |
51 | noecho(); | |
52 | screen(); | |
53 | row = rnd(LINES-3) + 1; | |
54 | column = rnd(COLS-2) + 1; | |
55 | moveenemy(); | |
56 | for (;;) { | |
57 | switch(getchar()){ | |
58 | ||
59 | case 'h': | |
60 | case 'r': | |
61 | dc = -1; | |
62 | fuel--; | |
63 | break; | |
64 | ||
65 | case 'H': | |
66 | case 'R': | |
67 | dc = -5; | |
68 | fuel -= 10; | |
69 | break; | |
70 | ||
71 | case 'l': | |
72 | dc = 1; | |
73 | fuel--; | |
74 | break; | |
75 | ||
76 | case 'L': | |
77 | dc = 5; | |
78 | fuel -= 10; | |
79 | break; | |
80 | ||
81 | case 'j': | |
82 | case 'u': | |
83 | dr = 1; | |
84 | fuel--; | |
85 | break; | |
86 | ||
87 | case 'J': | |
88 | case 'U': | |
89 | dr = 5; | |
90 | fuel -= 10; | |
91 | break; | |
92 | ||
93 | case 'k': | |
94 | case 'd': | |
95 | dr = -1; | |
96 | fuel--; | |
97 | break; | |
98 | ||
99 | case 'K': | |
100 | case 'D': | |
101 | dr = -5; | |
102 | fuel -= 10; | |
103 | break; | |
104 | ||
105 | case '+': | |
106 | if (cross){ | |
107 | cross = 0; | |
108 | notarget(); | |
109 | } | |
110 | else | |
111 | cross = 1; | |
112 | break; | |
113 | ||
114 | case ' ': | |
115 | case 'f': | |
116 | if (torps){ | |
117 | torps -= 2; | |
118 | blast(); | |
119 | if (row == MIDR && column - MIDC < 2 && MIDC - column < 2){ | |
120 | destroyed = 1; | |
121 | alarm(0); | |
122 | } | |
123 | } | |
124 | else | |
125 | mvaddstr(0,0,"*** Out of torpedoes. ***"); | |
126 | break; | |
127 | ||
128 | case 'q': | |
129 | endfly(); | |
130 | return(0); | |
131 | ||
132 | default: | |
133 | mvaddstr(0,26,"Commands = r,R,l,L,u,U,d,D,f,+,q"); | |
134 | continue; | |
135 | ||
136 | case EOF: | |
137 | break; | |
138 | } | |
139 | if (destroyed){ | |
140 | endfly(); | |
141 | return(1); | |
142 | } | |
143 | if (clock <= 0){ | |
144 | endfly(); | |
145 | die(); | |
146 | } | |
147 | } | |
148 | } | |
149 | ||
150 | screen() | |
151 | { | |
152 | register int r,c,n; | |
153 | int i; | |
154 | ||
155 | clear(); | |
156 | i = rnd(100); | |
157 | for (n=0; n < i; n++){ | |
158 | r = rnd(LINES-3) + 1; | |
159 | c = rnd(COLS); | |
160 | mvaddch(r, c, '.'); | |
161 | } | |
162 | mvaddstr(LINES-1-1,21,"TORPEDOES FUEL TIME"); | |
163 | refresh(); | |
164 | } | |
165 | ||
166 | target() | |
167 | { | |
168 | register int n; | |
169 | ||
170 | move(MIDR,MIDC-10); | |
171 | addstr("------- + -------"); | |
172 | for (n = MIDR-4; n < MIDR-1; n++){ | |
173 | mvaddch(n,MIDC,'|'); | |
174 | mvaddch(n+6,MIDC,'|'); | |
175 | } | |
176 | } | |
177 | ||
178 | notarget() | |
179 | { | |
180 | register int n; | |
181 | ||
182 | move(MIDR,MIDC-10); | |
183 | addstr(" "); | |
184 | for (n = MIDR-4; n < MIDR-1; n++){ | |
185 | mvaddch(n,MIDC,' '); | |
186 | mvaddch(n+6,MIDC,' '); | |
187 | } | |
188 | } | |
189 | ||
190 | blast() | |
191 | { | |
192 | register int n; | |
193 | ||
194 | alarm(0); | |
195 | move(LINES-1, 24); | |
196 | printw("%3d", torps); | |
197 | for(n = LINES-1-2; n >= MIDR + 1; n--){ | |
198 | mvaddch(n, MIDC+MIDR-n, '/'); | |
199 | mvaddch(n, MIDC-MIDR+n, '\\'); | |
200 | refresh(); | |
201 | } | |
202 | mvaddch(MIDR,MIDC,'*'); | |
203 | for(n = LINES-1-2; n >= MIDR + 1; n--){ | |
204 | mvaddch(n, MIDC+MIDR-n, ' '); | |
205 | mvaddch(n, MIDC-MIDR+n, ' '); | |
206 | refresh(); | |
207 | } | |
208 | alarm(1); | |
209 | } | |
210 | ||
40cfa738 | 211 | void |
77eecccb EW |
212 | moveenemy() |
213 | { | |
214 | double d; | |
215 | int oldr, oldc; | |
216 | ||
217 | oldr = row; | |
218 | oldc = column; | |
219 | if (fuel > 0){ | |
220 | if (row + dr <= LINES-3 && row + dr > 0) | |
221 | row += dr; | |
222 | if (column + dc < COLS-1 && column + dc > 0) | |
223 | column += dc; | |
224 | } else if (fuel < 0){ | |
225 | fuel = 0; | |
226 | mvaddstr(0,60,"*** Out of fuel ***"); | |
227 | } | |
228 | d = (double) ((row - MIDR)*(row - MIDR) + (column - MIDC)*(column - MIDC)); | |
229 | if (d < 16){ | |
230 | row += (rnd(9) - 4) % (4 - abs(row - MIDR)); | |
231 | column += (rnd(9) - 4) % (4 - abs(column - MIDC)); | |
232 | } | |
233 | clock--; | |
234 | mvaddstr(oldr, oldc - 1, " "); | |
235 | if (cross) | |
236 | target(); | |
237 | mvaddstr(row, column - 1, "/-\\"); | |
238 | move(LINES-1, 24); | |
239 | printw("%3d", torps); | |
240 | move(LINES-1, 42); | |
241 | printw("%3d", fuel); | |
242 | move(LINES-1, 57); | |
243 | printw("%3d", clock); | |
244 | refresh(); | |
245 | signal(SIGALRM, moveenemy); | |
246 | alarm(1); | |
247 | } | |
248 | ||
249 | endfly() | |
250 | { | |
251 | alarm(0); | |
252 | signal(SIGALRM, SIG_DFL); | |
253 | mvcur(0,COLS-1,LINES-1,0); | |
254 | endwin(); | |
255 | signal(SIGTSTP, SIG_DFL); | |
256 | signal(SIGINT, oldsig); | |
257 | } |