Annotation of 43BSDReno/games/atc/graphics.c, revision 1.1

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

unix.superglobalmegacorp.com

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