]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
323
[xonotic/darkplaces.git] / common.c
index dcc333b71556a538c078781640f1a64395307531..5c72b72f1dcbe51fe3b99574b9317234af0372ec 100644 (file)
--- a/common.c
+++ b/common.c
@@ -190,30 +190,74 @@ void MSG_WriteString (sizebuf_t *sb, const char *s)
                SZ_Write (sb, s, strlen(s)+1);
 }
 
-// used by server (always latest PROTOCOL_DARKPLACES)
-void MSG_WriteDPCoord (sizebuf_t *sb, float f)
+void MSG_WriteCoord13i (sizebuf_t *sb, float f)
 {
        if (f >= 0)
-               MSG_WriteShort (sb, (int)(f + 0.5f));
+               MSG_WriteShort (sb, (int)(f * 8.0 + 0.5));
        else
-               MSG_WriteShort (sb, (int)(f - 0.5f));
+               MSG_WriteShort (sb, (int)(f * 8.0 - 0.5));
 }
 
-void MSG_WritePreciseAngle (sizebuf_t *sb, float f)
+void MSG_WriteCoord16i (sizebuf_t *sb, float f)
 {
        if (f >= 0)
-               MSG_WriteShort (sb, (int)(f*(65536.0f/360.0f) + 0.5f) & 65535);
+               MSG_WriteShort (sb, (int)(f + 0.5));
        else
-               MSG_WriteShort (sb, (int)(f*(65536.0f/360.0f) - 0.5f) & 65535);
+               MSG_WriteShort (sb, (int)(f - 0.5));
+}
+
+void MSG_WriteCoord32f (sizebuf_t *sb, float f)
+{
+       MSG_WriteFloat (sb, f);
+}
+
+void MSG_WriteCoord (sizebuf_t *sb, float f, int protocol)
+{
+       if (protocol == PROTOCOL_QUAKE)
+               MSG_WriteCoord13i (sb, f);
+       else if (protocol == PROTOCOL_DARKPLACES1 || protocol == PROTOCOL_DARKPLACES5)
+               MSG_WriteCoord32f (sb, f);
+       else if (protocol == PROTOCOL_DARKPLACES2 || protocol == PROTOCOL_DARKPLACES3 || protocol == PROTOCOL_DARKPLACES4)
+               MSG_WriteCoord16i (sb, f);
+       else
+               Host_Error("MSG_WriteCoord: unknown protocol\n");
+}
+
+void MSG_WriteVector (sizebuf_t *sb, float *v, int protocol)
+{
+       MSG_WriteCoord (sb, v[0], protocol);
+       MSG_WriteCoord (sb, v[1], protocol);
+       MSG_WriteCoord (sb, v[2], protocol);
 }
 
 // LordHavoc: round to nearest value, rather than rounding toward zero, fixes crosshair problem
-void MSG_WriteAngle (sizebuf_t *sb, float f)
+void MSG_WriteAngle8i (sizebuf_t *sb, float f)
 {
        if (f >= 0)
-               MSG_WriteByte (sb, (int)(f*(256.0f/360.0f) + 0.5f) & 255);
+               MSG_WriteByte (sb, (int)(f*(256.0/360.0) + 0.5) & 255);
        else
-               MSG_WriteByte (sb, (int)(f*(256.0f/360.0f) - 0.5f) & 255);
+               MSG_WriteByte (sb, (int)(f*(256.0/360.0) - 0.5) & 255);
+}
+
+void MSG_WriteAngle16i (sizebuf_t *sb, float f)
+{
+       if (f >= 0)
+               MSG_WriteShort (sb, (int)(f*(65536.0/360.0) + 0.5) & 65535);
+       else
+               MSG_WriteShort (sb, (int)(f*(65536.0/360.0) - 0.5) & 65535);
+}
+
+void MSG_WriteAngle32f (sizebuf_t *sb, float f)
+{
+       MSG_WriteFloat (sb, f);
+}
+
+void MSG_WriteAngle (sizebuf_t *sb, float f, int protocol)
+{
+       if (protocol == PROTOCOL_DARKPLACES5)
+               MSG_WriteAngle16i (sb, f);
+       else
+               MSG_WriteAngle8i (sb, f);
 }
 
 //
@@ -324,15 +368,62 @@ int MSG_ReadBytes (int numbytes, unsigned char *out)
        return l;
 }
 
-// used by client
-float MSG_ReadCoord (void)
+float MSG_ReadCoord13i (void)
+{
+       return MSG_ReadLittleShort() * (1.0/8.0);
+}
+
+float MSG_ReadCoord16i (void)
 {
-       if (cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3 || cl.protocol == PROTOCOL_DARKPLACES4 || cl.protocol == PROTOCOL_DARKPLACES5)
-               return (signed short) MSG_ReadLittleShort();
-       else if (cl.protocol == PROTOCOL_DARKPLACES1)
-               return MSG_ReadLittleFloat();
+       return (signed short) MSG_ReadLittleShort();
+}
+
+float MSG_ReadCoord32f (void)
+{
+       return MSG_ReadLittleFloat();
+}
+
+float MSG_ReadCoord (int protocol)
+{
+       if (protocol == PROTOCOL_QUAKE)
+               return MSG_ReadCoord13i();
+       else if (protocol == PROTOCOL_DARKPLACES1 || protocol == PROTOCOL_DARKPLACES5)
+               return MSG_ReadCoord32f();
+       else if (protocol == PROTOCOL_DARKPLACES2 || protocol == PROTOCOL_DARKPLACES3 || protocol == PROTOCOL_DARKPLACES4)
+               return MSG_ReadCoord16i();
+       Host_Error("MSG_ReadCoord: unknown protocol\n");
+       return 0;
+}
+
+void MSG_ReadVector (float *v, int protocol)
+{
+       v[0] = MSG_ReadCoord(protocol);
+       v[1] = MSG_ReadCoord(protocol);
+       v[2] = MSG_ReadCoord(protocol);
+}
+
+// LordHavoc: round to nearest value, rather than rounding toward zero, fixes crosshair problem
+float MSG_ReadAngle8i (void)
+{
+       return MSG_ReadByte () * (360.0/256.0);
+}
+
+float MSG_ReadAngle16i (void)
+{
+       return (unsigned short)MSG_ReadShort () * (360.0/65536.0);
+}
+
+float MSG_ReadAngle32f (void)
+{
+       return MSG_ReadFloat ();
+}
+
+float MSG_ReadAngle (int protocol)
+{
+       if (protocol == PROTOCOL_DARKPLACES5)
+               return MSG_ReadAngle16i ();
        else
-               return MSG_ReadLittleShort() * (1.0f/8.0f);
+               return MSG_ReadAngle8i ();
 }
 
 
@@ -428,7 +519,7 @@ void Com_HexDumpToConsole(const qbyte *data, int size)
                                *cur++ = ' ';
                                *cur++ = ' ';
                        }
-                       if ((j & 3) == 0)
+                       if ((j & 3) == 3)
                                *cur++ = ' ';
                }
                // print text
@@ -698,8 +789,19 @@ void COM_InitArgv (void)
        for (j = 0;(j < MAX_NUM_ARGVS) && (j < com_argc);j++)
        {
                i = 0;
-               while ((n < (CMDLINE_LENGTH - 1)) && com_argv[j][i])
-                       com_cmdline[n++] = com_argv[j][i++];
+               if (strstr(com_argv[j], " "))
+               {
+                       // arg contains whitespace, store quotes around it
+                       com_cmdline[n++] = '\"';
+                       while ((n < (CMDLINE_LENGTH - 1)) && com_argv[j][i])
+                               com_cmdline[n++] = com_argv[j][i++];
+                       com_cmdline[n++] = '\"';
+               }
+               else
+               {
+                       while ((n < (CMDLINE_LENGTH - 1)) && com_argv[j][i])
+                               com_cmdline[n++] = com_argv[j][i++];
+               }
                if (n < (CMDLINE_LENGTH - 1))
                        com_cmdline[n++] = ' ';
                else
@@ -759,6 +861,8 @@ static const gamemode_info_t gamemode_info [] =
 { "openquartz",                "-openquartz",  "OpenQuartz",                   "id1",          "openquartz"},
 // GAME_PRYDON
 { "prydon",                    "-prydon",              "PrydonGate",                   "prydon",       "prydon"},
+// GAME_NETHERWORLD
+{ "netherworld",       "-netherworld", "Dark Masters",                 "netherworld",  "nw"},
 };
 
 void COM_InitGameType (void)