| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** 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 3 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, see <http://www.gnu.org/licenses/>.
- */
- //
- // Filename: useroptions.cpp
- // Author: Tom Spencer-Smith
- // Date: Dec 1999
- // Description:
- //
- #include "useroptions.h"
- #include "_globals.h"
- #include "wwdebug.h"
- #include "player.h"
- #include "cnetwork.h"
- #include "registry.h"
- #include "player.h"
- #include "playertype.h"
- #include "bandwidth.h"
- #include "bandwidthcheck.h"
- #include <stdio.h>
- #include "trim.h"
- #include "singletoninstancekeeper.h"
- #include "slavemaster.h"
- #include "debug.h"
- #include "rawfile.h"
- #include "serversettings.h"
- #include "autostart.h"
- #include "consolemode.h"
- #include "GameSpy_QnR.h"
- #include "gamespyadmin.h"
- #include "specialbuilds.h"
- #include "useroptions.h"
- extern char DefaultRegistryModifier[1024];
- //
- // Class statics
- //
- cRegistryBool cUserOptions::ShowNamesOnSoldier( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "ShowNamesOnSoldier", true);
- cRegistryBool cUserOptions::SkipQuitConfirmDialog( APPLICATION_SUB_KEY_NAME_OPTIONS, "SkipQuitConfirmDialog", false);
- cRegistryBool cUserOptions::SkipIngameQuitConfirmDialog( APPLICATION_SUB_KEY_NAME_OPTIONS, "SkipIngameQuitConfirmDialog", false);
- cRegistryBool cUserOptions::CameraLockedToTurret( APPLICATION_SUB_KEY_NAME_OPTIONS, "CameraLockedToTurret", false);
- cRegistryBool cUserOptions::PermitDiagLogging( APPLICATION_SUB_KEY_NAME_OPTIONS, "PermitDiagLogging", true);
- cRegistryInt cUserOptions::Sku( APPLICATION_SUB_KEY_NAME, "SKU", RENEGADE_BASE_SKU);
- cRegistryInt cUserOptions::BandwidthType( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "BandwidthType", BANDWIDTH_AUTO);
- cRegistryInt cUserOptions::BandwidthBps( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "BandwidthBps", 33600);
- cRegistryInt cUserOptions::GameSpyBandwidthType( APPLICATION_SUB_KEY_NAME_GAMESPY, "GameSpyBandwidthType", BANDWIDTH_AUTO);
- cRegistryInt cUserOptions::PreferredGameSpyNic( APPLICATION_SUB_KEY_NAME_GAMESPY, "PreferredGameSpyNic", 0);
- cRegistryString cUserOptions::GameSpyNickname( APPLICATION_SUB_KEY_NAME_GAMESPY, "GameSpyNickname", "");
- cRegistryInt cUserOptions::GameSpyQueryPort( APPLICATION_SUB_KEY_NAME_GAMESPY, "GameSpyQueryPort", 25300);
- cRegistryInt cUserOptions::GameSpyGamePort( APPLICATION_SUB_KEY_NAME_GAMESPY, "GameSpyGamePort", 4848);
- cRegistryInt cUserOptions::SplashCount( APPLICATION_SUB_KEY_NAME_GAMESPY, "SplashCount", 0);
- cRegistryBool cUserOptions::DoneClientBandwidthTest( APPLICATION_SUB_KEY_NAME_GAMESPY, "DoneClientBandwidthTest", false);
- cRegistryInt cUserOptions::PreferredLanNic( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "PreferredLanNic", 0);
- cRegistryInt cUserOptions::NetUpdateRate( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "NetUpdateRate", 10);
- cRegistryFloat cUserOptions::ClientHintFactor( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "ClientHintFactor", 10.0f);
- cRegistryFloat cUserOptions::MaxFacingPenalty( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "MaxFacingPenalty", 0.3f);
- cRegistryFloat cUserOptions::IrrelevancePenalty( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "IrrelevancePenalty", 0.2f);
- cRegistryInt cUserOptions::ResultsLogNumber( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "ResultsLogNumber", 1);
- //-----------------------------------------------------------------------------
- bool cUserOptions::Parse_Command_Line(LPCSTR command)
- {
- WWASSERT(command != NULL);
- bool retcode = true;
- //
- // Convert to argv & argc for convenience.
- // First argument is supposed to be a pointer to the .EXE that is running
- // but we don't need that here.
- //
- int argc = 1; //Set argument count to 1
- char * argv[20]; //Pointers to command line arguments
- argv[0] = NULL; //Set 1st command line argument to point to full path
- //
- // Get pointers to command line arguments just like if we were in DOS
- //
- char *command_line = strdup(command);
- char *token = strtok(command_line, " ");
- while (argc < ARRAY_SIZE(argv) && token != NULL) {
- argv[argc++] = strtrim(token);
- token = strtok(NULL, " ");
- if (argc >= 19) {
- break;
- }
- }
- //
- // Loop through all the command line arguments.
- //
- char *cmd;
- for (int i=1 ; i<argc ; i++) {
- cmd = strupr(argv[i]);
- // Look for ip override.
- if (strstr(cmd, "IP=")) {
- extern ULONG g_ip_override;
- g_ip_override = ::inet_addr(strstr(cmd, "IP=") + 3);
- continue;
- }
- // See if multiple progrram instances are allowed.
- if (strstr(cmd, "MULTI")) {
- SingletonInstanceKeeperClass::Allow_Multiple_Instances(true);
- continue;
- }
- if (strstr(cmd, "REGMOD=")) {
- strcpy(DefaultRegistryModifier, strstr(cmd, "REGMOD=") + 7);
- #ifdef WWDEBUG
- OutputDebugString("Registry modifier on command line\n");
- #endif //WWDEBUG
- Reread();
- continue;
- }
- if (strstr(cmd, "SLAVE")) {
- SlaveMaster.Set_Slave_Mode(true);
- DebugManager::Set_Is_Slave(true);
- // Save out process ID so our master server can find us.
- char tempmod[512];
- strcpy(tempmod, DefaultRegistryModifier);
- strcpy(DefaultRegistryModifier, "");
- RegistryClass reg(APPLICATION_SUB_KEY_NAME);
- if (reg.Is_Valid()) {
- reg.Set_Int("ProcessId", GetCurrentProcessId());
- }
- strcpy(DefaultRegistryModifier, tempmod);
- RegistryClass::Set_Read_Only(true);
- continue;
- }
- if (strstr(cmd, "STARTSERVER=")) {
- Set_Server_INI_File(cmd);
- continue;
- }
- if (strstr(cmd, "GAMESPYSERVER=")) {
- char server_config_file[MAX_PATH];
- strcpy(server_config_file, strstr(cmd, "GAMESPYSERVER=") + 14);
- WWDEBUG_SAY(("Set to load gamespy server settings from config file %s\n", server_config_file));
- RawFileClass file(server_config_file);
- if (file.Is_Available()) {
- ServerSettingsClass::Set_Settings_File_Name(server_config_file);
- RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
- if (registry.Is_Valid ()) {
- registry.Set_Int(AutoRestartClass::REG_VALUE_AUTO_RESTART_FLAG, 1);
- registry.Set_Int(AutoRestartClass::REG_VALUE_AUTO_RESTART_TYPE, 0);
- }
- cGameSpyAdmin::Set_Is_Server_Gamespy_Listed(true);
- GameSpyQnR.Enable_Reporting(true);
- }
- continue;
- }
- if (strstr(cmd, "NODX")) {
- ConsoleBox.Set_Exclusive(true);
- continue;
- }
- }
- free(command_line);
- #ifndef BETACLIENT
- //GAMESPY
- //
- // Gamespy params follow different param format
- //
- char *tmpstr = strdup(command);
- tmpstr = _strupr(tmpstr);
- char * ip_param = ::strstr(tmpstr, "+CONNECT");
- if (ip_param != NULL) {
- ip_param += ::strlen("+connect");
- USHORT port = 4848;
- DWORD addr = 0;
- char ipaddr[300] = "";
- ::sscanf(ip_param, "%s", ipaddr);
- strtrim(ipaddr);
- char *tport = strchr(ipaddr, ':');
- if (tport) {
- *tport++ = 0;
- if (atoi(tport) != 0 || atoi(tport) > 0) {
- port = atoi(tport);
- }
- }
- addr = ::inet_addr(ipaddr);
- cGameSpyAdmin::Set_Game_Host_Ip(addr);
- cGameSpyAdmin::Set_Game_Host_Port(port);
- cGameSpyAdmin::Set_Is_Launch_From_Gamespy_Requested(true);
- }
- char * nickname_param = ::strstr(tmpstr, "+NETPLAYERNAME");
- if (nickname_param != NULL) {
- nickname_param = (char *)(command + (nickname_param-tmpstr));
- nickname_param += ::strlen("+NetPlayerName");
- char * start = nickname_param;
- // Strip leading spaces
- while (*start && *start == ' ') start++;
- // if we find a space before a quote then space delimit
- while (*start && *start != '"' && *start != ' ') {
- start++;
- }
- char * end = start;
- // Match the end quote
- if (*start && *start != ' ') {
- start++;
- end = start;
- while (*end && *end != '"') {
- end++;
- }
- }
- // Couldn't find any quotes, so delimit by spaces
- if (start == end) {
- start = nickname_param;
- while (*start && *start == ' ') start++;
- end = strchr(start, ' ');
- if (!end) end = start + strlen(start);
- }
-
- char nickname2[300] = "";
- ::strncpy(nickname2, start, end - start);
- nickname2[end - start] = 0;
- cUserOptions::GameSpyNickname.Set(nickname2);
- cGameSpyAdmin::Set_Is_Launch_From_Gamespy_Requested(true);
- }
- char * password_param = ::strstr(tmpstr, "+PASS");
- if (password_param != NULL) {
- char *tmp_param = ::strstr(tmpstr, "+PASSWORD");
- if (tmp_param) {
- password_param = (char *)(command + (tmp_param-tmpstr));
- password_param += ::strlen("+PASSWORD");
- } else {
- password_param = (char *)(command + (password_param-tmpstr));
- password_param += ::strlen("+PASS");
- }
- char * start = password_param;
- // Strip leading spaces
- while (*start && *start == ' ') start++;
- // if we find a space before a quote then space delimit
- while (*start && *start != '"' && *start != ' ') {
- start++;
- }
- char * end = start;
- // Match the end quote
- if (*start && *start != ' ') {
- start++;
- end = start;
- while (*end && *end != '"') {
- end++;
- }
- }
- // Couldn't find any quotes, so delimit by spaces
- if (start == end) {
- start = password_param;
- while (*start && *start == ' ') start++;
- end = strchr(start, ' ');
- if (!end) end = start + strlen(start);
- }
- char password[300] = "";
- ::strncpy(password, start, end - start);
- password[end - start] = 0;
- WideStringClass wide_password;
- wide_password.Convert_From(password);
- cGameSpyAdmin::Set_Password_Attempt(wide_password);
- }
- free(tmpstr);
- #endif // !BETACLIENT
- // Return true if command line options scanned OK.
- return(retcode);
- }
- //-----------------------------------------------------------------------------
- void cUserOptions::Set_Server_INI_File(char *cmd_line_entry)
- {
- char server_config_file[MAX_PATH];
- strcpy(server_config_file, strstr(cmd_line_entry, "STARTSERVER=") + 12);
- WWDEBUG_SAY(("Set to load server settings from config file %s\n", server_config_file));
- RawFileClass file(server_config_file);
- if (file.Is_Available()) {
- ServerSettingsClass::Set_Settings_File_Name(server_config_file);
- RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
- if (registry.Is_Valid ()) {
- registry.Set_Int(AutoRestartClass::REG_VALUE_AUTO_RESTART_FLAG, 1);
- registry.Set_Int(AutoRestartClass::REG_VALUE_AUTO_RESTART_TYPE, 1);
- }
- }
- }
- //-----------------------------------------------------------------------------
- void cUserOptions::Set_Bandwidth_Type(BANDWIDTH_TYPE_ENUM bandwidth_type)
- {
- if (cGameSpyAdmin::Is_Gamespy_Game()) {
- GameSpyBandwidthType.Set(bandwidth_type);
- } else {
- BandwidthType.Set(bandwidth_type);
- }
- if (bandwidth_type != BANDWIDTH_CUSTOM) {
- if (bandwidth_type == BANDWIDTH_AUTO && BandwidthCheckerClass::Got_Bandwidth()) {
- ULONG bps = BandwidthCheckerClass::Get_Upstream_Bandwidth();
- WWASSERT(bps > 0);
- BandwidthBps.Set(bps);
- } else {
- ULONG bps = cBandwidth::Get_Bandwidth_Bps_From_Type(bandwidth_type);
- WWASSERT(bps > 0);
- BandwidthBps.Set(bps);
- }
- }
- }
- //-----------------------------------------------------------------------------
- BANDWIDTH_TYPE_ENUM cUserOptions::Get_Bandwidth_Type(void)
- {
- if (cGameSpyAdmin::Is_Gamespy_Game()) {
- return (BANDWIDTH_TYPE_ENUM) GameSpyBandwidthType.Get();
- } else {
- return (BANDWIDTH_TYPE_ENUM) BandwidthType.Get();
- }
- }
- //-----------------------------------------------------------------------------
- void cUserOptions::Set_Bandwidth_Bps(int bandwidth_bps)
- {
- WWASSERT(bandwidth_bps > 0);
- if (cGameSpyAdmin::Is_Gamespy_Game()) {
- GameSpyBandwidthType.Set(BANDWIDTH_CUSTOM);
- } else {
- BandwidthType.Set(BANDWIDTH_CUSTOM);
- }
- BandwidthBps.Set(bandwidth_bps);
- }
- //-----------------------------------------------------------------------------
- void cUserOptions::Reread(void)
- {
- Sku.Set(RegistryClass(APPLICATION_SUB_KEY_NAME).Get_Int("SKU", Sku.Get()));
- BandwidthType.Set(RegistryClass(APPLICATION_SUB_KEY_NAME_NETOPTIONS).Get_Int("BandwidthType", BandwidthType.Get()));
- BandwidthBps.Set(RegistryClass(APPLICATION_SUB_KEY_NAME_NETOPTIONS).Get_Int("BandwidthBps", BandwidthBps.Get()));
- GameSpyBandwidthType.Set(RegistryClass(APPLICATION_SUB_KEY_NAME_GAMESPY).Get_Int("GameSpyBandwidthType", GameSpyBandwidthType.Get()));
- }
- /*
- cRegistryInt cUserOptions::GameListFilterMaxPing( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterMaxPing", 9999);
- cRegistryInt cUserOptions::GameListFilterMinPlayersPresent( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterMinPlayersPresent", 0);
- cRegistryInt cUserOptions::GameListFilterMaxPlayersPresent( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterMaxPlayersPresent", 99);
- cRegistryInt cUserOptions::GameListFilterMaxPlayersPermitted( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterMaxPlayersPermitted", 99);
- cRegistryBool cUserOptions::GameListFilterShowPrivateGames( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterShowPrivateGames", true);
- cRegistryBool cUserOptions::GameListFilterShowOnlyDedicatedGames( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterShowOnlyDedicatedGames", false);
- cRegistryBool cUserOptions::GameListFilterShowOnlyGamesIRankFor( APPLICATION_SUB_KEY_NAME_NETOPTIONS, "GameListFilterShowOnlyGamesIRankFor", false);
- */
- /*
- //
- // Gamespy client launch params.
- // All 3 must be specified.
- // Example: Renegade.exe GAMESPY_IPADDR=192.168.10.100 GAMESPY_PORT=3333 GAMESPY_NICKNAME="Bob 1234"
- //
- LPCSTR param = NULL;
- char * value = NULL;
- param = "GAMESPY_IPADDR=";
- value = ::strstr(cmd, param);
- if (value != NULL) {
- value += ::strlen(param);
- ULONG ip = ::inet_addr(value);
- cGameSpyAdmin::Set_Game_Host_Ip(ip);
- cGameSpyAdmin::Set_Is_Launch_From_Gamespy_Requested(true);
- continue;
- }
- param = "GAMESPY_PORT=";
- value = ::strstr(cmd, param);
- if (value != NULL) {
- value += ::strlen(param);
- USHORT port = (USHORT)::atol(value);
- cGameSpyAdmin::Set_Game_Host_Port(port);
- cGameSpyAdmin::Set_Is_Launch_From_Gamespy_Requested(true);
- continue;
- }
- param = "GAMESPY_NICKNAME=";
- value = ::strstr(cmd, param);
- if (value != NULL) {
- value += ::strlen(param);
- WideStringClass nickname;
- char temp[200] = "";
- char seps[] = "\"";
- char * start_token = ::strtok(value, seps);
- if (start_token != NULL) {
- start_token++;
- }
- char * end_token = ::strtok(NULL, seps);
- if (end_token != NULL && end_token > start_token) {
- ::strncpy(temp, start_token, end_token - start_token);
- temp[end_token - start_token] = 0;
- }
- nickname.Convert_From(temp);
- cGameSpyAdmin::Set_Player_Nickname(nickname);
- cGameSpyAdmin::Set_Is_Launch_From_Gamespy_Requested(true);
- continue;
- }
- */
- /*
- char nickname[300] = "";
- ::sscanf(nickname_param, "%s", nickname);
- nickname[::strlen(nickname) - 1] = ' ';
- nickname[0] = ' ';
- char nickname2[300] = "";
- ::sscanf(nickname, "%s", nickname2);
- */
- /*
- char seps[] = "\"";
- char * start_token = ::strtok(nickname_param, seps);
- if (start_token != NULL) {
- start_token++;
- }
- char * end_token = ::strtok(NULL, seps);
- char nickname2[300] = "";
- if (end_token != NULL && end_token > start_token) {
- char nickname2[300] = "";
- ::strncpy(nickname2, start_token, end_token - start_token);
- nickname2[end_token - start_token] = 0;
- }
- */
- /*
- WideStringClass wide_nickname;
- wide_nickname.Convert_From(nickname2);
- cGameSpyAdmin::Set_Player_Nickname(wide_nickname);
- */
|