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