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

unix.superglobalmegacorp.com

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