Annotation of doom/d_netbak.c, revision 1.1

1.1     ! root        1: 
        !             2: // I_pcnet.m
        !             3: //
        !             4: // Modified 12-21-94 by Chris Rhinehart for use with multiple ticdups
        !             5: //             actually, it wasn't modified, but rather we are currently using this
        !             6: //     older version of D_NET.C, since the new one doesn't seem to work with
        !             7: //             ticdup set to greater than one.
        !             8: 
        !             9: #include "DoomDef.h"
        !            10: #include "P_local.h"
        !            11: #include "soundst.h"
        !            12: 
        !            13: #define        NCMD_EXIT               0x80000000
        !            14: #define        NCMD_RETRANSMIT 0x40000000
        !            15: #define        NCMD_SETUP              0x20000000
        !            16: #define        NCMD_CHECKSUM   0x0fffffff
        !            17: 
        !            18: /*
        !            19: if more space needs to be crunched out of the protocol...
        !            20: 
        !            21: 1      drone
        !            22: 2      player
        !            23: 8      tic
        !            24: 5      numtics
        !            25: 
        !            26: #define        NCMD_EXIT               0x80000000
        !            27: #define        NCMD_RETRANSMIT 0x40000000                      // a retransmit will have 0 tics
        !            28: #define        NCMD_DRONE              0x20000000
        !            29: #define        NCMD_PLAYER             0x18000000
        !            30: #define        NCMD_PLAYERSHIFT        27
        !            31: #define        NCMD_TIC                0x00ff0000
        !            32: #define        NCMD_TICSHIFT   16
        !            33: #define        NCMD_NUMTICS    0x0000ff00
        !            34: #define        NCMD_NUMTICSSHIFT       8
        !            35: #define        NCMD_CHECKSUM   0x000000ff
        !            36: 
        !            37: */
        !            38: 
        !            39: 
        !            40: 
        !            41: 
        !            42: 
        !            43: doomcom_t              *doomcom;
        !            44: doomdata_t             *netbuffer;             // points inside doomcom
        !            45: 
        !            46: 
        !            47: /*
        !            48: ==============================================================================
        !            49: 
        !            50:                                                        NETWORKING
        !            51: 
        !            52: gametic is the tic about to (or currently being) run
        !            53: maketic is the tick that hasn't had control made for it yet
        !            54: nettics[] has the maketics for all players
        !            55: 
        !            56: a gametic cannot be run until nettics[] > gametic for all players
        !            57: 
        !            58: ==============================================================================
        !            59: */
        !            60: 
        !            61: #define        RESENDCOUNT     10
        !            62: #define        PL_DRONE        0x80                            // bit flag in doomdata->player
        !            63: 
        !            64: ticcmd_t               localcmds[BACKUPTICS];
        !            65: 
        !            66: ticcmd_t        netcmds[MAXPLAYERS][BACKUPTICS];
        !            67: int            nettics[MAXNETNODES];
        !            68: boolean                        nodeingame[MAXNETNODES];        // set false as nodes leave game
        !            69: boolean                        remoteresend[MAXNETNODES];      // set when local needs tics
        !            70: int                            resendto[MAXNETNODES];                  // set when remote needs tics
        !            71: int                            resendcount[MAXNETNODES];
        !            72: 
        !            73: int                            nodeforplayer[MAXPLAYERS];
        !            74: 
        !            75: int             gametime;
        !            76: int             maketic;
        !            77: int                            lastnettic, skiptics;
        !            78: int                            ticdup;
        !            79: 
        !            80: void D_ProcessEvents (void);
        !            81: void G_BuildTiccmd (ticcmd_t *cmd);
        !            82: void D_DoAdvanceDemo (void);
        !            83: 
        !            84: boolean                        reboundpacket;
        !            85: doomdata_t             reboundstore;
        !            86: 
        !            87: 
        !            88: int    NetbufferSize (void)
        !            89: {
        !            90:        return (int)&(((doomdata_t *)0)->cmds[netbuffer->numtics]);
        !            91: }
        !            92: 
        !            93: unsigned NetbufferChecksum (void)
        !            94: {
        !            95:        unsigned                c;
        !            96:        int             i,l;
        !            97: 
        !            98:        c = 0x1234567;
        !            99: 
        !           100:        l = (NetbufferSize () - (int)&(((doomdata_t *)0)->retransmitfrom))/4;
        !           101:        for (i=0 ; i<l ; i++)
        !           102:                c += ((unsigned *)&netbuffer->retransmitfrom)[i] * (i+1);
        !           103: 
        !           104:        return c & NCMD_CHECKSUM;
        !           105: }
        !           106: 
        !           107: int ExpandTics (int low)
        !           108: {
        !           109:        int     delta;
        !           110: 
        !           111:        delta = low - (maketic&0xff);
        !           112: 
        !           113:        if (delta >= -64 && delta <= 64)
        !           114:                return (maketic&~0xff) + low;
        !           115:        if (delta > 64)
        !           116:                return (maketic&~0xff) - 256 + low;
        !           117:        if (delta < -64)
        !           118:                return (maketic&~0xff) + 256 + low;
        !           119: 
        !           120:        I_Error ("ExpandTics: strange value %i at maketic %i",low,maketic);
        !           121:        return 0;
        !           122: }
        !           123: 
        !           124: 
        !           125: //============================================================================
        !           126: 
        !           127: 
        !           128: /*
        !           129: ==============
        !           130: =
        !           131: = HSendPacket
        !           132: =
        !           133: ==============
        !           134: */
        !           135: 
        !           136: void HSendPacket (int node, int flags)
        !           137: {
        !           138:        netbuffer->checksum = NetbufferChecksum () | flags;
        !           139: 
        !           140:        if (!node)
        !           141:        {
        !           142:                reboundstore = *netbuffer;
        !           143:                reboundpacket = true;
        !           144:                return;
        !           145:        }
        !           146: 
        !           147:        if (!netgame)
        !           148:                I_Error ("Tried to transmit to another node");
        !           149: 
        !           150:        doomcom->command = CMD_SEND;
        !           151:        doomcom->remotenode = node;
        !           152:        doomcom->datalength = NetbufferSize ();
        !           153: 
        !           154: if (debugfile)
        !           155: {
        !           156:        int             i;
        !           157:        int             realretrans;
        !           158:        if (netbuffer->checksum & NCMD_RETRANSMIT)
        !           159:                realretrans = ExpandTics (netbuffer->retransmitfrom);
        !           160:        else
        !           161:                realretrans = -1;
        !           162:        fprintf (debugfile,"send (%i + %i, R %i) [%i] "
        !           163:        ,ExpandTics(netbuffer->starttic),netbuffer->numtics, realretrans, doomcom->datalength);
        !           164:        for (i=0 ; i<doomcom->datalength ; i++)
        !           165:                fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
        !           166:        fprintf (debugfile,"\n");
        !           167: }
        !           168: 
        !           169:        I_NetCmd ();
        !           170: }
        !           171: 
        !           172: /*
        !           173: ==============
        !           174: =
        !           175: = HGetPacket
        !           176: =
        !           177: = Returns false if no packet is waiting
        !           178: =
        !           179: ==============
        !           180: */
        !           181: 
        !           182: boolean HGetPacket (void)
        !           183: {
        !           184:        if (reboundpacket)
        !           185:        {
        !           186:                *netbuffer = reboundstore;
        !           187:                doomcom->remotenode = 0;
        !           188:                reboundpacket = false;
        !           189:                return true;
        !           190:        }
        !           191: 
        !           192:        if (!netgame)
        !           193:                return false;
        !           194: 
        !           195:        doomcom->command = CMD_GET;
        !           196:        I_NetCmd ();
        !           197:        if (doomcom->remotenode == -1)
        !           198:                return false;
        !           199: 
        !           200:        if (doomcom->datalength != NetbufferSize ())
        !           201:        {
        !           202:                if (debugfile)
        !           203:                        fprintf (debugfile,"bad packet length %i\n",doomcom->datalength);
        !           204:                return false;
        !           205:        }
        !           206: 
        !           207:        if (NetbufferChecksum () != (netbuffer->checksum&NCMD_CHECKSUM) )
        !           208:        {
        !           209:                if (debugfile)
        !           210:                        fprintf (debugfile,"bad packet checksum\n");
        !           211:                return false;
        !           212:        }
        !           213: 
        !           214: if (debugfile)
        !           215: {
        !           216:        int             realretrans;
        !           217:                        int     i;
        !           218: 
        !           219:        if (netbuffer->checksum & NCMD_SETUP)
        !           220:                fprintf (debugfile,"setup packet\n");
        !           221:        else
        !           222:        {
        !           223:                if (netbuffer->checksum & NCMD_RETRANSMIT)
        !           224:                        realretrans = ExpandTics (netbuffer->retransmitfrom);
        !           225:                else
        !           226:                        realretrans = -1;
        !           227:                fprintf (debugfile,"get %i = (%i + %i, R %i)[%i] ",doomcom->remotenode,
        !           228:                ExpandTics(netbuffer->starttic),netbuffer->numtics, realretrans, doomcom->datalength);
        !           229:                for (i=0 ; i<doomcom->datalength ; i++)
        !           230:                        fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
        !           231:                fprintf (debugfile,"\n");
        !           232:        }
        !           233: }
        !           234:        return true;
        !           235: }
        !           236: 
        !           237: 
        !           238: /*
        !           239: ===================
        !           240: =
        !           241: = GetPackets
        !           242: =
        !           243: ===================
        !           244: */
        !           245: 
        !           246: char    exitmsg[80];
        !           247: 
        !           248: void GetPackets (void)
        !           249: {
        !           250:        int             netconsole;
        !           251:        int             netnode;
        !           252:        int             netdrone;
        !           253:        int             j;
        !           254:        ticcmd_t        *src, *dest;
        !           255:        int             dupedstart, dupedend;
        !           256:        int             skiptics;
        !           257:        int             realstart;
        !           258: 
        !           259:        while (HGetPacket ())
        !           260:        {
        !           261:                if (netbuffer->checksum & NCMD_SETUP)
        !           262:                        continue;               // extra setup packet
        !           263: 
        !           264:                netdrone = netbuffer->player & PL_DRONE;
        !           265:                netconsole = netbuffer->player & ~PL_DRONE;
        !           266:                netnode = doomcom->remotenode;
        !           267:                //
        !           268:                // to save bytes, only the low byte of tic numbers are sent
        !           269:                // Figure out what the rest of the bytes are
        !           270:                //
        !           271:                realstart = ExpandTics (netbuffer->starttic);
        !           272:                dupedstart = realstart*doomcom->ticdup;
        !           273:                dupedend = (realstart+netbuffer->numtics)*doomcom->ticdup;
        !           274: 
        !           275:                //
        !           276:                // check for exiting the game
        !           277:                //
        !           278:                if (netbuffer->checksum & NCMD_EXIT)
        !           279:                {
        !           280:                        if (!nodeingame[netnode])
        !           281:                                continue;
        !           282:                        nodeingame[netnode] = false;
        !           283:                        if (!netdrone)
        !           284:                        {
        !           285:                                playeringame[netconsole] = false;
        !           286:                                strcpy (exitmsg, "PLAYER 1 HAS LEFT THE GAME");
        !           287:                                exitmsg[7] += netconsole;
        !           288:                                P_SetMessage(&players[consoleplayer], exitmsg, true);
        !           289:                                UpdateState |= I_MESSAGES;
        !           290:                                S_StartSound(NULL, sfx_chat);
        !           291:                        }
        !           292:                        continue;
        !           293:                }
        !           294: 
        !           295:                //
        !           296:                // drone packets are just notifications
        !           297:                //
        !           298:                if (netdrone)
        !           299:                {
        !           300:                        nettics[netnode] = dupedend;
        !           301:                        continue;
        !           302:                }
        !           303: 
        !           304:                nodeforplayer[netconsole] = netnode;
        !           305: 
        !           306:                //
        !           307:                // check for retransmit request
        !           308:                //
        !           309:                if ( resendcount[netnode] <= 0
        !           310:                && (netbuffer->checksum & NCMD_RETRANSMIT) )
        !           311:                {
        !           312:                        resendto[netnode] = ExpandTics(netbuffer->retransmitfrom);
        !           313: if (debugfile)
        !           314: fprintf (debugfile,"retransmit from %i\n", resendto[netnode]);
        !           315:                        resendcount[netnode] = RESENDCOUNT;
        !           316:                }
        !           317:                else
        !           318:                        resendcount[netnode]--;
        !           319: 
        !           320:                //
        !           321:                // check for out of order / duplicated packet
        !           322:                //
        !           323:                if (dupedend == nettics[netnode])
        !           324:                        continue;
        !           325: 
        !           326:                if (dupedend < nettics[netnode])
        !           327:                {
        !           328: if (debugfile)
        !           329: fprintf (debugfile,"out of order packet (%i + %i)\n" ,realstart,netbuffer->numtics);
        !           330:                        continue;
        !           331:                }
        !           332: 
        !           333:                //
        !           334:                // check for a missed packet
        !           335:                //
        !           336:                if (dupedstart > nettics[netnode])
        !           337:                {
        !           338:                // stop processing until the other system resends the missed tics
        !           339: if (debugfile)
        !           340: fprintf (debugfile,"missed tics from %i (%i - %i)\n", netnode, dupedstart, nettics[netnode]);
        !           341:                        remoteresend[netnode] = true;
        !           342:                        continue;
        !           343:                }
        !           344: 
        !           345: //
        !           346: // update command store from the packet
        !           347: //
        !           348:                remoteresend[netnode] = false;
        !           349: 
        !           350:                skiptics = nettics[netnode]/doomcom->ticdup - realstart;
        !           351:                src = &netbuffer->cmds[skiptics];
        !           352: 
        !           353:                while (nettics[netnode] < dupedend)
        !           354:                {
        !           355:                        for (j=0 ; j<doomcom->ticdup ; j++)
        !           356:                        {
        !           357:                                dest = &netcmds[netconsole][nettics[netnode]%BACKUPTICS];
        !           358:                                nettics[netnode]++;
        !           359:                                *dest = *src;
        !           360:                                src->chatchar = 0;
        !           361:                                if (src->buttons & BT_SPECIAL)
        !           362:                                        src->buttons = 0;
        !           363:                        }
        !           364:                        src++;
        !           365:                }
        !           366:        }
        !           367: }
        !           368: 
        !           369: /*
        !           370: =============
        !           371: =
        !           372: = NetUpdate
        !           373: =
        !           374: = Builds ticcmds for console player
        !           375: = sends out a packet
        !           376: =============
        !           377: */
        !           378: 
        !           379: void NetUpdate (void)
        !           380: {
        !           381:        int             nowtime;
        !           382:        int             newtics;
        !           383:        int                             i,j;
        !           384:        int                             gameticdiv;
        !           385:        int                             realstart;
        !           386: 
        !           387:        if (singletics)
        !           388:                return;         // singletic update is syncronous
        !           389: 
        !           390: //
        !           391: // check time
        !           392: //
        !           393:        nowtime = I_GetTime ()/doomcom->ticdup;
        !           394:        newtics = nowtime - gametime;
        !           395:        gametime = nowtime;
        !           396:        if (newtics <= 0)                       // nothing new to update
        !           397:                goto listen;
        !           398: 
        !           399:        if (skiptics <= newtics)
        !           400:        {
        !           401:                newtics -= skiptics;
        !           402:                skiptics = 0;
        !           403:        }
        !           404:        else
        !           405:        {
        !           406:                skiptics -= newtics;
        !           407:                newtics = 0;
        !           408:        }
        !           409: 
        !           410: 
        !           411:        netbuffer->player = consoleplayer;
        !           412:        if (doomcom->drone)
        !           413:                netbuffer->player |= PL_DRONE;
        !           414: 
        !           415: //
        !           416: // drone packets
        !           417: //
        !           418:        if (doomcom->drone)
        !           419:        {
        !           420:                I_StartTic ();
        !           421:                D_ProcessEvents ();
        !           422:                goto sendit;
        !           423:        }
        !           424: 
        !           425: //
        !           426: // build new ticcmds for console player
        !           427: //
        !           428:        gameticdiv = (gametic+doomcom->ticdup-1)/doomcom->ticdup;
        !           429:        for (i=0 ; i<newtics ; i++)
        !           430:        {
        !           431:                I_StartTic ();
        !           432:                D_ProcessEvents ();
        !           433:                if (maketic - gameticdiv >= BACKUPTICS/2 /* /doomcom->ticdup */- 1)
        !           434:                {
        !           435:                        newtics = i;
        !           436:                        break;          // can't hold any more
        !           437:                }
        !           438: //printf ("mk:%i ",maketic);
        !           439:                G_BuildTiccmd (&localcmds[maketic%BACKUPTICS]);
        !           440:                maketic++;
        !           441:        }
        !           442: 
        !           443: //
        !           444: // send the packet to the other nodes
        !           445: //
        !           446: sendit:
        !           447:        for (i=0 ; i<doomcom->numnodes ; i++)
        !           448:                if (nodeingame[i])
        !           449:                {
        !           450:                        if (doomcom->drone)
        !           451:                        {
        !           452:                                netbuffer->starttic = realstart = maketic + BACKUPTICS/2;
        !           453:                                netbuffer->numtics = 0;
        !           454:                        }
        !           455:                        else
        !           456:                        {
        !           457:                                netbuffer->starttic = realstart = resendto[i];
        !           458:                                netbuffer->numtics = maketic - realstart;
        !           459:                                resendto[i] = maketic - doomcom->extratics;
        !           460:                        }
        !           461: 
        !           462:                        if (netbuffer->numtics > BACKUPTICS)
        !           463:                                I_Error ("NetUpdate: netbuffer->numtics > BACKUPTICS");
        !           464: 
        !           465:                        for (j=0 ; j< netbuffer->numtics ; j++)
        !           466:                                netbuffer->cmds[j] =
        !           467:                                        localcmds[(realstart+j)%BACKUPTICS];
        !           468: 
        !           469:                        if (remoteresend[i])
        !           470:                        {
        !           471:                                netbuffer->retransmitfrom = nettics[i]/doomcom->ticdup;
        !           472:                                HSendPacket (i, NCMD_RETRANSMIT);
        !           473:                        }
        !           474:                        else
        !           475:                        {
        !           476:                                netbuffer->retransmitfrom = 0;
        !           477:                                HSendPacket (i, 0);
        !           478:                        }
        !           479:                }
        !           480: 
        !           481: //
        !           482: // listen for other packets
        !           483: //
        !           484: listen:
        !           485: 
        !           486:        GetPackets ();
        !           487: }
        !           488: 
        !           489: 
        !           490: /*
        !           491: =====================
        !           492: =
        !           493: = CheckAbort
        !           494: =
        !           495: =====================
        !           496: */
        !           497: 
        !           498: void CheckAbort (void)
        !           499: {
        !           500:        event_t *ev;
        !           501: 
        !           502:        I_WaitVBL(2);
        !           503: 
        !           504:        I_StartTic ();
        !           505:        for ( ; eventtail != eventhead
        !           506:        ; eventtail = (++eventtail)&(MAXEVENTS-1) )
        !           507:        {
        !           508:                ev = &events[eventtail];
        !           509:                if (ev->type == ev_keydown && ev->data1 == KEY_ESCAPE)
        !           510:                        I_Error ("Network game synchronization aborted.");
        !           511:        }
        !           512: }
        !           513: 
        !           514: /*
        !           515: =====================
        !           516: =
        !           517: = D_ArbitrateNetStart
        !           518: =
        !           519: =====================
        !           520: */
        !           521: 
        !           522: void D_ArbitrateNetStart (void)
        !           523: {
        !           524:        int             i;
        !           525:        boolean gotinfo[MAXNETNODES];
        !           526: 
        !           527:        autostart = true;
        !           528:        memset (gotinfo,0,sizeof(gotinfo));
        !           529: 
        !           530:        if (doomcom->consoleplayer)
        !           531:        {       // listen for setup info from key player
        !           532:                //printf ("listening for network start info...\n");
        !           533:                while (1)
        !           534:                {
        !           535:                        CheckAbort ();
        !           536:                        if (!HGetPacket ())
        !           537:                                continue;
        !           538:                        if (netbuffer->checksum & NCMD_SETUP)
        !           539:                        {
        !           540:                                if (netbuffer->player != VERSION)
        !           541:                                        I_Error ("Different HERETIC versions cannot play a net game!");
        !           542:                                startskill = netbuffer->retransmitfrom & 15;
        !           543:                                deathmatch = (netbuffer->retransmitfrom & 0x80) > 0;
        !           544:                                startmap = netbuffer->starttic & 15;
        !           545:                                startepisode = netbuffer->starttic >> 4;
        !           546:                                return;
        !           547:                        }
        !           548:                }
        !           549:        }
        !           550:        else
        !           551:        {       // key player, send the setup info
        !           552: //             printf ("sending network start info...\n");
        !           553:                do
        !           554:                {
        !           555:                        CheckAbort ();
        !           556:                        for (i=0 ; i<doomcom->numnodes ; i++)
        !           557:                        {
        !           558:                                netbuffer->retransmitfrom = startskill;
        !           559:                                if (deathmatch)
        !           560:                                        netbuffer->retransmitfrom |= 0x80;
        !           561:                                netbuffer->starttic = startepisode * 16 + startmap;
        !           562:                                netbuffer->player = VERSION;
        !           563:                                netbuffer->numtics = 0;
        !           564:                                HSendPacket (i, NCMD_SETUP);
        !           565:                        }
        !           566: 
        !           567:                        while (HGetPacket ())
        !           568:                        {
        !           569: //printf ("got packet\n");
        !           570:                                gotinfo[netbuffer->player&0x7f] = true;
        !           571:                        }
        !           572: 
        !           573:                        for (i=1 ; i<doomcom->numnodes ; i++)
        !           574:                                if (!gotinfo[i])
        !           575:                                        break;
        !           576:                } while (i < doomcom->numnodes);
        !           577:        }
        !           578: }
        !           579: 
        !           580: /*
        !           581: ===================
        !           582: =
        !           583: = D_CheckNetGame
        !           584: =
        !           585: = Works out player numbers among the net participants
        !           586: ===================
        !           587: */
        !           588: 
        !           589: extern int                     viewangleoffset;
        !           590: 
        !           591: void D_CheckNetGame (void)
        !           592: {
        !           593:        int             i;
        !           594: 
        !           595:        for (i=0 ; i<MAXNETNODES ; i++)
        !           596:        {
        !           597:                nodeingame[i] = false;
        !           598:                nettics[i] = 0;
        !           599:                remoteresend[i] = false;        // set when local needs tics
        !           600:                resendto[i] = 0;                        // which tic to start sending
        !           601:        }
        !           602: 
        !           603: // I_InitNetwork sets doomcom and netgame
        !           604:        I_InitNetwork ();
        !           605:        if (doomcom->id != DOOMCOM_ID)
        !           606:                I_Error ("Doomcom buffer invalid!");
        !           607:        netbuffer = &doomcom->data;
        !           608:        consoleplayer = displayplayer = doomcom->consoleplayer;
        !           609:        if (netgame)
        !           610:                D_ArbitrateNetStart ();
        !           611: //printf ("startskill %i  deathmatch: %i  startmap: %i  startepisode: %i\n", startskill, deathmatch, startmap, startepisode);
        !           612: 
        !           613: // read values out of doomcom
        !           614:        ticdup = doomcom->ticdup;
        !           615: 
        !           616:        for (i=0 ; i<doomcom->numplayers ; i++)
        !           617:                playeringame[i] = true;
        !           618:        for (i=0 ; i<doomcom->numnodes ; i++)
        !           619:                nodeingame[i] = true;
        !           620: 
        !           621: //printf ("player %i of %i (%i nodes)\n", consoleplayer+1, doomcom->numplayers, doomcom->numnodes);
        !           622: 
        !           623: }
        !           624: 
        !           625: /*
        !           626: ==================
        !           627: =
        !           628: = D_QuitNetGame
        !           629: =
        !           630: = Called before quitting to leave a net game without hanging the
        !           631: = other players
        !           632: =
        !           633: ==================
        !           634: */
        !           635: 
        !           636: void D_QuitNetGame (void)
        !           637: {
        !           638:        int             i, j;
        !           639: 
        !           640:        if (debugfile)
        !           641:                fclose (debugfile);
        !           642: 
        !           643:        if (!netgame || !usergame || consoleplayer == -1)
        !           644:                return;
        !           645: 
        !           646: // send a bunch of packets for security
        !           647:        netbuffer->player = consoleplayer;
        !           648:        if (doomcom->drone)
        !           649:                netbuffer->player |= PL_DRONE;
        !           650:        netbuffer->numtics = 0;
        !           651:        for (i=0 ; i<4 ; i++)
        !           652:        {
        !           653:                for (j=1 ; j<doomcom->numnodes ; j++)
        !           654:                        if (nodeingame[j])
        !           655:                                HSendPacket (j, NCMD_EXIT);
        !           656:                I_WaitVBL (1);
        !           657:        }
        !           658: }
        !           659: 
        !           660: 
        !           661: 
        !           662: /*
        !           663: ===============
        !           664: =
        !           665: = TryRunTics
        !           666: =
        !           667: ===============
        !           668: */
        !           669: 
        !           670: int    frametics[4], frameon;
        !           671: int    frameskip[4];
        !           672: int            oldnettics;
        !           673: extern boolean advancedemo;
        !           674: 
        !           675: void TryRunTics (void)
        !           676: {
        !           677:        int             i;
        !           678:        int             lowtic, nextlowest;
        !           679:        int             entertic;
        !           680:        int     static          oldentertics;
        !           681:        int                             realtics, availabletics;
        !           682:        int                             counts;
        !           683:        int                             numplaying;
        !           684: 
        !           685: //
        !           686: // get real tics
        !           687: //
        !           688:        entertic = I_GetTime ();
        !           689:        realtics = entertic - oldentertics;
        !           690:        oldentertics = entertic;
        !           691: 
        !           692: //
        !           693: // get available tics
        !           694: //
        !           695:        NetUpdate ();
        !           696: 
        !           697:        lowtic = nextlowest = MAXINT;
        !           698:        numplaying = 0;
        !           699:        for (i=0 ; i<doomcom->numnodes ; i++)
        !           700:                if (nodeingame[i])
        !           701:                {
        !           702:                        numplaying++;
        !           703:                        if (nettics[i] < lowtic)
        !           704:                        {
        !           705:                                nextlowest = lowtic;
        !           706:                                lowtic = nettics[i];
        !           707:                        }
        !           708:                        else if (nettics[i] < nextlowest)
        !           709:                                nextlowest = nettics[i];
        !           710:                }
        !           711:        availabletics = lowtic - gametic;
        !           712: 
        !           713: 
        !           714: //
        !           715: // decide how many tics to run
        !           716: //
        !           717:        if (realtics < availabletics-1)
        !           718:                counts = realtics+1;
        !           719:        else if (realtics < availabletics)
        !           720:                counts = realtics;
        !           721:        else
        !           722:                counts = availabletics;
        !           723:        if (counts < 1)
        !           724:                counts = 1;
        !           725: 
        !           726:        frameon++;
        !           727: 
        !           728: if (debugfile)
        !           729:        fprintf (debugfile,"=======real: %i  avail: %i  game: %i\n",realtics, availabletics,counts);
        !           730: 
        !           731: //=============================================================================
        !           732: //
        !           733: //     ideally nettics[0] should be 1 - 3 tics above lowtic
        !           734: //     if we are consistantly slower, speed up time
        !           735: //     drones should never hold up the other players
        !           736: //
        !           737:        for (i=0 ; i<MAXPLAYERS ; i++)
        !           738:                if (playeringame[i])
        !           739:                        break;
        !           740:        if (consoleplayer == i)
        !           741:        {       // the key player does not adapt
        !           742:        }
        !           743:        else
        !           744:        {
        !           745:                if (nettics[0] <= nettics[nodeforplayer[i]])
        !           746:                {
        !           747:                        gametime--;
        !           748: //                     printf ("-");
        !           749:                }
        !           750:                frameskip[frameon&3] = (oldnettics > nettics[nodeforplayer[i]]);
        !           751:                oldnettics = nettics[0];
        !           752:                if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3])
        !           753:                {
        !           754:                        skiptics = 1;
        !           755: //                     printf ("+");
        !           756:                }
        !           757:        }
        !           758: //=============================================================================
        !           759: 
        !           760: //
        !           761: // wait for new tics if needed
        !           762: //
        !           763:        while (lowtic < gametic + counts)
        !           764:        {
        !           765: 
        !           766:                NetUpdate ();
        !           767:                lowtic = MAXINT;
        !           768: 
        !           769:                for (i=0 ; i<doomcom->numnodes ; i++)
        !           770:                        if (nodeingame[i] && nettics[i] < lowtic)
        !           771:                                lowtic = nettics[i];
        !           772: 
        !           773:                if (lowtic < gametic)
        !           774:                        I_Error ("TryRunTics: lowtic < gametic");
        !           775: 
        !           776:                // don't stay in here forever -- give the menu a chance to work
        !           777:                if (I_GetTime () - entertic >= 20)
        !           778:                {
        !           779:                        MN_Ticker ();
        !           780:                        return;
        !           781:                }
        !           782:        }
        !           783: 
        !           784: 
        !           785: //
        !           786: // run the tics
        !           787: //
        !           788:        while (counts--)
        !           789:        {
        !           790:                if (advancedemo)
        !           791:                        D_DoAdvanceDemo ();
        !           792:                MN_Ticker ();
        !           793:                G_Ticker ();
        !           794:                NetUpdate ();                                   // check for new console commands
        !           795:                gametic++;
        !           796:        }
        !           797: }

unix.superglobalmegacorp.com

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