Commit | Line | Data |
---|---|---|
e04f5cf8 KB |
1 | /*- |
2 | * Copyright (c) 1990 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * This code is derived from software contributed to Berkeley by | |
6 | * Ed James. | |
7 | * | |
8 | * %sccs.include.redist.c% | |
9 | */ | |
10 | ||
98d86a23 KB |
11 | /* |
12 | * Copyright (c) 1987 by Ed James, UC Berkeley. All rights reserved. | |
13 | * | |
14 | * Copy permission is hereby granted provided that this notice is | |
15 | * retained on all partial or complete copies. | |
16 | * | |
17 | * For more info on this and all of my stuff, mail edjames@berkeley.edu. | |
18 | */ | |
19 | ||
e04f5cf8 | 20 | #ifndef lint |
55900916 | 21 | static char sccsid[] = "@(#)graphics.c 5.3 (Berkeley) %G%"; |
e04f5cf8 KB |
22 | #endif /* not lint */ |
23 | ||
98d86a23 KB |
24 | #include "include.h" |
25 | #ifdef SYSV | |
26 | #include <errno.h> | |
27 | #endif | |
28 | ||
29 | #define C_TOPBOTTOM '-' | |
30 | #define C_LEFTRIGHT '|' | |
31 | #define C_AIRPORT '=' | |
32 | #define C_LINE '+' | |
33 | #define C_BACKROUND '.' | |
34 | #define C_BEACON '*' | |
35 | #define C_CREDIT '*' | |
36 | ||
37 | WINDOW *radar, *cleanradar, *credit, *input, *planes; | |
38 | ||
39 | getAChar() | |
40 | { | |
41 | #ifdef BSD | |
42 | return (getchar()); | |
43 | #endif | |
44 | #ifdef SYSV | |
45 | int c; | |
46 | ||
47 | while ((c = getchar()) == -1 && errno == EINTR) ; | |
48 | return(c); | |
49 | #endif | |
50 | } | |
51 | ||
52 | erase_all() | |
53 | { | |
54 | PLANE *pp; | |
55 | ||
56 | for (pp = air.head; pp != NULL; pp = pp->next) { | |
57 | wmove(cleanradar, pp->ypos, pp->xpos * 2); | |
58 | wmove(radar, pp->ypos, pp->xpos * 2); | |
59 | waddch(radar, winch(cleanradar)); | |
60 | wmove(cleanradar, pp->ypos, pp->xpos * 2 + 1); | |
61 | wmove(radar, pp->ypos, pp->xpos * 2 + 1); | |
62 | waddch(radar, winch(cleanradar)); | |
63 | } | |
64 | } | |
65 | ||
66 | draw_all() | |
67 | { | |
68 | PLANE *pp; | |
69 | ||
70 | for (pp = air.head; pp != NULL; pp = pp->next) { | |
71 | if (pp->status == S_MARKED) | |
72 | wstandout(radar); | |
73 | wmove(radar, pp->ypos, pp->xpos * 2); | |
74 | waddch(radar, name(pp)); | |
75 | waddch(radar, '0' + pp->altitude); | |
76 | if (pp->status == S_MARKED) | |
77 | wstandend(radar); | |
78 | } | |
79 | wrefresh(radar); | |
80 | planewin(); | |
81 | wrefresh(input); /* return cursor */ | |
82 | fflush(stdout); | |
83 | } | |
84 | ||
85 | init_gr() | |
86 | { | |
87 | static char buffer[BUFSIZ]; | |
88 | ||
89 | initscr(); | |
90 | setbuf(stdout, buffer); | |
91 | input = newwin(INPUT_LINES, COLS - PLANE_COLS, LINES - INPUT_LINES, 0); | |
92 | credit = newwin(INPUT_LINES, PLANE_COLS, LINES - INPUT_LINES, | |
93 | COLS - PLANE_COLS); | |
94 | planes = newwin(LINES - INPUT_LINES, PLANE_COLS, 0, COLS - PLANE_COLS); | |
95 | } | |
96 | ||
97 | setup_screen(scp) | |
98 | C_SCREEN *scp; | |
99 | { | |
100 | register int i, j; | |
101 | char str[3], *airstr; | |
102 | ||
103 | str[2] = '\0'; | |
104 | ||
105 | if (radar != NULL) | |
106 | delwin(radar); | |
107 | radar = newwin(scp->height, scp->width * 2, 0, 0); | |
108 | ||
109 | if (cleanradar != NULL) | |
110 | delwin(cleanradar); | |
111 | cleanradar = newwin(scp->height, scp->width * 2, 0, 0); | |
112 | ||
113 | /* minus one here to prevent a scroll */ | |
114 | for (i = 0; i < PLANE_COLS - 1; i++) { | |
115 | wmove(credit, 0, i); | |
116 | waddch(credit, C_CREDIT); | |
117 | wmove(credit, INPUT_LINES - 1, i); | |
118 | waddch(credit, C_CREDIT); | |
119 | } | |
120 | wmove(credit, INPUT_LINES / 2, 1); | |
121 | waddstr(credit, AUTHOR_STR); | |
122 | ||
123 | for (i = 1; i < scp->height - 1; i++) { | |
124 | for (j = 1; j < scp->width - 1; j++) { | |
125 | wmove(radar, i, j * 2); | |
126 | waddch(radar, C_BACKROUND); | |
127 | } | |
128 | } | |
129 | ||
130 | /* | |
131 | * Draw the lines first, since people like to draw lines | |
132 | * through beacons and exit points. | |
133 | */ | |
134 | str[0] = C_LINE; | |
135 | for (i = 0; i < scp->num_lines; i++) { | |
136 | str[1] = ' '; | |
137 | draw_line(radar, scp->line[i].p1.x, scp->line[i].p1.y, | |
138 | scp->line[i].p2.x, scp->line[i].p2.y, str); | |
139 | } | |
140 | ||
141 | str[0] = C_TOPBOTTOM; | |
142 | str[1] = C_TOPBOTTOM; | |
143 | wmove(radar, 0, 0); | |
144 | for (i = 0; i < scp->width - 1; i++) | |
145 | waddstr(radar, str); | |
146 | waddch(radar, C_TOPBOTTOM); | |
147 | ||
148 | str[0] = C_TOPBOTTOM; | |
149 | str[1] = C_TOPBOTTOM; | |
150 | wmove(radar, scp->height - 1, 0); | |
151 | for (i = 0; i < scp->width - 1; i++) | |
152 | waddstr(radar, str); | |
153 | waddch(radar, C_TOPBOTTOM); | |
154 | ||
155 | for (i = 1; i < scp->height - 1; i++) { | |
156 | wmove(radar, i, 0); | |
157 | waddch(radar, C_LEFTRIGHT); | |
158 | wmove(radar, i, (scp->width - 1) * 2); | |
159 | waddch(radar, C_LEFTRIGHT); | |
160 | } | |
161 | ||
162 | str[0] = C_BEACON; | |
163 | for (i = 0; i < scp->num_beacons; i++) { | |
164 | str[1] = '0' + i; | |
165 | wmove(radar, scp->beacon[i].y, scp->beacon[i].x * 2); | |
166 | waddstr(radar, str); | |
167 | } | |
168 | ||
169 | for (i = 0; i < scp->num_exits; i++) { | |
170 | wmove(radar, scp->exit[i].y, scp->exit[i].x * 2); | |
171 | waddch(radar, '0' + i); | |
172 | } | |
173 | ||
174 | airstr = "^?>?v?<?"; | |
175 | for (i = 0; i < scp->num_airports; i++) { | |
176 | str[0] = airstr[scp->airport[i].dir]; | |
177 | str[1] = '0' + i; | |
178 | wmove(radar, scp->airport[i].y, scp->airport[i].x * 2); | |
179 | waddstr(radar, str); | |
180 | } | |
181 | ||
182 | overwrite(radar, cleanradar); | |
183 | wrefresh(radar); | |
184 | wrefresh(credit); | |
185 | fflush(stdout); | |
186 | } | |
187 | ||
188 | draw_line(w, x, y, lx, ly, s) | |
189 | WINDOW *w; | |
190 | char *s; | |
191 | { | |
192 | int dx, dy; | |
193 | ||
194 | dx = SGN(lx - x); | |
195 | dy = SGN(ly - y); | |
196 | for (;;) { | |
197 | wmove(w, y, x * 2); | |
198 | waddstr(w, s); | |
199 | if (x == lx && y == ly) | |
200 | break; | |
201 | x += dx; | |
202 | y += dy; | |
203 | } | |
204 | } | |
205 | ||
206 | ioclrtoeol(pos) | |
207 | { | |
208 | wmove(input, 0, pos); | |
209 | wclrtoeol(input); | |
210 | wrefresh(input); | |
211 | fflush(stdout); | |
212 | } | |
213 | ||
214 | iomove(pos) | |
215 | { | |
216 | wmove(input, 0, pos); | |
217 | wrefresh(input); | |
218 | fflush(stdout); | |
219 | } | |
220 | ||
221 | ioaddstr(pos, str) | |
222 | char *str; | |
223 | { | |
224 | wmove(input, 0, pos); | |
225 | waddstr(input, str); | |
226 | wrefresh(input); | |
227 | fflush(stdout); | |
228 | } | |
229 | ||
230 | ioclrtobot() | |
231 | { | |
232 | wclrtobot(input); | |
233 | wrefresh(input); | |
234 | fflush(stdout); | |
235 | } | |
236 | ||
237 | ioerror(pos, len, str) | |
238 | char *str; | |
239 | { | |
240 | int i; | |
241 | ||
242 | wmove(input, 1, pos); | |
243 | for (i = 0; i < len; i++) | |
244 | waddch(input, '^'); | |
245 | wmove(input, 2, 0); | |
246 | waddstr(input, str); | |
247 | wrefresh(input); | |
248 | fflush(stdout); | |
249 | } | |
250 | ||
251 | quit() | |
252 | { | |
253 | int c, y, x; | |
254 | #ifdef BSD | |
255 | struct itimerval itv; | |
256 | #endif | |
257 | ||
258 | getyx(input, y, x); | |
259 | wmove(input, 2, 0); | |
260 | waddstr(input, "Really quit? (y/n) "); | |
261 | wclrtobot(input); | |
262 | wrefresh(input); | |
263 | fflush(stdout); | |
264 | ||
265 | c = getchar(); | |
266 | if (c == EOF || c == 'y') { | |
267 | /* disable timer */ | |
268 | #ifdef BSD | |
269 | itv.it_value.tv_sec = 0; | |
270 | itv.it_value.tv_usec = 0; | |
271 | setitimer(ITIMER_REAL, &itv, NULL); | |
272 | #endif | |
273 | #ifdef SYSV | |
274 | alarm(0); | |
275 | #endif | |
276 | fflush(stdout); | |
277 | clear(); | |
278 | refresh(); | |
279 | endwin(); | |
280 | log_score(0); | |
281 | exit(0); | |
282 | } | |
283 | wmove(input, 2, 0); | |
284 | wclrtobot(input); | |
285 | wmove(input, y, x); | |
286 | wrefresh(input); | |
287 | fflush(stdout); | |
288 | return; | |
289 | } | |
290 | ||
291 | planewin() | |
292 | { | |
293 | PLANE *pp; | |
294 | char *command(); | |
295 | int warning = 0; | |
296 | ||
297 | #ifdef BSD | |
298 | wclear(planes); | |
299 | #endif | |
300 | ||
301 | wmove(planes, 0,0); | |
302 | ||
303 | #ifdef SYSV | |
304 | wclrtobot(planes); | |
305 | #endif | |
55900916 | 306 | wprintw(planes, "Time: %-4d Safe: %d", clck, safe_planes); |
98d86a23 KB |
307 | wmove(planes, 2, 0); |
308 | ||
309 | waddstr(planes, "pl dt comm"); | |
310 | for (pp = air.head; pp != NULL; pp = pp->next) { | |
311 | if (waddch(planes, '\n') == ERR) { | |
312 | warning++; | |
313 | break; | |
314 | } | |
315 | waddstr(planes, command(pp)); | |
316 | } | |
317 | waddch(planes, '\n'); | |
318 | for (pp = ground.head; pp != NULL; pp = pp->next) { | |
319 | if (waddch(planes, '\n') == ERR) { | |
320 | warning++; | |
321 | break; | |
322 | } | |
323 | waddstr(planes, command(pp)); | |
324 | } | |
325 | if (warning) { | |
326 | wmove(planes, LINES - INPUT_LINES - 1, 0); | |
327 | waddstr(planes, "---- more ----"); | |
328 | wclrtoeol(planes); | |
329 | } | |
330 | wrefresh(planes); | |
331 | fflush(stdout); | |
332 | } | |
333 | ||
334 | loser(p, s) | |
335 | PLANE *p; | |
336 | char *s; | |
337 | { | |
338 | int c; | |
339 | #ifdef BSD | |
340 | struct itimerval itv; | |
341 | #endif | |
342 | ||
343 | /* disable timer */ | |
344 | #ifdef BSD | |
345 | itv.it_value.tv_sec = 0; | |
346 | itv.it_value.tv_usec = 0; | |
347 | setitimer(ITIMER_REAL, &itv, NULL); | |
348 | #endif | |
349 | #ifdef SYSV | |
350 | alarm(0); | |
351 | #endif | |
352 | ||
353 | wmove(input, 0, 0); | |
354 | wclrtobot(input); | |
355 | wprintw(input, "Plane '%c' %s\n\nHit space for top players list...", | |
356 | name(p), s); | |
357 | wrefresh(input); | |
358 | fflush(stdout); | |
359 | while ((c = getchar()) != EOF && c != ' ') | |
360 | ; | |
361 | clear(); /* move to top of screen */ | |
362 | refresh(); | |
363 | endwin(); | |
364 | log_score(0); | |
365 | exit(0); | |
366 | } | |
367 | ||
368 | redraw() | |
369 | { | |
370 | clear(); | |
371 | refresh(); | |
372 | ||
373 | touchwin(radar); | |
374 | wrefresh(radar); | |
375 | touchwin(planes); | |
376 | wrefresh(planes); | |
377 | touchwin(credit); | |
378 | wrefresh(credit); | |
379 | ||
380 | /* refresh input last to get cursor in right place */ | |
381 | touchwin(input); | |
382 | wrefresh(input); | |
383 | fflush(stdout); | |
384 | } | |
385 | ||
386 | ||
387 | done_screen() | |
388 | { | |
389 | clear(); | |
390 | refresh(); | |
391 | endwin(); /* clean up curses */ | |
392 | } |