Annotation of quake2/qcommon/common.c, revision 1.1.1.3

1.1       root        1: // common.c -- misc functions used in client and server
                      2: #include "qcommon.h"
                      3: #include <setjmp.h>
1.1.1.2   root        4: 
1.1       root        5: #define        MAXPRINTMSG     4096
1.1.1.2   root        6: 
1.1       root        7: #define MAX_NUM_ARGVS  50
1.1.1.2   root        8: 
                      9: 
1.1       root       10: int            com_argc;
                     11: char   *com_argv[MAX_NUM_ARGVS+1];
1.1.1.2   root       12: 
1.1       root       13: int            realtime;
1.1.1.2   root       14: 
1.1       root       15: jmp_buf abortframe;            // an ERR_DROP occured, exit the entire frame
                     16: 
1.1.1.2   root       17: 
1.1       root       18: FILE   *log_stats_file;
1.1.1.2   root       19: 
1.1       root       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;
1.1.1.2   root       28: 
1.1       root       29: FILE   *logfile;
1.1.1.2   root       30: 
1.1       root       31: int                    server_state;
1.1.1.2   root       32: 
1.1       root       33: // host_speeds times
                     34: int            time_before_game;
                     35: int            time_after_game;
                     36: int            time_before_ref;
                     37: int            time_after_ref;
1.1.1.2   root       38: 
1.1       root       39: /*
                     40: ============================================================================
1.1.1.2   root       41: 
1.1       root       42: CLIENT / SERVER interactions
1.1.1.2   root       43: 
1.1       root       44: ============================================================================
                     45: */
1.1.1.2   root       46: 
1.1       root       47: static int     rd_target;
                     48: static char    *rd_buffer;
                     49: static int     rd_buffersize;
                     50: static void    (*rd_flush)(int target, char *buffer);
1.1.1.2   root       51: 
1.1       root       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
1.1.1.2   root       77: 
1.1       root       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];
1.1.1.2   root       86: 
1.1       root       87:        va_start (argptr,fmt);
                     88:        vsprintf (msg,fmt,argptr);
                     89:        va_end (argptr);
1.1.1.2   root       90: 
1.1       root       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);
1.1.1.2   root      106: 
1.1       root      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: }
1.1.1.2   root      123: 
                    124: 
1.1       root      125: /*
                    126: ================
                    127: Com_DPrintf
1.1.1.2   root      128: 
1.1       root      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...
1.1.1.2   root      139: 
1.1       root      140:        va_start (argptr,fmt);
                    141:        vsprintf (msg,fmt,argptr);
                    142:        va_end (argptr);
                    143:        
                    144:        Com_Printf ("%s", msg);
                    145: }
1.1.1.2   root      146: 
                    147: 
1.1       root      148: /*
                    149: =============
                    150: Com_Error
1.1.1.2   root      151: 
1.1       root      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;
1.1.1.2   root      161: 
1.1       root      162:        if (recursive)
                    163:                Sys_Error ("recursive error after: %s", msg);
                    164:        recursive = true;
1.1.1.2   root      165: 
1.1       root      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:        }
1.1.1.2   root      189: 
1.1       root      190:        if (logfile)
                    191:        {
                    192:                fclose (logfile);
                    193:                logfile = NULL;
                    194:        }
1.1.1.2   root      195: 
1.1       root      196:        Sys_Error ("%s", msg);
                    197: }
1.1.1.2   root      198: 
                    199: 
1.1       root      200: /*
                    201: =============
                    202: Com_Quit
1.1.1.2   root      203: 
1.1       root      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 ();
1.1.1.2   root      212: 
1.1       root      213:        if (logfile)
                    214:        {
                    215:                fclose (logfile);
                    216:                logfile = NULL;
                    217:        }
1.1.1.2   root      218: 
1.1       root      219:        Sys_Quit ();
                    220: }
1.1.1.2   root      221: 
                    222: 
1.1       root      223: /*
                    224: ==================
                    225: Com_ServerState
                    226: ==================
                    227: */
                    228: int Com_ServerState (void)
                    229: {
                    230:        return server_state;
                    231: }
1.1.1.2   root      232: 
1.1       root      233: /*
                    234: ==================
                    235: Com_SetServerState
                    236: ==================
                    237: */
                    238: void Com_SetServerState (int state)
                    239: {
                    240:        server_state = state;
                    241: }
1.1.1.2   root      242: 
                    243: 
1.1       root      244: /*
                    245: ==============================================================================
1.1.1.2   root      246: 
1.1       root      247:                        MESSAGE IO FUNCTIONS
1.1.1.2   root      248: 
1.1       root      249: Handles byte ordering and avoids alignment errors
                    250: ==============================================================================
                    251: */
1.1.1.2   root      252: 
1.1       root      253: vec3_t bytedirs[NUMVERTEXNORMALS] =
                    254: {
                    255: #include "../client/anorms.h"
                    256: };
1.1.1.2   root      257: 
1.1       root      258: //
                    259: // writing functions
                    260: //
1.1.1.2   root      261: 
1.1       root      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
1.1.1.2   root      270: 
1.1       root      271:        buf = SZ_GetSpace (sb, 1);
                    272:        buf[0] = c;
                    273: }
1.1.1.2   root      274: 
1.1       root      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
1.1.1.2   root      283: 
1.1       root      284:        buf = SZ_GetSpace (sb, 1);
                    285:        buf[0] = c;
                    286: }
1.1.1.2   root      287: 
1.1       root      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
1.1.1.2   root      296: 
1.1       root      297:        buf = SZ_GetSpace (sb, 2);
                    298:        buf[0] = c&0xff;
                    299:        buf[1] = c>>8;
                    300: }
1.1.1.2   root      301: 
1.1       root      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: }
1.1.1.2   root      312: 
1.1       root      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: }
1.1.1.2   root      327: 
1.1       root      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: }
1.1.1.2   root      335: 
1.1       root      336: void MSG_WriteCoord (sizebuf_t *sb, float f)
                    337: {
                    338:        MSG_WriteShort (sb, (int)(f*8));
                    339: }
1.1.1.2   root      340: 
1.1       root      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: }
1.1.1.2   root      347: 
1.1       root      348: void MSG_WriteAngle (sizebuf_t *sb, float f)
                    349: {
                    350:        MSG_WriteByte (sb, (int)(f*256/360) & 255);
                    351: }
1.1.1.2   root      352: 
1.1       root      353: void MSG_WriteAngle16 (sizebuf_t *sb, float f)
                    354: {
                    355:        MSG_WriteShort (sb, ANGLE2SHORT(f));
                    356: }
                    357: 
1.1.1.2   root      358: 
1.1       root      359: void MSG_WriteDeltaUsercmd (sizebuf_t *buf, usercmd_t *from, usercmd_t *cmd)
                    360: {
                    361:        int             bits;
1.1.1.2   root      362: 
1.1       root      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;
1.1.1.2   root      383: 
1.1       root      384:     MSG_WriteByte (buf, bits);
1.1.1.2   root      385: 
1.1       root      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);
1.1.1.2   root      399: 
1.1       root      400:        if (bits & CM_BUTTONS)
                    401:                MSG_WriteByte (buf, cmd->buttons);
                    402:        if (bits & CM_IMPULSE)
                    403:            MSG_WriteByte (buf, cmd->impulse);
1.1.1.2   root      404: 
1.1       root      405:     MSG_WriteByte (buf, cmd->msec);
                    406:        MSG_WriteByte (buf, cmd->lightlevel);
                    407: }
1.1.1.2   root      408: 
                    409: 
1.1       root      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:        }
1.1.1.2   root      420: 
1.1       root      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: }
1.1.1.2   root      434: 
                    435: 
1.1       root      436: void MSG_ReadDir (sizebuf_t *sb, vec3_t dir)
                    437: {
                    438:        int             b;
1.1.1.2   root      439: 
1.1       root      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: }
1.1.1.2   root      445: 
                    446: 
1.1       root      447: /*
                    448: ==================
                    449: MSG_WriteDeltaEntity
1.1.1.2   root      450: 
1.1       root      451: Writes part of a packetentities message.
                    452: Can delta from either a baseline or a previous packet_entity
                    453: ==================
                    454: */
1.1.1.2   root      455: void MSG_WriteDeltaEntity (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force, qboolean newentity)
1.1       root      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");
1.1.1.2   root      463: 
1.1       root      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;
1.1.1.2   root      476: 
1.1       root      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:        }
1.1.1.2   root      501: 
1.1       root      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;
1.1.1.3 ! root      524: 
1.1       root      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;
1.1.1.2   root      537: 
1.1       root      538:        if ( to->sound != from->sound )
                    539:                bits |= U_SOUND;
                    540: 
1.1.1.2   root      541:        if (newentity || (to->renderfx & RF_BEAM))
                    542:                bits |= U_OLDORIGIN;
                    543: 
1.1       root      544:        //
                    545:        // write the message
                    546:        //
                    547:        if (!bits && !force)
                    548:                return;         // nothing to send!
1.1.1.2   root      549: 
1.1       root      550:        //----------
                    551: 
                    552:        if (bits & 0xff000000)
                    553:                bits |= U_MOREBITS3 | U_MOREBITS2 | U_MOREBITS1;
                    554:        else if (bits & 0x00ff0000)
                    555:                bits |= U_MOREBITS2 | U_MOREBITS1;
                    556:        else if (bits & 0x0000ff00)
                    557:                bits |= U_MOREBITS1;
1.1.1.2   root      558: 
1.1       root      559:        MSG_WriteByte (msg,     bits&255 );
1.1.1.2   root      560: 
1.1       root      561:        if (bits & 0xff000000)
                    562:        {
                    563:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    564:                MSG_WriteByte (msg,     (bits>>16)&255 );
                    565:                MSG_WriteByte (msg,     (bits>>24)&255 );
                    566:        }
                    567:        else if (bits & 0x00ff0000)
                    568:        {
                    569:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    570:                MSG_WriteByte (msg,     (bits>>16)&255 );
                    571:        }
                    572:        else if (bits & 0x0000ff00)
                    573:        {
                    574:                MSG_WriteByte (msg,     (bits>>8)&255 );
                    575:        }
1.1.1.2   root      576: 
1.1       root      577:        //----------
                    578: 
                    579:        if (bits & U_NUMBER16)
                    580:                MSG_WriteShort (msg, to->number);
                    581:        else
                    582:                MSG_WriteByte (msg,     to->number);
1.1.1.2   root      583: 
1.1       root      584:        if (bits & U_MODEL)
                    585:                MSG_WriteByte (msg,     to->modelindex);
                    586:        if (bits & U_MODEL2)
                    587:                MSG_WriteByte (msg,     to->modelindex2);
                    588:        if (bits & U_MODEL3)
                    589:                MSG_WriteByte (msg,     to->modelindex3);
                    590:        if (bits & U_MODEL4)
                    591:                MSG_WriteByte (msg,     to->modelindex4);
1.1.1.2   root      592: 
1.1       root      593:        if (bits & U_FRAME8)
                    594:                MSG_WriteByte (msg, to->frame);
                    595:        if (bits & U_FRAME16)
                    596:                MSG_WriteShort (msg, to->frame);
1.1.1.2   root      597: 
1.1       root      598:        if ((bits & U_SKIN8) && (bits & U_SKIN16))              //used for laser colors
                    599:                MSG_WriteLong (msg, to->skinnum);
                    600:        else if (bits & U_SKIN8)
                    601:                MSG_WriteByte (msg, to->skinnum);
                    602:        else if (bits & U_SKIN16)
                    603:                MSG_WriteShort (msg, to->skinnum);
                    604: 
1.1.1.2   root      605: 
1.1       root      606:        if ( (bits & (U_EFFECTS8|U_EFFECTS16)) == (U_EFFECTS8|U_EFFECTS16) )
                    607:                MSG_WriteLong (msg, to->effects);
                    608:        else if (bits & U_EFFECTS8)
                    609:                MSG_WriteByte (msg, to->effects);
                    610:        else if (bits & U_EFFECTS16)
                    611:                MSG_WriteShort (msg, to->effects);
1.1.1.2   root      612: 
1.1       root      613:        if ( (bits & (U_RENDERFX8|U_RENDERFX16)) == (U_RENDERFX8|U_RENDERFX16) )
                    614:                MSG_WriteLong (msg, to->renderfx);
                    615:        else if (bits & U_RENDERFX8)
                    616:                MSG_WriteByte (msg, to->renderfx);
                    617:        else if (bits & U_RENDERFX16)
                    618:                MSG_WriteShort (msg, to->renderfx);
1.1.1.2   root      619: 
1.1       root      620:        if (bits & U_ORIGIN1)
                    621:                MSG_WriteCoord (msg, to->origin[0]);            
                    622:        if (bits & U_ORIGIN2)
                    623:                MSG_WriteCoord (msg, to->origin[1]);
                    624:        if (bits & U_ORIGIN3)
                    625:                MSG_WriteCoord (msg, to->origin[2]);
1.1.1.2   root      626: 
1.1       root      627:        if (bits & U_ANGLE1)
                    628:                MSG_WriteAngle(msg, to->angles[0]);
                    629:        if (bits & U_ANGLE2)
                    630:                MSG_WriteAngle(msg, to->angles[1]);
                    631:        if (bits & U_ANGLE3)
                    632:                MSG_WriteAngle(msg, to->angles[2]);
1.1.1.2   root      633: 
1.1       root      634:        if (bits & U_OLDORIGIN)
                    635:        {
                    636:                MSG_WriteCoord (msg, to->old_origin[0]);
                    637:                MSG_WriteCoord (msg, to->old_origin[1]);
                    638:                MSG_WriteCoord (msg, to->old_origin[2]);
                    639:        }
1.1.1.2   root      640: 
1.1       root      641:        if (bits & U_SOUND)
                    642:                MSG_WriteByte (msg, to->sound);
                    643:        if (bits & U_EVENT)
                    644:                MSG_WriteByte (msg, to->event);
                    645:        if (bits & U_SOLID)
                    646:                MSG_WriteShort (msg, to->solid);
                    647: }
1.1.1.2   root      648: 
                    649: 
1.1       root      650: //============================================================
1.1.1.2   root      651: 
1.1       root      652: //
                    653: // reading functions
                    654: //
1.1.1.2   root      655: 
1.1       root      656: void MSG_BeginReading (sizebuf_t *msg)
                    657: {
                    658:        msg->readcount = 0;
                    659: }
1.1.1.2   root      660: 
1.1       root      661: // returns -1 if no more characters are available
                    662: int MSG_ReadChar (sizebuf_t *msg_read)
                    663: {
                    664:        int     c;
                    665:        
                    666:        if (msg_read->readcount+1 > msg_read->cursize)
                    667:                c = -1;
                    668:        else
                    669:                c = (signed char)msg_read->data[msg_read->readcount];
                    670:        msg_read->readcount++;
                    671:        
                    672:        return c;
                    673: }
1.1.1.2   root      674: 
1.1       root      675: int MSG_ReadByte (sizebuf_t *msg_read)
                    676: {
                    677:        int     c;
                    678:        
                    679:        if (msg_read->readcount+1 > msg_read->cursize)
                    680:                c = -1;
                    681:        else
                    682:                c = (unsigned char)msg_read->data[msg_read->readcount];
                    683:        msg_read->readcount++;
                    684:        
                    685:        return c;
                    686: }
1.1.1.2   root      687: 
1.1       root      688: int MSG_ReadShort (sizebuf_t *msg_read)
                    689: {
                    690:        int     c;
                    691:        
                    692:        if (msg_read->readcount+2 > msg_read->cursize)
                    693:                c = -1;
                    694:        else            
                    695:                c = (short)(msg_read->data[msg_read->readcount]
                    696:                + (msg_read->data[msg_read->readcount+1]<<8));
                    697:        
                    698:        msg_read->readcount += 2;
                    699:        
                    700:        return c;
                    701: }
1.1.1.2   root      702: 
1.1       root      703: int MSG_ReadLong (sizebuf_t *msg_read)
                    704: {
                    705:        int     c;
                    706:        
                    707:        if (msg_read->readcount+4 > msg_read->cursize)
                    708:                c = -1;
                    709:        else
                    710:                c = msg_read->data[msg_read->readcount]
                    711:                + (msg_read->data[msg_read->readcount+1]<<8)
                    712:                + (msg_read->data[msg_read->readcount+2]<<16)
                    713:                + (msg_read->data[msg_read->readcount+3]<<24);
                    714:        
                    715:        msg_read->readcount += 4;
                    716:        
                    717:        return c;
                    718: }
1.1.1.2   root      719: 
1.1       root      720: float MSG_ReadFloat (sizebuf_t *msg_read)
                    721: {
                    722:        union
                    723:        {
                    724:                byte    b[4];
                    725:                float   f;
                    726:                int     l;
                    727:        } dat;
                    728:        
                    729:        if (msg_read->readcount+4 > msg_read->cursize)
                    730:                dat.f = -1;
                    731:        else
                    732:        {
                    733:                dat.b[0] =      msg_read->data[msg_read->readcount];
                    734:                dat.b[1] =      msg_read->data[msg_read->readcount+1];
                    735:                dat.b[2] =      msg_read->data[msg_read->readcount+2];
                    736:                dat.b[3] =      msg_read->data[msg_read->readcount+3];
                    737:        }
                    738:        msg_read->readcount += 4;
                    739:        
                    740:        dat.l = LittleLong (dat.l);
1.1.1.2   root      741: 
1.1       root      742:        return dat.f;   
                    743: }
1.1.1.2   root      744: 
1.1       root      745: char *MSG_ReadString (sizebuf_t *msg_read)
                    746: {
                    747:        static char     string[2048];
                    748:        int             l,c;
                    749:        
                    750:        l = 0;
                    751:        do
                    752:        {
                    753:                c = MSG_ReadChar (msg_read);
                    754:                if (c == -1 || c == 0)
                    755:                        break;
                    756:                string[l] = c;
                    757:                l++;
                    758:        } while (l < sizeof(string)-1);
                    759:        
                    760:        string[l] = 0;
                    761:        
                    762:        return string;
                    763: }
1.1.1.2   root      764: 
1.1       root      765: char *MSG_ReadStringLine (sizebuf_t *msg_read)
                    766: {
                    767:        static char     string[2048];
                    768:        int             l,c;
                    769:        
                    770:        l = 0;
                    771:        do
                    772:        {
                    773:                c = MSG_ReadChar (msg_read);
                    774:                if (c == -1 || c == 0 || c == '\n')
                    775:                        break;
                    776:                string[l] = c;
                    777:                l++;
                    778:        } while (l < sizeof(string)-1);
                    779:        
                    780:        string[l] = 0;
                    781:        
                    782:        return string;
                    783: }
1.1.1.2   root      784: 
1.1       root      785: float MSG_ReadCoord (sizebuf_t *msg_read)
                    786: {
                    787:        return MSG_ReadShort(msg_read) * (1.0/8);
                    788: }
1.1.1.2   root      789: 
1.1       root      790: void MSG_ReadPos (sizebuf_t *msg_read, vec3_t pos)
                    791: {
                    792:        pos[0] = MSG_ReadShort(msg_read) * (1.0/8);
                    793:        pos[1] = MSG_ReadShort(msg_read) * (1.0/8);
                    794:        pos[2] = MSG_ReadShort(msg_read) * (1.0/8);
                    795: }
1.1.1.2   root      796: 
1.1       root      797: float MSG_ReadAngle (sizebuf_t *msg_read)
                    798: {
                    799:        return MSG_ReadChar(msg_read) * (360.0/256);
                    800: }
1.1.1.2   root      801: 
1.1       root      802: float MSG_ReadAngle16 (sizebuf_t *msg_read)
                    803: {
                    804:        return SHORT2ANGLE(MSG_ReadShort(msg_read));
                    805: }
1.1.1.2   root      806: 
1.1       root      807: void MSG_ReadDeltaUsercmd (sizebuf_t *msg_read, usercmd_t *from, usercmd_t *move)
                    808: {
                    809:        int bits;
1.1.1.2   root      810: 
1.1       root      811:        memcpy (move, from, sizeof(*move));
1.1.1.2   root      812: 
1.1       root      813:        bits = MSG_ReadByte (msg_read);
                    814:                
                    815: // read current angles
                    816:        if (bits & CM_ANGLE1)
                    817:                move->angles[0] = MSG_ReadShort (msg_read);
                    818:        if (bits & CM_ANGLE2)
                    819:                move->angles[1] = MSG_ReadShort (msg_read);
                    820:        if (bits & CM_ANGLE3)
                    821:                move->angles[2] = MSG_ReadShort (msg_read);
                    822:                
                    823: // read movement
                    824:        if (bits & CM_FORWARD)
                    825:                move->forwardmove = MSG_ReadShort (msg_read);
                    826:        if (bits & CM_SIDE)
                    827:                move->sidemove = MSG_ReadShort (msg_read);
                    828:        if (bits & CM_UP)
                    829:                move->upmove = MSG_ReadShort (msg_read);
                    830:        
                    831: // read buttons
                    832:        if (bits & CM_BUTTONS)
                    833:                move->buttons = MSG_ReadByte (msg_read);
1.1.1.2   root      834: 
1.1       root      835:        if (bits & CM_IMPULSE)
                    836:                move->impulse = MSG_ReadByte (msg_read);
1.1.1.2   root      837: 
1.1       root      838: // read time to run command
                    839:        move->msec = MSG_ReadByte (msg_read);
1.1.1.2   root      840: 
1.1       root      841: // read the light level
                    842:        move->lightlevel = MSG_ReadByte (msg_read);
                    843: }
1.1.1.2   root      844: 
                    845: 
1.1       root      846: void MSG_ReadData (sizebuf_t *msg_read, void *data, int len)
                    847: {
                    848:        int             i;
1.1.1.2   root      849: 
1.1       root      850:        for (i=0 ; i<len ; i++)
                    851:                ((byte *)data)[i] = MSG_ReadByte (msg_read);
                    852: }
1.1.1.2   root      853: 
                    854: 
1.1       root      855: //===========================================================================
1.1.1.2   root      856: 
1.1       root      857: void SZ_Init (sizebuf_t *buf, byte *data, int length)
                    858: {
                    859:        memset (buf, 0, sizeof(*buf));
                    860:        buf->data = data;
                    861:        buf->maxsize = length;
                    862: }
1.1.1.2   root      863: 
1.1       root      864: void SZ_Clear (sizebuf_t *buf)
                    865: {
                    866:        buf->cursize = 0;
                    867:        buf->overflowed = false;
                    868: }
1.1.1.2   root      869: 
1.1       root      870: void *SZ_GetSpace (sizebuf_t *buf, int length)
                    871: {
                    872:        void    *data;
                    873:        
                    874:        if (buf->cursize + length > buf->maxsize)
                    875:        {
                    876:                if (!buf->allowoverflow)
                    877:                        Com_Error (ERR_FATAL, "SZ_GetSpace: overflow without allowoverflow set");
                    878:                
                    879:                if (length > buf->maxsize)
                    880:                        Com_Error (ERR_FATAL, "SZ_GetSpace: %i is > full buffer size", length);
                    881:                        
                    882:                Com_Printf ("SZ_GetSpace: overflow\n");
                    883:                SZ_Clear (buf); 
                    884:                buf->overflowed = true;
                    885:        }
1.1.1.2   root      886: 
1.1       root      887:        data = buf->data + buf->cursize;
                    888:        buf->cursize += length;
                    889:        
                    890:        return data;
                    891: }
1.1.1.2   root      892: 
1.1       root      893: void SZ_Write (sizebuf_t *buf, void *data, int length)
                    894: {
                    895:        memcpy (SZ_GetSpace(buf,length),data,length);           
                    896: }
1.1.1.2   root      897: 
1.1       root      898: void SZ_Print (sizebuf_t *buf, char *data)
                    899: {
                    900:        int             len;
                    901:        
                    902:        len = strlen(data)+1;
1.1.1.2   root      903: 
1.1       root      904:        if (buf->cursize)
                    905:        {
                    906:                if (buf->data[buf->cursize-1])
                    907:                        memcpy ((byte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
                    908:                else
                    909:                        memcpy ((byte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
                    910:        }
                    911:        else
                    912:                memcpy ((byte *)SZ_GetSpace(buf, len),data,len);
                    913: }
1.1.1.2   root      914: 
                    915: 
1.1       root      916: //============================================================================
1.1.1.2   root      917: 
                    918: 
1.1       root      919: /*
                    920: ================
                    921: COM_CheckParm
1.1.1.2   root      922: 
1.1       root      923: Returns the position (1 to argc-1) in the program's argument list
                    924: where the given parameter apears, or 0 if not present
                    925: ================
                    926: */
                    927: int COM_CheckParm (char *parm)
                    928: {
                    929:        int             i;
                    930:        
                    931:        for (i=1 ; i<com_argc ; i++)
                    932:        {
                    933:                if (!strcmp (parm,com_argv[i]))
                    934:                        return i;
                    935:        }
                    936:                
                    937:        return 0;
                    938: }
1.1.1.2   root      939: 
1.1       root      940: int COM_Argc (void)
                    941: {
                    942:        return com_argc;
                    943: }
1.1.1.2   root      944: 
1.1       root      945: char *COM_Argv (int arg)
                    946: {
                    947:        if (arg < 0 || arg >= com_argc || !com_argv[arg])
                    948:                return "";
                    949:        return com_argv[arg];
                    950: }
1.1.1.2   root      951: 
1.1       root      952: void COM_ClearArgv (int arg)
                    953: {
                    954:        if (arg < 0 || arg >= com_argc || !com_argv[arg])
                    955:                return;
                    956:        com_argv[arg] = "";
                    957: }
1.1.1.2   root      958: 
                    959: 
1.1       root      960: /*
                    961: ================
                    962: COM_InitArgv
                    963: ================
                    964: */
                    965: void COM_InitArgv (int argc, char **argv)
                    966: {
                    967:        int             i;
1.1.1.2   root      968: 
1.1       root      969:        if (argc > MAX_NUM_ARGVS)
                    970:                Com_Error (ERR_FATAL, "argc > MAX_NUM_ARGVS");
                    971:        com_argc = argc;
                    972:        for (i=0 ; i<argc ; i++)
                    973:        {
                    974:                if (!argv[i] || strlen(argv[i]) >= MAX_TOKEN_CHARS )
                    975:                        com_argv[i] = "";
                    976:                else
                    977:                        com_argv[i] = argv[i];
                    978:        }
                    979: }
1.1.1.2   root      980: 
1.1       root      981: /*
                    982: ================
                    983: COM_AddParm
1.1.1.2   root      984: 
1.1       root      985: Adds the given string at the end of the current argument list
                    986: ================
                    987: */
                    988: void COM_AddParm (char *parm)
                    989: {
                    990:        if (com_argc == MAX_NUM_ARGVS)
                    991:                Com_Error (ERR_FATAL, "COM_AddParm: MAX_NUM)ARGS");
                    992:        com_argv[com_argc++] = parm;
                    993: }
1.1.1.2   root      994: 
                    995: 
                    996: 
                    997: 
1.1       root      998: /// just for debugging
                    999: int    memsearch (byte *start, int count, int search)
                   1000: {
                   1001:        int             i;
                   1002:        
                   1003:        for (i=0 ; i<count ; i++)
                   1004:                if (start[i] == search)
                   1005:                        return i;
                   1006:        return -1;
                   1007: }
1.1.1.2   root     1008: 
                   1009: 
1.1       root     1010: char *CopyString (char *in)
                   1011: {
                   1012:        char    *out;
                   1013:        
                   1014:        out = Z_Malloc (strlen(in)+1);
                   1015:        strcpy (out, in);
                   1016:        return out;
                   1017: }
1.1.1.2   root     1018: 
                   1019: 
                   1020: 
1.1       root     1021: void Info_Print (char *s)
                   1022: {
                   1023:        char    key[512];
                   1024:        char    value[512];
                   1025:        char    *o;
                   1026:        int             l;
1.1.1.2   root     1027: 
1.1       root     1028:        if (*s == '\\')
                   1029:                s++;
                   1030:        while (*s)
                   1031:        {
                   1032:                o = key;
                   1033:                while (*s && *s != '\\')
                   1034:                        *o++ = *s++;
1.1.1.2   root     1035: 
1.1       root     1036:                l = o - key;
                   1037:                if (l < 20)
                   1038:                {
                   1039:                        memset (o, ' ', 20-l);
                   1040:                        key[20] = 0;
                   1041:                }
                   1042:                else
                   1043:                        *o = 0;
                   1044:                Com_Printf ("%s", key);
1.1.1.2   root     1045: 
1.1       root     1046:                if (!*s)
                   1047:                {
                   1048:                        Com_Printf ("MISSING VALUE\n");
                   1049:                        return;
                   1050:                }
1.1.1.2   root     1051: 
1.1       root     1052:                o = value;
                   1053:                s++;
                   1054:                while (*s && *s != '\\')
                   1055:                        *o++ = *s++;
                   1056:                *o = 0;
1.1.1.2   root     1057: 
1.1       root     1058:                if (*s)
                   1059:                        s++;
                   1060:                Com_Printf ("%s\n", value);
                   1061:        }
                   1062: }
1.1.1.2   root     1063: 
                   1064: 
1.1       root     1065: /*
                   1066: ==============================================================================
1.1.1.2   root     1067: 
1.1       root     1068:                                                ZONE MEMORY ALLOCATION
1.1.1.2   root     1069: 
1.1       root     1070: just cleared malloc with counters now...
1.1.1.2   root     1071: 
1.1       root     1072: ==============================================================================
                   1073: */
1.1.1.2   root     1074: 
1.1       root     1075: #define        Z_MAGIC         0x1d1d
1.1.1.2   root     1076: 
                   1077: 
1.1       root     1078: typedef struct zhead_s
                   1079: {
                   1080:        struct zhead_s  *prev, *next;
                   1081:        short   magic;
                   1082:        short   tag;                    // for group free
                   1083:        int             size;
                   1084: } zhead_t;
1.1.1.2   root     1085: 
1.1       root     1086: zhead_t                z_chain;
                   1087: int            z_count, z_bytes;
1.1.1.2   root     1088: 
1.1       root     1089: /*
                   1090: ========================
                   1091: Z_Free
                   1092: ========================
                   1093: */
                   1094: void Z_Free (void *ptr)
                   1095: {
                   1096:        zhead_t *z;
1.1.1.2   root     1097: 
1.1       root     1098:        z = ((zhead_t *)ptr) - 1;
1.1.1.2   root     1099: 
1.1       root     1100:        if (z->magic != Z_MAGIC)
                   1101:                Com_Error (ERR_FATAL, "Z_Free: bad magic");
1.1.1.2   root     1102: 
1.1       root     1103:        z->prev->next = z->next;
                   1104:        z->next->prev = z->prev;
1.1.1.2   root     1105: 
1.1       root     1106:        z_count--;
                   1107:        z_bytes -= z->size;
                   1108:        free (z);
                   1109: }
1.1.1.2   root     1110: 
                   1111: 
1.1       root     1112: /*
                   1113: ========================
                   1114: Z_Stats_f
                   1115: ========================
                   1116: */
                   1117: void Z_Stats_f (void)
                   1118: {
                   1119:        Com_Printf ("%i bytes in %i blocks\n", z_bytes, z_count);
                   1120: }
1.1.1.2   root     1121: 
1.1       root     1122: /*
                   1123: ========================
                   1124: Z_FreeTags
                   1125: ========================
                   1126: */
                   1127: void Z_FreeTags (int tag)
                   1128: {
                   1129:        zhead_t *z, *next;
1.1.1.2   root     1130: 
1.1       root     1131:        for (z=z_chain.next ; z != &z_chain ; z=next)
                   1132:        {
                   1133:                next = z->next;
                   1134:                if (z->tag == tag)
                   1135:                        Z_Free ((void *)(z+1));
                   1136:        }
                   1137: }
1.1.1.2   root     1138: 
1.1       root     1139: /*
                   1140: ========================
                   1141: Z_TagMalloc
                   1142: ========================
                   1143: */
                   1144: void *Z_TagMalloc (int size, int tag)
                   1145: {
                   1146:        zhead_t *z;
                   1147:        
                   1148:        size = size + sizeof(zhead_t);
                   1149:        z = malloc(size);
                   1150:        if (!z)
                   1151:                Com_Error (ERR_FATAL, "Z_Malloc: failed on allocation of %i bytes",size);
                   1152:        memset (z, 0, size);
                   1153:        z_count++;
                   1154:        z_bytes += size;
                   1155:        z->magic = Z_MAGIC;
                   1156:        z->tag = tag;
                   1157:        z->size = size;
1.1.1.2   root     1158: 
1.1       root     1159:        z->next = z_chain.next;
                   1160:        z->prev = &z_chain;
                   1161:        z_chain.next->prev = z;
                   1162:        z_chain.next = z;
1.1.1.2   root     1163: 
1.1       root     1164:        return (void *)(z+1);
                   1165: }
1.1.1.2   root     1166: 
1.1       root     1167: /*
                   1168: ========================
                   1169: Z_Malloc
                   1170: ========================
                   1171: */
                   1172: void *Z_Malloc (int size)
                   1173: {
                   1174:        return Z_TagMalloc (size, 0);
                   1175: }
1.1.1.2   root     1176: 
                   1177: 
1.1       root     1178: //============================================================================
                   1179: 
                   1180: 
                   1181: /*
                   1182: ====================
                   1183: COM_BlockSequenceCheckByte
                   1184: 
                   1185: For proxy protecting
1.1.1.2   root     1186: 
                   1187: // THIS IS MASSIVELY BROKEN!  CHALLENGE MAY BE NEGATIVE
                   1188: // DON'T USE THIS FUNCTION!!!!!
                   1189: 
1.1       root     1190: ====================
                   1191: */
1.1.1.2   root     1192: byte   COM_BlockSequenceCheckByte (byte *base, int length, int sequence, int challenge)
1.1       root     1193: {
1.1.1.2   root     1194:        Sys_Error("COM_BlockSequenceCheckByte called\n");
                   1195: 
                   1196: #if 0
1.1       root     1197:        int             checksum;
1.1.1.2   root     1198:        byte    buf[68];
1.1       root     1199:        byte    *p;
1.1.1.2   root     1200:        float temp;
                   1201:        byte c;
                   1202: 
                   1203:        temp = bytedirs[(sequence/3) % NUMVERTEXNORMALS][sequence % 3];
                   1204:        temp = LittleFloat(temp);
                   1205:        p = ((byte *)&temp);
1.1       root     1206: 
                   1207:        if (length > 60)
                   1208:                length = 60;
                   1209:        memcpy (buf, base, length);
                   1210: 
1.1.1.2   root     1211:        buf[length] = (sequence & 0xff) ^ p[0];
                   1212:        buf[length+1] = p[1];
                   1213:        buf[length+2] = ((sequence>>8) & 0xff) ^ p[2];
                   1214:        buf[length+3] = p[3];
                   1215: 
                   1216:        temp = bytedirs[((sequence+challenge)/3) % NUMVERTEXNORMALS][(sequence+challenge) % 3];
                   1217:        temp = LittleFloat(temp);
                   1218:        p = ((byte *)&temp);
                   1219: 
                   1220:        buf[length+4] = (sequence & 0xff) ^ p[3];
                   1221:        buf[length+5] = (challenge & 0xff) ^ p[2];
                   1222:        buf[length+6] = ((sequence>>8) & 0xff) ^ p[1];
                   1223:        buf[length+7] = ((challenge >> 7) & 0xff) ^ p[0];
                   1224: 
                   1225:        length += 8;
                   1226: 
                   1227:        checksum = LittleLong(Com_BlockChecksum (buf, length));
1.1       root     1228: 
                   1229:        checksum &= 0xff;
                   1230: 
                   1231:        return checksum;
1.1.1.2   root     1232: #endif
                   1233:        return 0;
                   1234: }
                   1235: 
                   1236: static byte chktbl[1024] = {
                   1237: 0x84, 0x47, 0x51, 0xc1, 0x93, 0x22, 0x21, 0x24, 0x2f, 0x66, 0x60, 0x4d, 0xb0, 0x7c, 0xda,
                   1238: 0x88, 0x54, 0x15, 0x2b, 0xc6, 0x6c, 0x89, 0xc5, 0x9d, 0x48, 0xee, 0xe6, 0x8a, 0xb5, 0xf4,
                   1239: 0xcb, 0xfb, 0xf1, 0x0c, 0x2e, 0xa0, 0xd7, 0xc9, 0x1f, 0xd6, 0x06, 0x9a, 0x09, 0x41, 0x54,
                   1240: 0x67, 0x46, 0xc7, 0x74, 0xe3, 0xc8, 0xb6, 0x5d, 0xa6, 0x36, 0xc4, 0xab, 0x2c, 0x7e, 0x85,
                   1241: 0xa8, 0xa4, 0xa6, 0x4d, 0x96, 0x19, 0x19, 0x9a, 0xcc, 0xd8, 0xac, 0x39, 0x5e, 0x3c, 0xf2,
                   1242: 0xf5, 0x5a, 0x72, 0xe5, 0xa9, 0xd1, 0xb3, 0x23, 0x82, 0x6f, 0x29, 0xcb, 0xd1, 0xcc, 0x71,
                   1243: 0xfb, 0xea, 0x92, 0xeb, 0x1c, 0xca, 0x4c, 0x70, 0xfe, 0x4d, 0xc9, 0x67, 0x43, 0x47, 0x94,
                   1244: 0xb9, 0x47, 0xbc, 0x3f, 0x01, 0xab, 0x7b, 0xa6, 0xe2, 0x76, 0xef, 0x5a, 0x7a, 0x29, 0x0b,
                   1245: 0x51, 0x54, 0x67, 0xd8, 0x1c, 0x14, 0x3e, 0x29, 0xec, 0xe9, 0x2d, 0x48, 0x67, 0xff, 0xed,
                   1246: 0x54, 0x4f, 0x48, 0xc0, 0xaa, 0x61, 0xf7, 0x78, 0x12, 0x03, 0x7a, 0x9e, 0x8b, 0xcf, 0x83,
                   1247: 0x7b, 0xae, 0xca, 0x7b, 0xd9, 0xe9, 0x53, 0x2a, 0xeb, 0xd2, 0xd8, 0xcd, 0xa3, 0x10, 0x25,
                   1248: 0x78, 0x5a, 0xb5, 0x23, 0x06, 0x93, 0xb7, 0x84, 0xd2, 0xbd, 0x96, 0x75, 0xa5, 0x5e, 0xcf,
                   1249: 0x4e, 0xe9, 0x50, 0xa1, 0xe6, 0x9d, 0xb1, 0xe3, 0x85, 0x66, 0x28, 0x4e, 0x43, 0xdc, 0x6e,
                   1250: 0xbb, 0x33, 0x9e, 0xf3, 0x0d, 0x00, 0xc1, 0xcf, 0x67, 0x34, 0x06, 0x7c, 0x71, 0xe3, 0x63,
                   1251: 0xb7, 0xb7, 0xdf, 0x92, 0xc4, 0xc2, 0x25, 0x5c, 0xff, 0xc3, 0x6e, 0xfc, 0xaa, 0x1e, 0x2a,
                   1252: 0x48, 0x11, 0x1c, 0x36, 0x68, 0x78, 0x86, 0x79, 0x30, 0xc3, 0xd6, 0xde, 0xbc, 0x3a, 0x2a,
                   1253: 0x6d, 0x1e, 0x46, 0xdd, 0xe0, 0x80, 0x1e, 0x44, 0x3b, 0x6f, 0xaf, 0x31, 0xda, 0xa2, 0xbd,
                   1254: 0x77, 0x06, 0x56, 0xc0, 0xb7, 0x92, 0x4b, 0x37, 0xc0, 0xfc, 0xc2, 0xd5, 0xfb, 0xa8, 0xda,
                   1255: 0xf5, 0x57, 0xa8, 0x18, 0xc0, 0xdf, 0xe7, 0xaa, 0x2a, 0xe0, 0x7c, 0x6f, 0x77, 0xb1, 0x26,
                   1256: 0xba, 0xf9, 0x2e, 0x1d, 0x16, 0xcb, 0xb8, 0xa2, 0x44, 0xd5, 0x2f, 0x1a, 0x79, 0x74, 0x87,
                   1257: 0x4b, 0x00, 0xc9, 0x4a, 0x3a, 0x65, 0x8f, 0xe6, 0x5d, 0xe5, 0x0a, 0x77, 0xd8, 0x1a, 0x14,
                   1258: 0x41, 0x75, 0xb1, 0xe2, 0x50, 0x2c, 0x93, 0x38, 0x2b, 0x6d, 0xf3, 0xf6, 0xdb, 0x1f, 0xcd,
                   1259: 0xff, 0x14, 0x70, 0xe7, 0x16, 0xe8, 0x3d, 0xf0, 0xe3, 0xbc, 0x5e, 0xb6, 0x3f, 0xcc, 0x81,
                   1260: 0x24, 0x67, 0xf3, 0x97, 0x3b, 0xfe, 0x3a, 0x96, 0x85, 0xdf, 0xe4, 0x6e, 0x3c, 0x85, 0x05,
                   1261: 0x0e, 0xa3, 0x2b, 0x07, 0xc8, 0xbf, 0xe5, 0x13, 0x82, 0x62, 0x08, 0x61, 0x69, 0x4b, 0x47,
                   1262: 0x62, 0x73, 0x44, 0x64, 0x8e, 0xe2, 0x91, 0xa6, 0x9a, 0xb7, 0xe9, 0x04, 0xb6, 0x54, 0x0c,
                   1263: 0xc5, 0xa9, 0x47, 0xa6, 0xc9, 0x08, 0xfe, 0x4e, 0xa6, 0xcc, 0x8a, 0x5b, 0x90, 0x6f, 0x2b,
                   1264: 0x3f, 0xb6, 0x0a, 0x96, 0xc0, 0x78, 0x58, 0x3c, 0x76, 0x6d, 0x94, 0x1a, 0xe4, 0x4e, 0xb8,
                   1265: 0x38, 0xbb, 0xf5, 0xeb, 0x29, 0xd8, 0xb0, 0xf3, 0x15, 0x1e, 0x99, 0x96, 0x3c, 0x5d, 0x63,
                   1266: 0xd5, 0xb1, 0xad, 0x52, 0xb8, 0x55, 0x70, 0x75, 0x3e, 0x1a, 0xd5, 0xda, 0xf6, 0x7a, 0x48,
                   1267: 0x7d, 0x44, 0x41, 0xf9, 0x11, 0xce, 0xd7, 0xca, 0xa5, 0x3d, 0x7a, 0x79, 0x7e, 0x7d, 0x25,
                   1268: 0x1b, 0x77, 0xbc, 0xf7, 0xc7, 0x0f, 0x84, 0x95, 0x10, 0x92, 0x67, 0x15, 0x11, 0x5a, 0x5e,
                   1269: 0x41, 0x66, 0x0f, 0x38, 0x03, 0xb2, 0xf1, 0x5d, 0xf8, 0xab, 0xc0, 0x02, 0x76, 0x84, 0x28,
                   1270: 0xf4, 0x9d, 0x56, 0x46, 0x60, 0x20, 0xdb, 0x68, 0xa7, 0xbb, 0xee, 0xac, 0x15, 0x01, 0x2f,
                   1271: 0x20, 0x09, 0xdb, 0xc0, 0x16, 0xa1, 0x89, 0xf9, 0x94, 0x59, 0x00, 0xc1, 0x76, 0xbf, 0xc1,
                   1272: 0x4d, 0x5d, 0x2d, 0xa9, 0x85, 0x2c, 0xd6, 0xd3, 0x14, 0xcc, 0x02, 0xc3, 0xc2, 0xfa, 0x6b,
                   1273: 0xb7, 0xa6, 0xef, 0xdd, 0x12, 0x26, 0xa4, 0x63, 0xe3, 0x62, 0xbd, 0x56, 0x8a, 0x52, 0x2b,
                   1274: 0xb9, 0xdf, 0x09, 0xbc, 0x0e, 0x97, 0xa9, 0xb0, 0x82, 0x46, 0x08, 0xd5, 0x1a, 0x8e, 0x1b,
                   1275: 0xa7, 0x90, 0x98, 0xb9, 0xbb, 0x3c, 0x17, 0x9a, 0xf2, 0x82, 0xba, 0x64, 0x0a, 0x7f, 0xca,
                   1276: 0x5a, 0x8c, 0x7c, 0xd3, 0x79, 0x09, 0x5b, 0x26, 0xbb, 0xbd, 0x25, 0xdf, 0x3d, 0x6f, 0x9a,
                   1277: 0x8f, 0xee, 0x21, 0x66, 0xb0, 0x8d, 0x84, 0x4c, 0x91, 0x45, 0xd4, 0x77, 0x4f, 0xb3, 0x8c,
                   1278: 0xbc, 0xa8, 0x99, 0xaa, 0x19, 0x53, 0x7c, 0x02, 0x87, 0xbb, 0x0b, 0x7c, 0x1a, 0x2d, 0xdf,
                   1279: 0x48, 0x44, 0x06, 0xd6, 0x7d, 0x0c, 0x2d, 0x35, 0x76, 0xae, 0xc4, 0x5f, 0x71, 0x85, 0x97,
                   1280: 0xc4, 0x3d, 0xef, 0x52, 0xbe, 0x00, 0xe4, 0xcd, 0x49, 0xd1, 0xd1, 0x1c, 0x3c, 0xd0, 0x1c,
                   1281: 0x42, 0xaf, 0xd4, 0xbd, 0x58, 0x34, 0x07, 0x32, 0xee, 0xb9, 0xb5, 0xea, 0xff, 0xd7, 0x8c,
                   1282: 0x0d, 0x2e, 0x2f, 0xaf, 0x87, 0xbb, 0xe6, 0x52, 0x71, 0x22, 0xf5, 0x25, 0x17, 0xa1, 0x82,
                   1283: 0x04, 0xc2, 0x4a, 0xbd, 0x57, 0xc6, 0xab, 0xc8, 0x35, 0x0c, 0x3c, 0xd9, 0xc2, 0x43, 0xdb,
                   1284: 0x27, 0x92, 0xcf, 0xb8, 0x25, 0x60, 0xfa, 0x21, 0x3b, 0x04, 0x52, 0xc8, 0x96, 0xba, 0x74,
                   1285: 0xe3, 0x67, 0x3e, 0x8e, 0x8d, 0x61, 0x90, 0x92, 0x59, 0xb6, 0x1a, 0x1c, 0x5e, 0x21, 0xc1,
                   1286: 0x65, 0xe5, 0xa6, 0x34, 0x05, 0x6f, 0xc5, 0x60, 0xb1, 0x83, 0xc1, 0xd5, 0xd5, 0xed, 0xd9,
                   1287: 0xc7, 0x11, 0x7b, 0x49, 0x7a, 0xf9, 0xf9, 0x84, 0x47, 0x9b, 0xe2, 0xa5, 0x82, 0xe0, 0xc2,
                   1288: 0x88, 0xd0, 0xb2, 0x58, 0x88, 0x7f, 0x45, 0x09, 0x67, 0x74, 0x61, 0xbf, 0xe6, 0x40, 0xe2,
                   1289: 0x9d, 0xc2, 0x47, 0x05, 0x89, 0xed, 0xcb, 0xbb, 0xb7, 0x27, 0xe7, 0xdc, 0x7a, 0xfd, 0xbf,
                   1290: 0xa8, 0xd0, 0xaa, 0x10, 0x39, 0x3c, 0x20, 0xf0, 0xd3, 0x6e, 0xb1, 0x72, 0xf8, 0xe6, 0x0f,
                   1291: 0xef, 0x37, 0xe5, 0x09, 0x33, 0x5a, 0x83, 0x43, 0x80, 0x4f, 0x65, 0x2f, 0x7c, 0x8c, 0x6a,
                   1292: 0xa0, 0x82, 0x0c, 0xd4, 0xd4, 0xfa, 0x81, 0x60, 0x3d, 0xdf, 0x06, 0xf1, 0x5f, 0x08, 0x0d,
                   1293: 0x6d, 0x43, 0xf2, 0xe3, 0x11, 0x7d, 0x80, 0x32, 0xc5, 0xfb, 0xc5, 0xd9, 0x27, 0xec, 0xc6,
                   1294: 0x4e, 0x65, 0x27, 0x76, 0x87, 0xa6, 0xee, 0xee, 0xd7, 0x8b, 0xd1, 0xa0, 0x5c, 0xb0, 0x42,
                   1295: 0x13, 0x0e, 0x95, 0x4a, 0xf2, 0x06, 0xc6, 0x43, 0x33, 0xf4, 0xc7, 0xf8, 0xe7, 0x1f, 0xdd,
                   1296: 0xe4, 0x46, 0x4a, 0x70, 0x39, 0x6c, 0xd0, 0xed, 0xca, 0xbe, 0x60, 0x3b, 0xd1, 0x7b, 0x57,
                   1297: 0x48, 0xe5, 0x3a, 0x79, 0xc1, 0x69, 0x33, 0x53, 0x1b, 0x80, 0xb8, 0x91, 0x7d, 0xb4, 0xf6,
                   1298: 0x17, 0x1a, 0x1d, 0x5a, 0x32, 0xd6, 0xcc, 0x71, 0x29, 0x3f, 0x28, 0xbb, 0xf3, 0x5e, 0x71,
                   1299: 0xb8, 0x43, 0xaf, 0xf8, 0xb9, 0x64, 0xef, 0xc4, 0xa5, 0x6c, 0x08, 0x53, 0xc7, 0x00, 0x10,
                   1300: 0x39, 0x4f, 0xdd, 0xe4, 0xb6, 0x19, 0x27, 0xfb, 0xb8, 0xf5, 0x32, 0x73, 0xe5, 0xcb, 0x32
                   1301: };
                   1302: 
                   1303: /*
                   1304: ====================
                   1305: COM_BlockSequenceCRCByte
                   1306: 
                   1307: For proxy protecting
                   1308: ====================
                   1309: */
                   1310: byte   COM_BlockSequenceCRCByte (byte *base, int length, int sequence)
                   1311: {
1.1.1.3 ! root     1312:        int             n;
1.1.1.2   root     1313:        byte    *p;
1.1.1.3 ! root     1314:        int             x;
1.1.1.2   root     1315:        byte chkb[60 + 4];
1.1.1.3 ! root     1316:        unsigned short crc;
        !          1317: 
1.1.1.2   root     1318: 
                   1319:        if (sequence < 0)
                   1320:                Sys_Error("sequence < 0, this shouldn't happen\n");
                   1321: 
                   1322:        p = chktbl + (sequence % (sizeof(chktbl) - 4));
                   1323: 
                   1324:        if (length > 60)
                   1325:                length = 60;
                   1326:        memcpy (chkb, base, length);
                   1327: 
                   1328:        chkb[length] = p[0];
                   1329:        chkb[length+1] = p[1];
                   1330:        chkb[length+2] = p[2];
                   1331:        chkb[length+3] = p[3];
                   1332: 
                   1333:        length += 4;
                   1334: 
                   1335:        crc = CRC_Block(chkb, length);
                   1336: 
1.1.1.3 ! root     1337:        for (x=0, n=0; n<length; n++)
        !          1338:                x += chkb[n];
        !          1339: 
        !          1340:        crc = (crc ^ x) & 0xff;
1.1.1.2   root     1341: 
                   1342:        return crc;
1.1       root     1343: }
                   1344: 
                   1345: //========================================================
1.1.1.2   root     1346: 
1.1       root     1347: float  frand(void)
                   1348: {
                   1349:        return (rand()&32767)* (1.0/32767);
                   1350: }
1.1.1.2   root     1351: 
1.1       root     1352: float  crand(void)
                   1353: {
                   1354:        return (rand()&32767)* (2.0/32767) - 1;
                   1355: }
1.1.1.2   root     1356: 
1.1       root     1357: void Key_Init (void);
                   1358: void SCR_EndLoadingPlaque (void);
1.1.1.2   root     1359: 
1.1       root     1360: /*
                   1361: =============
                   1362: Com_Error_f
1.1.1.2   root     1363: 
1.1       root     1364: Just throw a fatal error to
                   1365: test error shutdown procedures
                   1366: =============
                   1367: */
                   1368: void Com_Error_f (void)
                   1369: {
                   1370:        Com_Error (ERR_FATAL, "%s", Cmd_Argv(1));
                   1371: }
                   1372: 
                   1373: 
                   1374: /*
                   1375: =================
                   1376: Qcommon_Init
                   1377: =================
                   1378: */
                   1379: void Qcommon_Init (int argc, char **argv)
                   1380: {
                   1381:        char    *s;
1.1.1.2   root     1382: 
1.1       root     1383:        if (setjmp (abortframe) )
                   1384:                Sys_Error ("Error during initialization");
1.1.1.2   root     1385: 
1.1       root     1386:        z_chain.next = z_chain.prev = &z_chain;
1.1.1.2   root     1387: 
1.1       root     1388:        // prepare enough of the subsystems to handle
                   1389:        // cvar and command buffer management
                   1390:        COM_InitArgv (argc, argv);
1.1.1.2   root     1391: 
1.1       root     1392:        Swap_Init ();
                   1393:        Cbuf_Init ();
1.1.1.2   root     1394: 
1.1       root     1395:        Cmd_Init ();
                   1396:        Cvar_Init ();
1.1.1.2   root     1397: 
1.1       root     1398:        Key_Init ();
1.1.1.2   root     1399: 
1.1       root     1400:        // we need to add the early commands twice, because
                   1401:        // a basedir or cddir needs to be set before execing
                   1402:        // config files, but we want other parms to override
                   1403:        // the settings of the config files
                   1404:        Cbuf_AddEarlyCommands (false);
                   1405:        Cbuf_Execute ();
1.1.1.2   root     1406: 
1.1       root     1407:        FS_InitFilesystem ();
1.1.1.2   root     1408: 
1.1       root     1409:        Cbuf_AddText ("exec default.cfg\n");
                   1410:        Cbuf_AddText ("exec config.cfg\n");
1.1.1.2   root     1411: 
1.1       root     1412:        Cbuf_AddEarlyCommands (true);
                   1413:        Cbuf_Execute ();
1.1.1.2   root     1414: 
1.1       root     1415:        //
                   1416:        // init commands and vars
                   1417:        //
                   1418:     Cmd_AddCommand ("z_stats", Z_Stats_f);
                   1419:     Cmd_AddCommand ("error", Com_Error_f);
1.1.1.2   root     1420: 
1.1       root     1421:        host_speeds = Cvar_Get ("host_speeds", "0", 0);
                   1422:        log_stats = Cvar_Get ("log_stats", "0", 0);
                   1423:        developer = Cvar_Get ("developer", "0", 0);
                   1424:        timescale = Cvar_Get ("timescale", "1", 0);
                   1425:        fixedtime = Cvar_Get ("fixedtime", "0", 0);
                   1426:        logfile_active = Cvar_Get ("logfile", "0", 0);
                   1427:        showtrace = Cvar_Get ("showtrace", "0", 0);
1.1.1.2   root     1428: #ifdef DEDICATED_ONLY
                   1429:        dedicated = Cvar_Get ("dedicated", "1", CVAR_NOSET);
                   1430: #else
1.1       root     1431:        dedicated = Cvar_Get ("dedicated", "0", CVAR_NOSET);
1.1.1.2   root     1432: #endif
                   1433: 
1.1       root     1434:        s = va("%4.2f %s %s %s", VERSION, CPUSTRING, __DATE__, BUILDSTRING);
                   1435:        Cvar_Get ("version", s, CVAR_SERVERINFO|CVAR_NOSET);
1.1.1.2   root     1436: 
                   1437: 
1.1       root     1438:        if (dedicated->value)
                   1439:                Cmd_AddCommand ("quit", Com_Quit);
1.1.1.2   root     1440: 
1.1       root     1441:        Sys_Init ();
1.1.1.2   root     1442: 
1.1       root     1443:        NET_Init ();
                   1444:        Netchan_Init ();
1.1.1.2   root     1445: 
1.1       root     1446:        SV_Init ();
                   1447:        CL_Init ();
1.1.1.2   root     1448: 
1.1       root     1449:        // add + commands from command line
                   1450:        if (!Cbuf_AddLateCommands ())
                   1451:        {       // if the user didn't give any commands, run default action
                   1452:                if (!dedicated->value)
                   1453:                        Cbuf_AddText ("d1\n");
                   1454:                else
                   1455:                        Cbuf_AddText ("dedicated_start\n");
                   1456:                Cbuf_Execute ();
                   1457:        }
                   1458:        else
                   1459:        {       // the user asked for something explicit
                   1460:                // so drop the loading plaque
                   1461:                SCR_EndLoadingPlaque ();
                   1462:        }
1.1.1.2   root     1463: 
1.1       root     1464:        Com_Printf ("====== Quake2 Initialized ======\n\n");    
                   1465: }
1.1.1.2   root     1466: 
1.1       root     1467: /*
                   1468: =================
                   1469: Qcommon_Frame
                   1470: =================
                   1471: */
                   1472: void Qcommon_Frame (int msec)
                   1473: {
                   1474:        char    *s;
                   1475:        int             time_before, time_between, time_after;
1.1.1.2   root     1476: 
1.1       root     1477:        if (setjmp (abortframe) )
                   1478:                return;                 // an ERR_DROP was thrown
                   1479: 
                   1480:        if ( log_stats->modified )
                   1481:        {
                   1482:                log_stats->modified = false;
                   1483:                if ( log_stats->value )
                   1484:                {
                   1485:                        if ( log_stats_file )
                   1486:                        {
                   1487:                                fclose( log_stats_file );
                   1488:                                log_stats_file = 0;
                   1489:                        }
                   1490:                        log_stats_file = fopen( "stats.log", "w" );
                   1491:                        if ( log_stats_file )
                   1492:                                fprintf( log_stats_file, "entities,dlights,parts,frame time\n" );
                   1493:                }
                   1494:                else
                   1495:                {
                   1496:                        if ( log_stats_file )
                   1497:                        {
                   1498:                                fclose( log_stats_file );
                   1499:                                log_stats_file = 0;
                   1500:                        }
                   1501:                }
                   1502:        }
1.1.1.2   root     1503: 
1.1       root     1504:        if (fixedtime->value)
                   1505:                msec = fixedtime->value;
                   1506:        else if (timescale->value)
                   1507:        {
                   1508:                msec *= timescale->value;
                   1509:                if (msec < 1)
                   1510:                        msec = 1;
                   1511:        }
                   1512: 
                   1513:        if (showtrace->value)
                   1514:        {
                   1515:                extern  int c_traces, c_brush_traces;
                   1516:                extern  int     c_pointcontents;
1.1.1.2   root     1517: 
1.1       root     1518:                Com_Printf ("%4i traces  %4i points\n", c_traces, c_pointcontents);
                   1519:                c_traces = 0;
                   1520:                c_brush_traces = 0;
                   1521:                c_pointcontents = 0;
                   1522:        }
1.1.1.2   root     1523: 
1.1       root     1524:        do
                   1525:        {
                   1526:                s = Sys_ConsoleInput ();
                   1527:                if (s)
                   1528:                        Cbuf_AddText (va("%s\n",s));
                   1529:        } while (s);
                   1530:        Cbuf_Execute ();
1.1.1.2   root     1531: 
1.1       root     1532:        if (host_speeds->value)
                   1533:                time_before = Sys_Milliseconds ();
1.1.1.2   root     1534: 
1.1       root     1535:        SV_Frame (msec);
1.1.1.2   root     1536: 
1.1       root     1537:        if (host_speeds->value)
                   1538:                time_between = Sys_Milliseconds ();             
1.1.1.2   root     1539: 
1.1       root     1540:        CL_Frame (msec);
1.1.1.2   root     1541: 
1.1       root     1542:        if (host_speeds->value)
                   1543:                time_after = Sys_Milliseconds ();               
1.1.1.2   root     1544: 
                   1545: 
1.1       root     1546:        if (host_speeds->value)
                   1547:        {
                   1548:                int                     all, sv, gm, cl, rf;
1.1.1.2   root     1549: 
1.1       root     1550:                all = time_after - time_before;
                   1551:                sv = time_between - time_before;
                   1552:                cl = time_after - time_between;
                   1553:                gm = time_after_game - time_before_game;
                   1554:                rf = time_after_ref - time_before_ref;
                   1555:                sv -= gm;
                   1556:                cl -= rf;
                   1557:                Com_Printf ("all:%3i sv:%3i gm:%3i cl:%3i rf:%3i\n",
                   1558:                        all, sv, gm, cl, rf);
                   1559:        }       
                   1560: }
1.1.1.2   root     1561: 
1.1       root     1562: /*
                   1563: =================
                   1564: Qcommon_Shutdown
                   1565: =================
                   1566: */
                   1567: void Qcommon_Shutdown (void)
                   1568: {
                   1569: }

unix.superglobalmegacorp.com

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