-#include "quakedef.h"
+/*
+Copyright (C) 2000-2021 DarkPlaces contributors
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "darkplaces.h"
+#include "com_game.h"
// Game mods
{ GAME_MOONHELM, GAME_MOONHELM, "moonhelm", "-moonhelm", "MoonHelm", "MoonHelm", "data", NULL, "mh", "moonhelm" }, // COMMANDLINEOPTION: Game: -moonhelm runs the game MoonHelm
{ GAME_VORETOURNAMENT, GAME_VORETOURNAMENT, "voretournament", "-voretournament", "Vore Tournament", "Vore_Tournament", "data", NULL, "voretournament", "voretournament" }, // COMMANDLINEOPTION: Game: -voretournament runs the multiplayer game Vore Tournament
{ GAME_DOOMBRINGER, GAME_DOOMBRINGER, "doombringer", "-doombringer", "DOOMBRINGER", "DOOMBRINGER", "dbdata", NULL, "doombringer", "doombringer" }, // COMMANDLINEOPTION: Game: -doombringer runs the game DOOMBRINGER
+{ GAME_BATTLEMETAL, GAME_NORMAL, "battlemetal", "-battlemetal", "battlemetal", "battlemetal", "metaldata", NULL, "battlemetal", "battlemetal" }, // COMMANDLINEOPTION: Game: -battlemetal runs the game battleMETAL
};
static void COM_SetGameType(int index);
// check commandline options for keywords
for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++)
- if (COM_CheckParm (gamemode_info[i].cmdline))
+ if (Sys_CheckParm (gamemode_info[i].cmdline))
index = i;
com_startupgamemode = gamemode_info[index].mode;
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]))
{
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))
{
if (gamemode == com_startupgamemode)
{
- if((t = COM_CheckParm("-customgamename")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgamename")) && t + 1 < sys.argc)
gamename = gamenetworkfiltername = sys.argv[t+1];
- if((t = COM_CheckParm("-customgamenetworkfiltername")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgamenetworkfiltername")) && t + 1 < sys.argc)
gamenetworkfiltername = sys.argv[t+1];
- if((t = COM_CheckParm("-customgamedirname1")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgamedirname1")) && t + 1 < sys.argc)
gamedirname1 = sys.argv[t+1];
- if((t = COM_CheckParm("-customgamedirname2")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgamedirname2")) && t + 1 < sys.argc)
gamedirname2 = *sys.argv[t+1] ? sys.argv[t+1] : NULL;
- if((t = COM_CheckParm("-customgamescreenshotname")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgamescreenshotname")) && t + 1 < sys.argc)
gamescreenshotname = sys.argv[t+1];
- if((t = COM_CheckParm("-customgameuserdirname")) && t + 1 < sys.argc)
+ if((t = Sys_CheckParm("-customgameuserdirname")) && t + 1 < sys.argc)
gameuserdirname = sys.argv[t+1];
}
// 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;