]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - battlestar/fly.c
curses needs termcap
[bsdgames-darwin.git] / battlestar / fly.c
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 }