Annotation of 43BSD/games/hunt/shots.c, revision 1.1.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: # include      <signal.h>
                     13: 
                     14: # define       PLUS_DELTA(x, max)      if (x < max) x++; else x--
                     15: # define       MINUS_DELTA(x, min)     if (x > min) x--; else x++
                     16: 
                     17: /*
                     18:  * moveshots:
                     19:  *     Move the shots already in the air, taking explosions into account
                     20:  */
                     21: moveshots()
                     22: {
                     23:        register BULLET *bp, *next;
                     24:        register PLAYER *pp;
                     25:        register int    x, y;
                     26:        register BULLET *blist;
                     27:        register int    i;
                     28: 
                     29:        rollexpl();
                     30:        if (Bullets == NULL)
                     31:                goto ret;
                     32: 
                     33:        /*
                     34:         * First we move through the bullet list BULSPD times, looking
                     35:         * for things we may have run into.  If we do run into
                     36:         * something, we set up the explosion and disappear, checking
                     37:         * for damage to any player who got in the way.
                     38:         */
                     39: 
                     40:        blist = Bullets;
                     41:        Bullets = NULL;
                     42:        for (bp = blist; bp != NULL; bp = next) {
                     43:                next = bp->b_next;
                     44:                x = bp->b_x;
                     45:                y = bp->b_y;
                     46:                Maze[y][x] = bp->b_over;
                     47:                for (pp = Player; pp < End_player; pp++)
                     48:                        check(pp, y, x);
                     49: # ifdef MONITOR
                     50:                for (pp = Monitor; pp < End_monitor; pp++)
                     51:                        check(pp, y, x);
                     52: # endif MONITOR
                     53: 
                     54:                for (i = 0; i < BULSPD; i++) {
                     55:                        if (bp->b_expl)
                     56:                                break;
                     57: 
                     58:                        x = bp->b_x;
                     59:                        y = bp->b_y;
                     60: 
                     61:                        switch (bp->b_face) {
                     62:                          case LEFTS:
                     63:                                x--;
                     64:                                break;
                     65:                          case RIGHT:
                     66:                                x++;
                     67:                                break;
                     68:                          case ABOVE:
                     69:                                y--;
                     70:                                break;
                     71:                          case BELOW:
                     72:                                y++;
                     73:                                break;
                     74:                        }
                     75: 
                     76:                        switch (Maze[y][x]) {
                     77:                          case SHOT:
                     78:                                if (rand_num(100) < 5) {
                     79:                                        zapshot(Bullets, bp);
                     80:                                        zapshot(next, bp);
                     81:                                }
                     82:                                break;
                     83:                          case GRENADE:
                     84:                                if (rand_num(100) < 10) {
                     85:                                        zapshot(Bullets, bp);
                     86:                                        zapshot(next, bp);
                     87:                                }
                     88:                                break;
                     89: # ifdef        REFLECT
                     90:                          case WALL4:   /* reflecting walls */
                     91:                                switch (bp->b_face) {
                     92:                                  case LEFTS:
                     93:                                        bp->b_face = BELOW;
                     94:                                        break;
                     95:                                  case RIGHT:
                     96:                                        bp->b_face = ABOVE;
                     97:                                        break;
                     98:                                  case ABOVE:
                     99:                                        bp->b_face = RIGHT;
                    100:                                        break;
                    101:                                  case BELOW:
                    102:                                        bp->b_face = LEFTS;
                    103:                                        break;
                    104:                                }
                    105:                                Maze[y][x] = WALL5;
                    106: # ifdef MONITOR
                    107:                                for (pp = Monitor; pp < End_monitor; pp++)
                    108:                                        check(pp, y, x);
                    109: # endif MONITOR
                    110:                                break;
                    111:                          case WALL5:
                    112:                                switch (bp->b_face) {
                    113:                                  case LEFTS:
                    114:                                        bp->b_face = ABOVE;
                    115:                                        break;
                    116:                                  case RIGHT:
                    117:                                        bp->b_face = BELOW;
                    118:                                        break;
                    119:                                  case ABOVE:
                    120:                                        bp->b_face = LEFTS;
                    121:                                        break;
                    122:                                  case BELOW:
                    123:                                        bp->b_face = RIGHT;
                    124:                                        break;
                    125:                                }
                    126:                                Maze[y][x] = WALL4;
                    127: # ifdef MONITOR
                    128:                                for (pp = Monitor; pp < End_monitor; pp++)
                    129:                                        check(pp, y, x);
                    130: # endif MONITOR
                    131:                                break;
                    132: # endif REFLECT
                    133: # ifdef RANDOM
                    134:                          case DOOR:
                    135:                                switch (rand_num(4)) {
                    136:                                  case 0:
                    137:                                        bp->b_face = ABOVE;
                    138:                                        break;
                    139:                                  case 1:
                    140:                                        bp->b_face = BELOW;
                    141:                                        break;
                    142:                                  case 2:
                    143:                                        bp->b_face = LEFTS;
                    144:                                        break;
                    145:                                  case 3:
                    146:                                        bp->b_face = RIGHT;
                    147:                                        break;
                    148:                                }
                    149:                                break;
                    150: # endif RANDOM
                    151:                          case LEFTS:
                    152:                          case RIGHT:
                    153:                          case BELOW:
                    154:                          case ABOVE:
                    155: # ifdef FLY
                    156:                          case FLYER:
                    157: # endif FLY
                    158:                                /*
                    159:                                 * give the person a chance to catch a
                    160:                                 * grenade if s/he is facing it
                    161:                                 */
                    162:                                if (rand_num(100) < 10
                    163:                                    && opposite(bp->b_face, Maze[y][x])) {
                    164:                                        if (bp->b_owner != NULL)
                    165:                                                message(bp->b_owner,
                    166:                                                "Your charge was absorbed!");
                    167:                                        pp = play_at(y, x);
                    168:                                        pp->p_ammo += bp->b_charge;
                    169:                                        (void) sprintf(Buf,
                    170:                                                "Absorbed charge (good shield!)");
                    171:                                        message(pp, Buf);
                    172:                                        free((char *) bp);
                    173:                                        (void) sprintf(Buf, "%3d", pp->p_ammo);
                    174:                                        cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
                    175:                                        outstr(pp, Buf, 3);
                    176:                                        goto next_bullet;
                    177:                                }
                    178:                                /* FALLTHROUGH */
                    179: # ifndef RANDOM
                    180:                          case DOOR:
                    181: # endif RANDOM
                    182:                          case WALL1:
                    183:                          case WALL2:
                    184:                          case WALL3:
                    185:                                bp->b_expl = TRUE;
                    186:                                break;
                    187:                        }
                    188: 
                    189:                        bp->b_x = x;
                    190:                        bp->b_y = y;
                    191:                }
                    192: 
                    193:                bp->b_next = Bullets;
                    194:                Bullets = bp;
                    195: next_bullet:
                    196:                ;
                    197:        }
                    198: 
                    199:        blist = Bullets;
                    200:        Bullets = NULL;
                    201:        for (bp = blist; bp != NULL; bp = next) {
                    202:                next = bp->b_next;
                    203:                if (!bp->b_expl) {
                    204:                        save_bullet(bp);
                    205: # ifdef MONITOR
                    206:                        for (pp = Monitor; pp < End_monitor; pp++)
                    207:                                check(pp, bp->b_y, bp->b_x);
                    208: # endif MONITOR
                    209:                        continue;
                    210:                }
                    211: 
                    212:                chkshot(bp);
                    213:                free((char *) bp);
                    214:        }
                    215:        for (pp = Player; pp < End_player; pp++)
                    216:                Maze[pp->p_y][pp->p_x] = pp->p_face;
                    217: ret:
                    218:        for (pp = Player; pp < End_player; pp++) {
                    219: # ifdef FLY
                    220:                if (pp->p_flying >= 0) {
                    221:                        Maze[pp->p_y][pp->p_x] = pp->p_over;
                    222:                        x = pp->p_x + pp->p_flyx;
                    223:                        y = pp->p_y + pp->p_flyy;
                    224:                        if (x < 1) {
                    225:                                x = 1 - x;
                    226:                                pp->p_flyx = -pp->p_flyx;
                    227:                        }
                    228:                        else if (x > WIDTH - 2) {
                    229:                                x = (WIDTH - 2) - (x - (WIDTH - 2));
                    230:                                pp->p_flyx = -pp->p_flyx;
                    231:                        }
                    232:                        if (y < 1) {
                    233:                                y = 1 - y;
                    234:                                pp->p_flyy = -pp->p_flyy;
                    235:                        }
                    236:                        else if (y > HEIGHT - 2) {
                    237:                                y = (HEIGHT - 2) - (y - (HEIGHT - 2));
                    238:                                pp->p_flyy = -pp->p_flyy;
                    239:                        }
                    240: again:                 switch (Maze[y][x]) {
                    241:                          case LEFTS:
                    242:                          case RIGHT:
                    243:                          case ABOVE:
                    244:                          case BELOW:
                    245:                          case FLYER:
                    246:                                switch (rand_num(4)) {
                    247:                                  case 0:
                    248:                                        PLUS_DELTA(x, WIDTH - 2);
                    249:                                        break;
                    250:                                  case 1:
                    251:                                        MINUS_DELTA(x, 1);
                    252:                                        break;
                    253:                                  case 2:
                    254:                                        PLUS_DELTA(y, HEIGHT - 2);
                    255:                                        break;
                    256:                                  case 3:
                    257:                                        MINUS_DELTA(y, 1);
                    258:                                        break;
                    259:                                }
                    260:                                goto again;
                    261:                          case WALL1:
                    262:                          case WALL2:
                    263:                          case WALL3:
                    264: # ifdef        REFLECT
                    265:                          case WALL4:
                    266:                          case WALL5:
                    267: # endif REFLECT
                    268: # ifdef        RANDOM
                    269:                          case DOOR:
                    270: # endif        RANDOM
                    271:                                if (pp->p_flying == 0)
                    272:                                        pp->p_flying++;
                    273:                                break;
                    274:                          case MINE:
                    275:                                checkdam(pp, NULL, NULL, MINDAM, MINE);
                    276:                                Maze[y][x] = SPACE;
                    277:                                break;
                    278:                          case GMINE:
                    279:                                checkdam(pp, NULL, NULL, MINDAM, GMINE);
                    280:                                checkdam(pp, NULL, NULL, MINDAM, GMINE);
                    281:                                Maze[y][x] = SPACE;
                    282:                                break;
                    283:                        }
                    284:                        pp->p_y = y;
                    285:                        pp->p_x = x;
                    286:                        pp->p_over = Maze[y][x];
                    287:                        if (pp->p_flying-- == 0) {
                    288:                                checkdam(pp, NULL, NULL,
                    289:                                        rand_num(pp->p_damage / 5), FALL);
                    290:                                rand_face(pp);
                    291:                                showstat(pp);
                    292:                        }
                    293:                        Maze[y][x] = pp->p_face;
                    294:                        showexpl(y, x, pp->p_face);
                    295:                }
                    296: # endif FLY
                    297:                sendcom(pp, REFRESH);   /* Flush out the explosions */
                    298:                look(pp);
                    299:                sendcom(pp, REFRESH);
                    300:        }
                    301: # ifdef MONITOR
                    302:        for (pp = Monitor; pp < End_monitor; pp++)
                    303:                sendcom(pp, REFRESH);
                    304: # endif MONITOR
                    305: 
                    306: # ifdef CONSTANT_MOVE
                    307:        if (Bullets != NULL) {
                    308:                bul_alarm(1);
                    309:                return;
                    310:        }
                    311:        for (i = 0; i < EXPLEN; i++)
                    312:                if (Expl[i] != NULL) {
                    313:                        bul_alarm(1);
                    314:                        return;
                    315:                }
                    316:        bul_alarm(0);
                    317: # endif CONSTANT_MOVE
                    318: 
                    319:        return;
                    320: }
                    321: 
                    322: save_bullet(bp)
                    323: register BULLET        *bp;
                    324: {
                    325:        bp->b_over = Maze[bp->b_y][bp->b_x];
                    326:        switch (bp->b_over) {
                    327:          case SHOT:
                    328:          case GRENADE:
                    329:          case SATCHEL:
                    330:          case BOMB:
                    331: # ifdef OOZE
                    332:          case SLIME:
                    333: # ifdef VOLCANO
                    334:          case LAVA:
                    335: # endif VOLCANO
                    336: # endif OOZE
                    337:                find_under(Bullets, bp);
                    338:                break;
                    339:        }
                    340: 
                    341:        switch (bp->b_over) {
                    342:          case LEFTS:
                    343:          case RIGHT:
                    344:          case ABOVE:
                    345:          case BELOW:
                    346: # ifdef FLY
                    347:          case FLYER:
                    348: # endif FLY
                    349:                mark_player(bp);
                    350:                break;
                    351:                
                    352:          default:
                    353:                Maze[bp->b_y][bp->b_x] = bp->b_type;
                    354:                break;
                    355:        }
                    356: 
                    357:        bp->b_next = Bullets;
                    358:        Bullets = bp;
                    359: }
                    360: 
                    361: /*
                    362:  * chkshot
                    363:  *     Handle explosions
                    364:  */
                    365: chkshot(bp)
                    366: register BULLET        *bp;
                    367: {
                    368:        register int    y, x;
                    369:        register int    dy, dx, absdy;
                    370:        register int    delta, damage;
                    371:        register char   expl;
                    372:        register PLAYER *pp;
                    373: 
                    374:        switch (bp->b_type) {
                    375:          case SHOT:
                    376:          case MINE:
                    377:                delta = 0;
                    378:                break;
                    379:          case GRENADE:
                    380:          case GMINE:
                    381:                delta = 1;
                    382:                break;
                    383:          case SATCHEL:
                    384:                delta = 2;
                    385:                break;
                    386:          case BOMB:
                    387:                delta = 3;
                    388:                break;
                    389: # ifdef        OOZE
                    390:          case SLIME:
                    391: # ifdef VOLCANO
                    392:          case LAVA:
                    393: # endif VOLCANO
                    394:                chkslime(bp);
                    395:                return;
                    396: # endif        OOZE
                    397:        }
                    398:        for (y = bp->b_y - delta; y <= bp->b_y + delta; y++) {
                    399:                if (y < 0 || y >= HEIGHT)
                    400:                        continue;
                    401:                dy = y - bp->b_y;
                    402:                absdy = (dy < 0) ? -dy : dy;
                    403:                for (x = bp->b_x - delta; x <= bp->b_x + delta; x++) {
                    404:                        if (x < 0 || x >= WIDTH)
                    405:                                continue;
                    406:                        dx = x - bp->b_x;
                    407:                        if (dx == 0)
                    408:                                expl = (dy == 0) ? '*' : '|';
                    409:                        else if (dy == 0)
                    410:                                expl = '-';
                    411:                        else if (dx == dy)
                    412:                                expl = '\\';
                    413:                        else if (dx == -dy)
                    414:                                expl = '/';
                    415:                        else
                    416:                                expl = '*';
                    417:                        showexpl(y, x, expl);
                    418:                        switch (Maze[y][x]) {
                    419:                          case LEFTS:
                    420:                          case RIGHT:
                    421:                          case ABOVE:
                    422:                          case BELOW:
                    423: # ifdef FLY
                    424:                          case FLYER:
                    425: # endif FLY
                    426:                                if (dx < 0)
                    427:                                        dx = -dx;
                    428:                                if (absdy > dx)
                    429:                                        damage = delta - absdy + 1;
                    430:                                else
                    431:                                        damage = delta - dx + 1;
                    432:                                pp = play_at(y, x);
                    433:                                while (damage-- > 0)
                    434:                                        checkdam(pp, bp->b_owner, bp->b_score,
                    435:                                                MINDAM, bp->b_type);
                    436:                                break;
                    437:                          case GMINE:
                    438:                          case MINE:
                    439:                                add_shot((Maze[y][x] == GMINE) ?
                    440:                                        GRENADE : SHOT,
                    441:                                        y, x, LEFTS,
                    442:                                        (Maze[y][x] == GMINE) ?
                    443:                                        GRENREQ : BULREQ,
                    444:                                        (PLAYER *) NULL, TRUE, SPACE);
                    445:                                Maze[y][x] = SPACE;
                    446:                                break;
                    447:                        }
                    448:                }
                    449:        }
                    450: }
                    451: 
                    452: # ifdef        OOZE
                    453: /*
                    454:  * chkslime:
                    455:  *     handle slime shot exploding
                    456:  */
                    457: chkslime(bp)
                    458: register BULLET        *bp;
                    459: {
                    460:        register BULLET *nbp;
                    461: 
                    462:        switch (Maze[bp->b_y][bp->b_x]) {
                    463:          case WALL1:
                    464:          case WALL2:
                    465:          case WALL3:
                    466: # ifdef        REFLECT
                    467:          case WALL4:
                    468:          case WALL5:
                    469: # endif REFLECT
                    470: # ifdef        RANDOM
                    471:          case DOOR:
                    472: # endif        RANDOM
                    473:                switch (bp->b_face) {
                    474:                  case LEFTS:
                    475:                        bp->b_x++;
                    476:                        break;
                    477:                  case RIGHT:
                    478:                        bp->b_x--;
                    479:                        break;
                    480:                  case ABOVE:
                    481:                        bp->b_y++;
                    482:                        break;
                    483:                  case BELOW:
                    484:                        bp->b_y--;
                    485:                        break;
                    486:                }
                    487:                break;
                    488:        }
                    489:        nbp = (BULLET *) malloc(sizeof (BULLET));
                    490:        *nbp = *bp;
                    491: # ifdef VOLCANO
                    492:        moveslime(nbp, nbp->b_type == SLIME ? SLIMESPEED : LAVASPEED);
                    493: # else VOLCANO
                    494:        moveslime(nbp, SLIMESPEED);
                    495: # endif VOLCANO
                    496: }
                    497: 
                    498: /*
                    499:  * moveslime:
                    500:  *     move the given slime shot speed times and add it back if
                    501:  *     it hasn't fizzled yet
                    502:  */
                    503: moveslime(bp, speed)
                    504: register BULLET        *bp;
                    505: register int   speed;
                    506: {
                    507:        register int    i, j, dirmask, count;
                    508:        register PLAYER *pp;
                    509:        register BULLET *nbp;
                    510: 
                    511:        if (speed == 0) {
                    512:                if (bp->b_charge <= 0)
                    513:                        free((char *) bp);
                    514:                else
                    515:                        save_bullet(bp);
                    516:                return;
                    517:        }
                    518: 
                    519: # ifdef VOLCANO
                    520:        showexpl(bp->b_y, bp->b_x, bp->b_type == LAVA ? LAVA : '*');
                    521: # else VOLCANO
                    522:        showexpl(bp->b_y, bp->b_x, '*');
                    523: # endif VOLCANO
                    524:        switch (Maze[bp->b_y][bp->b_x]) {
                    525:          case LEFTS:
                    526:          case RIGHT:
                    527:          case ABOVE:
                    528:          case BELOW:
                    529: # ifdef FLY
                    530:          case FLYER:
                    531: # endif FLY
                    532:                pp = play_at(bp->b_y, bp->b_x);
                    533:                message(pp, "You've been slimed.");
                    534:                checkdam(pp, bp->b_owner, bp->b_score, MINDAM, bp->b_type);
                    535:                break;
                    536:        }
                    537: 
                    538:        if (--bp->b_charge <= 0) {
                    539:                free((char *) bp);
                    540:                return;
                    541:        }
                    542: 
                    543:        dirmask = 0;
                    544:        count = 0;
                    545:        switch (bp->b_face) {
                    546:          case LEFTS:
                    547:                if (!iswall(bp->b_y, bp->b_x - 1))
                    548:                        dirmask |= WEST, count++;
                    549:                if (!iswall(bp->b_y - 1, bp->b_x))
                    550:                        dirmask |= NORTH, count++;
                    551:                if (!iswall(bp->b_y + 1, bp->b_x))
                    552:                        dirmask |= SOUTH, count++;
                    553:                if (dirmask == 0)
                    554:                        if (!iswall(bp->b_y, bp->b_x + 1))
                    555:                                dirmask |= EAST, count++;
                    556:                break;
                    557:          case RIGHT:
                    558:                if (!iswall(bp->b_y, bp->b_x + 1))
                    559:                        dirmask |= EAST, count++;
                    560:                if (!iswall(bp->b_y - 1, bp->b_x))
                    561:                        dirmask |= NORTH, count++;
                    562:                if (!iswall(bp->b_y + 1, bp->b_x))
                    563:                        dirmask |= SOUTH, count++;
                    564:                if (dirmask == 0)
                    565:                        if (!iswall(bp->b_y, bp->b_x - 1))
                    566:                                dirmask |= WEST, count++;
                    567:                break;
                    568:          case ABOVE:
                    569:                if (!iswall(bp->b_y - 1, bp->b_x))
                    570:                        dirmask |= NORTH, count++;
                    571:                if (!iswall(bp->b_y, bp->b_x - 1))
                    572:                        dirmask |= WEST, count++;
                    573:                if (!iswall(bp->b_y, bp->b_x + 1))
                    574:                        dirmask |= EAST, count++;
                    575:                if (dirmask == 0)
                    576:                        if (!iswall(bp->b_y + 1, bp->b_x))
                    577:                                dirmask |= SOUTH, count++;
                    578:                break;
                    579:          case BELOW:
                    580:                if (!iswall(bp->b_y + 1, bp->b_x))
                    581:                        dirmask |= SOUTH, count++;
                    582:                if (!iswall(bp->b_y, bp->b_x - 1))
                    583:                        dirmask |= WEST, count++;
                    584:                if (!iswall(bp->b_y, bp->b_x + 1))
                    585:                        dirmask |= EAST, count++;
                    586:                if (dirmask == 0)
                    587:                        if (!iswall(bp->b_y - 1, bp->b_x))
                    588:                                dirmask |= NORTH, count++;
                    589:                break;
                    590:        }
                    591:        if (count == 0) {
                    592:                /*
                    593:                 * No place to go.  Just sit here for a while and wait
                    594:                 * for adjacent squares to clear out.
                    595:                 */
                    596:                save_bullet(bp);
                    597:                return;
                    598:        }
                    599:        if (bp->b_charge < count) {
                    600:                /* Only bp->b_charge paths may be taken */
                    601:                while (count > bp->b_charge) {
                    602:                        if (dirmask & WEST)
                    603:                                dirmask &= ~WEST;
                    604:                        else if (dirmask & EAST)
                    605:                                dirmask &= ~EAST;
                    606:                        else if (dirmask & NORTH)
                    607:                                dirmask &= ~NORTH;
                    608:                        else if (dirmask & SOUTH)
                    609:                                dirmask &= ~SOUTH;
                    610:                        count--;
                    611:                }
                    612:        }
                    613: 
                    614:        i = bp->b_charge / count;
                    615:        j = bp->b_charge % count;
                    616:        if (dirmask & WEST) {
                    617:                count--;
                    618:                nbp = create_shot(bp->b_type, bp->b_y, bp->b_x - 1, LEFTS,
                    619:                        i, bp->b_owner, bp->b_score, TRUE, SPACE);
                    620:                moveslime(nbp, speed - 1);
                    621:        }
                    622:        if (dirmask & EAST) {
                    623:                count--;
                    624:                nbp = create_shot(bp->b_type, bp->b_y, bp->b_x + 1, RIGHT,
                    625:                        (count < j) ? i + 1 : i, bp->b_owner, bp->b_score,
                    626:                        TRUE, SPACE);
                    627:                moveslime(nbp, speed - 1);
                    628:        }
                    629:        if (dirmask & NORTH) {
                    630:                count--;
                    631:                nbp = create_shot(bp->b_type, bp->b_y - 1, bp->b_x, ABOVE,
                    632:                        (count < j) ? i + 1 : i, bp->b_owner, bp->b_score,
                    633:                        TRUE, SPACE);
                    634:                moveslime(nbp, speed - 1);
                    635:        }
                    636:        if (dirmask & SOUTH) {
                    637:                count--;
                    638:                nbp = create_shot(bp->b_type, bp->b_y + 1, bp->b_x, BELOW,
                    639:                        (count < j) ? i + 1 : i, bp->b_owner, bp->b_score,
                    640:                        TRUE, SPACE);
                    641:                moveslime(nbp, speed - 1);
                    642:        }
                    643: 
                    644:        free((char *) bp);
                    645: }
                    646: 
                    647: /*
                    648:  * iswall:
                    649:  *     returns whether the given location is a wall
                    650:  */
                    651: iswall(y, x)
                    652: register int   y, x;
                    653: {
                    654:        if (y < 0 || x < 0 || y >= HEIGHT || x >= WIDTH)
                    655:                return TRUE;
                    656:        switch (Maze[y][x]) {
                    657:          case WALL1:
                    658:          case WALL2:
                    659:          case WALL3:
                    660: # ifdef        REFLECT
                    661:          case WALL4:
                    662:          case WALL5:
                    663: # endif        REFLECT
                    664: # ifdef        RANDOM
                    665:          case DOOR:
                    666: # endif        RANDOM
                    667: # ifdef VOLCANO
                    668:          case LAVA:
                    669: # endif VOLCANO
                    670:                return TRUE;
                    671:        }
                    672:        return FALSE;
                    673: }
                    674: # endif        OOZE
                    675: 
                    676: /*
                    677:  * zapshot:
                    678:  *     Take a shot out of the air.
                    679:  */
                    680: zapshot(blist, obp)
                    681: register BULLET        *blist, *obp;
                    682: {
                    683:        register BULLET *bp;
                    684:        register FLAG   explode;
                    685: 
                    686:        explode = FALSE;
                    687:        for (bp = blist; bp != NULL; bp = bp->b_next) {
                    688:                if (bp->b_x != obp->b_x || bp->b_y != obp->b_y)
                    689:                        continue;
                    690:                if (bp->b_face == obp->b_face)
                    691:                        continue;
                    692:                explode = TRUE;
                    693:                break;
                    694:        }
                    695:        if (!explode)
                    696:                return;
                    697:        explshot(blist, obp->b_y, obp->b_x);
                    698: }
                    699: 
                    700: /*
                    701:  * explshot -
                    702:  *     Make all shots at this location blow up
                    703:  */
                    704: explshot(blist, y, x)
                    705: register BULLET        *blist;
                    706: register int   y, x;
                    707: {
                    708:        register BULLET *bp;
                    709: 
                    710:        for (bp = blist; bp != NULL; bp = bp->b_next)
                    711:                if (bp->b_x == x && bp->b_y == y) {
                    712:                        bp->b_expl = TRUE;
                    713:                        if (bp->b_owner != NULL)
                    714:                                message(bp->b_owner, "Shot intercepted");
                    715:                }
                    716: }
                    717: 
                    718: /*
                    719:  * play_at:
                    720:  *     Return a pointer to the player at the given location
                    721:  */
                    722: PLAYER *
                    723: play_at(y, x)
                    724: register int   y, x;
                    725: {
                    726:        register PLAYER *pp;
                    727: 
                    728:        for (pp = Player; pp < End_player; pp++)
                    729:                if (pp->p_x == x && pp->p_y == y)
                    730:                        return pp;
                    731:        fprintf(stderr, "driver: couldn't find player at (%d,%d)\n", x, y);
                    732:        abort();
                    733:        /* NOTREACHED */
                    734: }
                    735: 
                    736: /*
                    737:  * opposite:
                    738:  *     Return TRUE if the bullet direction faces the opposite direction
                    739:  *     of the player in the maze
                    740:  */
                    741: opposite(face, dir)
                    742: int    face;
                    743: char   dir;
                    744: {
                    745:        switch (face) {
                    746:          case LEFTS:
                    747:                return (dir == RIGHT);
                    748:          case RIGHT:
                    749:                return (dir == LEFTS);
                    750:          case ABOVE:
                    751:                return (dir == BELOW);
                    752:          case BELOW:
                    753:                return (dir == ABOVE);
                    754:          default:
                    755:                return FALSE;
                    756:        }
                    757: }
                    758: 
                    759: /*
                    760:  * is_bullet:
                    761:  *     Is there a bullet at the given coordinates?  If so, return
                    762:  *     a pointer to the bullet, otherwise return NULL
                    763:  */
                    764: BULLET *
                    765: is_bullet(y, x)
                    766: register int   y, x;
                    767: {
                    768:        register BULLET *bp;
                    769: 
                    770:        for (bp = Bullets; bp != NULL; bp = bp->b_next)
                    771:                if (bp->b_y == y && bp->b_x == x)
                    772:                        return bp;
                    773:        return NULL;
                    774: }
                    775: 
                    776: /*
                    777:  * fixshots:
                    778:  *     change the underlying character of the shots at a location
                    779:  *     to the given character.
                    780:  */
                    781: fixshots(y, x, over)
                    782: register int   y, x;
                    783: char           over;
                    784: {
                    785:        register BULLET *bp;
                    786: 
                    787:        for (bp = Bullets; bp != NULL; bp = bp->b_next)
                    788:                if (bp->b_y == y && bp->b_x == x)
                    789:                        bp->b_over = over;
                    790: }
                    791: 
                    792: /*
                    793:  * find_under:
                    794:  *     find the underlying character for a bullet when it lands
                    795:  *     on another bullet.
                    796:  */
                    797: find_under(blist, bp)
                    798: register BULLET        *blist, *bp;
                    799: {
                    800:        register BULLET *nbp;
                    801: 
                    802:        for (nbp = blist; nbp != NULL; nbp = nbp->b_next)
                    803:                if (bp->b_y == nbp->b_y && bp->b_x == nbp->b_x) {
                    804:                        bp->b_over = nbp->b_over;
                    805:                        break;
                    806:                }
                    807: }
                    808: 
                    809: /*
                    810:  * mark_player:
                    811:  *     mark a player as under a shot
                    812:  */
                    813: mark_player(bp)
                    814: register BULLET        *bp;
                    815: {
                    816:        register PLAYER *pp;
                    817: 
                    818:        for (pp = Player; pp < End_player; pp++)
                    819:                if (pp->p_y == bp->b_y && pp->p_x == bp->b_x) {
                    820:                        pp->p_undershot = TRUE;
                    821:                        break;
                    822:                }
                    823: }

unix.superglobalmegacorp.com

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