]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - com_game.c
NudgeOutOfSolid: fix moving entities out of the world in complex cases
[xonotic/darkplaces.git] / com_game.c
index 1406989ba6e4a9c6fccc840a6f650bbf15cb77c5..0dcde1ea082ec5a55cadd84310df9d0e8d1a95ef 100644 (file)
@@ -118,11 +118,12 @@ void COM_InitGameType (void)
 
 void COM_ChangeGameTypeForGameDirs(void)
 {
-       int i;
+       unsigned i, gamemode_count = sizeof(gamemode_info) / sizeof(gamemode_info[0]);
        int index = -1;
        // this will not not change the gamegroup
+
        // first check if a base game (single gamedir) matches
-       for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++)
+       for (i = 0; i < gamemode_count; i++)
        {
                if (gamemode_info[i].group == com_startupgamegroup && !(gamemode_info[i].gamedirname2 && gamemode_info[i].gamedirname2[0]))
                {
@@ -130,10 +131,21 @@ void COM_ChangeGameTypeForGameDirs(void)
                        break;
                }
        }
-       // now that we have a base game, see if there is a matching derivative game (two gamedirs)
+       // now that we have a base game, see if there is a derivative game matching the startup one (two gamedirs)
+       // bones_was_here: this prevents a Quake expansion (eg Rogue) getting switched to Quake,
+       // and its gamedirname2 (eg "rogue") being lost from the search path, when adding a miscellaneous gamedir.
+       for (i = 0; i < gamemode_count; i++)
+       {
+               if (gamemode_info[i].group == com_startupgamegroup && (gamemode_info[i].gamedirname2 && gamemode_info[i].gamedirname2[0]) && gamemode_info[i].mode == com_startupgamemode)
+               {
+                       index = i;
+                       break;
+               }
+       }
+       // also see if the first gamedir (from -game parm or gamedir command) matches a derivative game (two/three gamedirs)
        if (fs_numgamedirs)
        {
-               for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++)
+               for (i = 0; i < gamemode_count; i++)
                {
                        if (gamemode_info[i].group == com_startupgamegroup && (gamemode_info[i].gamedirname2 && gamemode_info[i].gamedirname2[0]) && !strcasecmp(fs_gamedirs[0], gamemode_info[i].gamedirname2))
                        {
@@ -195,7 +207,7 @@ static void COM_SetGameType(int index)
                // if there are spaces in the game's network filter name it would
                // cause parse errors in getservers in dpmaster, so we need to replace
                // them with _ characters
-               strlcpy(gamenetworkfilternamebuffer, gamenetworkfiltername, sizeof(gamenetworkfilternamebuffer));
+               dp_strlcpy(gamenetworkfilternamebuffer, gamenetworkfiltername, sizeof(gamenetworkfilternamebuffer));
                while ((s = strchr(gamenetworkfilternamebuffer, ' ')) != NULL)
                        *s = '_';
                gamenetworkfiltername = gamenetworkfilternamebuffer;