Annotation of 43BSDReno/games/hunt/driver/draw.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: static char sccsid[] = "@(#)draw.c     5.2 (Berkeley) 6/27/88";
        !            20: #endif /* not lint */
        !            21: 
        !            22: /*
        !            23:  *  Hunt
        !            24:  *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
        !            25:  *  San Francisco, California
        !            26:  */
        !            27: 
        !            28: # include      "hunt.h"
        !            29: 
        !            30: drawmaze(pp)
        !            31: register PLAYER        *pp;
        !            32: {
        !            33:        register int    x;
        !            34:        register char   *sp;
        !            35:        register int    y;
        !            36:        register char   *endp;
        !            37: 
        !            38:        clrscr(pp);
        !            39:        outstr(pp, pp->p_maze[0], WIDTH);
        !            40:        for (y = 1; y < HEIGHT - 1; y++) {
        !            41:                endp = &pp->p_maze[y][WIDTH];
        !            42:                for (x = 0, sp = pp->p_maze[y]; sp < endp; x++, sp++)
        !            43:                        if (*sp != SPACE) {
        !            44:                                cgoto(pp, y, x);
        !            45:                                if (pp->p_x == x && pp->p_y == y)
        !            46:                                        outch(pp, translate(*sp));
        !            47:                                else
        !            48:                                        outch(pp, *sp);
        !            49:                        }
        !            50:        }
        !            51:        cgoto(pp, HEIGHT - 1, 0);
        !            52:        outstr(pp, pp->p_maze[HEIGHT - 1], WIDTH);
        !            53:        drawstatus(pp);
        !            54: }
        !            55: 
        !            56: /*
        !            57:  * drawstatus - put up the status lines (this assumes the screen
        !            58:  *             size is 80x24 with the maze being 64x24)
        !            59:  */
        !            60: drawstatus(pp)
        !            61: register PLAYER        *pp;
        !            62: {
        !            63:        register int    i;
        !            64:        register PLAYER *np;
        !            65: 
        !            66:        (void) sprintf(Buf, "%-13.13s", pp->p_ident->i_name);
        !            67:        cgoto(pp, STAT_NAME_ROW, STAT_LABEL_COL);
        !            68:        outstr(pp, Buf, 13);
        !            69: 
        !            70:        cgoto(pp, STAT_AMMO_ROW, STAT_LABEL_COL);
        !            71:        outstr(pp, "Ammo:", 5);
        !            72:        (void) sprintf(Buf, "%3d", pp->p_ammo);
        !            73:        cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
        !            74:        outstr(pp, Buf, 3);
        !            75: 
        !            76:        cgoto(pp, STAT_CLOAK_ROW, STAT_LABEL_COL);
        !            77:        outstr(pp, "Cloak:", 6);
        !            78:        cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
        !            79:        outstr(pp, (pp->p_cloak < 0) ? "   " : " on", 3);
        !            80: 
        !            81:        cgoto(pp, STAT_SCAN_ROW, STAT_LABEL_COL);
        !            82:        outstr(pp, "Scan:", 5);
        !            83:        cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL);
        !            84:        outstr(pp, (pp->p_scan < 0) ? "   " : " on", 3);
        !            85: 
        !            86:        cgoto(pp, STAT_GUN_ROW, STAT_LABEL_COL);
        !            87:        outstr(pp, "Gun:", 4);
        !            88:        cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL);
        !            89:        outstr(pp, (pp->p_ncshot < MAXNCSHOT) ? " ok" : "   ", 3);
        !            90: 
        !            91:        cgoto(pp, STAT_DAM_ROW, STAT_LABEL_COL);
        !            92:        outstr(pp, "Damage:", 7);
        !            93:        (void) sprintf(Buf, "%2d/%2d", pp->p_damage, pp->p_damcap);
        !            94:        cgoto(pp, STAT_DAM_ROW, STAT_VALUE_COL);
        !            95:        outstr(pp, Buf, 5);
        !            96: 
        !            97:        cgoto(pp, STAT_KILL_ROW, STAT_LABEL_COL);
        !            98:        outstr(pp, "Kills:", 6);
        !            99:        (void) sprintf(Buf, "%3d", (pp->p_damcap - MAXDAM) / 2);
        !           100:        cgoto(pp, STAT_KILL_ROW, STAT_VALUE_COL);
        !           101:        outstr(pp, Buf, 3);
        !           102: 
        !           103:        cgoto(pp, STAT_PLAY_ROW, STAT_LABEL_COL);
        !           104:        outstr(pp, "Player:", 7);
        !           105:        for (i = STAT_PLAY_ROW + 1, np = Player; np < End_player; np++) {
        !           106:                (void) sprintf(Buf, "%5.2f%c%-10.10s", np->p_ident->i_score,
        !           107:                        stat_char(np), np->p_ident->i_name);
        !           108:                cgoto(pp, i++, STAT_NAME_COL);
        !           109:                outstr(pp, Buf, STAT_NAME_LEN);
        !           110:        }
        !           111: 
        !           112: # ifdef MONITOR
        !           113:        cgoto(pp, STAT_MON_ROW, STAT_LABEL_COL);
        !           114:        outstr(pp, "Monitor:", 8);
        !           115:        for (i = STAT_MON_ROW + 1, np = Monitor; np < End_monitor; np++) {
        !           116:                (void) sprintf(Buf, "%5.5s %-10.10s", " ", np->p_ident->i_name);
        !           117:                cgoto(pp, i++, STAT_NAME_COL);
        !           118:                outstr(pp, Buf, STAT_NAME_LEN);
        !           119:        }
        !           120: # endif MONITOR
        !           121: }
        !           122: 
        !           123: # ifndef CPUHOG
        !           124: look(pp)
        !           125: register PLAYER        *pp;
        !           126: {
        !           127:        register int    x, y;
        !           128: 
        !           129:        x = pp->p_x;
        !           130:        y = pp->p_y;
        !           131: 
        !           132:        check(pp, y - 1, x - 1);
        !           133:        check(pp, y - 1, x    );
        !           134:        check(pp, y - 1, x + 1);
        !           135:        check(pp, y    , x - 1);
        !           136:        check(pp, y    , x    );
        !           137:        check(pp, y    , x + 1);
        !           138:        check(pp, y + 1, x - 1);
        !           139:        check(pp, y + 1, x    );
        !           140:        check(pp, y + 1, x + 1);
        !           141: 
        !           142:        switch (pp->p_face) {
        !           143:          case LEFTS:
        !           144:                see(pp, LEFTS);
        !           145:                see(pp, ABOVE);
        !           146:                see(pp, BELOW);
        !           147:                break;
        !           148:          case RIGHT:
        !           149:                see(pp, RIGHT);
        !           150:                see(pp, ABOVE);
        !           151:                see(pp, BELOW);
        !           152:                break;
        !           153:          case ABOVE:
        !           154:                see(pp, ABOVE);
        !           155:                see(pp, LEFTS);
        !           156:                see(pp, RIGHT);
        !           157:                break;
        !           158:          case BELOW:
        !           159:                see(pp, BELOW);
        !           160:                see(pp, LEFTS);
        !           161:                see(pp, RIGHT);
        !           162:                break;
        !           163: # ifdef FLY
        !           164:          case FLYER:
        !           165:                break;
        !           166: # endif FLY
        !           167:        }
        !           168:        cgoto(pp, y, x);
        !           169: }
        !           170: 
        !           171: see(pp, face)
        !           172: register PLAYER        *pp;
        !           173: int            face;
        !           174: {
        !           175:        register char   *sp;
        !           176:        register int    y, x, i, cnt;
        !           177: 
        !           178:        x = pp->p_x;
        !           179:        y = pp->p_y;
        !           180: 
        !           181:        switch (face) {
        !           182:          case LEFTS:
        !           183:                sp = &Maze[y][x];
        !           184:                for (i = 0; See_over[*--sp]; i++)
        !           185:                        continue;
        !           186: 
        !           187:                if (i == 0)
        !           188:                        break;
        !           189: 
        !           190:                cnt = i;
        !           191:                x = pp->p_x - 1;
        !           192:                --y;
        !           193:                while (i--)
        !           194:                        check(pp, y, --x);
        !           195:                i = cnt;
        !           196:                x = pp->p_x - 1;
        !           197:                ++y;
        !           198:                while (i--)
        !           199:                        check(pp, y, --x);
        !           200:                i = cnt;
        !           201:                x = pp->p_x - 1;
        !           202:                ++y;
        !           203:                while (i--)
        !           204:                        check(pp, y, --x);
        !           205:                break;
        !           206:          case RIGHT:
        !           207:                sp = &Maze[y][++x];
        !           208:                for (i = 0; See_over[*sp++]; i++)
        !           209:                        continue;
        !           210: 
        !           211:                if (i == 0)
        !           212:                        break;
        !           213: 
        !           214:                cnt = i;
        !           215:                x = pp->p_x + 1;
        !           216:                --y;
        !           217:                while (i--)
        !           218:                        check(pp, y, ++x);
        !           219:                i = cnt;
        !           220:                x = pp->p_x + 1;
        !           221:                ++y;
        !           222:                while (i--)
        !           223:                        check(pp, y, ++x);
        !           224:                i = cnt;
        !           225:                x = pp->p_x + 1;
        !           226:                ++y;
        !           227:                while (i--)
        !           228:                        check(pp, y, ++x);
        !           229:                break;
        !           230:          case ABOVE:
        !           231:                sp = &Maze[--y][x];
        !           232:                if (!See_over[*sp])
        !           233:                        break;
        !           234:                do {
        !           235:                        --y;
        !           236:                        sp -= sizeof Maze[0];
        !           237:                        check(pp, y, x - 1);
        !           238:                        check(pp, y, x    );
        !           239:                        check(pp, y, x + 1);
        !           240:                } while (See_over[*sp]);
        !           241:                break;
        !           242:          case BELOW:
        !           243:                sp = &Maze[++y][x];
        !           244:                if (!See_over[*sp])
        !           245:                        break;
        !           246:                do {
        !           247:                        y++;
        !           248:                        sp += sizeof Maze[0];
        !           249:                        check(pp, y, x - 1);
        !           250:                        check(pp, y, x    );
        !           251:                        check(pp, y, x + 1);
        !           252:                } while (See_over[*sp]);
        !           253:                break;
        !           254:        }
        !           255: }
        !           256: 
        !           257: # else CPUHOG
        !           258: 
        !           259: look(pp)
        !           260: register PLAYER        *pp;
        !           261: {
        !           262:        switch (pp->p_face) {
        !           263:          case LEFTS:
        !           264:                lookquad2(pp, pp->p_y, pp->p_x);
        !           265:                lookquad3(pp, pp->p_y, pp->p_x);
        !           266:                break;
        !           267:          case RIGHT:
        !           268:                lookquad1(pp, pp->p_y, pp->p_x);
        !           269:                lookquad4(pp, pp->p_y, pp->p_x);
        !           270:                break;
        !           271:          case ABOVE:
        !           272:                lookquad3(pp, pp->p_y, pp->p_x);
        !           273:                lookquad4(pp, pp->p_y, pp->p_x);
        !           274:                break;
        !           275:          case BELOW:
        !           276:                lookquad1(pp, pp->p_y, pp->p_x);
        !           277:                lookquad2(pp, pp->p_y, pp->p_x);
        !           278:                break;
        !           279:        }
        !           280:        cgoto(pp, pp->p_y, pp->p_x);
        !           281: }
        !           282: # endif CPUHOG
        !           283: 
        !           284: check(pp, y, x)
        !           285: PLAYER *pp;
        !           286: int    y, x;
        !           287: {
        !           288:        register int    index;
        !           289:        register int    ch;
        !           290:        register PLAYER *rpp;
        !           291: 
        !           292:        index = y * sizeof Maze[0] + x;
        !           293:        ch = ((char *) Maze)[index];
        !           294:        if (ch != ((char *) pp->p_maze)[index]) {
        !           295:                rpp = pp;
        !           296:                cgoto(rpp, y, x);
        !           297:                if (x == rpp->p_x && y == rpp->p_y)
        !           298:                        outch(rpp, translate(ch));
        !           299:                else
        !           300:                        outch(rpp, ch);
        !           301:                ((char *) rpp->p_maze)[index] = ch;
        !           302:        }
        !           303: }
        !           304: 
        !           305: /*
        !           306:  * showstat
        !           307:  *     Update the status of players
        !           308:  */
        !           309: showstat(pp)
        !           310: register PLAYER        *pp;
        !           311: {
        !           312:        register PLAYER *np;
        !           313:        register int    y;
        !           314:        register char   c;
        !           315: 
        !           316:        y = STAT_PLAY_ROW + 1 + (pp - Player);
        !           317:        c = stat_char(pp);
        !           318: # ifdef MONITOR
        !           319:        for (np = Monitor; np < End_monitor; np++) {
        !           320:                cgoto(np, y, STAT_SCAN_COL);
        !           321:                outch(np, c);
        !           322:        }
        !           323: # endif MONITOR
        !           324:        for (np = Player; np < End_player; np++) {
        !           325:                cgoto(np, y, STAT_SCAN_COL);
        !           326:                outch(np, c);
        !           327:        }
        !           328: }
        !           329: 
        !           330: /*
        !           331:  * drawplayer:
        !           332:  *     Draw the player on the screen and show him to everyone who's scanning
        !           333:  *     unless he is cloaked.
        !           334:  */
        !           335: drawplayer(pp, draw)
        !           336: PLAYER *pp;
        !           337: FLAG   draw;
        !           338: {
        !           339:        register PLAYER *newp;
        !           340:        register int    x, y;
        !           341: 
        !           342:        x = pp->p_x;
        !           343:        y = pp->p_y;
        !           344:        Maze[y][x] = draw ? pp->p_face : pp->p_over;
        !           345: 
        !           346: # ifdef MONITOR
        !           347:        for (newp = Monitor; newp < End_monitor; newp++)
        !           348:                check(newp, y, x);
        !           349: # endif MONITOR
        !           350: 
        !           351:        for (newp = Player; newp < End_player; newp++) {
        !           352:                if (!draw || newp == pp) {
        !           353:                        check(newp, y, x);
        !           354:                        continue;
        !           355:                }
        !           356:                if (newp->p_scan == 0) {
        !           357:                        cgoto(newp, STAT_SCAN_ROW, STAT_VALUE_COL);
        !           358:                        outstr(newp, "   ", 3);
        !           359:                        newp->p_scan--;
        !           360:                        showstat(newp);
        !           361:                }
        !           362:                else if (newp->p_scan > 0) {
        !           363:                        if (pp->p_cloak < 0)
        !           364:                                check(newp, y, x);
        !           365:                        newp->p_scan--;
        !           366:                }
        !           367:        }
        !           368:        if (!draw || pp->p_cloak < 0)
        !           369:                return;
        !           370:        if (pp->p_cloak-- == 0) {
        !           371:                cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL);
        !           372:                outstr(pp, "   ", 3);
        !           373:                showstat(pp);
        !           374:        }
        !           375: }
        !           376: 
        !           377: message(pp, s)
        !           378: register PLAYER        *pp;
        !           379: char           *s;
        !           380: {
        !           381:        cgoto(pp, HEIGHT, 0);
        !           382:        outstr(pp, s, strlen(s));
        !           383:        ce(pp);
        !           384: }
        !           385: 
        !           386: /*
        !           387:  * translate:
        !           388:  *     Turn a charcter into the right direction character if we are
        !           389:  *     looking at the current player.
        !           390:  */
        !           391: translate(ch)
        !           392: char   ch;
        !           393: {
        !           394:        switch (ch) {
        !           395:          case LEFTS:
        !           396:                return '<';
        !           397:          case RIGHT:
        !           398:                return '>';
        !           399:          case ABOVE:
        !           400:                return '^';
        !           401:          case BELOW:
        !           402:                return 'v';
        !           403:        }
        !           404:        return ch;
        !           405: }

unix.superglobalmegacorp.com

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