Annotation of researchv10no/games/pacman/pacman.c, revision 1.1.1.1

1.1       root        1: /*
                      2: /* PACMAN  - written by Dave Nixon, AGS Computers Inc., July, 1981.
                      3: /*
                      4: /* Terminal handling for video games taken from aliens
                      5: /*      the original version  of aliens is from 
                      6: /*      Fall 1979                      Cambridge               Jude Miller
                      7: /*
                      8: /* Score keeping modified and general terminal handling (termcap routines
                      9: /* from UCB's ex) added by Rob Coben, BTL, June, 1980.
                     10: /*
                     11: /* If MSG is defined, the program uses the inter-process message facility
                     12: /* of UNIX/TS Augmented to optimize reading the tty while updating the
                     13: /* screen. Otherwise, the child process (reading the tty) writes
                     14: /* a temporary communications file, which the parent (updating the screen)
                     15: /* is constantly seeking to the beginning of and re-reading. (UGH!)
                     16: /* If your system has a non-blocking read (read-without-wait), it should
                     17: /* be implemented, and the child process could be dispensed with entirely.
                     18: */
                     19: #include <stdio.h>
                     20: #include       "pacdefs.h"
                     21:  
                     22: /*
                     23:  * global variables
                     24:  */
                     25: 
                     26: extern char
                     27:        *vs_cm;
                     28: 
                     29: extern int
                     30:        putch();
                     31: 
                     32: extern char
                     33:        *tgoto();
                     34: 
                     35: extern char
                     36:        message[];
                     37: 
                     38: extern char
                     39:        initbrd[BRDY][BRDX],
                     40:        display[BRDY][BRDX];
                     41: 
                     42: extern unsigned
                     43:        pscore;
                     44: 
                     45: extern struct pac
                     46:        monst[];
                     47: 
                     48: int    pacsymb = PACMAN,
                     49:        rounds,         /* time keeping mechanism */
                     50:        killflg,
                     51:        delay,
                     52:        potion,
                     53:        goldcnt,                /* no. of gold pieces remaining */
                     54:        potioncnt;
                     55: 
                     56: struct pac
                     57:        pac;
                     58: 
                     59: struct pac
                     60:        pacstart =
                     61: {
                     62:        PSTARTX,
                     63:        PSTARTY,
                     64:        DNULL,
                     65:        SLOW,
                     66:        FALSE
                     67: };
                     68: 
                     69: struct pac
                     70:        *pacptr = &pac;
                     71: 
                     72: main()
                     73: {
                     74:        register int tmp;               /* temp variables */
                     75:        register int pac_cnt;
                     76:        register int monstcnt;  /* monster number */
                     77:        struct pac *mptr;
                     78:        char gcnt[10];
                     79: 
                     80:        init();         /* global init */
                     81:        for (pac_cnt = MAXPAC; pac_cnt > 0; pac_cnt--)
                     82:        {
                     83: redraw:
                     84:                clr();
                     85:                SPLOT(0, 45, "SCORE: ");
                     86:                SPLOT(21, 45, "gold left = ");
                     87:                (void) sprintf(gcnt, "%6d", goldcnt);
                     88:                SPLOT(21, 57, gcnt);
                     89:                if (potion == TRUE)
                     90:                {
                     91:                        SPLOT(3, 45, "COUNTDOWN: ");
                     92:                };
                     93:                pacsymb = PACMAN;
                     94:                killflg = FALSE;
                     95:                (void) sprintf(message, "delay = %6d", delay);
                     96:                SPLOT(22, 45, message);
                     97:                /*
                     98:                 * PLOT maze
                     99:                 */
                    100:                for (tmp = 0; tmp < BRDY; tmp++)
                    101:                {
                    102:                        SPLOT(tmp, 0, &(display[tmp][0]));
                    103:                };
                    104:                /* initialize a pacman */
                    105:                pac = pacstart;
                    106:                PLOT(pacptr->ypos, pacptr->xpos, pacsymb);
                    107:                /* display remaining pacmen */
                    108:                for (tmp = 0; tmp < pac_cnt - 1; tmp++)
                    109:                {
                    110:                        PLOT(23, (MAXPAC * tmp), PACMAN);
                    111:                };
                    112:                /*
                    113:                 * Init. monsters
                    114:                 */
                    115:                for (mptr = &monst[0], monstcnt = 0; monstcnt < MAXMONSTER; mptr++, monstcnt++)
                    116:                {
                    117:                        mptr->xpos = MSTARTX + (2 * monstcnt);
                    118:                        mptr->ypos = MSTARTY;
                    119:                        mptr->speed = SLOW;
                    120:                        mptr->dirn = DNULL;
                    121:                        mptr->danger = FALSE;
                    122:                        mptr->stat = START;
                    123:                        PLOT(mptr->ypos, mptr->xpos, MONSTER);
                    124:                };
                    125:                rounds = 0;     /* timing mechanism */
                    126: 
                    127:                /* main game loop */
                    128:                do
                    129:                {
                    130:                        if (rounds++ % MSTARTINTVL == 0)
                    131:                        {
                    132:                                startmonst();
                    133:                        };
                    134:                        pacman();
                    135:                        if (killflg == TURKEY)
                    136:                                break;
                    137:                        for (monstcnt = 0; monstcnt < (MAXMONSTER / 2); monstcnt++)
                    138:                        {
                    139:                                monster(monstcnt);      /* next monster */
                    140:                        };
                    141:                        if (killflg == TURKEY)
                    142:                                break;
                    143:                        if (pacptr->speed == FAST)
                    144:                        {
                    145:                                pacman();
                    146:                                if (killflg == TURKEY)
                    147:                                        break;
                    148:                        };
                    149:                        for (monstcnt = (MAXMONSTER / 2); monstcnt < MAXMONSTER; monstcnt++)
                    150:                        {
                    151:                                monster(monstcnt);      /* next monster */
                    152:                        };
                    153:                        if (killflg == TURKEY)
                    154:                                break;
                    155:                        if (potion == TRUE)
                    156:                        {
                    157:                                (void) sprintf(message, "%2d%c", potioncnt,
                    158:                                        ((potioncnt == 10) ? BEEP : ' '));
                    159:                                SPLOT(3, 60, message);
                    160:                                if (--potioncnt <= 0)
                    161:                                {
                    162:                                        SPLOT(3, 45, "                        ");
                    163:                                        potion = FALSE;
                    164:                                        pacptr->speed = SLOW;
                    165:                                        pacptr->danger = FALSE;
                    166:                                        for (monstcnt = 0; monstcnt < MAXMONSTER; monstcnt++)
                    167:                                        {
                    168:                                                monst[monstcnt].danger = TRUE;
                    169:                                        };
                    170:                                };
                    171:                        };
                    172:                        update();       /* score display etc */
                    173:                        if (goldcnt <= 0)
                    174:                        {
                    175:                                reinit();
                    176:                                goto redraw;
                    177:                        };
                    178:                } while (killflg != TURKEY);
                    179:                SPLOT(5, 45, "YOU ARE BEING EATEN");
                    180:                SPLOT(6, 45, "THIS TAKES ABOUT 2 SECONDS");
                    181:                sleep(2);
                    182:        };
                    183:        SPLOT(8, 45, "THE MONSTERS ALWAYS TRIUMPH");
                    184:        SPLOT(9, 45, "IN THE END!");
                    185:        over();
                    186: }
                    187: 
                    188: pacman()
                    189: {
                    190:        register int sqtype;
                    191:        register int mcnt;
                    192:        register int tmpx, tmpy;
                    193:        int deltat;
                    194:        struct pac *mptr;
                    195: 
                    196:        /* pause; wait for the player to hit a key */
                    197:        for (deltat = delay; deltat > 0; deltat--);
                    198: 
                    199:        /* get instructions from player, but don't wait */
                    200:        poll(0);
                    201: 
                    202:        /* remember current pacman position */
                    203:        tmpx = pacptr->xpos;
                    204:        tmpy = pacptr->ypos;
                    205: 
                    206:        /* "eat" any gold */
                    207:        /* update display array to reflect what is on terminal */
                    208:        display[tmpy][tmpx] = VACANT;
                    209: 
                    210:        /* what next? */
                    211:        switch (pacptr->dirn)
                    212:        {
                    213:        case DUP:
                    214:                pacsymb = PUP;
                    215:                switch (sqtype = display[tmpy + UPINT][tmpx])
                    216:                {
                    217:                case GOLD:
                    218:                case VACANT:
                    219:                case CHOICE:
                    220:                case POTION:
                    221:                case TREASURE:
                    222: 
                    223:                        /* erase where the pacman went */
                    224:                        PLOT(tmpy, tmpx, VACANT);
                    225:                        pacptr->ypos += UPINT;
                    226:                        break;
                    227: 
                    228:                default:
                    229:                        pacptr->dirn = DNULL;
                    230:                        break;
                    231:                };
                    232:                break;
                    233:        case DDOWN:
                    234:                pacsymb = PDOWN;
                    235:                switch (sqtype = display[tmpy + DOWNINT][tmpx])
                    236:                {
                    237:                case GOLD:
                    238:                case VACANT:
                    239:                case CHOICE:
                    240:                case POTION:
                    241:                case TREASURE:
                    242: 
                    243:                        /* erase where the pacman went */
                    244:                        PLOT(tmpy, tmpx, VACANT);
                    245:                        pacptr->ypos += DOWNINT;
                    246:                        break;
                    247: 
                    248:                default:
                    249:                        pacptr->dirn = DNULL;
                    250:                        break;
                    251:                };
                    252:                break;
                    253:        case DLEFT:
                    254:                if(tmpx == 0)
                    255:                {
                    256:                        /* erase where the pacman went */
                    257:                        PLOT(tmpy, tmpx, VACANT);
                    258:                        pacptr->xpos = XWRAP;
                    259:                        sqtype = VACANT;
                    260:                        break;
                    261:                };
                    262:                pacsymb = PLEFT;
                    263:                switch (sqtype = display[tmpy][tmpx + LEFTINT])
                    264:                {
                    265:                case GOLD:
                    266:                case VACANT:
                    267:                case CHOICE:
                    268:                case POTION:
                    269:                case TREASURE:
                    270: 
                    271:                        /* erase where the pacman went */
                    272:                        PLOT(tmpy, tmpx, VACANT);
                    273:                        pacptr->xpos += LEFTINT;
                    274:                        break;
                    275:                
                    276:                default:
                    277:                        pacptr->dirn = DNULL;
                    278:                        break;
                    279:                };
                    280:                break;
                    281:        case DRIGHT:
                    282:                if(tmpx == XWRAP)
                    283:                {
                    284:                        /* erase where the pacman went */
                    285:                        PLOT(tmpy, tmpx, VACANT);
                    286:                        pacptr->xpos = 0;
                    287:                        sqtype = VACANT;
                    288:                        break;
                    289:                };
                    290:                pacsymb = PRIGHT;
                    291:                switch (sqtype = display[tmpy][tmpx + RIGHTINT])
                    292:                {
                    293:                case GOLD:
                    294:                case VACANT:
                    295:                case CHOICE:
                    296:                case POTION:
                    297:                case TREASURE:
                    298: 
                    299:                        /* erase where the pacman went */
                    300:                        PLOT(tmpy, tmpx, VACANT);
                    301:                        pacptr->xpos += RIGHTINT;
                    302:                        break;
                    303: 
                    304:                default:
                    305:                        pacptr->dirn = DNULL;
                    306:                        break;
                    307:                };
                    308:                break;
                    309:        };
                    310: 
                    311:        /* did the pacman get any points or eat a potion? */
                    312:        switch (sqtype)
                    313:        {
                    314:        case CHOICE:
                    315:        case GOLD:
                    316:                pscore++;
                    317:                goldcnt--;
                    318:                break;
                    319: 
                    320:        case TREASURE:
                    321:                pscore += TREASVAL;
                    322:                break;
                    323: 
                    324:        case POTION:
                    325:                SPLOT(3, 45, "COUNTDOWN: ");
                    326:                potion = TRUE;
                    327:                potioncnt = POTINTVL;
                    328:                pacptr->speed = FAST;
                    329:                pacptr->danger = TRUE;
                    330: 
                    331:                /* slow down monsters and make them harmless */
                    332:                mptr = &monst[0];
                    333:                for (mcnt = 0; mcnt < MAXMONSTER; mcnt++)
                    334:                {
                    335:                        if (mptr->stat == RUN)
                    336:                        {
                    337:                                mptr->speed = SLOW;
                    338:                                mptr->danger = FALSE;
                    339:                        };
                    340:                        mptr++;
                    341:                };
                    342:                break;
                    343:        };
                    344: 
                    345:        /* did the pacman run into a monster? */
                    346:        for (mptr = &monst[0], mcnt = 0; mcnt < MAXMONSTER; mptr++, mcnt++)
                    347:        {
                    348:                if ((mptr->xpos == pacptr->xpos) &&
                    349:                        (mptr->ypos == pacptr->ypos))
                    350:                {
                    351: 
                    352:                        killflg = dokill(mcnt);
                    353:                }
                    354:                else
                    355:                {
                    356:                        killflg = FALSE;
                    357:                };
                    358:        };
                    359:        if (killflg != TURKEY)
                    360:        {
                    361:                PLOT(pacptr->ypos, pacptr->xpos, pacsymb);
                    362:        };
                    363: }

unix.superglobalmegacorp.com

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