141166Sbostic /*- 241166Sbostic * Copyright (c) 1990 The Regents of the University of California. 341166Sbostic * All rights reserved. 441166Sbostic * 541166Sbostic * This code is derived from software contributed to Berkeley by 641166Sbostic * Ed James. 741166Sbostic * 841166Sbostic * %sccs.include.redist.c% 941166Sbostic */ 1041166Sbostic 1141159Sbostic /* 1241159Sbostic * Copyright (c) 1987 by Ed James, UC Berkeley. All rights reserved. 1341159Sbostic * 1441159Sbostic * Copy permission is hereby granted provided that this notice is 1541159Sbostic * retained on all partial or complete copies. 1641159Sbostic * 1741159Sbostic * For more info on this and all of my stuff, mail edjames@berkeley.edu. 1841159Sbostic */ 1941159Sbostic 2041166Sbostic #ifndef lint 21*45433Sbostic static char sccsid[] = "@(#)graphics.c 5.3 (Berkeley) 10/30/90"; 2241166Sbostic #endif /* not lint */ 2341166Sbostic 2441159Sbostic #include "include.h" 2541159Sbostic #ifdef SYSV 2641159Sbostic #include <errno.h> 2741159Sbostic #endif 2841159Sbostic 2941159Sbostic #define C_TOPBOTTOM '-' 3041159Sbostic #define C_LEFTRIGHT '|' 3141159Sbostic #define C_AIRPORT '=' 3241159Sbostic #define C_LINE '+' 3341159Sbostic #define C_BACKROUND '.' 3441159Sbostic #define C_BEACON '*' 3541159Sbostic #define C_CREDIT '*' 3641159Sbostic 3741159Sbostic WINDOW *radar, *cleanradar, *credit, *input, *planes; 3841159Sbostic 3941159Sbostic getAChar() 4041159Sbostic { 4141159Sbostic #ifdef BSD 4241159Sbostic return (getchar()); 4341159Sbostic #endif 4441159Sbostic #ifdef SYSV 4541159Sbostic int c; 4641159Sbostic 4741159Sbostic while ((c = getchar()) == -1 && errno == EINTR) ; 4841159Sbostic return(c); 4941159Sbostic #endif 5041159Sbostic } 5141159Sbostic 5241159Sbostic erase_all() 5341159Sbostic { 5441159Sbostic PLANE *pp; 5541159Sbostic 5641159Sbostic for (pp = air.head; pp != NULL; pp = pp->next) { 5741159Sbostic wmove(cleanradar, pp->ypos, pp->xpos * 2); 5841159Sbostic wmove(radar, pp->ypos, pp->xpos * 2); 5941159Sbostic waddch(radar, winch(cleanradar)); 6041159Sbostic wmove(cleanradar, pp->ypos, pp->xpos * 2 + 1); 6141159Sbostic wmove(radar, pp->ypos, pp->xpos * 2 + 1); 6241159Sbostic waddch(radar, winch(cleanradar)); 6341159Sbostic } 6441159Sbostic } 6541159Sbostic 6641159Sbostic draw_all() 6741159Sbostic { 6841159Sbostic PLANE *pp; 6941159Sbostic 7041159Sbostic for (pp = air.head; pp != NULL; pp = pp->next) { 7141159Sbostic if (pp->status == S_MARKED) 7241159Sbostic wstandout(radar); 7341159Sbostic wmove(radar, pp->ypos, pp->xpos * 2); 7441159Sbostic waddch(radar, name(pp)); 7541159Sbostic waddch(radar, '0' + pp->altitude); 7641159Sbostic if (pp->status == S_MARKED) 7741159Sbostic wstandend(radar); 7841159Sbostic } 7941159Sbostic wrefresh(radar); 8041159Sbostic planewin(); 8141159Sbostic wrefresh(input); /* return cursor */ 8241159Sbostic fflush(stdout); 8341159Sbostic } 8441159Sbostic 8541159Sbostic init_gr() 8641159Sbostic { 8741159Sbostic static char buffer[BUFSIZ]; 8841159Sbostic 8941159Sbostic initscr(); 9041159Sbostic setbuf(stdout, buffer); 9141159Sbostic input = newwin(INPUT_LINES, COLS - PLANE_COLS, LINES - INPUT_LINES, 0); 9241159Sbostic credit = newwin(INPUT_LINES, PLANE_COLS, LINES - INPUT_LINES, 9341159Sbostic COLS - PLANE_COLS); 9441159Sbostic planes = newwin(LINES - INPUT_LINES, PLANE_COLS, 0, COLS - PLANE_COLS); 9541159Sbostic } 9641159Sbostic 9741159Sbostic setup_screen(scp) 9841159Sbostic C_SCREEN *scp; 9941159Sbostic { 10041159Sbostic register int i, j; 10141159Sbostic char str[3], *airstr; 10241159Sbostic 10341159Sbostic str[2] = '\0'; 10441159Sbostic 10541159Sbostic if (radar != NULL) 10641159Sbostic delwin(radar); 10741159Sbostic radar = newwin(scp->height, scp->width * 2, 0, 0); 10841159Sbostic 10941159Sbostic if (cleanradar != NULL) 11041159Sbostic delwin(cleanradar); 11141159Sbostic cleanradar = newwin(scp->height, scp->width * 2, 0, 0); 11241159Sbostic 11341159Sbostic /* minus one here to prevent a scroll */ 11441159Sbostic for (i = 0; i < PLANE_COLS - 1; i++) { 11541159Sbostic wmove(credit, 0, i); 11641159Sbostic waddch(credit, C_CREDIT); 11741159Sbostic wmove(credit, INPUT_LINES - 1, i); 11841159Sbostic waddch(credit, C_CREDIT); 11941159Sbostic } 12041159Sbostic wmove(credit, INPUT_LINES / 2, 1); 12141159Sbostic waddstr(credit, AUTHOR_STR); 12241159Sbostic 12341159Sbostic for (i = 1; i < scp->height - 1; i++) { 12441159Sbostic for (j = 1; j < scp->width - 1; j++) { 12541159Sbostic wmove(radar, i, j * 2); 12641159Sbostic waddch(radar, C_BACKROUND); 12741159Sbostic } 12841159Sbostic } 12941159Sbostic 13041159Sbostic /* 13141159Sbostic * Draw the lines first, since people like to draw lines 13241159Sbostic * through beacons and exit points. 13341159Sbostic */ 13441159Sbostic str[0] = C_LINE; 13541159Sbostic for (i = 0; i < scp->num_lines; i++) { 13641159Sbostic str[1] = ' '; 13741159Sbostic draw_line(radar, scp->line[i].p1.x, scp->line[i].p1.y, 13841159Sbostic scp->line[i].p2.x, scp->line[i].p2.y, str); 13941159Sbostic } 14041159Sbostic 14141159Sbostic str[0] = C_TOPBOTTOM; 14241159Sbostic str[1] = C_TOPBOTTOM; 14341159Sbostic wmove(radar, 0, 0); 14441159Sbostic for (i = 0; i < scp->width - 1; i++) 14541159Sbostic waddstr(radar, str); 14641159Sbostic waddch(radar, C_TOPBOTTOM); 14741159Sbostic 14841159Sbostic str[0] = C_TOPBOTTOM; 14941159Sbostic str[1] = C_TOPBOTTOM; 15041159Sbostic wmove(radar, scp->height - 1, 0); 15141159Sbostic for (i = 0; i < scp->width - 1; i++) 15241159Sbostic waddstr(radar, str); 15341159Sbostic waddch(radar, C_TOPBOTTOM); 15441159Sbostic 15541159Sbostic for (i = 1; i < scp->height - 1; i++) { 15641159Sbostic wmove(radar, i, 0); 15741159Sbostic waddch(radar, C_LEFTRIGHT); 15841159Sbostic wmove(radar, i, (scp->width - 1) * 2); 15941159Sbostic waddch(radar, C_LEFTRIGHT); 16041159Sbostic } 16141159Sbostic 16241159Sbostic str[0] = C_BEACON; 16341159Sbostic for (i = 0; i < scp->num_beacons; i++) { 16441159Sbostic str[1] = '0' + i; 16541159Sbostic wmove(radar, scp->beacon[i].y, scp->beacon[i].x * 2); 16641159Sbostic waddstr(radar, str); 16741159Sbostic } 16841159Sbostic 16941159Sbostic for (i = 0; i < scp->num_exits; i++) { 17041159Sbostic wmove(radar, scp->exit[i].y, scp->exit[i].x * 2); 17141159Sbostic waddch(radar, '0' + i); 17241159Sbostic } 17341159Sbostic 17441159Sbostic airstr = "^?>?v?<?"; 17541159Sbostic for (i = 0; i < scp->num_airports; i++) { 17641159Sbostic str[0] = airstr[scp->airport[i].dir]; 17741159Sbostic str[1] = '0' + i; 17841159Sbostic wmove(radar, scp->airport[i].y, scp->airport[i].x * 2); 17941159Sbostic waddstr(radar, str); 18041159Sbostic } 18141159Sbostic 18241159Sbostic overwrite(radar, cleanradar); 18341159Sbostic wrefresh(radar); 18441159Sbostic wrefresh(credit); 18541159Sbostic fflush(stdout); 18641159Sbostic } 18741159Sbostic 18841159Sbostic draw_line(w, x, y, lx, ly, s) 18941159Sbostic WINDOW *w; 19041159Sbostic char *s; 19141159Sbostic { 19241159Sbostic int dx, dy; 19341159Sbostic 19441159Sbostic dx = SGN(lx - x); 19541159Sbostic dy = SGN(ly - y); 19641159Sbostic for (;;) { 19741159Sbostic wmove(w, y, x * 2); 19841159Sbostic waddstr(w, s); 19941159Sbostic if (x == lx && y == ly) 20041159Sbostic break; 20141159Sbostic x += dx; 20241159Sbostic y += dy; 20341159Sbostic } 20441159Sbostic } 20541159Sbostic 20641159Sbostic ioclrtoeol(pos) 20741159Sbostic { 20841159Sbostic wmove(input, 0, pos); 20941159Sbostic wclrtoeol(input); 21041159Sbostic wrefresh(input); 21141159Sbostic fflush(stdout); 21241159Sbostic } 21341159Sbostic 21441159Sbostic iomove(pos) 21541159Sbostic { 21641159Sbostic wmove(input, 0, pos); 21741159Sbostic wrefresh(input); 21841159Sbostic fflush(stdout); 21941159Sbostic } 22041159Sbostic 22141159Sbostic ioaddstr(pos, str) 22241159Sbostic char *str; 22341159Sbostic { 22441159Sbostic wmove(input, 0, pos); 22541159Sbostic waddstr(input, str); 22641159Sbostic wrefresh(input); 22741159Sbostic fflush(stdout); 22841159Sbostic } 22941159Sbostic 23041159Sbostic ioclrtobot() 23141159Sbostic { 23241159Sbostic wclrtobot(input); 23341159Sbostic wrefresh(input); 23441159Sbostic fflush(stdout); 23541159Sbostic } 23641159Sbostic 23741159Sbostic ioerror(pos, len, str) 23841159Sbostic char *str; 23941159Sbostic { 24041159Sbostic int i; 24141159Sbostic 24241159Sbostic wmove(input, 1, pos); 24341159Sbostic for (i = 0; i < len; i++) 24441159Sbostic waddch(input, '^'); 24541159Sbostic wmove(input, 2, 0); 24641159Sbostic waddstr(input, str); 24741159Sbostic wrefresh(input); 24841159Sbostic fflush(stdout); 24941159Sbostic } 25041159Sbostic 25141159Sbostic quit() 25241159Sbostic { 25341159Sbostic int c, y, x; 25441159Sbostic #ifdef BSD 25541159Sbostic struct itimerval itv; 25641159Sbostic #endif 25741159Sbostic 25841159Sbostic getyx(input, y, x); 25941159Sbostic wmove(input, 2, 0); 26041159Sbostic waddstr(input, "Really quit? (y/n) "); 26141159Sbostic wclrtobot(input); 26241159Sbostic wrefresh(input); 26341159Sbostic fflush(stdout); 26441159Sbostic 26541159Sbostic c = getchar(); 26641159Sbostic if (c == EOF || c == 'y') { 26741159Sbostic /* disable timer */ 26841159Sbostic #ifdef BSD 26941159Sbostic itv.it_value.tv_sec = 0; 27041159Sbostic itv.it_value.tv_usec = 0; 27141159Sbostic setitimer(ITIMER_REAL, &itv, NULL); 27241159Sbostic #endif 27341159Sbostic #ifdef SYSV 27441159Sbostic alarm(0); 27541159Sbostic #endif 27641159Sbostic fflush(stdout); 27741159Sbostic clear(); 27841159Sbostic refresh(); 27941159Sbostic endwin(); 28041159Sbostic log_score(0); 28141159Sbostic exit(0); 28241159Sbostic } 28341159Sbostic wmove(input, 2, 0); 28441159Sbostic wclrtobot(input); 28541159Sbostic wmove(input, y, x); 28641159Sbostic wrefresh(input); 28741159Sbostic fflush(stdout); 28841159Sbostic return; 28941159Sbostic } 29041159Sbostic 29141159Sbostic planewin() 29241159Sbostic { 29341159Sbostic PLANE *pp; 29441159Sbostic char *command(); 29541159Sbostic int warning = 0; 29641159Sbostic 29741159Sbostic #ifdef BSD 29841159Sbostic wclear(planes); 29941159Sbostic #endif 30041159Sbostic 30141159Sbostic wmove(planes, 0,0); 30241159Sbostic 30341159Sbostic #ifdef SYSV 30441159Sbostic wclrtobot(planes); 30541159Sbostic #endif 306*45433Sbostic wprintw(planes, "Time: %-4d Safe: %d", clck, safe_planes); 30741159Sbostic wmove(planes, 2, 0); 30841159Sbostic 30941159Sbostic waddstr(planes, "pl dt comm"); 31041159Sbostic for (pp = air.head; pp != NULL; pp = pp->next) { 31141159Sbostic if (waddch(planes, '\n') == ERR) { 31241159Sbostic warning++; 31341159Sbostic break; 31441159Sbostic } 31541159Sbostic waddstr(planes, command(pp)); 31641159Sbostic } 31741159Sbostic waddch(planes, '\n'); 31841159Sbostic for (pp = ground.head; pp != NULL; pp = pp->next) { 31941159Sbostic if (waddch(planes, '\n') == ERR) { 32041159Sbostic warning++; 32141159Sbostic break; 32241159Sbostic } 32341159Sbostic waddstr(planes, command(pp)); 32441159Sbostic } 32541159Sbostic if (warning) { 32641159Sbostic wmove(planes, LINES - INPUT_LINES - 1, 0); 32741159Sbostic waddstr(planes, "---- more ----"); 32841159Sbostic wclrtoeol(planes); 32941159Sbostic } 33041159Sbostic wrefresh(planes); 33141159Sbostic fflush(stdout); 33241159Sbostic } 33341159Sbostic 33441159Sbostic loser(p, s) 33541159Sbostic PLANE *p; 33641159Sbostic char *s; 33741159Sbostic { 33841159Sbostic int c; 33941159Sbostic #ifdef BSD 34041159Sbostic struct itimerval itv; 34141159Sbostic #endif 34241159Sbostic 34341159Sbostic /* disable timer */ 34441159Sbostic #ifdef BSD 34541159Sbostic itv.it_value.tv_sec = 0; 34641159Sbostic itv.it_value.tv_usec = 0; 34741159Sbostic setitimer(ITIMER_REAL, &itv, NULL); 34841159Sbostic #endif 34941159Sbostic #ifdef SYSV 35041159Sbostic alarm(0); 35141159Sbostic #endif 35241159Sbostic 35341159Sbostic wmove(input, 0, 0); 35441159Sbostic wclrtobot(input); 35541159Sbostic wprintw(input, "Plane '%c' %s\n\nHit space for top players list...", 35641159Sbostic name(p), s); 35741159Sbostic wrefresh(input); 35841159Sbostic fflush(stdout); 35941159Sbostic while ((c = getchar()) != EOF && c != ' ') 36041159Sbostic ; 36141159Sbostic clear(); /* move to top of screen */ 36241159Sbostic refresh(); 36341159Sbostic endwin(); 36441159Sbostic log_score(0); 36541159Sbostic exit(0); 36641159Sbostic } 36741159Sbostic 36841159Sbostic redraw() 36941159Sbostic { 37041159Sbostic clear(); 37141159Sbostic refresh(); 37241159Sbostic 37341159Sbostic touchwin(radar); 37441159Sbostic wrefresh(radar); 37541159Sbostic touchwin(planes); 37641159Sbostic wrefresh(planes); 37741159Sbostic touchwin(credit); 37841159Sbostic wrefresh(credit); 37941159Sbostic 38041159Sbostic /* refresh input last to get cursor in right place */ 38141159Sbostic touchwin(input); 38241159Sbostic wrefresh(input); 38341159Sbostic fflush(stdout); 38441159Sbostic } 38541159Sbostic 38641159Sbostic 38741159Sbostic done_screen() 38841159Sbostic { 38941159Sbostic clear(); 39041159Sbostic refresh(); 39141159Sbostic endwin(); /* clean up curses */ 39241159Sbostic } 393