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

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

unix.superglobalmegacorp.com

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