Annotation of doom/g_game.c, revision 1.1.1.1

1.1       root        1: /* G_game.c  */
                      2:  
                      3: #include "doomdef.h" 
                      4: #include "p_local.h" 
                      5:  
                      6: void G_PlayerReborn (int player); 
                      7:  
                      8: void G_DoReborn (int playernum); 
                      9:  
                     10: void G_DoLoadLevel (void); 
                     11:  
                     12:  
                     13: gameaction_t    gameaction; 
                     14: skill_t         gameskill; 
                     15: int             gamemap; 
                     16: int                            nextmap;                                /* the map to go to after the stats */
                     17: 
                     18: gametype_t             netgame;
                     19: 
                     20: boolean         playeringame[MAXPLAYERS]; 
                     21: player_t        players[MAXPLAYERS]; 
                     22:  
                     23: int             consoleplayer;          /* player taking events and displaying  */
                     24: int             displayplayer;          /* view being displayed  */
                     25: int             gametic; 
                     26: int             totalkills, totalitems, totalsecret;    /* for intermission  */
                     27:  
                     28: char            demoname[32]; 
                     29: boolean         demorecording; 
                     30: boolean         demoplayback; 
                     31:    
                     32:  
                     33: /* 
                     34: ============== 
                     35: = 
                     36: = G_DoLoadLevel 
                     37: = 
                     38: ============== 
                     39: */ 
                     40:   
                     41: extern int              skytexture; 
                     42: extern texture_t               *skytexturep;
                     43: extern texture_t               textures[];
                     44: 
                     45: void G_DoLoadLevel (void) 
                     46: { 
                     47:        int             i; 
                     48:         
                     49:        for (i=0 ; i<MAXPLAYERS ; i++) 
                     50:        { 
                     51:                if (playeringame[i] && players[i].playerstate == PST_DEAD) 
                     52:                        players[i].playerstate = PST_REBORN; 
                     53:                players[i].frags = 0;
                     54:        } 
                     55: 
                     56: /*  */
                     57: /* set the sky map for the episode  */
                     58: /*  */
                     59:        if (gamemap < 9) 
                     60:                skytexture = R_TextureNumForName ("SKY1"); 
                     61:        else if (gamemap < 18)
                     62:                skytexture = R_TextureNumForName ("SKY2"); 
                     63:        else
                     64:                skytexture = R_TextureNumForName ("SKY3"); 
                     65: 
                     66:        skytexturep = &textures[skytexture];
                     67:                 
                     68:        P_SetupLevel (gamemap, gameskill);   
                     69:        displayplayer = consoleplayer;          /* view the guy you are playing     */
                     70:        gameaction = ga_nothing; 
                     71: 
                     72:     /* S_StartSong(1, 0); */  /* Added CEF */
                     73: 
                     74:        Z_CheckHeap (mainzone);                 /* DEBUG */
                     75: } 
                     76:  
                     77:  
                     78:  
                     79: /* 
                     80: ============================================================================== 
                     81:  
                     82:                                                PLAYER STRUCTURE FUNCTIONS 
                     83:  
                     84: also see P_SpawnPlayer in P_Mobj 
                     85: ============================================================================== 
                     86: */ 
                     87:  
                     88: /* 
                     89: ==================== 
                     90: = 
                     91: = G_PlayerFinishLevel 
                     92: = 
                     93: = Can when a player completes a level 
                     94: ==================== 
                     95: */ 
                     96:  
                     97: void G_PlayerFinishLevel (int player) 
                     98: { 
                     99:        player_t        *p; 
                    100:         
                    101:        p = &players[player]; 
                    102:         
                    103:        D_memset (p->powers, 0, sizeof (p->powers)); 
                    104:        D_memset (p->cards, 0, sizeof (p->cards)); 
                    105:        p->mo->flags &= ~MF_SHADOW;             /* cancel invisibility  */
                    106:        p->extralight = 0;                      /* cancel gun flashes  */
                    107:        p->fixedcolormap = 0;                   /* cancel ir gogles  */
                    108:        p->damagecount = 0;                     /* no palette changes  */
                    109:        p->bonuscount = 0; 
                    110: } 
                    111:  
                    112: /* 
                    113: ==================== 
                    114: = 
                    115: = G_PlayerReborn 
                    116: = 
                    117: = Called after a player dies 
                    118: = almost everything is cleared and initialized 
                    119: ==================== 
                    120: */ 
                    121:  
                    122: void G_PlayerReborn (int player) 
                    123: { 
                    124:        player_t        *p; 
                    125:        int                     i; 
                    126:        int             frags; 
                    127:         
                    128:        
                    129:        p = &players[player]; 
                    130:        frags = p->frags;
                    131:        D_memset (p, 0, sizeof(*p)); 
                    132:        p->frags = frags;       
                    133:        p->usedown = p->attackdown = true;              /* don't do anything immediately */
                    134:        p->playerstate = PST_LIVE;       
                    135:        p->health = MAXHEALTH; 
                    136:        p->readyweapon = p->pendingweapon = wp_pistol; 
                    137:        p->weaponowned[wp_fist] = true; 
                    138:        p->weaponowned[wp_pistol] = true; 
                    139:        p->ammo[am_clip] = 50; 
                    140:         
                    141:        for (i=0 ; i<NUMAMMO ; i++) 
                    142:                p->maxammo[i] = maxammo[i]; 
                    143: } 
                    144:  
                    145:  
                    146: /* 
                    147: ==================== 
                    148: = 
                    149: = G_CheckSpot  
                    150: = 
                    151: = Returns false if the player cannot be respawned at the given mapthing_t spot  
                    152: = because something is occupying it 
                    153: ==================== 
                    154: */ 
                    155:  
                    156: void P_SpawnPlayer (mapthing_t *mthing); 
                    157:  
                    158: boolean G_CheckSpot (int playernum, mapthing_t *mthing) 
                    159: { 
                    160:        fixed_t         x,y; 
                    161:        subsector_t *ss; 
                    162:        int                     an; 
                    163:        mobj_t          *mo;
                    164:        
                    165:        x = mthing->x << FRACBITS; 
                    166:        y = mthing->y << FRACBITS; 
                    167:         
                    168:        if (!P_CheckPosition (players[playernum].mo, x, y) ) 
                    169:                return false; 
                    170:  
                    171:        ss = R_PointInSubsector (x,y); 
                    172:        an = ( ANG45 * (mthing->angle/45) ) >> ANGLETOFINESHIFT; 
                    173:  
                    174: /* spawn a teleport fog  */
                    175:        mo = P_SpawnMobj (x+20*finecosine[an], y+20*finesine[an], ss->sector->floorheight 
                    176:        , MT_TFOG); 
                    177:        S_StartSound (mo, sfx_telept);
                    178:        
                    179:        return true; 
                    180: } 
                    181:  
                    182: /* 
                    183: ==================== 
                    184: = 
                    185: = G_DeathMatchSpawnPlayer 
                    186: = 
                    187: = Spawns a player at one of the random death match spots 
                    188: = called at level load and each death 
                    189: ==================== 
                    190: */ 
                    191:  
                    192: void G_DeathMatchSpawnPlayer (int playernum) 
                    193: { 
                    194:        int             i,j; 
                    195:        int                             selections;
                    196:        
                    197:        selections = deathmatch_p - deathmatchstarts;
                    198:        if (selections < 4)
                    199:                I_Error ("Only %i deathmatch spots, 4 required", selections);
                    200:                
                    201:        for (j=0 ; j<20 ; j++) 
                    202:        { 
                    203:                i = P_Random()%selections;
                    204:                if (G_CheckSpot (playernum, &deathmatchstarts[i]) ) 
                    205:                { 
                    206:                        deathmatchstarts[i].type = playernum+1; 
                    207:                        P_SpawnPlayer (&deathmatchstarts[i]); 
                    208:                        return; 
                    209:                } 
                    210:        } 
                    211:  
                    212: /* no good spot, so the player will probably get stuck  */
                    213:        P_SpawnPlayer (&playerstarts[playernum]); 
                    214: } 
                    215:  
                    216: /* 
                    217: ==================== 
                    218: = 
                    219: = G_DoReborn 
                    220: = 
                    221: ==================== 
                    222: */ 
                    223:  
                    224: void G_DoReborn (int playernum) 
                    225: { 
                    226:        int             i; 
                    227:         
                    228:        if (!netgame)
                    229:        {
                    230:                gameaction = ga_died;                   /* reload the level from scratch  */
                    231:                return;
                    232:        }
                    233: 
                    234: /*      */
                    235: /* respawn this player while the other players keep going */
                    236: /* */
                    237:        players[playernum].mo->player = NULL;   /* dissasociate the corpse  */
                    238:                
                    239:        /* spawn at random spot if in death match  */
                    240:        if (netgame == gt_deathmatch) 
                    241:        { 
                    242:                G_DeathMatchSpawnPlayer (playernum); 
                    243:                return; 
                    244:        } 
                    245:                
                    246:        if (G_CheckSpot (playernum, &playerstarts[playernum]) ) 
                    247:        { 
                    248:                P_SpawnPlayer (&playerstarts[playernum]); 
                    249:                return; 
                    250:        } 
                    251:        /* try to spawn at one of the other players spots  */
                    252:        for (i=0 ; i<MAXPLAYERS ; i++) 
                    253:                if (G_CheckSpot (playernum, &playerstarts[i]) ) 
                    254:                { 
                    255:                        playerstarts[i].type = playernum+1;             /* fake as other player  */
                    256:                        P_SpawnPlayer (&playerstarts[i]); 
                    257:                        playerstarts[i].type = i+1;             /* restore  */
                    258:                        return; 
                    259:                } 
                    260:        /* he's going to be inside something.  Too bad.  */
                    261:        P_SpawnPlayer (&playerstarts[playernum]); 
                    262: } 
                    263:  
                    264:  
                    265: /* 
                    266: ==================== 
                    267: = 
                    268: = G_ExitLevel 
                    269: = 
                    270: ==================== 
                    271: */ 
                    272:  
                    273: void G_ExitLevel (void) 
                    274: {
                    275:        gameaction = ga_completed;
                    276: } 
                    277:  
                    278: void G_SecretExitLevel (void) 
                    279: { 
                    280:        gameaction = ga_secretexit;
                    281: } 
                    282:   
                    283: /*============================================================================  */
                    284:  
                    285: /* 
                    286: ==================== 
                    287: = 
                    288: = G_InitNew 
                    289: = 
                    290: ==================== 
                    291: */ 
                    292:  
                    293: extern mobj_t emptymobj;
                    294:  
                    295: void G_InitNew (skill_t skill, int map, gametype_t gametype) 
                    296: { 
                    297:        int             i; 
                    298:        
                    299: D_printf ("G_InitNew\n");
                    300: 
                    301:        M_ClearRandom (); 
                    302: 
                    303: /* these may be reset by I_NetSetup */
                    304:        gamemap = map; 
                    305:        gameskill = skill; 
                    306:        netgame = gametype;
                    307:        I_DrawSbar ();                  /* draw frag boxes if multiplayer */
                    308: 
                    309: /* force players to be initialized upon first level load          */
                    310:        for (i=0 ; i<MAXPLAYERS ; i++) 
                    311:                players[i].playerstate = PST_REBORN; 
                    312: 
                    313:        players[0].mo = players[1].mo = &emptymobj;     /* for net consistancy checks */
                    314:        
                    315:        playeringame[0] = true; 
                    316:        if (netgame != gt_single)
                    317:                playeringame[1] = true; 
                    318:        else
                    319:                playeringame[1] = false;        
                    320: 
                    321:        demorecording = false;
                    322:        demoplayback = false;
                    323:        
                    324: 
                    325:        gametic = 0; 
                    326: 
                    327:        if ( skill == sk_nightmare )
                    328:        { 
                    329:                states[S_SARG_ATK1].tics = 2;
                    330:                states[S_SARG_ATK2].tics = 2;
                    331:                states[S_SARG_ATK3].tics = 2;
                    332:                mobjinfo[MT_SERGEANT].speed = 15; 
                    333:                mobjinfo[MT_SHADOWS].speed = 15; 
                    334:                
                    335:                mobjinfo[MT_BRUISERSHOT].speed = 40*FRACUNIT; 
                    336:                mobjinfo[MT_HEADSHOT].speed = 40*FRACUNIT; 
                    337:                mobjinfo[MT_TROOPSHOT].speed = 40*FRACUNIT; 
                    338:        } 
                    339:        else 
                    340:        { 
                    341:                states[S_SARG_ATK1].tics = 4;
                    342:                states[S_SARG_ATK2].tics = 4;
                    343:                states[S_SARG_ATK3].tics = 4;
                    344:                mobjinfo[MT_SERGEANT].speed = 10; 
                    345:                mobjinfo[MT_SHADOWS].speed = 10; 
                    346:                
                    347:                mobjinfo[MT_BRUISERSHOT].speed = 30*FRACUNIT; 
                    348:                mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT; 
                    349:                mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT; 
                    350:        }   
                    351: } 
                    352:  
                    353: /*============================================================================  */
                    354:  
                    355: /*
                    356: =================
                    357: =
                    358: = G_RunGame
                    359: =
                    360: = The game should allready have been initialized or laoded
                    361: =================
                    362: */
                    363: 
                    364: void G_RunGame (void)
                    365: {
                    366:        int             i;
                    367:        
                    368:        while (1)
                    369:        {
                    370:        /* load a level */
                    371:                G_DoLoadLevel ();   
                    372:        
                    373:        /* run a level until death or completion */
                    374:                MiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);
                    375:        
                    376:        /* take away cards and stuff */
                    377:                        
                    378:                for (i=0 ; i<MAXPLAYERS ; i++) 
                    379:                        if (playeringame[i]) 
                    380:                                G_PlayerFinishLevel (i);         
                    381: 
                    382:                if (gameaction == ga_died)
                    383:                        continue;                       /* died, so restart the level */
                    384:        
                    385:                if (gameaction == ga_warped)
                    386:                        continue;                       /* skip intermission */
                    387:                                        
                    388:        /* decide which level to go to next */
                    389: #ifdef MARS
                    390:                if (gameaction == ga_secretexit)
                    391:                        nextmap = 24;
                    392:                else
                    393:                {
                    394:                        switch (gamemap)
                    395:                        {
                    396:                        case 15: nextmap = 23; break;
                    397:                        case 24: nextmap = 4; break;
                    398:                        default: nextmap = gamemap+1; break;
                    399:                        }
                    400:                }
                    401: #else
                    402:                if (gameaction == ga_secretexit)
                    403:                {
                    404:                         nextmap = 24;
                    405:                }
                    406:                else
                    407:                {
                    408:                        switch (gamemap)
                    409:                        {
                    410:                        case 24: nextmap = 4; break;
                    411:                        case 23: nextmap = 23; break;   /* don't add secret level to eeprom */
                    412:                        default: nextmap = gamemap+1; break;
                    413:                        }
                    414: #ifdef JAGUAR
                    415:                        if (nextmap > maxlevel)
                    416:                        {       /* allow higher menu selection now */
                    417:                                void WriteEEProm (void);
                    418:                                maxlevel = nextmap;
                    419:                                WriteEEProm ();
                    420:                        }
                    421: #endif
                    422: 
                    423:                }
                    424: #endif
                    425: 
                    426:        /* run a stats intermission */
                    427:                MiniLoop (IN_Start, IN_Stop, IN_Ticker, IN_Drawer);
                    428:        
                    429:        /* run the finale if needed */
                    430:                if (gamemap == 23)
                    431:                        MiniLoop (F_Start, F_Stop, F_Ticker, F_Drawer);
                    432:                        
                    433:                gamemap = nextmap;
                    434:        }
                    435: }
                    436: 
                    437: 
                    438: int G_PlayDemoPtr (int *demo)
                    439: {
                    440:        int             exit;
                    441:        int             skill, map;
                    442:        
                    443:        demobuffer = demo;
                    444:        
                    445:        skill = *demo++;
                    446:        map = *demo++;
                    447: 
                    448:        demo_p = demo;
                    449:        
                    450:        G_InitNew (skill, map, gt_single);
                    451:        G_DoLoadLevel ();   
                    452:        demoplayback = true;
                    453:        exit = MiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);
                    454:        demoplayback = false;
                    455:        
                    456:        return exit;
                    457: }
                    458: 
                    459: /*
                    460: =================
                    461: =
                    462: = G_RecordDemo
                    463: =
                    464: =================
                    465: */
                    466: 
                    467: void G_RecordDemo (void)
                    468: {
                    469:        demo_p = demobuffer = Z_Malloc (0x8000, PU_STATIC, NULL);
                    470:        
                    471:        *demo_p++ = startskill;
                    472:        *demo_p++ = startmap;
                    473:        
                    474:        G_InitNew (startskill, startmap, gt_single);
                    475:        G_DoLoadLevel ();  
                    476:        demorecording = true; 
                    477:        MiniLoop (P_Start, P_Stop, P_Ticker, P_Drawer);
                    478:        demorecording = false;
                    479:        
                    480:        D_printf ("w %x,%x",demobuffer,demo_p);
                    481:        
                    482:        while (1)
                    483:        {
                    484:                G_PlayDemoPtr (demobuffer);
                    485:        D_printf ("w %x,%x",demobuffer,demo_p);
                    486:        }
                    487:        
                    488: }
                    489: 

unix.superglobalmegacorp.com

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