Annotation of researchv9/jtools/src/demo/pacman/main.c, revision 1.1

1.1     ! root        1: /*----------------------------------------------------------------------*/
        !             2: /*                                                                     */
        !             3: /*     PACMAN for BBN BitGraphs                                        */
        !             4: /*                                                                     */
        !             5: /*               File: main.c68                                        */
        !             6: /*           Contents: controlling and utility routines                */
        !             7: /*             Author: Bob Brown (rlb)                                 */
        !             8: /*                     Purdue CS                                       */
        !             9: /*               Date: May, 1982                                       */
        !            10: /*        Description: routines for setting up and controlling the     */
        !            11: /*                     game, plus miscellaneous utilities.             */
        !            12: /*                                                                     */
        !            13: /*----------------------------------------------------------------------*/
        !            14: 
        !            15: #include "style.h"
        !            16: #include "pacman.h"
        !            17: #include "host.h"
        !            18: 
        !            19: /*
        !            20: ** Instances of global variables not defined elsewhere
        !            21: */
        !            22: char   *Board[];
        !            23: bool   Abort;
        !            24: int    Dotsrem;
        !            25: int    Game;
        !            26: long   Highscore[MAXGAMES];
        !            27: int    Monbase;                /* Base scheduler delay for monsters */
        !            28: bool   Monseeking;             /* TRUE=>they know where he is */
        !            29: int    Monvalue;               /* value of captured monster */
        !            30: bool   Newgame;
        !            31: int    Pacmen;                 /* Number of Pacman remaining */
        !            32: bool   Running;
        !            33: long   Score;
        !            34: long   Nextbonus;
        !            35: bool   Silent;
        !            36: int    Timedelay;
        !            37: int    Wave;
        !            38: int    clock;
        !            39: int    Freeze;                 /* true if game frozen */
        !            40: 
        !            41: /*
        !            42: **  Game parameters
        !            43: */
        !            44: int    Seekprob;
        !            45: int    Seekinc;
        !            46: 
        !            47: /*
        !            48: ** main - game logic control.
        !            49: **
        !            50: **  contortions are because there's no exit().
        !            51: */
        !            52: extern short Bits24[], Bits40[];
        !            53: Bitmap Bitmap24;
        !            54: Bitmap Bitmap40;
        !            55: 
        !            56: main(argc,argv)
        !            57: {
        !            58:        request(KBD|ALARM|MOUSE);
        !            59:        mousemotion();
        !            60:        initdisplay(argc,argv);
        !            61:        Bitmap24 = ToBitmap(Bits24,30, 0,0,240,24);
        !            62:        Bitmap40 = ToBitmap(Bits40,130, 0,0,1040,40);
        !            63:        init();
        !            64:        Running = TRUE;
        !            65:        Freeze = FALSE;
        !            66:        retxy(1);
        !            67:        /*
        !            68:        ** For each game played...
        !            69:        */
        !            70:        alarm(1);
        !            71:        while ( Running ) {
        !            72:                /*
        !            73:                ** For each new wave...
        !            74:                */
        !            75:                newgame();
        !            76:                while ( Pacmen > 0 && Running ) {
        !            77:                        newwave();
        !            78:                        /*
        !            79:                        ** For each game scan...
        !            80:                        */
        !            81:                        while ( Dotsrem > 0 ) {
        !            82:                                /*
        !            83:                                ** If the Pacman died, start a new one.
        !            84:                                */
        !            85:                                if ( !Pacman.alive ) {
        !            86:                                        addmen(-1);
        !            87:                                        if ( Pacmen <= 0 )
        !            88:                                                break;
        !            89:                                        elinit();
        !            90:                                        pacinit();
        !            91:                                        moninit();
        !            92:                                        fruitinit(FALSE);
        !            93:                                }
        !            94:                                if (own()&ALARM) {
        !            95:                                        clock++;
        !            96:                                        alarm(1);
        !            97:                                }
        !            98:                                poll();
        !            99:                                if ( Abort || Newgame )
        !           100:                                        break;
        !           101:                                if(!Freeze)
        !           102:                                        elpoll();
        !           103:                        }
        !           104:                        soundoff();
        !           105:                        if ( Abort || Newgame )
        !           106:                                break;
        !           107:                        paccomp();
        !           108:                        moncomp();
        !           109:                        fruitcomp();
        !           110:                        soundoff();
        !           111:                }
        !           112:                alarm(300);
        !           113:                while (kbdchar()!=-1);
        !           114:                wait(ALARM|KBD);
        !           115:                alarm(1);
        !           116:                if (Game != 0) {
        !           117:                        sndhost ("%s%s%d\n%s%d %d\n", SYNCSTRING, 
        !           118:                               GAMESTRING,  Game, 
        !           119:                               SCORESTRING, encrypt (Score),
        !           120:                               encrypt (KEY));
        !           121:                        if ( Score > Highscore[Game-1] )
        !           122:                                Highscore[Game-1] = Score;
        !           123:                }
        !           124:                if ( Abort )
        !           125:                        break;
        !           126:        }
        !           127:        wrapup();
        !           128: }
        !           129: 
        !           130: /*
        !           131: ** init - set up the terminal
        !           132: */
        !           133: 
        !           134: init()
        !           135: {
        !           136:        extern int argc, arg0;
        !           137:        int i, *argp;
        !           138: 
        !           139: #if V1_25 | V1_76
        !           140:        extern char screenmode;
        !           141:        do_push();
        !           142:        screenmode = 0;
        !           143:        setcontext();
        !           144: #endif
        !           145:        /* For non-iconic mpx:
        !           146:        jinit();
        !           147:        */
        !           148: #if BLIT
        !           149:        textmode = F_STORE;
        !           150: #endif
        !           151: 
        !           152: #ifdef V2_0
        !           153:        extern char screenm;
        !           154: /*
        !           155:        dopush();
        !           156: */
        !           157:        screenm = 0;
        !           158:        setcontext();
        !           159: #endif
        !           160:        Abort = FALSE;
        !           161:        /*
        !           162:        ** High score processing - arguments are the high scores for the
        !           163:        ** games
        !           164:        */
        !           165: /*             Ghod only knows what to do with with these for the Blit
        !           166: 
        !           167:        getscores ();
        !           168:        argp = &arg0;
        !           169:        for ( i=0 ; i<MAXGAMES ; i++ )
        !           170:                if ( i < argc )
        !           171:                        Highscore[i] = *argp++;
        !           172:                else
        !           173:                        Highscore[i] = NOSCORE;
        !           174: */
        !           175: }
        !           176: 
        !           177: /*
        !           178: ** getscores - get the high score vector from the host.
        !           179: **
        !           180: **   Scores are transmitted as ESC : arg0;arg1;...CAN
        !           181: **   where CAN is the ANSI standard cancel sequence.
        !           182: **   The cancel ensures the BitGraph will do no processing
        !           183: **   if the downloaded program doesn't read the arg vector.
        !           184: **   This routine times out in two seconds in case the host
        !           185: **   doesn't send the scores.
        !           186: */
        !           187: 
        !           188: getscores ()
        !           189: {
        !           190: #ifndef BLIT
        !           191:        register int  c;
        !           192:        register int  i;
        !           193:        extern   long  argc;
        !           194:        extern   long  arg0;
        !           195:        extern   long  arg1;
        !           196: 
        !           197:        argc = arg0 = arg1 = 0;
        !           198:        for (i = 0; i < 1000; i++)
        !           199:        {
        !           200:            sleep (2);              /* Wait for max of 2 msec.  */
        !           201:            if ((c = hstgetc ()) == '\033')
        !           202:            {
        !           203:                getchar ();         /* Throw away the colon.    */
        !           204: #if V1_25 | V1_76                                                   
        !           205:                do_args  ();        /* Old style read arg list. */
        !           206: #else
        !           207:                doargs  ();         /* Read the arg list.       */
        !           208: #endif
        !           209:                break;
        !           210:            }
        !           211:        }
        !           212: #endif
        !           213: }
        !           214: /*
        !           215: ** settextop - set text operation mode
        !           216: */
        !           217: 
        !           218: settextop(i)
        !           219: {
        !           220: #ifndef BLIT
        !           221:        extern long argc, arg0;
        !           222:        argc = 1;
        !           223:        arg0 = i;
        !           224:        setop();
        !           225: #endif
        !           226: }
        !           227: wrapup()
        !           228: {
        !           229:        sndhost ("%s", EXITSTRING);
        !           230: #ifdef V1_25
        !           231:        do_pop();
        !           232: #endif
        !           233: 
        !           234: #ifdef V1_76
        !           235:        do_pop();
        !           236: #endif
        !           237: 
        !           238: #ifdef V2_0
        !           239:        dopop();
        !           240: #endif
        !           241: }
        !           242: 
        !           243: /*
        !           244: ** newgame - set up for a new game, with instructions.
        !           245: */
        !           246: 
        !           247: newgame()
        !           248: {
        !           249:        instruct();
        !           250:        Game = 0;
        !           251:        Silent = TRUE;
        !           252: #if BLIT
        !           253:        wait(KBD);
        !           254: #else
        !           255:        while(kbdgetc()!=-1) ;
        !           256: #endif
        !           257:        while (Game==0 && Running) {
        !           258:                 wait(KBD);
        !           259:                 poll();
        !           260:        }
        !           261:        if ( !Running )
        !           262:                return;
        !           263:        clear();
        !           264: 
        !           265:        switch ( Game ) {
        !           266:        case 1:
        !           267:                Seekprob = 40;
        !           268:                Seekinc = 10;
        !           269:                Monbase = 40;
        !           270:                Pacman.time = 43;
        !           271:                break;
        !           272:        case 2:
        !           273:                Seekprob = 80;
        !           274:                Seekinc = 2;
        !           275:                Monbase = 30;
        !           276:                Pacman.time = 35;
        !           277:                break;
        !           278:        case 3:
        !           279:                Seekprob = 100;
        !           280:                Seekinc = 0;
        !           281:                Monbase = MINMONTIME;
        !           282:                Pacman.time = MINPACTIME;
        !           283:                break;
        !           284:        case 4:                         /* Flat out, for testing and practice */
        !           285:                Seekprob = 100;
        !           286:                Seekinc = 0;
        !           287:                Monbase = 0;
        !           288:                Pacman.time = 0;
        !           289:        }
        !           290:        Newgame = FALSE;
        !           291:        Pacman.alive = TRUE;
        !           292:        Wave = 0;
        !           293:        Score = 0;
        !           294:        Nextbonus = (long) SCOREMOD;
        !           295:        mvprintf(SCOREROW,1,"S C O R E : ");
        !           296:        addscore(0);
        !           297:        if ( Highscore[Game-1] != NOSCORE )
        !           298:                mvprintf(SCOREROW,HIGHCOL,"H I G H   S C O R E : %l",Highscore[Game-1]);
        !           299:        Pacmen = 1;
        !           300:        mvprintf(WAVEROW,WAVECOL,"W A V E : ");
        !           301:        addmen(PACMEN-1);
        !           302:        pacnew();
        !           303:        monnew();
        !           304: }
        !           305: /*
        !           306: ** Display Game instructions
        !           307: */
        !           308: instruct()
        !           309: {
        !           310:        clear();
        !           311:        /*cursinhibit();*/
        !           312:        mvprintf(11,1,"P A C M A N");
        !           313:        mvprintf(13,10,"use mouse to move");
        !           314:        mvprintf(14,10,"<f> to freeze game.");
        !           315: 
        !           316:        mvprintf(15,10,"<q> to quit.");
        !           317:        mvprintf(16,10,"<n> to start a new game.");
        !           318:        mvprintf(17,10,"<s> to toggle sound.");
        !           319:        mvprintf(19,10,"Select game 1, 2, 3, or 4.");
        !           320:        /*cursallow();*/
        !           321: }
        !           322: /*
        !           323: ** start a new wave - also starts the first wave.
        !           324: **
        !           325: **  increase the speed on the monsters, but not too fast.
        !           326: **  However, if already running faster than fastest, leave it there.
        !           327: */
        !           328: 
        !           329: newwave()
        !           330: {
        !           331:        register monster *mptr;
        !           332:        Wave++;
        !           333:        mvprintf(WAVEROW,WAVECOL+10,"%d",Wave);
        !           334:        if ( Wave&1 ) {
        !           335:                for ( mptr=Monster ; mptr < &Monster[MAXMONSTER] ; mptr++ )
        !           336:                        if ( mptr->time > MINMONTIME )
        !           337:                                mptr->time = max(mptr->time-MONDELTA,MINMONTIME);
        !           338:                if ( Pacman.time > MINPACTIME )
        !           339:                        Pacman.time = max(Pacman.time-PACDELTA,MINPACTIME);
        !           340:        }
        !           341:        newboard();
        !           342:        drawboard();
        !           343:        Dotsrem = DOTS;
        !           344:        Seekprob += Seekinc;
        !           345:        elinit();
        !           346:        pacinit();
        !           347:        moninit();
        !           348:        fruitinit(TRUE);
        !           349: }
        !           350: /*
        !           351: ** Keyboard polling routine
        !           352: */
        !           353: poll()
        !           354: {
        !           355:        register unsigned char c;
        !           356:        register int o;
        !           357: 
        !           358: #if BLIT
        !           359:        if(button123()){
        !           360:                wait(KBD|ALARM|MOUSE);
        !           361:        }
        !           362:        if((o = own()) & KBD)
        !           363:                c = kbdchar();
        !           364:        else if(!Freeze && (o & MOUSE))
        !           365:                c = retxy(0);
        !           366:        else
        !           367:                c = 0;
        !           368:        if(c == 0)
        !           369:                wait(KBD|ALARM|MOUSE);
        !           370:        else
        !           371:        switch(c) {
        !           372: #else
        !           373:        rsetdead();
        !           374:        switch ( (c=kbdgetc()) ) {
        !           375: #endif
        !           376:        case GAME4:
        !           377:        case GAME3:
        !           378:        case GAME2:
        !           379:        case GAME1:
        !           380:                if ( Game ) return;
        !           381:                Game = c - '0';
        !           382:                break;
        !           383:        case LEFT:
        !           384:        case ALTLEFT:
        !           385:                Pacman.pending = MOVELEFT;
        !           386:                Pacman.pendcnt = PENDCOUNT;
        !           387:                Pacman.moving = TRUE;
        !           388:                break;
        !           389:        case RIGHT:
        !           390:        case ALTRIGHT:
        !           391:                Pacman.pending = MOVERIGHT;
        !           392:                Pacman.pendcnt = PENDCOUNT;
        !           393:                Pacman.moving = TRUE;
        !           394:                break;
        !           395:        case UP:
        !           396:        case ALTUP:
        !           397:                Pacman.pending = MOVEUP;
        !           398:                Pacman.pendcnt = PENDCOUNT;
        !           399:                Pacman.moving = TRUE;
        !           400:                break;
        !           401:        case DOWN:
        !           402:        case ALTDOWN:
        !           403:        case ALTALTDOWN:
        !           404:                Pacman.pending = MOVEDOWN;
        !           405:                Pacman.pendcnt = PENDCOUNT;
        !           406:                Pacman.moving = TRUE;
        !           407:                break;
        !           408:        case SILENT:
        !           409:                Silent = !Silent;
        !           410:                break;
        !           411:        case STOP:
        !           412:        case ALTSTOP:
        !           413:                Pacman.moving = FALSE;
        !           414:                Pacman.pendcnt = 0;
        !           415:                break;
        !           416:        case ABORT:
        !           417:                Running = FALSE;
        !           418:                Abort = TRUE;
        !           419:                break;
        !           420:        case NEWGAME:
        !           421:                Newgame = TRUE;
        !           422:                break;
        !           423:        case FREEZE:
        !           424:                Freeze = ! Freeze;
        !           425:                break;
        !           426:        case -1:
        !           427:                wait(KBD|ALARM|MOUSE);
        !           428:                break;
        !           429:        }
        !           430: }
        !           431: 
        !           432: /*
        !           433: ** Update the score
        !           434: */
        !           435: addscore(inc)
        !           436: register int inc;
        !           437: {
        !           438:        long oldscore;
        !           439:        oldscore = Score;
        !           440:        Score += inc;
        !           441:        /*cursinhibit();*/
        !           442:        mvprintf(SCOREROW,SCORECOL,"%l",Score);
        !           443:        /*cursallow();*/
        !           444:        if ( oldscore<Nextbonus &&  Score>=Nextbonus ) {
        !           445:                addmen(1);
        !           446:                Nextbonus *= 2;
        !           447:        }
        !           448: }
        !           449: /*
        !           450: ** Add multiple men or subtract just one.
        !           451: */
        !           452: addmen(inc)
        !           453: register int inc;
        !           454: {
        !           455:        register int i;
        !           456:        /*
        !           457:        ** Put another at the bottom of the screen
        !           458:        */
        !           459:        if ( inc > 0 ) {
        !           460:                for ( i=0 ; i<inc ; i++ ) {
        !           461:                        rempacface();
        !           462:                        Pacmen++;
        !           463:                }
        !           464:        } else {
        !           465:                Pacmen--;
        !           466:                rempacface();
        !           467:        }
        !           468: }
        !           469: mvprintf(row,col,f,p0,p1,p2,p3)
        !           470: char *f;
        !           471: int p0,p1,p2,p3;
        !           472: {
        !           473: #ifdef V1_25
        !           474:        extern long arg0, arg1;
        !           475:        arg0 = row;
        !           476:        arg1 = col;
        !           477:        movexy();
        !           478: #endif
        !           479: #ifdef V1_76
        !           480:        cmovey (row);
        !           481:        cmovex (col);
        !           482: #endif
        !           483: #ifdef V2_0
        !           484:        cmovey (row);
        !           485:        cmovex (col);
        !           486: #endif
        !           487: #ifdef BLIT
        !           488:        movexy(col,row);
        !           489: #endif
        !           490:        printf(f,p0,p1,p2,p3);
        !           491: }
        !           492: #define PRIME 2131
        !           493: grand(lb,ub)
        !           494: int lb, ub;
        !           495: {
        !           496:        return (rand() % PRIME) * (ub-lb+1) / PRIME + lb;
        !           497: }
        !           498: long   randx = 1;
        !           499: 
        !           500: srand(x)
        !           501: unsigned x;
        !           502: {
        !           503:        randx = x;
        !           504: }
        !           505: 
        !           506: rand()
        !           507: {
        !           508:        return(((randx = randx*1103515245 + 12345)>>16) & 077777);
        !           509: }
        !           510: 
        !           511: pause(ms)
        !           512: {
        !           513:        soundoff();
        !           514: #ifdef BLIT
        !           515:        sleep((ms+8)/16);
        !           516: #else
        !           517:        sleep(ms);
        !           518: #endif
        !           519:        eladjust(ms);
        !           520: }
        !           521: 
        !           522: #ifdef BLIT
        !           523: clear()
        !           524: {
        !           525:        /*cursinhibit();*/
        !           526:        rectf(&display,Drect,F_CLR);
        !           527:        /*cursallow();*/
        !           528: }
        !           529: #endif
        !           530: 
        !           531: #ifdef BLIT
        !           532: retxy(init)
        !           533: {
        !           534:        register ret;
        !           535:        Point p, dif;
        !           536:        static Point centre;
        !           537: #define                FUZZ    6
        !           538: 
        !           539:        if(init)
        !           540:        {
        !           541:                centre = div(add(Drect.origin, Drect.corner), 2);
        !           542:                cursset(centre);
        !           543:                return;
        !           544:        }
        !           545:        p = mouse.xy;
        !           546:        dif = sub(p, centre);
        !           547:        ret = 0;
        !           548:        if(abs(dif.y) > FUZZ) {
        !           549:                ret = (dif.y<0)? UP : DOWN;
        !           550:                cursset(Pt(p.x, centre.y));
        !           551:        } else if(abs(dif.x) > FUZZ) {
        !           552:                ret = (dif.x>0)? RIGHT : LEFT;
        !           553:                cursset(Pt(centre.x, p.y));
        !           554:        }
        !           555:        return(ret);
        !           556: }
        !           557: #endif

unix.superglobalmegacorp.com

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