Annotation of 43BSDTahoe/games/atc/graphics.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.