]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
added COMMANDLINEOPTION comments for every commandline option, these will be listed...
[xonotic/darkplaces.git] / common.c
index 0d5c2a9f348b2404ee1fdd1adcc50d753993c2b7..b357905e31edd1f5212e61ba0c3127fdebf2a29c 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 (signed char) MSG_ReadByte () * (360.0/256.0);
+}
+
+float MSG_ReadAngle16i (void)
+{
+       return (signed 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 ();
 }
 
 
@@ -342,7 +433,7 @@ void SZ_Alloc (sizebuf_t *buf, int startsize, const char *name)
 {
        if (startsize < 256)
                startsize = 256;
-       buf->mempool = Mem_AllocPool(name);
+       buf->mempool = Mem_AllocPool(name, 0, NULL);
        buf->data = Mem_Alloc(buf->mempool, startsize);
        buf->maxsize = startsize;
        buf->cursize = 0;
@@ -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
@@ -726,39 +828,59 @@ static const gamemode_info_t gamemode_info [] =
 {// prog_name          cmdline                 gamename                                gamedirname     gamescreenshotname
 
 // GAME_NORMAL
+// COMMANDLINEOPTION: -quake runs the game Quake (default)
 { "",                          "-quake",               "DarkPlaces-Quake",             "",                     "dp" },
 // GAME_HIPNOTIC
+// COMMANDLINEOPTION: -hipnotic runs Quake mission pack 1: The Scourge of Armagon
 { "hipnotic",          "-hipnotic",    "Darkplaces-Hipnotic",  "hipnotic",     "dp" },
 // GAME_ROGUE
+// COMMANDLINEOPTION: -rogue runs Quake mission pack 2: The Dissolution of Eternity
 { "rogue",                     "-rogue",               "Darkplaces-Rogue",             "rogue",        "dp" },
 // GAME_NEHAHRA
+// COMMANDLINEOPTION: -nehahra runs The Seal of Nehahra movie and game
 { "nehahra",           "-nehahra",             "DarkPlaces-Nehahra",   "nehahra",      "dp" },
 // GAME_NEXUIZ
+// COMMANDLINEOPTION: -nexuiz runs the multiplayer game Nexuiz
 { "nexuiz",                    "-nexuiz",              "Nexuiz",                               "data",         "nexuiz" },
 // GAME_TRANSFUSION
+// COMMANDLINEOPTION: -transfusion runs Transfusion (the recreation of Blood in Quake)
 { "transfusion",       "-transfusion", "Transfusion",                  "basetf",       "transfusion" },
 // GAME_GOODVSBAD2
+// COMMANDLINEOPTION: -goodvsbad2 runs the psychadelic RTS FPS game Good Vs Bad 2
 { "gvb2",                      "-goodvsbad2",  "GoodVs.Bad2",                  "rts",          "gvb2" },
 // GAME_TEU
+// COMMANDLINEOPTION: -teu runs The Evil Unleashed (this option is obsolete as they are not using darkplaces)
 { "teu",                       "-teu",                 "TheEvilUnleashed",             "baseteu",      "teu" },
 // GAME_BATTLEMECH
+// COMMANDLINEOPTION: -battlemech runs the multiplayer topdown deathmatch game BattleMech 
 { "battlemech",                "-battlemech",  "Battlemech",                   "base",         "battlemech" },
 // GAME_ZYMOTIC
+// COMMANDLINEOPTION: -zymotic runs the singleplayer game Zymotic
 { "zymotic",           "-zymotic",             "Zymotic",                              "data",         "zymotic" },
 // GAME_FNIGGIUM
+// COMMANDLINEOPTION: -fniggium runs the post apocalyptic melee RPG Fniggium 
 { "fniggium",          "-fniggium",    "Fniggium",                             "data",         "fniggium" },
 // GAME_SETHERAL
+// COMMANDLINEOPTION: -setheral runs the multiplayer game Setheral 
 { "setheral",          "-setheral",    "Setheral",                             "data",         "setheral" },
 // GAME_SOM
+// COMMANDLINEOPTION: -som runs the multiplayer game Son Of Man 
 { "som",                       "-som",                 "Son of Man",                   "sonofman",     "som" },
 // GAME_TENEBRAE
+// COMMANDLINEOPTION: -tenebrae runs the graphics test mod known as Tenebrae (some features not implemented)
 { "tenebrae",          "-tenebrae",    "DarkPlaces-Tenebrae",  "tenebrae",     "dp" },
 // GAME_NEOTERIC
+// COMMANDLINEOPTION: -neoteric runs the game Neoteric
 { "neoteric",          "-neoteric",    "Neoteric",                             "neobase",      "neo" },
 // GAME_OPENQUARTZ
+// COMMANDLINEOPTION: -openquartz runs the game OpenQuartz, a standalone GPL replacement of the quake content
 { "openquartz",                "-openquartz",  "OpenQuartz",                   "id1",          "openquartz"},
 // GAME_PRYDON
+// COMMANDLINEOPTION: -prydon runs the topdown point and click action-RPG Prydon Gate
 { "prydon",                    "-prydon",              "PrydonGate",                   "prydon",       "prydon"},
+// GAME_NETHERWORLD
+// COMMANDLINEOPTION: -netherworld runs the game Netherworld: Dark Masters
+{ "netherworld",       "-netherworld", "Dark Masters",                 "netherworld",  "nw"},
 };
 
 void COM_InitGameType (void)