Annotation of quake2/qcommon/common.c.org, revision 1.1.1.1

1.1       root        1: // common.c -- misc functions used in client and server
                      2: #include "qcommon.h"
                      3: #include <setjmp.h>
                      4: 
                      5: #define        MAXPRINTMSG     4096
                      6: 
                      7: #define MAX_NUM_ARGVS  50
                      8: 
                      9: 
                     10: int            com_argc;
                     11: char   *com_argv[MAX_NUM_ARGVS+1];
                     12: 
                     13: int            realtime;
                     14: 
                     15: jmp_buf abortframe;            // an ERR_DROP occured, exit the entire frame
                     16: 
                     17: 
                     18: FILE   *log_stats_file;
                     19: 
                     20: cvar_t *host_speeds;
                     21: cvar_t *log_stats;
                     22: cvar_t *developer;
                     23: cvar_t *timescale;
                     24: cvar_t *fixedtime;
                     25: cvar_t *logfile_active;        // 1 = buffer log, 2 = flush after each print
                     26: cvar_t *showtrace;
                     27: cvar_t *dedicated;
                     28: 
                     29: FILE   *logfile;
                     30: 
                     31: int                    server_state;
                     32: 
                     33: // host_speeds times
                     34: int            time_before_game;
                     35: int            time_after_game;
                     36: int            time_before_ref;
                     37: int            time_after_ref;
                     38: 
                     39: /*
                     40: ============================================================================
                     41: 
                     42: CLIENT / SERVER interactions
                     43: 
                     44: ============================================================================
                     45: */
                     46: 
                     47: static int     rd_target;
                     48: static char    *rd_buffer;
                     49: static int     rd_buffersize;
                     50: static void    (*rd_flush)(int target, char *buffer);
                     51: 
                     52: void Com_BeginRedirect (int target, char *buffer, int buffersize, void (*flush))
                     53: {
                     54:        if (!target || !buffer || !buffersize || !flush)
                     55:                return;
                     56:        rd_target = target;
                     57:        rd_buffer = buffer;
                     58:        rd_buffersize = buffersize;
                     59:        rd_flush = flush;
                     60: 
                     61:        *rd_buffer = 0;
                     62: }
                     63: 
                     64: void Com_EndRedirect (void)
                     65: {
                     66:        rd_flush(rd_target, rd_buffer);
                     67: 
                     68:        rd_target = 0;
                     69:        rd_buffer = NULL;
                     70:        rd_buffersize = 0;
                     71:        rd_flush = NULL;
                     72: }
                     73: 
                     74: /*
                     75: =============
                     76: Com_Printf
                     77: 
                     78: Both client and server can use this, and it will output
                     79: to the apropriate place.
                     80: =============
                     81: */
                     82: void Com_Printf (char *fmt, ...)
                     83: {
                     84:        va_list         argptr;
                     85:        char            msg[MAXPRINTMSG];
                     86: 
                     87:        va_start (argptr,fmt);
                     88:        vsprintf (msg,fmt,argptr);
                     89:        va_end (argptr);
                     90: 
                     91:        if (rd_target)
                     92:        {
                     93:                if ((strlen (msg) + strlen(rd_buffer)) > (rd_buffersize - 1))
                     94:                {
                     95:                        rd_flush(rd_target, rd_buffer);
                     96:                        *rd_buffer = 0;
                     97:                }
                     98:                strcat (rd_buffer, msg);
                     99:                return;
                    100:        }
                    101: 
                    102:        Con_Print (msg);
                    103:                
                    104:        // also echo to debugging console
                    105:        Sys_ConsoleOutput (msg);
                    106: 
                    107:        // logfile
                    108:        if (logfile_active && logfile_active->value)
                    109:        {
                    110:                char    name[MAX_QPATH];
                    111:                
                    112:                if (!logfile)
                    113:                {
                    114:                        Com_sprintf (name, sizeof(name), "%s/qconsole.log", FS_Gamedir ());
                    115:                        logfile = fopen (name, "w");
                    116:                }
                    117:                if (logfile)
                    118:                        fprintf (logfile, "%s", msg);
                    119:                if (logfile_active->value > 1)
                    120:                        fflush (logfile);               // force it to save every time
                    121:        }
                    122: }
                    123: 
                    124: 
                    125: /*
                    126: ================
                    127: Com_DPrintf
                    128: 
                    129: A Com_Printf that only shows up if the "developer" cvar is set
                    130: ================
                    131: */
                    132: void Com_DPrintf (char *fmt, ...)
                    133: {
                    134:        va_list         argptr;
                    135:        char            msg[MAXPRINTMSG];
                    136:                
                    137:        if (!developer || !developer->value)
                    138:                return;                 // don't confuse non-developers with techie stuff...
                    139: 
                    140:        va_start (argptr,fmt);
                    141:        vsprintf (msg,fmt,argptr);
                    142:        va_end (argptr);
                    143:        
                    144:        Com_Printf ("%s", msg);
                    145: }
                    146: 
                    147: 
                    148: /*
                    149: =============
                    150: Com_Error
                    151: 
                    152: Both client and server can use this, and it will
                    153: do the apropriate things.
                    154: =============
                    155: */
                    156: void Com_Error (int code, char *fmt, ...)
                    157: {
                    158:        va_list         argptr;
                    159:        static char             msg[MAXPRINTMSG];
                    160:        static  qboolean        recursive;
                    161: 
                    162:        if (recursive)
                    163:                Sys_Error ("recursive error after: %s", msg);
                    164:        recursive = true;
                    165: 
                    166:        va_start (argptr,fmt);
                    167:        vsprintf (msg,fmt,argptr);
                    168:        va_end (argptr);
                    169:        
                    170:        if (code == ERR_DISCONNECT)
                    171:        {
                    172:                CL_Drop ();
                    173:                recursive = false;
                    174:                longjmp (abortframe, -1);
                    175:        }
                    176:        else if (code == ERR_DROP)
                    177:        {
                    178:                Com_Printf ("********************\nERROR: %s\n********************\n", msg);
                    179:                SV_Shutdown (va("Server crashed: %s\n", msg), false);
                    180:                CL_Drop ();
                    181:                recursive = false;
                    182:                longjmp (abortframe, -1);
                    183:        }
                    184:        else
                    185:        {
                    186:                SV_Shutdown (va("Server fatal crashed: %s\n", msg), false);
                    187:                CL_Shutdown ();
                    188:        }
                    189: 
                    190:        if (logfile)
                    191:        {
                    192:                fclose (logfile);
                    193:                logfile = NULL;
                    194:        }
                    195: 
                    196:        Sys_Error ("%s", msg);
                    197: }
                    198: 
                    199: 
                    200: /*
                    201: =============
                    202: Com_Quit
                    203: 
                    204: Both client and server can use this, and it will
                    205: do the apropriate things.
                    206: =============
                    207: */
                    208: void Com_Quit (void)
                    209: {
                    210:        SV_Shutdown ("Server quit\n", false);
                    211:        CL_Shutdown ();
                    212: 
                    213:        if (logfile)
                    214:        {
                    215:                fclose (logfile);
                    216:                logfile = NULL;
                    217:        }
                    218: 
                    219:        Sys_Quit ();
                    220: }
                    221: 
                    222: 
                    223: /*
                    224: ==================
                    225: Com_ServerState
                    226: ==================
                    227: */
                    228: int Com_ServerState (void)
                    229: {
                    230:        return server_state;
                    231: }
                    232: 
                    233: /*
                    234: ==================
                    235: Com_SetServerState
                    236: ==================
                    237: */
                    238: void Com_SetServerState (int state)
                    239: {
                    240:        server_state = state;
                    241: }
                    242: 
                    243: 
                    244: /*
                    245: ==============================================================================
                    246: 
                    247:                        MESSAGE IO FUNCTIONS
                    248: 
                    249: Handles byte ordering and avoids alignment errors
                    250: ==============================================================================
                    251: */
                    252: 
                    253: vec3_t bytedirs[NUMVERTEXNORMALS] =
                    254: {
                    255: #include "../client/anorms.h"
                    256: };
                    257: 
                    258: //
                    259: // writing functions
                    260: //
                    261: 
                    262: void MSG_WriteChar (sizebuf_t *sb, int c)
                    263: {
                    264:        byte    *buf;
                    265:        
                    266: #ifdef PARANOID
                    267:        if (c < -128 || c > 127)
                    268:                Com_Error (ERR_FATAL, "MSG_WriteChar: range error");
                    269: #endif
                    270: 
                    271:        buf = SZ_GetSpace (sb, 1);
                    272:        buf[0] = c;
                    273: }
                    274: 
                    275: void MSG_WriteByte (sizebuf_t *sb, int c)
                    276: {
                    277:        byte    *buf;
                    278:        
                    279: #ifdef PARANOID
                    280:        if (c < 0 || c > 255)
                    281:                Com_Error (ERR_FATAL, "MSG_WriteByte: range error");
                    282: #endif
                    283: 
                    284:        buf = SZ_GetSpace (sb, 1);
                    285:        buf[0] = c;
                    286: }
                    287: 
                    288: void MSG_WriteShort (sizebuf_t *sb, int c)
                    289: {
                    290:        byte    *buf;
                    291:        
                    292: #ifdef PARANOID
                    293:        if (c < ((short)0x8000) || c > (short)0x7fff)
                    294:                Com_Error (ERR_FATAL, "MSG_WriteShort: range error");
                    295: #endif
                    296: 
                    297:        buf = SZ_GetSpace (sb, 2);
                    298:        buf[0] = c&0xff;
                    299:        buf[1] = c>>8;
                    300: }
                    301: 
                    302: void MSG_WriteLong (sizebuf_t *sb, int c)
                    303: {
                    304:        byte    *buf;
                    305:        
                    306:        buf = SZ_GetSpace (sb, 4);
                    307:        buf[0] = c&0xff;
                    308:        buf[1] = (c>>8)&0xff;
                    309:        buf[2] = (c>>16)&0xff;
                    310:        buf[3] = c>>24;
                    311: }
                    312: 
                    313: void MSG_WriteFloat (sizebuf_t *sb, float f)
                    314: {
                    315:        union
                    316:        {
                    317:                float   f;
                    318:                int     l;
                    319:        } dat;
                    320:        
                    321:        
                    322:        dat.f = f;
                    323:        dat.l = LittleLong (dat.l);
                    324:        
                    325:        SZ_Write (sb, &dat.l, 4);
                    326: }
                    327: 
                    328: void MSG_WriteString (sizebuf_t *sb, char *s)
                    329: {
                    330:        if (!s)
                    331:                SZ_Write (sb, "", 1);
                    332:        else
                    333:                SZ_Write (sb, s, strlen(s)+1);
                    334: }
                    335: 
                    336: void MSG_WriteCoord (sizebuf_t *sb, float f)
                    337: {
                    338:        MSG_WriteShort (sb, (int)(f*8));
                    339: }
                    340: 
                    341: void MSG_WritePos (sizebuf_t *sb, vec3_t pos)
                    342: {
                    343:        MSG_WriteShort (sb, (int)(pos[0]*8));
                    344:        MSG_WriteShort (sb, (int)(pos[1]*8));
                    345:        MSG_WriteShort (sb, (int)(pos[2]*8));
                    346: }
                    347: 
                    348: void MSG_WriteAngle (sizebuf_t *sb, float f)
                    349: {
                    350:        MSG_WriteByte (sb, (int)(f*256/360) & 255);
                    351: }
                    352: 
                    353: void MSG_WriteAngle16 (sizebuf_t *sb, float f)
                    354: {
                    355:        MSG_WriteShort (sb, ANGLE2SHORT(f));
                    356: }
                    357: 
                    358: 
                    359: void MSG_WriteDeltaUsercmd (sizebuf_t *buf, usercmd_t *from, usercmd_t *cmd)
                    360: {
                    361:        int             bits;
                    362: 
                    363: //
                    364: // send the movement message
                    365: //
                    366:        bits = 0;
                    367:        if (cmd->angles[0] != from->angles[0])
                    368:                bits |= CM_ANGLE1;
                    369:        if (cmd->angles[1] != from->angles[1])
                    370:                bits |= CM_ANGLE2;
                    371:        if (cmd->angles[2] != from->angles[2])
                    372:                bits |= CM_ANGLE3;
                    373:        if (cmd->forwardmove != from->forwardmove)
                    374:                bits |= CM_FORWARD;
                    375:        if (cmd->sidemove != from->sidemove)
                    376:                bits |= CM_SIDE;
                    377:        if (cmd->upmove != from->upmove)
                    378:                bits |= CM_UP;
                    379:        if (cmd->buttons != from->buttons)
                    380:                bits |= CM_BUTTONS;
                    381:        if (cmd->impulse != from->impulse)
                    382:                bits |= CM_IMPULSE;
                    383: 
                    384:     MSG_WriteByte (buf, bits);
                    385: 
                    386:        if (bits & CM_ANGLE1)
                    387:                MSG_WriteShort (buf, cmd->angles[0]);
                    388:        if (bits & CM_ANGLE2)
                    389:                MSG_WriteShort (buf, cmd->angles[1]);
                    390:        if (bits & CM_ANGLE3)
                    391:                MSG_WriteShort (buf, cmd->angles[2]);
                    392:        
                    393:        if (bits & CM_FORWARD)
                    394:                MSG_WriteShort (buf, cmd->forwardmove);
                    395:        if (bits & CM_SIDE)
                    396:                MSG_WriteShort (buf, cmd->sidemove);
                    397:        if (bits & CM_UP)
                    398:                MSG_WriteShort (buf, cmd->upmove);
                    399: 
                    400:        if (bits & CM_BUTTONS)
                    401:                MSG_WriteByte (buf, cmd->buttons);
                    402:        if (bits & CM_IMPULSE)
                    403:            MSG_WriteByte (buf, cmd->impulse);
                    404: 
                    405:     MSG_WriteByte (buf, cmd->msec);
                    406:        MSG_WriteByte (buf, cmd->lightlevel);
                    407: }
                    408: 
                    409: 
                    410: void MSG_WriteDir (sizebuf_t *sb, vec3_t dir)
                    411: {
                    412:        int             i, best;
                    413:        float   d, bestd;
                    414:        
                    415:        if (!dir)
                    416:        {
                    417:                MSG_WriteByte (sb, 0);
                    418:                return;
                    419:        }
                    420: 
                    421:        bestd = 0;
                    422:        best = 0;
                    423:        for (i=0 ; i<NUMVERTEXNORMALS ; i++)
                    424:        {
                    425:                d = DotProduct (dir, bytedirs[i]);
                    426:                if (d > bestd)
                    427:                {
                    428:                        bestd = d;
                    429:                        best = i;
                    430:                }
                    431:        }
                    432:        MSG_WriteByte (sb, best);
                    433: }
                    434: 
                    435: 
                    436: void MSG_ReadDir (sizebuf_t *sb, vec3_t dir)
                    437: {
                    438:        int             b;
                    439: 
                    440:        b = MSG_ReadByte (sb);
                    441:        if (b >= NUMVERTEXNORMALS)
                    442:                Com_Error (ERR_DROP, "MSF_ReadDir: out of range");
                    443:        VectorCopy (bytedirs[b], dir);
                    444: }
                    445: 
                    446: 
                    447: /*
                    448: ==================
                    449: MSG_WriteDeltaEntity
                    450: 
                    451: Writes part of a packetentities message.
                    452: Can delta from either a baseline or a previous packet_entity
                    453: ==================
                    454: */
                    455: void MSG_WriteDeltaEntity (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force)
                    456: {
                    457:        int             bits;
                    458: 
                    459:        if (!to->number)
                    460:                Com_Error (ERR_FATAL, "Unset entity number");
                    461:        if (to->number >= MAX_EDICTS)
                    462:                Com_Error (ERR_FATAL, "Entity number >= MAX_EDICTS");
                    463: 
                    464: // send an update
                    465:        bits = 0;
                    466: 
                    467:        if (to->number >= 256)
                    468:                bits |= U_NUMBER16;             // number8 is implicit otherwise
                    469: 
                    470:        if (to->origin[0] != from->origin[0])
                    471:                bits |= U_ORIGIN1;
                    472:        if (to->origin[1] != from->origin[1])
                    473:                bits |= U_ORIGIN2;
                    474:        if (to->origin[2] != from->origin[2])
                    475:                bits |= U_ORIGIN3;
                    476: 
                    477:        if ( to->angles[0] != from->angles[0] )
                    478:                bits |= U_ANGLE1;               
                    479:        if ( to->angles[1] != from->angles[1] )
                    480:                bits |= U_ANGLE2;
                    481:        if ( to->angles[2] != from->angles[2] )
                    482:                bits |= U_ANGLE3;
                    483:                
                    484:        if ( to->skinnum != from->skinnum )
                    485:        {
                    486:                if ((unsigned)to->skinnum < 256)
                    487:                        bits |= U_SKIN8;
                    488:                else if ((unsigned)to->skinnum < 0x10000)
                    489:                        bits |= U_SKIN16;
                    490:                else
                    491:                        bits |= (U_SKIN8|U_SKIN16);
                    492:        }
                    493:                
                    494:        if ( to->frame != from->frame )
                    495:        {
                    496:                if (to->frame < 256)
                    497:                        bits |= U_FRAME8;
                    498:                else
                    499:                        bits |= U_FRAME16;
                    500:        }
                    501: 
                    502:        if ( to->effects != from->effects )
                    503:        {
                    504:                if (to->effects < 256)
                    505:                        bits |= U_EFFECTS8;
                    506:                else if (to->effects < 0x8000)
                    507:                        bits |= U_EFFECTS16;
                    508:                else
                    509:                        bits |= U_EFFECTS8|U_EFFECTS16;
                    510:        }
                    511:        
                    512:        if ( to->renderfx != from->renderfx )
                    513:        {
                    514:                if (to->renderfx < 256)
                    515:                        bits |= U_RENDERFX8;
                    516:                else if (to->renderfx < 0x8000)
                    517:                        bits |= U_RENDERFX16;
                    518:                else
                    519:                        bits |= U_RENDERFX8|U_RENDERFX16;
                    520:        }
                    521:        
                    522:        if ( to->solid != from->solid )
                    523:                bits |= U_SOLID;
                    524:        
                    525:        // event is not delta compressed, just 0 compressed
                    526:        if ( to->event  )
                    527:                bits |= U_EVENT;
                    528:        
                    529:        if ( to->modelindex != from->modelindex )
                    530:                bits |= U_MODEL;
                    531:        if ( to->modelindex2 != from->modelindex2 )
                    532:                bits |= U_MODEL2;
                    533:        if ( to->modelindex3 != from->modelindex3 )
                    534:                bits |= U_MODEL3;
                    535:        if ( to->modelindex4 != from->modelindex4 )
                    536:                bits |= U_MODEL4;
                    537: 
                    538:        if ( to->sound != from->sound )
                    539:                bits |= U_SOUND;
                    540: 
                    541:        if (to->old_origin[0] != from->old_origin[0]
                    542:                || to->old_origin[1] != from->old_origin[1]
                    543:                || to->old_origin[2] != from->old_origin[2] )
                    544:                bits |= U_OLDORIGIN;            // FIXME: only when newly seen!!!
                    545: 
                    546:        //
                    547:        // write the message
                    548:        //
                    549:        if (!bits && !force)
                    550:                return;         // nothing to send!
                    551: 
                    552:        //----------
                    553: 
                    554:        if (bits & 0xff000000)
                    555:                bits |= U_MOREBITS3 | U_MOREBITS2 | U_MOREBITS1;
                    556:        else if (bits & 0x00ff0000)
                    557:                bits |= U_MOREBITS2 | U_MOREBITS1;
                    558:        else if (bits & 0x0000ff00)
                    559:                bits |= U_MOREBITS1;
                    560: 
                    561:        MSG_WriteByte (msg,     bits&255 );
                    562: 
                    563:        if (bits & 0xff000000)
                    564:        {
                    565:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    566:                MSG_WriteByte (msg,     (bits>>16)&255 );
                    567:                MSG_WriteByte (msg,     (bits>>24)&255 );
                    568:        }
                    569:        else if (bits & 0x00ff0000)
                    570:        {
                    571:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    572:                MSG_WriteByte (msg,     (bits>>16)&255 );
                    573:        }
                    574:        else if (bits & 0x0000ff00)
                    575:        {
                    576:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    577:        }
                    578: 
                    579:        //----------
                    580: 
                    581:        if (bits & U_NUMBER16)
                    582:                MSG_WriteShort (msg, to->number);
                    583:        else
                    584:                MSG_WriteByte (msg,     to->number);
                    585: 
                    586:        if (bits & U_MODEL)
                    587:                MSG_WriteByte (msg,     to->modelindex);
                    588:        if (bits & U_MODEL2)
                    589:                MSG_WriteByte (msg,     to->modelindex2);
                    590:        if (bits & U_MODEL3)
                    591:                MSG_WriteByte (msg,     to->modelindex3);
                    592:        if (bits & U_MODEL4)
                    593:                MSG_WriteByte (msg,     to->modelindex4);
                    594: 
                    595:        if (bits & U_FRAME8)
                    596:                MSG_WriteByte (msg, to->frame);
                    597:        if (bits & U_FRAME16)
                    598:                MSG_WriteShort (msg, to->frame);
                    599: 
                    600:        if ((bits & U_SKIN8) && (bits & U_SKIN16))              //used for laser colors
                    601:                MSG_WriteLong (msg, to->skinnum);
                    602:        else if (bits & U_SKIN8)
                    603:                MSG_WriteByte (msg, to->skinnum);
                    604:        else if (bits & U_SKIN16)
                    605:                MSG_WriteShort (msg, to->skinnum);
                    606: 
                    607: 
                    608:        if ( (bits & (U_EFFECTS8|U_EFFECTS16)) == (U_EFFECTS8|U_EFFECTS16) )
                    609:                MSG_WriteLong (msg, to->effects);
                    610:        else if (bits & U_EFFECTS8)
                    611:                MSG_WriteByte (msg, to->effects);
                    612:        else if (bits & U_EFFECTS16)
                    613:                MSG_WriteShort (msg, to->effects);
                    614: 
                    615:        if ( (bits & (U_RENDERFX8|U_RENDERFX16)) == (U_RENDERFX8|U_RENDERFX16) )
                    616:                MSG_WriteLong (msg, to->renderfx);
                    617:        else if (bits & U_RENDERFX8)
                    618:                MSG_WriteByte (msg, to->renderfx);
                    619:        else if (bits & U_RENDERFX16)
                    620:                MSG_WriteShort (msg, to->renderfx);
                    621: 
                    622:        if (bits & U_ORIGIN1)
                    623:                MSG_WriteCoord (msg, to->origin[0]);            
                    624:        if (bits & U_ORIGIN2)
                    625:                MSG_WriteCoord (msg, to->origin[1]);
                    626:        if (bits & U_ORIGIN3)
                    627:                MSG_WriteCoord (msg, to->origin[2]);
                    628: 
                    629:        if (bits & U_ANGLE1)
                    630:                MSG_WriteAngle(msg, to->angles[0]);
                    631:        if (bits & U_ANGLE2)
                    632:                MSG_WriteAngle(msg, to->angles[1]);
                    633:        if (bits & U_ANGLE3)
                    634:                MSG_WriteAngle(msg, to->angles[2]);
                    635: 
                    636:        if (bits & U_OLDORIGIN)
                    637:        {
                    638:                MSG_WriteCoord (msg, to->old_origin[0]);
                    639:                MSG_WriteCoord (msg, to->old_origin[1]);
                    640:                MSG_WriteCoord (msg, to->old_origin[2]);
                    641:        }
                    642: 
                    643:        if (bits & U_SOUND)
                    644:                MSG_WriteByte (msg, to->sound);
                    645:        if (bits & U_EVENT)
                    646:                MSG_WriteByte (msg, to->event);
                    647:        if (bits & U_SOLID)
                    648:                MSG_WriteShort (msg, to->solid);
                    649: }
                    650: 
                    651: 
                    652: //============================================================
                    653: 
                    654: //
                    655: // reading functions
                    656: //
                    657: 
                    658: void MSG_BeginReading (sizebuf_t *msg)
                    659: {
                    660:        msg->readcount = 0;
                    661: }
                    662: 
                    663: // returns -1 if no more characters are available
                    664: int MSG_ReadChar (sizebuf_t *msg_read)
                    665: {
                    666:        int     c;
                    667:        
                    668:        if (msg_read->readcount+1 > msg_read->cursize)
                    669:                c = -1;
                    670:        else
                    671:                c = (signed char)msg_read->data[msg_read->readcount];
                    672:        msg_read->readcount++;
                    673:        
                    674:        return c;
                    675: }
                    676: 
                    677: int MSG_ReadByte (sizebuf_t *msg_read)
                    678: {
                    679:        int     c;
                    680:        
                    681:        if (msg_read->readcount+1 > msg_read->cursize)
                    682:                c = -1;
                    683:        else
                    684:                c = (unsigned char)msg_read->data[msg_read->readcount];
                    685:        msg_read->readcount++;
                    686:        
                    687:        return c;
                    688: }
                    689: 
                    690: int MSG_ReadShort (sizebuf_t *msg_read)
                    691: {
                    692:        int     c;
                    693:        
                    694:        if (msg_read->readcount+2 > msg_read->cursize)
                    695:                c = -1;
                    696:        else            
                    697:                c = (short)(msg_read->data[msg_read->readcount]
                    698:                + (msg_read->data[msg_read->readcount+1]<<8));
                    699:        
                    700:        msg_read->readcount += 2;
                    701:        
                    702:        return c;
                    703: }
                    704: 
                    705: int MSG_ReadLong (sizebuf_t *msg_read)
                    706: {
                    707:        int     c;
                    708:        
                    709:        if (msg_read->readcount+4 > msg_read->cursize)
                    710:                c = -1;
                    711:        else
                    712:                c = msg_read->data[msg_read->readcount]
                    713:                + (msg_read->data[msg_read->readcount+1]<<8)
                    714:                + (msg_read->data[msg_read->readcount+2]<<16)
                    715:                + (msg_read->data[msg_read->readcount+3]<<24);
                    716:        
                    717:        msg_read->readcount += 4;
                    718:        
                    719:        return c;
                    720: }
                    721: 
                    722: float MSG_ReadFloat (sizebuf_t *msg_read)
                    723: {
                    724:        union
                    725:        {
                    726:                byte    b[4];
                    727:                float   f;
                    728:                int     l;
                    729:        } dat;
                    730:        
                    731:        if (msg_read->readcount+4 > msg_read->cursize)
                    732:                dat.f = -1;
                    733:        else
                    734:        {
                    735:                dat.b[0] =      msg_read->data[msg_read->readcount];
                    736:                dat.b[1] =      msg_read->data[msg_read->readcount+1];
                    737:                dat.b[2] =      msg_read->data[msg_read->readcount+2];
                    738:                dat.b[3] =      msg_read->data[msg_read->readcount+3];
                    739:        }
                    740:        msg_read->readcount += 4;
                    741:        
                    742:        dat.l = LittleLong (dat.l);
                    743: 
                    744:        return dat.f;   
                    745: }
                    746: 
                    747: char *MSG_ReadString (sizebuf_t *msg_read)
                    748: {
                    749:        static char     string[2048];
                    750:        int             l,c;
                    751:        
                    752:        l = 0;
                    753:        do
                    754:        {
                    755:                c = MSG_ReadChar (msg_read);
                    756:                if (c == -1 || c == 0)
                    757:                        break;
                    758:                string[l] = c;
                    759:                l++;
                    760:        } while (l < sizeof(string)-1);
                    761:        
                    762:        string[l] = 0;
                    763:        
                    764:        return string;
                    765: }
                    766: 
                    767: char *MSG_ReadStringLine (sizebuf_t *msg_read)
                    768: {
                    769:        static char     string[2048];
                    770:        int             l,c;
                    771:        
                    772:        l = 0;
                    773:        do
                    774:        {
                    775:                c = MSG_ReadChar (msg_read);
                    776:                if (c == -1 || c == 0 || c == '\n')
                    777:                        break;
                    778:                string[l] = c;
                    779:                l++;
                    780:        } while (l < sizeof(string)-1);
                    781:        
                    782:        string[l] = 0;
                    783:        
                    784:        return string;
                    785: }
                    786: 
                    787: float MSG_ReadCoord (sizebuf_t *msg_read)
                    788: {
                    789:        return MSG_ReadShort(msg_read) * (1.0/8);
                    790: }
                    791: 
                    792: void MSG_ReadPos (sizebuf_t *msg_read, vec3_t pos)
                    793: {
                    794:        pos[0] = MSG_ReadShort(msg_read) * (1.0/8);
                    795:        pos[1] = MSG_ReadShort(msg_read) * (1.0/8);
                    796:        pos[2] = MSG_ReadShort(msg_read) * (1.0/8);
                    797: }
                    798: 
                    799: float MSG_ReadAngle (sizebuf_t *msg_read)
                    800: {
                    801:        return MSG_ReadChar(msg_read) * (360.0/256);
                    802: }
                    803: 
                    804: float MSG_ReadAngle16 (sizebuf_t *msg_read)
                    805: {
                    806:        return SHORT2ANGLE(MSG_ReadShort(msg_read));
                    807: }
                    808: 
                    809: void MSG_ReadDeltaUsercmd (sizebuf_t *msg_read, usercmd_t *from, usercmd_t *move)
                    810: {
                    811:        int bits;
                    812: 
                    813:        memcpy (move, from, sizeof(*move));
                    814: 
                    815:        bits = MSG_ReadByte (msg_read);
                    816:                
                    817: // read current angles
                    818:        if (bits & CM_ANGLE1)
                    819:                move->angles[0] = MSG_ReadShort (msg_read);
                    820:        if (bits & CM_ANGLE2)
                    821:                move->angles[1] = MSG_ReadShort (msg_read);
                    822:        if (bits & CM_ANGLE3)
                    823:                move->angles[2] = MSG_ReadShort (msg_read);
                    824:                
                    825: // read movement
                    826:        if (bits & CM_FORWARD)
                    827:                move->forwardmove = MSG_ReadShort (msg_read);
                    828:        if (bits & CM_SIDE)
                    829:                move->sidemove = MSG_ReadShort (msg_read);
                    830:        if (bits & CM_UP)
                    831:                move->upmove = MSG_ReadShort (msg_read);
                    832:        
                    833: // read buttons
                    834:        if (bits & CM_BUTTONS)
                    835:                move->buttons = MSG_ReadByte (msg_read);
                    836: 
                    837:        if (bits & CM_IMPULSE)
                    838:                move->impulse = MSG_ReadByte (msg_read);
                    839: 
                    840: // read time to run command
                    841:        move->msec = MSG_ReadByte (msg_read);
                    842: 
                    843: // read the light level
                    844:        move->lightlevel = MSG_ReadByte (msg_read);
                    845: }
                    846: 
                    847: 
                    848: void MSG_ReadData (sizebuf_t *msg_read, void *data, int len)
                    849: {
                    850:        int             i;
                    851: 
                    852:        for (i=0 ; i<len ; i++)
                    853:                ((byte *)data)[i] = MSG_ReadByte (msg_read);
                    854: }
                    855: 
                    856: 
                    857: //===========================================================================
                    858: 
                    859: void SZ_Init (sizebuf_t *buf, byte *data, int length)
                    860: {
                    861:        memset (buf, 0, sizeof(*buf));
                    862:        buf->data = data;
                    863:        buf->maxsize = length;
                    864: }
                    865: 
                    866: void SZ_Clear (sizebuf_t *buf)
                    867: {
                    868:        buf->cursize = 0;
                    869:        buf->overflowed = false;
                    870: }
                    871: 
                    872: void *SZ_GetSpace (sizebuf_t *buf, int length)
                    873: {
                    874:        void    *data;
                    875:        
                    876:        if (buf->cursize + length > buf->maxsize)
                    877:        {
                    878:                if (!buf->allowoverflow)
                    879:                        Com_Error (ERR_FATAL, "SZ_GetSpace: overflow without allowoverflow set");
                    880:                
                    881:                if (length > buf->maxsize)
                    882:                        Com_Error (ERR_FATAL, "SZ_GetSpace: %i is > full buffer size", length);
                    883:                        
                    884:                Com_Printf ("SZ_GetSpace: overflow\n");
                    885:                SZ_Clear (buf); 
                    886:                buf->overflowed = true;
                    887:        }
                    888: 
                    889:        data = buf->data + buf->cursize;
                    890:        buf->cursize += length;
                    891:        
                    892:        return data;
                    893: }
                    894: 
                    895: void SZ_Write (sizebuf_t *buf, void *data, int length)
                    896: {
                    897:        memcpy (SZ_GetSpace(buf,length),data,length);           
                    898: }
                    899: 
                    900: void SZ_Print (sizebuf_t *buf, char *data)
                    901: {
                    902:        int             len;
                    903:        
                    904:        len = strlen(data)+1;
                    905: 
                    906:        if (buf->cursize)
                    907:        {
                    908:                if (buf->data[buf->cursize-1])
                    909:                        memcpy ((byte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
                    910:                else
                    911:                        memcpy ((byte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
                    912:        }
                    913:        else
                    914:                memcpy ((byte *)SZ_GetSpace(buf, len),data,len);
                    915: }
                    916: 
                    917: 
                    918: //============================================================================
                    919: 
                    920: 
                    921: /*
                    922: ================
                    923: COM_CheckParm
                    924: 
                    925: Returns the position (1 to argc-1) in the program's argument list
                    926: where the given parameter apears, or 0 if not present
                    927: ================
                    928: */
                    929: int COM_CheckParm (char *parm)
                    930: {
                    931:        int             i;
                    932:        
                    933:        for (i=1 ; i<com_argc ; i++)
                    934:        {
                    935:                if (!strcmp (parm,com_argv[i]))
                    936:                        return i;
                    937:        }
                    938:                
                    939:        return 0;
                    940: }
                    941: 
                    942: int COM_Argc (void)
                    943: {
                    944:        return com_argc;
                    945: }
                    946: 
                    947: char *COM_Argv (int arg)
                    948: {
                    949:        if (arg < 0 || arg >= com_argc || !com_argv[arg])
                    950:                return "";
                    951:        return com_argv[arg];
                    952: }
                    953: 
                    954: void COM_ClearArgv (int arg)
                    955: {
                    956:        if (arg < 0 || arg >= com_argc || !com_argv[arg])
                    957:                return;
                    958:        com_argv[arg] = "";
                    959: }
                    960: 
                    961: 
                    962: /*
                    963: ================
                    964: COM_InitArgv
                    965: ================
                    966: */
                    967: void COM_InitArgv (int argc, char **argv)
                    968: {
                    969:        int             i;
                    970: 
                    971:        if (argc > MAX_NUM_ARGVS)
                    972:                Com_Error (ERR_FATAL, "argc > MAX_NUM_ARGVS");
                    973:        com_argc = argc;
                    974:        for (i=0 ; i<argc ; i++)
                    975:        {
                    976:                if (!argv[i] || strlen(argv[i]) >= MAX_TOKEN_CHARS )
                    977:                        com_argv[i] = "";
                    978:                else
                    979:                        com_argv[i] = argv[i];
                    980:        }
                    981: }
                    982: 
                    983: /*
                    984: ================
                    985: COM_AddParm
                    986: 
                    987: Adds the given string at the end of the current argument list
                    988: ================
                    989: */
                    990: void COM_AddParm (char *parm)
                    991: {
                    992:        if (com_argc == MAX_NUM_ARGVS)
                    993:                Com_Error (ERR_FATAL, "COM_AddParm: MAX_NUM)ARGS");
                    994:        com_argv[com_argc++] = parm;
                    995: }
                    996: 
                    997: 
                    998: 
                    999: 
                   1000: /// just for debugging
                   1001: int    memsearch (byte *start, int count, int search)
                   1002: {
                   1003:        int             i;
                   1004:        
                   1005:        for (i=0 ; i<count ; i++)
                   1006:                if (start[i] == search)
                   1007:                        return i;
                   1008:        return -1;
                   1009: }
                   1010: 
                   1011: 
                   1012: char *CopyString (char *in)
                   1013: {
                   1014:        char    *out;
                   1015:        
                   1016:        out = Z_Malloc (strlen(in)+1);
                   1017:        strcpy (out, in);
                   1018:        return out;
                   1019: }
                   1020: 
                   1021: 
                   1022: 
                   1023: void Info_Print (char *s)
                   1024: {
                   1025:        char    key[512];
                   1026:        char    value[512];
                   1027:        char    *o;
                   1028:        int             l;
                   1029: 
                   1030:        if (*s == '\\')
                   1031:                s++;
                   1032:        while (*s)
                   1033:        {
                   1034:                o = key;
                   1035:                while (*s && *s != '\\')
                   1036:                        *o++ = *s++;
                   1037: 
                   1038:                l = o - key;
                   1039:                if (l < 20)
                   1040:                {
                   1041:                        memset (o, ' ', 20-l);
                   1042:                        key[20] = 0;
                   1043:                }
                   1044:                else
                   1045:                        *o = 0;
                   1046:                Com_Printf ("%s", key);
                   1047: 
                   1048:                if (!*s)
                   1049:                {
                   1050:                        Com_Printf ("MISSING VALUE\n");
                   1051:                        return;
                   1052:                }
                   1053: 
                   1054:                o = value;
                   1055:                s++;
                   1056:                while (*s && *s != '\\')
                   1057:                        *o++ = *s++;
                   1058:                *o = 0;
                   1059: 
                   1060:                if (*s)
                   1061:                        s++;
                   1062:                Com_Printf ("%s\n", value);
                   1063:        }
                   1064: }
                   1065: 
                   1066: 
                   1067: /*
                   1068: ==============================================================================
                   1069: 
                   1070:                                                ZONE MEMORY ALLOCATION
                   1071: 
                   1072: just cleared malloc with counters now...
                   1073: 
                   1074: ==============================================================================
                   1075: */
                   1076: 
                   1077: #define        Z_MAGIC         0x1d1d
                   1078: 
                   1079: 
                   1080: typedef struct zhead_s
                   1081: {
                   1082:        struct zhead_s  *prev, *next;
                   1083:        short   magic;
                   1084:        short   tag;                    // for group free
                   1085:        int             size;
                   1086: } zhead_t;
                   1087: 
                   1088: zhead_t                z_chain;
                   1089: int            z_count, z_bytes;
                   1090: 
                   1091: /*
                   1092: ========================
                   1093: Z_Free
                   1094: ========================
                   1095: */
                   1096: void Z_Free (void *ptr)
                   1097: {
                   1098:        zhead_t *z;
                   1099: 
                   1100:        z = ((zhead_t *)ptr) - 1;
                   1101: 
                   1102:        if (z->magic != Z_MAGIC)
                   1103:                Com_Error (ERR_FATAL, "Z_Free: bad magic");
                   1104: 
                   1105:        z->prev->next = z->next;
                   1106:        z->next->prev = z->prev;
                   1107: 
                   1108:        z_count--;
                   1109:        z_bytes -= z->size;
                   1110:        free (z);
                   1111: }
                   1112: 
                   1113: 
                   1114: /*
                   1115: ========================
                   1116: Z_Stats_f
                   1117: ========================
                   1118: */
                   1119: void Z_Stats_f (void)
                   1120: {
                   1121:        Com_Printf ("%i bytes in %i blocks\n", z_bytes, z_count);
                   1122: }
                   1123: 
                   1124: /*
                   1125: ========================
                   1126: Z_FreeTags
                   1127: ========================
                   1128: */
                   1129: void Z_FreeTags (int tag)
                   1130: {
                   1131:        zhead_t *z, *next;
                   1132: 
                   1133:        for (z=z_chain.next ; z != &z_chain ; z=next)
                   1134:        {
                   1135:                next = z->next;
                   1136:                if (z->tag == tag)
                   1137:                        Z_Free ((void *)(z+1));
                   1138:        }
                   1139: }
                   1140: 
                   1141: /*
                   1142: ========================
                   1143: Z_TagMalloc
                   1144: ========================
                   1145: */
                   1146: void *Z_TagMalloc (int size, int tag)
                   1147: {
                   1148:        zhead_t *z;
                   1149:        
                   1150:        size = size + sizeof(zhead_t);
                   1151:        z = malloc(size);
                   1152:        if (!z)
                   1153:                Com_Error (ERR_FATAL, "Z_Malloc: failed on allocation of %i bytes",size);
                   1154:        memset (z, 0, size);
                   1155:        z_count++;
                   1156:        z_bytes += size;
                   1157:        z->magic = Z_MAGIC;
                   1158:        z->tag = tag;
                   1159:        z->size = size;
                   1160: 
                   1161:        z->next = z_chain.next;
                   1162:        z->prev = &z_chain;
                   1163:        z_chain.next->prev = z;
                   1164:        z_chain.next = z;
                   1165: 
                   1166:        return (void *)(z+1);
                   1167: }
                   1168: 
                   1169: /*
                   1170: ========================
                   1171: Z_Malloc
                   1172: ========================
                   1173: */
                   1174: void *Z_Malloc (int size)
                   1175: {
                   1176:        return Z_TagMalloc (size, 0);
                   1177: }
                   1178: 
                   1179: 
                   1180: //============================================================================
                   1181: 
                   1182: 
                   1183: /*
                   1184: ====================
                   1185: COM_BlockSequenceCheckByte
                   1186: 
                   1187: For proxy protecting
                   1188: ====================
                   1189: */
                   1190: byte   COM_BlockSequenceCheckByte (byte *base, int length, int sequence)
                   1191: {
                   1192:        int             checksum;
                   1193:        byte    buf[64];
                   1194:        int             n;
                   1195:        byte    *p;
                   1196: 
                   1197:        n = sequence % (NUMVERTEXNORMALS * sizeof(vec3_t));
                   1198:        p = ((byte *)bytedirs)+n;
                   1199:        if (length > 60)
                   1200:                length = 60;
                   1201:        memcpy (buf, base, length);
                   1202: Com_DPrintf("sum: seq=%d, [%02x %02x %02x %02x/%02x %02x] ", sequence, 
                   1203:                        p[0], p[1], p[2], p[3], (sequence & 0xff), ((sequence>>8) & 0xff));
                   1204: 
                   1205:        buf[length] = (sequence & 0xff) ^ *p++;
                   1206:        buf[length+1] = *p++;
                   1207:        buf[length+2] = ((sequence>>8) & 0xff) ^ *p++;
                   1208:        buf[length+3] = *p;
                   1209: 
                   1210: Com_DPrintf("%02x %02x %02x %02x\n", sequence, 
                   1211:                buf[length], buf[length+1], buf[length+2], buf[length+3]);          
                   1212: 
                   1213:        length += 4;
                   1214: 
                   1215:        checksum = Com_BlockChecksum (buf, length);
                   1216: 
                   1217:        checksum &= 0xff;
                   1218: 
                   1219:        return checksum;
                   1220: }
                   1221: 
                   1222: //========================================================
                   1223: 
                   1224: float  frand(void)
                   1225: {
                   1226:        return (rand()&32767)* (1.0/32767);
                   1227: }
                   1228: 
                   1229: float  crand(void)
                   1230: {
                   1231:        return (rand()&32767)* (2.0/32767) - 1;
                   1232: }
                   1233: 
                   1234: void Key_Init (void);
                   1235: void SCR_EndLoadingPlaque (void);
                   1236: 
                   1237: /*
                   1238: =============
                   1239: Com_Error_f
                   1240: 
                   1241: Just throw a fatal error to
                   1242: test error shutdown procedures
                   1243: =============
                   1244: */
                   1245: void Com_Error_f (void)
                   1246: {
                   1247:        Com_Error (ERR_FATAL, "%s", Cmd_Argv(1));
                   1248: }
                   1249: 
                   1250: 
                   1251: /*
                   1252: =================
                   1253: Qcommon_Init
                   1254: =================
                   1255: */
                   1256: void Qcommon_Init (int argc, char **argv)
                   1257: {
                   1258:        char    *s;
                   1259: 
                   1260:        if (setjmp (abortframe) )
                   1261:                Sys_Error ("Error during initialization");
                   1262: 
                   1263:        z_chain.next = z_chain.prev = &z_chain;
                   1264: 
                   1265:        // prepare enough of the subsystems to handle
                   1266:        // cvar and command buffer management
                   1267:        COM_InitArgv (argc, argv);
                   1268: 
                   1269:        Swap_Init ();
                   1270:        Cbuf_Init ();
                   1271: 
                   1272:        Cmd_Init ();
                   1273:        Cvar_Init ();
                   1274: 
                   1275:        Key_Init ();
                   1276: 
                   1277:        // we need to add the early commands twice, because
                   1278:        // a basedir or cddir needs to be set before execing
                   1279:        // config files, but we want other parms to override
                   1280:        // the settings of the config files
                   1281:        Cbuf_AddEarlyCommands (false);
                   1282:        Cbuf_Execute ();
                   1283: 
                   1284:        FS_InitFilesystem ();
                   1285: 
                   1286:        Cbuf_AddText ("exec default.cfg\n");
                   1287:        Cbuf_AddText ("exec config.cfg\n");
                   1288: 
                   1289:        Cbuf_AddEarlyCommands (true);
                   1290:        Cbuf_Execute ();
                   1291: 
                   1292:        //
                   1293:        // init commands and vars
                   1294:        //
                   1295:     Cmd_AddCommand ("z_stats", Z_Stats_f);
                   1296:     Cmd_AddCommand ("error", Com_Error_f);
                   1297: 
                   1298:        host_speeds = Cvar_Get ("host_speeds", "0", 0);
                   1299:        log_stats = Cvar_Get ("log_stats", "0", 0);
                   1300:        developer = Cvar_Get ("developer", "0", 0);
                   1301:        timescale = Cvar_Get ("timescale", "1", 0);
                   1302:        fixedtime = Cvar_Get ("fixedtime", "0", 0);
                   1303:        logfile_active = Cvar_Get ("logfile", "0", 0);
                   1304:        showtrace = Cvar_Get ("showtrace", "0", 0);
                   1305:        dedicated = Cvar_Get ("dedicated", "0", CVAR_NOSET);
                   1306: 
                   1307:        s = va("%4.2f %s %s %s", VERSION, CPUSTRING, __DATE__, BUILDSTRING);
                   1308:        Cvar_Get ("version", s, CVAR_SERVERINFO|CVAR_NOSET);
                   1309: 
                   1310: 
                   1311:        if (dedicated->value)
                   1312:                Cmd_AddCommand ("quit", Com_Quit);
                   1313: 
                   1314:        Sys_Init ();
                   1315: 
                   1316:        NET_Init ();
                   1317:        Netchan_Init ();
                   1318: 
                   1319:        SV_Init ();
                   1320:        CL_Init ();
                   1321: 
                   1322:        // add + commands from command line
                   1323:        if (!Cbuf_AddLateCommands ())
                   1324:        {       // if the user didn't give any commands, run default action
                   1325:                if (!dedicated->value)
                   1326:                        Cbuf_AddText ("d1\n");
                   1327:                else
                   1328:                        Cbuf_AddText ("dedicated_start\n");
                   1329:                Cbuf_Execute ();
                   1330:        }
                   1331:        else
                   1332:        {       // the user asked for something explicit
                   1333:                // so drop the loading plaque
                   1334:                SCR_EndLoadingPlaque ();
                   1335:        }
                   1336: 
                   1337:        Com_Printf ("====== Quake2 Initialized ======\n\n");    
                   1338: }
                   1339: 
                   1340: /*
                   1341: =================
                   1342: Qcommon_Frame
                   1343: =================
                   1344: */
                   1345: void Qcommon_Frame (int msec)
                   1346: {
                   1347:        char    *s;
                   1348:        int             time_before, time_between, time_after;
                   1349: 
                   1350:        if (setjmp (abortframe) )
                   1351:                return;                 // an ERR_DROP was thrown
                   1352: 
                   1353:        if ( log_stats->modified )
                   1354:        {
                   1355:                log_stats->modified = false;
                   1356:                if ( log_stats->value )
                   1357:                {
                   1358:                        if ( log_stats_file )
                   1359:                        {
                   1360:                                fclose( log_stats_file );
                   1361:                                log_stats_file = 0;
                   1362:                        }
                   1363:                        log_stats_file = fopen( "stats.log", "w" );
                   1364:                        if ( log_stats_file )
                   1365:                                fprintf( log_stats_file, "entities,dlights,parts,frame time\n" );
                   1366:                }
                   1367:                else
                   1368:                {
                   1369:                        if ( log_stats_file )
                   1370:                        {
                   1371:                                fclose( log_stats_file );
                   1372:                                log_stats_file = 0;
                   1373:                        }
                   1374:                }
                   1375:        }
                   1376: 
                   1377:        if (fixedtime->value)
                   1378:                msec = fixedtime->value;
                   1379:        else if (timescale->value)
                   1380:        {
                   1381:                msec *= timescale->value;
                   1382:                if (msec < 1)
                   1383:                        msec = 1;
                   1384:        }
                   1385: 
                   1386:        if (showtrace->value)
                   1387:        {
                   1388:                extern  int c_traces, c_brush_traces;
                   1389:                extern  int     c_pointcontents;
                   1390: 
                   1391:                Com_Printf ("%4i traces  %4i points\n", c_traces, c_pointcontents);
                   1392:                c_traces = 0;
                   1393:                c_brush_traces = 0;
                   1394:                c_pointcontents = 0;
                   1395:        }
                   1396: 
                   1397:        do
                   1398:        {
                   1399:                s = Sys_ConsoleInput ();
                   1400:                if (s)
                   1401:                        Cbuf_AddText (va("%s\n",s));
                   1402:        } while (s);
                   1403:        Cbuf_Execute ();
                   1404: 
                   1405:        if (host_speeds->value)
                   1406:                time_before = Sys_Milliseconds ();
                   1407: 
                   1408:        SV_Frame (msec);
                   1409: 
                   1410:        if (host_speeds->value)
                   1411:                time_between = Sys_Milliseconds ();             
                   1412: 
                   1413:        CL_Frame (msec);
                   1414: 
                   1415:        if (host_speeds->value)
                   1416:                time_after = Sys_Milliseconds ();               
                   1417: 
                   1418: 
                   1419:        if (host_speeds->value)
                   1420:        {
                   1421:                int                     all, sv, gm, cl, rf;
                   1422: 
                   1423:                all = time_after - time_before;
                   1424:                sv = time_between - time_before;
                   1425:                cl = time_after - time_between;
                   1426:                gm = time_after_game - time_before_game;
                   1427:                rf = time_after_ref - time_before_ref;
                   1428:                sv -= gm;
                   1429:                cl -= rf;
                   1430:                Com_Printf ("all:%3i sv:%3i gm:%3i cl:%3i rf:%3i\n",
                   1431:                        all, sv, gm, cl, rf);
                   1432:        }       
                   1433: }
                   1434: 
                   1435: /*
                   1436: =================
                   1437: Qcommon_Shutdown
                   1438: =================
                   1439: */
                   1440: void Qcommon_Shutdown (void)
                   1441: {
                   1442: }

unix.superglobalmegacorp.com

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