Annotation of doom/p_tick.c, revision 1.1

1.1     ! root        1: #include "doomdef.h"
        !             2: #include "p_local.h"
        !             3: 
        !             4: int    playertics, thinkertics, sighttics, basetics, latetics;
        !             5: int    tictics;
        !             6: 
        !             7: boolean                gamepaused;
        !             8: jagobj_t       *pausepic;
        !             9: 
        !            10: /*
        !            11: ===============================================================================
        !            12: 
        !            13:                                                                THINKERS
        !            14: 
        !            15: All thinkers should be allocated by Z_Malloc so they can be operated on uniformly.  The actual
        !            16: structures will vary in size, but the first element must be thinker_t.
        !            17: 
        !            18: Mobjs are similar to thinkers, but kept seperate for more optimal list
        !            19: processing
        !            20: ===============================================================================
        !            21: */
        !            22: 
        !            23: thinker_t      thinkercap;     /* both the head and tail of the thinker list */
        !            24: mobj_t         mobjhead;       /* head and tail of mobj list */
        !            25: int                    activethinkers; /* debug count */
        !            26: int                    activemobjs;    /* debug count */
        !            27: 
        !            28: /*
        !            29: ===============
        !            30: =
        !            31: = P_InitThinkers
        !            32: =
        !            33: ===============
        !            34: */
        !            35: 
        !            36: void P_InitThinkers (void)
        !            37: {
        !            38:        thinkercap.prev = thinkercap.next  = &thinkercap;
        !            39:        mobjhead.next = mobjhead.prev = &mobjhead;
        !            40: }
        !            41: 
        !            42: 
        !            43: /*
        !            44: ===============
        !            45: =
        !            46: = P_AddThinker
        !            47: =
        !            48: = Adds a new thinker at the end of the list
        !            49: =
        !            50: ===============
        !            51: */
        !            52: 
        !            53: void P_AddThinker (thinker_t *thinker)
        !            54: {
        !            55:        thinkercap.prev->next = thinker;
        !            56:        thinker->next = &thinkercap;
        !            57:        thinker->prev = thinkercap.prev;
        !            58:        thinkercap.prev = thinker;
        !            59: }
        !            60: 
        !            61: 
        !            62: /*
        !            63: ===============
        !            64: =
        !            65: = P_RemoveThinker
        !            66: =
        !            67: = Deallocation is lazy -- it will not actually be freed until its
        !            68: = thinking turn comes up
        !            69: =
        !            70: ===============
        !            71: */
        !            72: 
        !            73: void P_RemoveThinker (thinker_t *thinker)
        !            74: {
        !            75:        thinker->function = (think_t)-1;
        !            76: }
        !            77: 
        !            78: /*
        !            79: ===============
        !            80: =
        !            81: = P_RunThinkers
        !            82: =
        !            83: ===============
        !            84: */
        !            85: 
        !            86: void P_RunThinkers (void)
        !            87: {
        !            88:        thinker_t       *currentthinker;
        !            89:        
        !            90:        activethinkers = 0;
        !            91:        
        !            92:        currentthinker = thinkercap.next;
        !            93:        while (currentthinker != &thinkercap)
        !            94:        {
        !            95:                if (currentthinker->function == (think_t)-1)
        !            96:                {       /* time to remove it */
        !            97:                        currentthinker->next->prev = currentthinker->prev;
        !            98:                        currentthinker->prev->next = currentthinker->next;
        !            99:                        Z_Free (currentthinker);
        !           100:                }
        !           101:                else
        !           102:                {
        !           103:                        if (currentthinker->function)
        !           104:                        {
        !           105:                                currentthinker->function (currentthinker);
        !           106:                        }
        !           107:                        activethinkers++;
        !           108:                }
        !           109:                currentthinker = currentthinker->next;
        !           110:        }
        !           111: }
        !           112: 
        !           113: 
        !           114: /*============================================================================= */
        !           115: 
        !           116: /*
        !           117: ===============
        !           118: =
        !           119: = P_CheckSights
        !           120: =
        !           121: = Check sights of all mobj thinkers that are going to change state this
        !           122: = tic and have MF_COUNTKILL set
        !           123: ===============
        !           124: */
        !           125: 
        !           126: void P_CheckSights2 ();
        !           127: 
        !           128: void P_CheckSights (void)
        !           129: {
        !           130: #ifdef JAGUAR
        !           131:        extern  int p_sight_start;
        !           132:        DSPFunction (&p_sight_start);
        !           133: #else
        !           134:        P_CheckSights2 ();
        !           135: #endif
        !           136: }
        !           137: 
        !           138: /*============================================================================= */
        !           139: 
        !           140: /* 
        !           141: =================== 
        !           142: = 
        !           143: = P_RunMobjBase  
        !           144: =
        !           145: = Run stuff that doesn't happen every tick
        !           146: =================== 
        !           147: */ 
        !           148: 
        !           149: void   P_RunMobjBase (void)
        !           150: {
        !           151: #ifdef JAGUAR
        !           152:        extern  int p_base_start;
        !           153:         
        !           154:        DSPFunction (&p_base_start);
        !           155: #else
        !           156:        P_RunMobjBase2 ();
        !           157: #endif
        !           158: }
        !           159: 
        !           160: /*============================================================================= */
        !           161: 
        !           162: /* 
        !           163: =================== 
        !           164: = 
        !           165: = P_RunMobjLate  
        !           166: =
        !           167: = Run stuff that doesn't happen every tick
        !           168: =================== 
        !           169: */ 
        !           170: 
        !           171: void   P_RunMobjLate (void)
        !           172: {
        !           173:        mobj_t  *mo;
        !           174:        mobj_t  *next;
        !           175:        
        !           176:        for (mo=mobjhead.next ; mo != &mobjhead ; mo=next)
        !           177:        {
        !           178:                next = mo->next;        /* in case mo is removed this time */
        !           179:                if (mo->latecall)
        !           180:                {
        !           181:                        mo->latecall(mo);
        !           182:                }
        !           183:        }
        !           184: }
        !           185: 
        !           186: /*============================================================================= */
        !           187: 
        !           188: /*
        !           189: ==============
        !           190: =
        !           191: = P_CheckCheats
        !           192: =
        !           193: ==============
        !           194: */
        !           195:  
        !           196: void P_CheckCheats (void)
        !           197: {
        !           198:        int             buttons, oldbuttons;
        !           199:        int     warpmap;
        !           200:        int             i;
        !           201:        player_t        *p;
        !           202:        
        !           203:        for (i=0 ; i<MAXPLAYERS ; i++)
        !           204:        {
        !           205:                if (!playeringame[i])
        !           206:                        continue;
        !           207:                buttons = ticbuttons[i];
        !           208:                oldbuttons = oldticbuttons[i];
        !           209:        
        !           210:                if ( (buttons & BT_PAUSE) && !(oldbuttons&BT_PAUSE) )
        !           211:                        gamepaused ^= 1;
        !           212:        }
        !           213:        
        !           214:        if (netgame)
        !           215:                return;
        !           216:                
        !           217:        buttons = ticbuttons[0];
        !           218:        oldbuttons = oldticbuttons[0];
        !           219: 
        !           220:        if ( (oldbuttons&JP_PAUSE) || !(buttons & JP_PAUSE ) )
        !           221:                return;
        !           222: 
        !           223:                
        !           224:        if (buttons&JP_NUM)
        !           225:        {       /* free stuff */
        !           226:                p=&players[0];
        !           227:                for (i=0 ; i<NUMCARDS ; i++)
        !           228:                        p->cards[i] = true;                     
        !           229:                p->armorpoints = 200;
        !           230:                p->armortype = 2;
        !           231:                for (i=0;i<NUMWEAPONS;i++) p->weaponowned[i] = true;
        !           232:                for (i=0;i<NUMAMMO;i++) p->ammo[i] = p->maxammo[i] = 500;
        !           233:        }
        !           234: 
        !           235:        if (buttons&JP_STAR)
        !           236:        {       /* godmode */
        !           237:                players[0].cheats ^= CF_GODMODE;
        !           238:        }
        !           239:        warpmap = 0;
        !           240:        if (buttons&JP_1) warpmap = 1;
        !           241:        if (buttons&JP_2) warpmap = 2;
        !           242:        if (buttons&JP_3) warpmap = 3;
        !           243:        if (buttons&JP_4) warpmap = 4;
        !           244:        if (buttons&JP_5) warpmap = 5;
        !           245:        if (buttons&JP_6) warpmap = 6;
        !           246:        if (buttons&JP_7) warpmap = 7;
        !           247:        if (buttons&JP_8) warpmap = 8;
        !           248:        if (buttons&JP_9) warpmap = 9;
        !           249:        if (buttons&JP_A) warpmap += 10;
        !           250:        else if (buttons&JP_B) warpmap += 20;
        !           251:        
        !           252:        if (warpmap>0 && warpmap < 27)
        !           253:        {
        !           254:                gamemap = warpmap;
        !           255:                gameaction = ga_warped;
        !           256:        }
        !           257: }
        !           258:   
        !           259: 
        !           260: int playernum;
        !           261: 
        !           262: void G_DoReborn (int playernum); 
        !           263: 
        !           264: /*
        !           265: =================
        !           266: =
        !           267: = P_Ticker
        !           268: =
        !           269: =================
        !           270: */
        !           271: 
        !           272: int            ticphase;
        !           273: 
        !           274: int P_Ticker (void)
        !           275: {
        !           276:        int             start;
        !           277:        int             ticstart;
        !           278:        player_t        *pl;
        !           279:        
        !           280:        ticstart = samplecount;
        !           281:        
        !           282:        while (!I_RefreshLatched () )
        !           283:        ;               /* wait for refresh to latch all needed data before */
        !           284:                        /* running the next tick */
        !           285: 
        !           286: #ifdef JAGAUR
        !           287:        while (DSPRead (&dspfinished) != 0xdef6)
        !           288:        ;               /* wait for sound mixing to complete */
        !           289: #endif
        !           290: 
        !           291:        gameaction = ga_nothing;
        !           292:        
        !           293:        gametic++;               
        !           294:  
        !           295: /* */
        !           296: /* check for pause and cheats */
        !           297: /* */
        !           298:        P_CheckCheats ();
        !           299:        
        !           300: /* */
        !           301: /* do option screen processing */
        !           302: /* */
        !           303: 
        !           304:        for (playernum=0,pl=players ; playernum<MAXPLAYERS ; playernum++,pl++)
        !           305:                if (playeringame[playernum])
        !           306:                        O_Control (pl);
        !           307: 
        !           308: 
        !           309:        if (gamepaused)
        !           310:                return 0;
        !           311: 
        !           312: /* */
        !           313: /* run player actions */
        !           314: /* */
        !           315:        start = samplecount;
        !           316:        for (playernum=0,pl=players ; playernum<MAXPLAYERS ; playernum++,pl++)
        !           317:                if (playeringame[playernum])
        !           318:                {
        !           319:                        if (pl->playerstate == PST_REBORN) 
        !           320:                                G_DoReborn (playernum); 
        !           321:                        AM_Control (pl);
        !           322:                        P_PlayerThink (pl);
        !           323:                }
        !           324:        playertics = samplecount - start;
        !           325:        
        !           326:        
        !           327:        start = samplecount;
        !           328:        P_RunThinkers ();
        !           329:        thinkertics = samplecount - start;
        !           330:                
        !           331:        start = samplecount;
        !           332:        P_CheckSights ();       
        !           333:        sighttics = samplecount - start;
        !           334: 
        !           335:        start = samplecount;
        !           336:        P_RunMobjBase ();
        !           337:        basetics = samplecount - start;
        !           338: 
        !           339:        start = samplecount;
        !           340:        P_RunMobjLate ();
        !           341:        latetics = samplecount - start;
        !           342: 
        !           343:        P_UpdateSpecials ();
        !           344: 
        !           345:        P_RespawnSpecials ();
        !           346:        
        !           347:        ST_Ticker ();                   /* update status bar */
        !           348:                
        !           349:        tictics = samplecount - ticstart;
        !           350:        
        !           351:        return gameaction;              /* may have been set to ga_died, ga_completed, */
        !           352:                                                        /* or ga_secretexit */
        !           353: }
        !           354: 
        !           355: 
        !           356: /* 
        !           357: ============= 
        !           358: = 
        !           359: = DrawPlaque 
        !           360: = 
        !           361: ============= 
        !           362: */ 
        !           363:  
        !           364: void DrawPlaque (jagobj_t *pl)
        !           365: {
        !           366: #ifdef JAGUAR
        !           367:        int                     x,y,w;
        !           368:        short           *sdest;
        !           369:        byte            *bdest, *source;
        !           370:        extern          int isrvmode;
        !           371:        
        !           372:        while ( !I_RefreshCompleted () )
        !           373:        ;
        !           374: 
        !           375:        bufferpage = (byte *)screens[!workpage];
        !           376:        source = pl->data;
        !           377:        
        !           378:        if (isrvmode == 0xc1 + (3<<9) )
        !           379:        {       /* 320 mode, stretch pixels */
        !           380:                bdest = (byte *)bufferpage + 80*320 + (160 - pl->width);
        !           381:                w = pl->width;
        !           382:                for (y=0 ; y<pl->height ; y++)
        !           383:                {
        !           384:                        for (x=0 ; x<w ; x++)
        !           385:                        {
        !           386:                                bdest[x*2] = bdest[x*2+1] = *source++;
        !           387:                        }
        !           388:                        bdest += 320;
        !           389:                }
        !           390:        }
        !           391:        else
        !           392:        {       /* 160 mode, draw directly */
        !           393:                sdest = (short *)bufferpage + 80*160 + (80 - pl->width/2);
        !           394:                w = pl->width;
        !           395:                for (y=0 ; y<pl->height ; y++)
        !           396:                {
        !           397:                        for (x=0 ; x<w ; x++)
        !           398:                        {
        !           399:                                sdest[x] = palette8[*source++];
        !           400:                        }
        !           401:                        sdest += 160;
        !           402:                }
        !           403:        }
        !           404:        
        !           405: #endif
        !           406: }
        !           407: 
        !           408: /* 
        !           409: ============= 
        !           410: = 
        !           411: = DrawPlaque 
        !           412: = 
        !           413: ============= 
        !           414: */ 
        !           415:  
        !           416: void DrawSinglePlaque (jagobj_t *pl)
        !           417: {
        !           418:        int                     x,y,w;
        !           419:        byte            *bdest, *source;
        !           420:        
        !           421:        while ( !I_RefreshCompleted () )
        !           422:        ;
        !           423: 
        !           424:        bufferpage = (byte *)screens[!workpage];
        !           425:        source = pl->data;
        !           426:        
        !           427:        bdest = (byte *)bufferpage + 80*320 + (160 - pl->width/2);
        !           428:        w = pl->width;
        !           429:        for (y=0 ; y<pl->height ; y++)
        !           430:        {
        !           431:                for (x=0 ; x<w ; x++)
        !           432:                        bdest[x] = *source++;
        !           433:                bdest += 320;
        !           434:        }
        !           435: }
        !           436: 
        !           437: 
        !           438: /* 
        !           439: ============= 
        !           440: = 
        !           441: = P_Drawer 
        !           442: = 
        !           443: = draw current display 
        !           444: ============= 
        !           445: */ 
        !           446:  
        !           447:  
        !           448: void P_Drawer (void) 
        !           449: {      
        !           450:        static boolean  refreshdrawn;
        !           451: #ifndef MARS
        !           452:        if (players[consoleplayer].automapflags & AF_OPTIONSACTIVE)
        !           453:        {
        !           454:                O_Drawer ();
        !           455:                refreshdrawn = false;
        !           456:        }
        !           457:        else if (gamepaused && refreshdrawn)
        !           458:                DrawPlaque (pausepic);
        !           459:        else if (players[consoleplayer].automapflags & AF_ACTIVE)
        !           460:        {
        !           461:                ST_Drawer ();
        !           462:                AM_Drawer ();
        !           463:                I_Update ();
        !           464:                refreshdrawn = true;
        !           465:        }
        !           466:        else
        !           467: #endif
        !           468:        {
        !           469: #ifdef JAGUAR
        !           470:                ST_Drawer ();
        !           471: #endif
        !           472:                R_RenderPlayerView (); 
        !           473:                refreshdrawn = true;
        !           474:        /* assume part of the refresh is now running parallel with main code */
        !           475:        }
        !           476: } 
        !           477:  
        !           478:  
        !           479: extern  int            ticremainder[2];
        !           480: 
        !           481: void P_Start (void)
        !           482: {
        !           483: #ifndef MARS
        !           484:        AM_Start ();
        !           485:        S_RestartSounds ();
        !           486: #endif
        !           487:        players[0].automapflags = 0;
        !           488:        players[1].automapflags = 0;
        !           489:        ticremainder[0] = ticremainder[1] = 0;
        !           490:        M_ClearRandom ();
        !           491: }
        !           492: 
        !           493: void P_Stop (void)
        !           494: {
        !           495:        Z_FreeTags (mainzone);
        !           496: }
        !           497: 

unix.superglobalmegacorp.com

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