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