]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
added cl_avidemo cvar (saves a series of tga images named gamedir/dpavi000000.tga...
[xonotic/darkplaces.git] / common.c
index 27112675c830b572a56a29fac0749925330a2000..80a7389fc3b1e372a7e6d7a731e802e4f7991583 100644 (file)
--- a/common.c
+++ b/common.c
@@ -109,7 +109,7 @@ void Q_memset (void *dest, int fill, int count)
        }
        else
                for (i=0 ; i<count ; i++)
-                       ((byte *)dest)[i] = fill;
+                       ((qbyte *)dest)[i] = fill;
 }
 
 void Q_memcpy (void *dest, void *src, int count)
@@ -124,7 +124,7 @@ void Q_memcpy (void *dest, void *src, int count)
        }
        else
                for (i=0 ; i<count ; i++)
-                       ((byte *)dest)[i] = ((byte *)src)[i];
+                       ((qbyte *)dest)[i] = ((qbyte *)src)[i];
 }
 
 int Q_memcmp (void *m1, void *m2, int count)
@@ -132,7 +132,7 @@ int Q_memcmp (void *m1, void *m2, int count)
        while(count)
        {
                count--;
-               if (((byte *)m1)[count] != ((byte *)m2)[count])
+               if (((qbyte *)m1)[count] != ((qbyte *)m2)[count])
                        return -1;
        }
        return 0;
@@ -404,7 +404,7 @@ float   (*LittleFloat) (float l);
 
 short   ShortSwap (short l)
 {
-       byte    b1,b2;
+       qbyte    b1,b2;
 
        b1 = l&255;
        b2 = (l>>8)&255;
@@ -421,7 +421,7 @@ short   ShortNoSwap (short l)
 
 int    LongSwap (int l)
 {
-       byte    b1,b2,b3,b4;
+       qbyte    b1,b2,b3,b4;
 
        b1 = l&255;
        b2 = (l>>8)&255;
@@ -443,7 +443,7 @@ float FloatSwap (float f)
        union
        {
                float   f;
-               byte    b[4];
+               qbyte    b[4];
        } dat1, dat2;
 
 
@@ -477,7 +477,7 @@ Handles byte ordering and avoids alignment errors
 
 void MSG_WriteChar (sizebuf_t *sb, int c)
 {
-       byte    *buf;
+       qbyte    *buf;
        
 //#ifdef PARANOID
 //     if (c < -128 || c > 127)
@@ -490,7 +490,7 @@ void MSG_WriteChar (sizebuf_t *sb, int c)
 
 void MSG_WriteByte (sizebuf_t *sb, int c)
 {
-       byte    *buf;
+       qbyte    *buf;
        
 //#ifdef PARANOID
 //     if (c < 0 || c > 255)
@@ -503,7 +503,7 @@ void MSG_WriteByte (sizebuf_t *sb, int c)
 
 void MSG_WriteShort (sizebuf_t *sb, int c)
 {
-       byte    *buf;
+       qbyte    *buf;
 
 //#ifdef PARANOID
 //     if (c < ((short)0x8000) || c > (short)0x7fff)
@@ -517,7 +517,7 @@ void MSG_WriteShort (sizebuf_t *sb, int c)
 
 void MSG_WriteLong (sizebuf_t *sb, int c)
 {
-       byte    *buf;
+       qbyte    *buf;
 
        buf = SZ_GetSpace (sb, 4);
        buf[0] = c&0xff;
@@ -549,27 +549,13 @@ void MSG_WriteString (sizebuf_t *sb, char *s)
                SZ_Write (sb, s, strlen(s)+1);
 }
 
-// used by server (always dpprotocol)
-// moved to common.h as #define
-/*
-void MSG_WriteFloatCoord (sizebuf_t *sb, float f)
-{
-       MSG_WriteFloat(sb, f);
-}
-*/
-
-// used by client
-void MSG_WriteCoord (sizebuf_t *sb, float f)
+// used by server (always latest dpprotocol)
+void MSG_WriteDPCoord (sizebuf_t *sb, float f)
 {
-       if (dpprotocol)
-               MSG_WriteFloat(sb, f);
+       if (f >= 0)
+               MSG_WriteShort (sb, (int)(f + 0.5f));
        else
-       {
-               if (f >= 0)
-                       MSG_WriteShort (sb, (int)(f*8.0f + 0.5f));
-               else
-                       MSG_WriteShort (sb, (int)(f*8.0f - 0.5f));
-       }
+               MSG_WriteShort (sb, (int)(f - 0.5f));
 }
 
 void MSG_WritePreciseAngle (sizebuf_t *sb, float f)
@@ -606,7 +592,7 @@ void MSG_BeginReading (void)
 int MSG_ReadChar (void)
 {
        int     c;
-       
+
        // LordHavoc: minor optimization
        if (msg_readcount >= net_message.cursize)
 //     if (msg_readcount+1 > net_message.cursize)
@@ -614,7 +600,7 @@ int MSG_ReadChar (void)
                msg_badread = true;
                return -1;
        }
-               
+
        c = (signed char)net_message.data[msg_readcount];
        msg_readcount++;
 
@@ -624,7 +610,7 @@ int MSG_ReadChar (void)
 int MSG_ReadByte (void)
 {
        int     c;
-       
+
        // LordHavoc: minor optimization
        if (msg_readcount >= net_message.cursize)
 //     if (msg_readcount+1 > net_message.cursize)
@@ -635,7 +621,7 @@ int MSG_ReadByte (void)
 
        c = (unsigned char)net_message.data[msg_readcount];
        msg_readcount++;
-       
+
        return c;
 }
 */
@@ -649,19 +635,19 @@ int MSG_ReadShort (void)
                msg_badread = true;
                return -1;
        }
-               
+
        c = (short)(net_message.data[msg_readcount]
        + (net_message.data[msg_readcount+1]<<8));
-       
+
        msg_readcount += 2;
-       
+
        return c;
 }
 
 int MSG_ReadLong (void)
 {
        int     c;
-       
+
        if (msg_readcount+4 > net_message.cursize)
        {
                msg_badread = true;
@@ -672,9 +658,9 @@ int MSG_ReadLong (void)
        + (net_message.data[msg_readcount+1]<<8)
        + (net_message.data[msg_readcount+2]<<16)
        + (net_message.data[msg_readcount+3]<<24);
-       
+
        msg_readcount += 4;
-       
+
        return c;
 }
 
@@ -682,27 +668,27 @@ float MSG_ReadFloat (void)
 {
        union
        {
-               byte    b[4];
+               qbyte    b[4];
                float   f;
                int     l;
        } dat;
-       
+
        dat.b[0] =      net_message.data[msg_readcount];
        dat.b[1] =      net_message.data[msg_readcount+1];
        dat.b[2] =      net_message.data[msg_readcount+2];
        dat.b[3] =      net_message.data[msg_readcount+3];
        msg_readcount += 4;
-       
+
        dat.l = LittleLong (dat.l);
 
-       return dat.f;   
+       return dat.f;
 }
 
 char *MSG_ReadString (void)
 {
        static char     string[2048];
        int             l,c;
-       
+
        l = 0;
        do
        {
@@ -712,25 +698,24 @@ char *MSG_ReadString (void)
                string[l] = c;
                l++;
        } while (l < sizeof(string)-1);
-       
+
        string[l] = 0;
-       
+
        return string;
 }
 
-// used by server (always dpprotocol)
-// moved to common.h as #define
-/*
-float MSG_ReadFloatCoord (void)
+// used by server (always latest dpprotocol)
+float MSG_ReadDPCoord (void)
 {
-       return MSG_ReadFloat();
+       return (signed short) MSG_ReadShort();
 }
-*/
 
 // used by client
 float MSG_ReadCoord (void)
 {
-       if (dpprotocol)
+       if (dpprotocol == DPPROTOCOL_VERSION2 || dpprotocol == DPPROTOCOL_VERSION3)
+               return (signed short) MSG_ReadShort();
+       else if (dpprotocol == DPPROTOCOL_VERSION1)
                return MSG_ReadFloat();
        else
                return MSG_ReadShort() * (1.0f/8.0f);
@@ -787,7 +772,7 @@ void *SZ_GetSpace (sizebuf_t *buf, int length)
        if (buf->cursize + length > buf->maxsize)
        {
                if (!buf->allowoverflow)
-                       Host_Error ("SZ_GetSpace: overflow without allowoverflow set - use -zone on the commandline for more zone memory, default: 128k (quake original default was 48k)");
+                       Host_Error ("SZ_GetSpace: overflow without allowoverflow set");
 
                if (length > buf->maxsize)
                        Host_Error ("SZ_GetSpace: %i is > full buffer size", length);
@@ -816,9 +801,9 @@ void SZ_Print (sizebuf_t *buf, char *data)
 
 // byte * cast to keep VC++ happy
        if (buf->data[buf->cursize-1])
-               memcpy ((byte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
+               memcpy ((qbyte *)SZ_GetSpace(buf, len),data,len); // no trailing 0
        else
-               memcpy ((byte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
+               memcpy ((qbyte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
 }
 
 
@@ -856,8 +841,8 @@ void COM_StripExtension (char *in, char *out)
        while (*in)
        {
                if (*in == '.')
-                       last = in;
-               if ((*in == '/') || (*in == '\\') || (*in == ':'))
+                       last = out;
+               else if (*in == '/' || *in == '\\' || *in == ':')
                        last = NULL;
                *out++ = *in++;
        }
@@ -1141,14 +1126,18 @@ void COM_InitArgv (int argc, char **argv)
        largv[com_argc] = argvdummy;
        com_argv = largv;
 
-#if ZYMOTIC
+#if BLOODBATH
+       gamemode = GAME_BLOODBATH;
+#elif ZYMOTIC
        gamemode = GAME_ZYMOTIC;
 #elif FIENDARENA
        gamemode = GAME_FIENDARENA;
 #elif NEHAHRA
        gamemode = GAME_NEHAHRA;
 #else
-       if (COM_CheckParm ("-zymotic"))
+       if (COM_CheckParm ("-bloodbath"))
+               gamemode = GAME_BLOODBATH;
+       else if (COM_CheckParm ("-zymotic"))
                gamemode = GAME_ZYMOTIC;
        else if (COM_CheckParm ("-fiendarena"))
                gamemode = GAME_FIENDARENA;
@@ -1179,6 +1168,9 @@ void COM_InitArgv (int argc, char **argv)
        case GAME_ZYMOTIC:
                gamename = "Zymotic";
                break;
+       case GAME_BLOODBATH:
+               gamename = "BloodBath";
+               break;
        default:
                Sys_Error("COM_InitArgv: unknown gamemode %i\n", gamemode);
                break;
@@ -1196,7 +1188,7 @@ COM_Init
 void COM_Init (void)
 {
 #if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
-       byte    swaptest[2] = {1,0};
+       qbyte    swaptest[2] = {1,0};
 
 // set the byte swapping variables in a portable manner
        if ( *(short *)swaptest == 1)
@@ -1243,22 +1235,26 @@ FIXME: make this buffer size safe someday
 */
 char    *va(char *format, ...)
 {
-       va_list         argptr;
-       static char             string[1024];
-       
+       va_list argptr;
+       // LordHavoc: now cycles through 8 buffers to avoid problems in most cases
+       static char string[8][1024], *s;
+       static int stringindex = 0;
+
+       s = string[stringindex];
+       stringindex = (stringindex + 1) & 7;
        va_start (argptr, format);
-       vsprintf (string, format,argptr);
+       vsprintf (s, format,argptr);
        va_end (argptr);
 
-       return string;  
+       return s;
 }
 
 
 /// just for debugging
-int     memsearch (byte *start, int count, int search)
+int     memsearch (qbyte *start, int count, int search)
 {
        int             i;
-       
+
        for (i=0 ; i<count ; i++)
                if (start[i] == search)
                        return i;
@@ -1366,8 +1362,9 @@ void    COM_CreatePath (char *path)
 
        for (ofs = path+1 ; *ofs ; ofs++)
        {
-               if (*ofs == '/' || *ofs == '\\' || *ofs == ':')
-               {       // create the directory
+               if (*ofs == '/' || *ofs == '\\')
+               {
+                       // create the directory
                        save = *ofs;
                        *ofs = 0;
                        Sys_mkdir (path);
@@ -1384,7 +1381,7 @@ COM_WriteFile
 The filename will be prefixed by the current game directory
 ============
 */
-void COM_WriteFile (char *filename, void *data, int len)
+qboolean COM_WriteFile (char *filename, void *data, int len)
 {
        int             handle;
        char    name[MAX_OSPATH];
@@ -1397,13 +1394,14 @@ void COM_WriteFile (char *filename, void *data, int len)
        handle = Sys_FileOpenWrite (name);
        if (handle == -1)
        {
-               Sys_Printf ("COM_WriteFile: failed on %s\n", name);
-               return;
+               Con_Printf ("COM_WriteFile: failed on %s\n", name);
+               return false;
        }
 
-       Con_Printf ("COM_WriteFile: %s\n", name);
+       Con_DPrintf ("COM_WriteFile: %s\n", name);
        Sys_FileWrite (handle, data, len);
        Sys_FileClose (handle);
+       return true;
 }
 
 
@@ -1620,14 +1618,14 @@ Filename are reletive to the quake directory.
 Always appends a 0 byte.
 ============
 */
-byte                   *loadbuf;
-int                            loadsize;
-byte *COM_LoadFile (char *path, qboolean quiet)
+qbyte *loadbuf;
+int loadsize;
+qbyte *COM_LoadFile (char *path, qboolean quiet)
 {
-       QFile             *h;
-       byte    *buf;
-       char    base[1024];
-       int             len;
+       QFile *h;
+       qbyte *buf;
+       char base[1024];
+       int len;
 
        buf = NULL;     // quiet compiler warning
        loadsize = 0;
@@ -1646,7 +1644,7 @@ byte *COM_LoadFile (char *path, qboolean quiet)
        if (!buf)
                Sys_Error ("COM_LoadFile: not enough available memory for %s (size %i)", path, len);
 
-       ((byte *)buf)[len] = 0;
+       ((qbyte *)buf)[len] = 0;
 
        Qread (h, buf, len);
        Qclose (h);
@@ -1731,10 +1729,11 @@ then loads and adds pak1.pak pak2.pak ...
 */
 void COM_AddGameDirectory (char *dir)
 {
-       int                             i;
-       searchpath_t    *search;
-       pack_t                  *pak;
-       char                    pakfile[MAX_OSPATH];
+       //int i;
+       stringlist_t *list, *current;
+       searchpath_t *search;
+       pack_t *pak;
+       char pakfile[MAX_OSPATH];
 
        strcpy (com_gamedir, dir);
 
@@ -1746,6 +1745,28 @@ void COM_AddGameDirectory (char *dir)
        search->next = com_searchpaths;
        com_searchpaths = search;
 
+       // add any paks in the directory
+       list = listdirectory(dir);
+       for (current = list;current;current = current->next)
+       {
+               if (matchpattern(current->text, "*.pak"))
+               {
+                       sprintf (pakfile, "%s/%s", dir, current->text);
+                       pak = COM_LoadPackFile (pakfile);
+                       if (pak)
+                       {
+                               search = Mem_Alloc(pak_mempool, sizeof(searchpath_t));
+                               search->pack = pak;
+                               search->next = com_searchpaths;
+                               com_searchpaths = search;
+                       }
+                       else
+                               Con_Printf("unable to load pak \"%s\"\n", pakfile);
+               }
+       }
+       freedirectory(list);
+
+       /*
 //
 // add any pak files in the format pak0.pak pak1.pak, ...
 //
@@ -1760,6 +1781,7 @@ void COM_AddGameDirectory (char *dir)
                search->next = com_searchpaths;
                com_searchpaths = search;
        }
+       */
 
 //
 // add the contents of the parms.txt file to the end of the command line
@@ -1838,6 +1860,9 @@ void COM_InitFilesystem (void)
        case GAME_ZYMOTIC:
                COM_AddGameDirectory (va("%s/zymotic", basedir) );
                break;
+       case GAME_BLOODBATH:
+               COM_AddGameDirectory (va("%s/bb", basedir) );
+               break;
        default:
                Sys_Error("COM_InitFilesystem: unknown gamemode %i\n", gamemode);
                break;