968 lines
No EOL
34 KiB
C++
968 lines
No EOL
34 KiB
C++
/*
|
|
** 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/>.
|
|
*/
|
|
|
|
/***********************************************************************************************
|
|
*** Confidential - Westwood Studios ***
|
|
***********************************************************************************************
|
|
* *
|
|
* Project Name : Commando *
|
|
* *
|
|
* $Archive:: /Commando/Code/Commando/AutoStart.cpp $*
|
|
* *
|
|
* $Author:: Steve_t $*
|
|
* *
|
|
* $Modtime:: 8/13/02 4:58p $*
|
|
* *
|
|
* $Revision:: 24 $*
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#include "always.h"
|
|
#include "autostart.h"
|
|
//#include "dlgmplangametype.h"
|
|
#include "gameinitmgr.h"
|
|
#include "registry.h"
|
|
#include "_globals.h"
|
|
#include "gamedata.h"
|
|
#include "gameinitmgr.h"
|
|
#include "campaign.h"
|
|
#include "win.h"
|
|
#include "except.h"
|
|
#include "listctrl.h"
|
|
#include "dlgwolautostart.h"
|
|
#include "dlgdownload.h"
|
|
#include "translatedb.h"
|
|
#include "string_ids.h"
|
|
#include "slavemaster.h"
|
|
#include "gamesideservercontrol.h"
|
|
#include "gamedata.h"
|
|
#include "nat.h"
|
|
#include "consolemode.h"
|
|
#include "wwonline\wolserver.h"
|
|
#include "notify.h"
|
|
#include "serversettings.h"
|
|
#include "wolbuddymgr.h"
|
|
#include "bandwidthcheck.h"
|
|
#include "bandwidth.h"
|
|
#include "gamespyadmin.h"
|
|
#include "specialbuilds.h"
|
|
|
|
/*
|
|
** Single instance of restart class.
|
|
*/
|
|
AutoRestartClass AutoRestart;
|
|
|
|
/*
|
|
** Registry entries.
|
|
*/
|
|
const char *AutoRestartClass::REG_VALUE_AUTO_RESTART_FLAG = "AutoRestartFlag";
|
|
const char *AutoRestartClass::REG_VALUE_AUTO_RESTART_TYPE = "AutoRestartType";
|
|
static const char *WINDOWS_SUB_KEY_RUN_ONCE = "Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\";
|
|
static const char *WINDOWS_SUB_KEY_RUN_ONCE_APP = "Renegade";
|
|
|
|
/*
|
|
** Stupid extern for main loop exit.
|
|
*/
|
|
extern void Stop_Main_Loop (int exitCode);
|
|
|
|
|
|
AutoRestartProgressDialogClass *AutoRestartProgressDialogClass::Instance;
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::AutoRestartClass -- Class constructor *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:21PM ST : Created *
|
|
*=============================================================================================*/
|
|
AutoRestartClass::AutoRestartClass(void)
|
|
{
|
|
RestartState = STATE_DONE;
|
|
CancelRequest = false;
|
|
GameMode = 0;
|
|
NumChannelCreateTries = 0;
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::Restart_Game -- Initiate the restart process *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:22PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::Restart_Game(void)
|
|
{
|
|
if (RestartState == STATE_DONE) {
|
|
RestartState = STATE_FIRST;
|
|
CancelRequest = false;
|
|
RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
|
|
if (registry.Is_Valid()) {
|
|
GameMode = registry.Get_Int(REG_VALUE_AUTO_RESTART_TYPE, GameMode);
|
|
}
|
|
Set_Restart_Flag(false);
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::Cancel -- Cancel game restart *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 9:42PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::Cancel(void)
|
|
{
|
|
CancelRequest = true;
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::Think -- Class service function *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Nothing *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:22PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::Think(void)
|
|
{
|
|
static unsigned long time;
|
|
|
|
bool can_render = ConsoleBox.Is_Exclusive() ? false : true;
|
|
|
|
switch (RestartState) {
|
|
|
|
/*
|
|
** Idle, not doing anything.
|
|
*/
|
|
case STATE_DONE:
|
|
break;
|
|
|
|
/*
|
|
** This is the first restart state. Initialise WOL and login.
|
|
*/
|
|
case STATE_FIRST:
|
|
|
|
if (CancelRequest) {
|
|
RestartState = STATE_CANCELLED;
|
|
}
|
|
|
|
/*
|
|
** Create the progress dialog.
|
|
*/
|
|
if (can_render) {
|
|
START_DIALOG(AutoRestartProgressDialogClass);
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Auto starting game. Type 'quit' at the console window to abort");
|
|
}
|
|
ConsoleBox.Print("*** Auto starting game. Type 'quit' to abort ***\n");
|
|
|
|
/*
|
|
** Start listening for server control messages.
|
|
*/
|
|
GameSideServerControlClass::Init();
|
|
|
|
/*
|
|
** Initialise WOL or LAN mode.
|
|
*/
|
|
if (!GameMode) {
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Initializing LAN Mode");
|
|
}
|
|
if (cGameSpyAdmin::Get_Is_Server_Gamespy_Listed()) {
|
|
ConsoleBox.Print("Initializing GameSpy Mode\n");
|
|
} else {
|
|
ConsoleBox.Print("Initializing LAN Mode\n");
|
|
}
|
|
GameInitMgrClass::Initialize_LAN();
|
|
RestartState = STATE_GAME_MODE_WAIT;
|
|
} else {
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Initializing Westwood Online");
|
|
}
|
|
ConsoleBox.Print("Initializing Westwood Online Mode\n");
|
|
GameInitMgrClass::Initialize_WOL();
|
|
RestartState = STATE_GAME_MODE_WAIT;
|
|
|
|
/*
|
|
** Force a new server list update. This will cause a complete WOLAPI reset too btw.
|
|
*/
|
|
RefPtr<WWOnline::Session> wol_session = WWOnline::Session::GetInstance(false);
|
|
wol_session->Reset();
|
|
|
|
/*
|
|
** Hide the page dialog - we don't want that sucker popping up when there's no-one around.
|
|
*/
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->HidePagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case STATE_GAME_MODE_WAIT:
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
} else {
|
|
|
|
if (!GameMode) {
|
|
GameModeClass *game_mode = GameModeManager::Find("LAN");
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
RestartState = STATE_CREATE_GAME;
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** It won't have initialzed above if a shutdown was already pending. Maybe we need to try again.
|
|
*/
|
|
if (game_mode && game_mode->Is_Inactive()) {
|
|
GameInitMgrClass::Initialize_LAN();
|
|
break;
|
|
}
|
|
} else {
|
|
GameModeClass *game_mode = GameModeManager::Find("WOL");
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
/*
|
|
** Logon to WOL.
|
|
*/
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Logging on");
|
|
}
|
|
LogonAction = (WOLLogonAction) -1;
|
|
WOLLogonMgr::Set_Quiet_Mode(true);
|
|
RefPtr<WWOnline::Session> WOLSession = WWOnline::Session::GetInstance(false);
|
|
Observer<WWOnline::ServerError>::NotifyMe(*WOLSession);
|
|
WOLLogonMgr::Logon(this);
|
|
RestartState = STATE_LOGIN;
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** It won't have initialzed above if a shutdown was already pending. Maybe we need to try again.
|
|
*/
|
|
if (game_mode && game_mode->Is_Inactive()) {
|
|
GameInitMgrClass::Initialize_WOL();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
/*
|
|
** Wait for the login process to complete.
|
|
*/
|
|
case STATE_LOGIN:
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
switch (LogonAction) {
|
|
|
|
/*
|
|
** Login failed. Might be that the user is still logged in from last time so retry.
|
|
*/
|
|
case WOLLOGON_FAILED:
|
|
if (CancelRequest) {
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Failed, retrying");
|
|
}
|
|
ConsoleBox.Print("Failed to log in, retrying\n");
|
|
LogonAction = (WOLLogonAction) -1;
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Logging on");
|
|
}
|
|
ConsoleBox.Print("Logging on....\n");
|
|
WOLLogonMgr::Logon(this);
|
|
break;
|
|
|
|
/*
|
|
** Logged in OK. Move onto the next step.
|
|
*/
|
|
case WOLLOGON_SUCCESS:
|
|
if (CancelRequest) {
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
WOLLogonMgr::Logoff();
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Logged on OK");
|
|
}
|
|
ConsoleBox.Print("Logged on OK\n");
|
|
WOLLogonMgr::Set_Quiet_Mode(false);
|
|
RestartState = STATE_CREATE_GAME;
|
|
time = TIMEGETTIME();
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
break;
|
|
|
|
/*
|
|
** Patch available. At this point we want to
|
|
**
|
|
** 1. Download the patch.
|
|
** 2. Quit to apply the patch.
|
|
** 3. Reload the level after the restart.
|
|
**
|
|
*/
|
|
case WOLLOGON_PATCHREQUIRED:
|
|
{
|
|
RefPtr<WWOnline::Session> wol_session = WWOnline::Session::GetInstance(false);
|
|
ConsoleBox.Print("Downloading patch\n");
|
|
DlgDownload::DoDialog(TRANSLATE(IDS_WOL_DOWNLOAD), wol_session->GetPatchDownloadList(), true);
|
|
Set_Restart_Flag(true);
|
|
RestartState = STATE_DONE;
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** Fatal error. Abort restart process.
|
|
*/
|
|
case WOLLOGON_CANCEL:
|
|
WOLLogonMgr::Set_Quiet_Mode(false);
|
|
RestartState = STATE_CANCELLED;
|
|
Observer<WWOnline::ServerError>::StopObserving();
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
/*
|
|
** Create the game object and initialise it with the settings from the last game.
|
|
*/
|
|
case STATE_CREATE_GAME:
|
|
{
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
|
|
if (CancelRequest) {
|
|
if (GameMode) {
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** We have to wait for the firewall thread to discover the local IP before we can build the game.
|
|
*/
|
|
if (GameMode) {
|
|
if (FirewallHelper.Get_Local_Address() == 0) {
|
|
if (TIMEGETTIME() - time < 1000 * 6) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Work out what type of game to create.
|
|
*/
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Building game info");
|
|
}
|
|
|
|
/*
|
|
int last_game_type = 0;
|
|
RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
|
|
if (registry.Is_Valid ()) {
|
|
last_game_type = registry.Get_Int(REG_VALUE_LAST_GAME_TYPE, last_game_type);
|
|
}
|
|
|
|
last_game_type = min(last_game_type, NUM_GAME_TYPE_MENU_ENTRIES-1);
|
|
last_game_type = max(last_game_type, 0);
|
|
|
|
int game_type = MPLanGameTypeMenuClass::GameTypeList[last_game_type].GameType;
|
|
*/
|
|
|
|
int game_type = cGameData::GAME_TYPE_CNC;
|
|
|
|
/*
|
|
** Create the new game data.
|
|
*/
|
|
PTheGameData = cGameData::Create_Game_Of_Type((cGameData::GameTypeEnum)game_type);
|
|
WWASSERT(PTheGameData != NULL);
|
|
|
|
/*
|
|
** Apply command line/ini settings.
|
|
*/
|
|
if (ServerSettingsClass::Parse(true) == false) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** Start listening for server control messages.
|
|
*/
|
|
//GameSideServerControlClass::Init();
|
|
|
|
/*
|
|
** Load alternate server settings if required.
|
|
*/
|
|
if (SlaveMaster.Am_I_Slave()) {
|
|
RegistryClass reg(APPLICATION_SUB_KEY_NAME_OPTIONS);
|
|
char file_name[MAX_PATH];
|
|
reg.Get_String("MultiplayerSettings", file_name, sizeof(file_name), "");
|
|
if (strlen(file_name)) {
|
|
WWDEBUG_SAY(("Loading multiplayer settings from file %s\n", file_name));
|
|
The_Game()->Set_Ini_Filename(file_name);
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Load the game settings.
|
|
*/
|
|
The_Game()->Load_From_Server_Config();
|
|
|
|
|
|
/*
|
|
** Set MaxPlayers based on Bandwidth test results if MaxPlayers is
|
|
** set to 0 in the INI file.
|
|
*/
|
|
if (ServerSettingsClass::Get_Game_Mode() == ServerSettingsClass::MODE_WOL &&
|
|
The_Game()->Get_Max_Players() == 0 && BandwidthCheckerClass::Got_Bandwidth()) {
|
|
|
|
int max_players = (cBandwidth::Get_Bandwidth_Bps_From_Type(BANDWIDTH_AUTO) / 250000) * 4;
|
|
if (max_players < 2) {
|
|
if (cBandwidth::Get_Bandwidth_Bps_From_Type(BANDWIDTH_AUTO) > 100000) {
|
|
max_players = 4;
|
|
} else {
|
|
max_players = 2;
|
|
}
|
|
} else if (max_players > 32) {
|
|
max_players = 32;
|
|
}
|
|
The_Game()->Set_Max_Players(max_players);
|
|
}
|
|
|
|
/*
|
|
** Override gama settings in command line mode.
|
|
*/
|
|
if (ServerSettingsClass::Is_Command_Line_Mode()) {
|
|
The_Game()->IsAutoRestart.Set(true);
|
|
The_Game()->IsDedicated.Set(true);
|
|
}
|
|
|
|
StringClass inifile = The_Game()->Get_Ini_Filename();
|
|
StringClass nick(32, true);
|
|
cNetInterface::Get_Nickname().Convert_To(nick);
|
|
ConsoleBox.Set_Title(nick.Peek_Buffer(), inifile.Peek_Buffer());
|
|
|
|
if (GameMode) {
|
|
NumChannelCreateTries = 0;
|
|
RestartState = STATE_CREATE_CHANNEL;
|
|
} else {
|
|
RestartState = STATE_START_GAME;
|
|
}
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** Create the game channel on the chat server.
|
|
*/
|
|
case STATE_CREATE_CHANNEL:
|
|
{
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
|
|
/*
|
|
** Log off.
|
|
*/
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
|
|
if (CancelRequest) {
|
|
WOLLogonMgr::Logoff();
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Creating game channel....");
|
|
}
|
|
ConsoleBox.Print("Creating game channel...\n");
|
|
|
|
/*
|
|
** Create the game channel.
|
|
*/
|
|
GameModeClass *game_mode = GameModeManager::Find("WOL");
|
|
LastChannelCreateTime = TIMEGETTIME();
|
|
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
WolGameModeClass* wol_game = (WolGameModeClass*) game_mode;
|
|
WWASSERT(wol_game);
|
|
wol_game->Set_Quiet_Mode(true);
|
|
wol_game->SignalMe(*this);
|
|
WWASSERT(PTheGameData != NULL);
|
|
NumChannelCreateTries++;
|
|
wol_game->Create_Game(The_Game());
|
|
RestartState = STATE_WAIT_CHANNEL_CREATE;
|
|
} else {
|
|
RestartState = STATE_START_GAME;
|
|
}
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** Wait for the game channel creation result.
|
|
*/
|
|
case STATE_WAIT_CHANNEL_CREATE:
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
|
|
/*
|
|
** Log off.
|
|
*/
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
}
|
|
if (CancelRequest) {
|
|
WOLLogonMgr::Logoff();
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
/*
|
|
** Waiting to retry channel create.
|
|
*/
|
|
case STATE_WAIT_CHANNEL_CREATE_RETRY:
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
|
|
/*
|
|
** Log off.
|
|
*/
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
if (CancelRequest) {
|
|
WOLLogonMgr::Logoff();
|
|
RestartState = STATE_CANCELLED;
|
|
break;
|
|
}
|
|
/*
|
|
** Give up and restart if we fail enough times when trying to create a channel.
|
|
*/
|
|
if (NumChannelCreateTries > 10) {
|
|
Set_Exit_On_Exception(true);
|
|
cGameData::Set_Manual_Exit(true);
|
|
}
|
|
if (TIMEGETTIME() - LastChannelCreateTime > 5*1000) {
|
|
ConsoleBox.Print("Retrying channel create\n");
|
|
RestartState = STATE_CREATE_CHANNEL;
|
|
}
|
|
break;
|
|
|
|
|
|
/*
|
|
** Load the game.
|
|
*/
|
|
case STATE_START_GAME:
|
|
{
|
|
if (cGameData::Is_Manual_Exit()) {
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
|
|
/*
|
|
** Log off.
|
|
*/
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
break;
|
|
}
|
|
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Channel created OK");
|
|
}
|
|
|
|
ConsoleBox.Print("Channel created OK\n");
|
|
|
|
SlaveMaster.Startup_Slaves();
|
|
|
|
GameModeClass *game_mode = GameModeManager::Find("WOL");
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
WolGameModeClass* wol_game = (WolGameModeClass*) game_mode;
|
|
WWASSERT(wol_game);
|
|
wol_game->Set_Quiet_Mode(false);
|
|
}
|
|
|
|
//ConsoleBox.Print("Loading level...\n");
|
|
WWASSERT(PTheGameData != NULL);
|
|
CampaignManager::Select_Backdrop_Number_By_MP_Type(The_Game()->Get_Game_Type());
|
|
GameInitMgrClass::Set_Is_Client_Required(false);
|
|
GameInitMgrClass::Set_Is_Server_Required(true);
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->End_Dialog();
|
|
}
|
|
GameInitMgrClass::Start_Game(The_Game()->Get_Map_Name(), -1, 0);
|
|
//ConsoleBox.Print("Level loaded OK\n");
|
|
RestartState = STATE_DONE;
|
|
|
|
/*
|
|
** Allow the page dialog to display again (it can't really anyway since it's disabled when the game is in progress.
|
|
*/
|
|
if (GameMode) {
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
/*
|
|
** User cancelled.
|
|
*/
|
|
case STATE_CANCELLED:
|
|
RestartState = STATE_DONE;
|
|
|
|
/*
|
|
** Allow the page dialog to display again.
|
|
*/
|
|
WOLBuddyMgr* buddy = WOLBuddyMgr::GetInstance(false);
|
|
if (buddy) {
|
|
buddy->ShowPagedDialog();
|
|
buddy->Release_Ref();
|
|
}
|
|
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->End_Dialog();
|
|
}
|
|
if (SlaveMaster.Am_I_Slave()) {
|
|
if (GameMode) {
|
|
WOLLogonMgr::Logoff();
|
|
}
|
|
RestartState = STATE_DONE;
|
|
Stop_Main_Loop (EXIT_SUCCESS);
|
|
} else {
|
|
RenegadeDialogMgrClass::Goto_Location (RenegadeDialogMgrClass::LOC_MAIN_MENU);
|
|
}
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::HandleNotification -- Notification callback for WOL login *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Success code *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:23PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::HandleNotification(WOLLogonAction& action)
|
|
{
|
|
LogonAction = action;
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* WolGameModeClass::HandleNotification -- Handle server error notifications *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Server error tyoe *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/8/2001 10:21PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::HandleNotification(WWOnline::ServerError& server_error)
|
|
{
|
|
ConsoleBox.Print("Error - %S\n", server_error.GetDescription());
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::ReceiveSignal -- Channel creation signal handler *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: Game mode *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:23PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::ReceiveSignal(WolGameModeClass &game_mode)
|
|
{
|
|
if (RestartState == STATE_WAIT_CHANNEL_CREATE) {
|
|
if (game_mode.Channel_Create_OK()) {
|
|
RestartState = STATE_START_GAME;
|
|
} else {
|
|
bool can_render = ConsoleBox.Is_Exclusive() ? false : true;
|
|
if (can_render) {
|
|
AutoRestartProgressDialogClass::Get_Instance()->Add_Text(L"Failed, retrying");
|
|
}
|
|
ConsoleBox.Print("Failed to create channel\n");
|
|
RestartState = STATE_WAIT_CHANNEL_CREATE_RETRY;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::Set_Restart_Flag -- Set state of auto restart mode *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: New state *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:32PM ST : Created *
|
|
*=============================================================================================*/
|
|
void AutoRestartClass::Set_Restart_Flag(bool enable)
|
|
{
|
|
RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
|
|
if (registry.Is_Valid ()) {
|
|
registry.Set_Int(REG_VALUE_AUTO_RESTART_FLAG, enable ? 1 : 0);
|
|
|
|
GameModeClass *game_mode = GameModeManager::Find("WOL");
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
GameMode = 1;
|
|
} else {
|
|
GameModeClass *game_mode = GameModeManager::Find("LAN");
|
|
if (game_mode && game_mode->Is_Active()) {
|
|
GameMode = 0;
|
|
}
|
|
}
|
|
|
|
if (enable) {
|
|
registry.Set_Int(REG_VALUE_AUTO_RESTART_TYPE, GameMode);
|
|
Set_Exit_On_Exception(true);
|
|
} else {
|
|
Set_Exit_On_Exception(false);
|
|
}
|
|
|
|
RegistryClass registry_too(WINDOWS_SUB_KEY_RUN_ONCE);
|
|
if (registry_too.Is_Valid()) {
|
|
|
|
if (enable) {
|
|
/*
|
|
** The the current path and build a path/file combo that points to the launcher.
|
|
*/
|
|
char path_to_exe[256];
|
|
char drive[_MAX_DRIVE];
|
|
char dir[_MAX_DIR];
|
|
char path[_MAX_PATH];
|
|
GetModuleFileName(ProgramInstance, path_to_exe, sizeof(path_to_exe));
|
|
_splitpath(path_to_exe, drive, dir, NULL, NULL);
|
|
#ifdef FREEDEDICATEDSERVER
|
|
_makepath(path, drive, dir, "renegadeserver", "exe");
|
|
#else //FREEDEDICATEDSERVER
|
|
_makepath(path, drive, dir, "renegade", "exe");
|
|
|
|
char options[256];
|
|
options[0] = 0;
|
|
if (ServerSettingsClass::Is_Active()) {
|
|
sprintf(options, " /startserver=%s", ServerSettingsClass::Get_Settings_File_Name());
|
|
}
|
|
|
|
if (ConsoleBox.Is_Exclusive()) {
|
|
strcat(options, " /nodx");
|
|
}
|
|
|
|
strcat(path, options);
|
|
#endif //FREEDEDICATEDSERVER
|
|
WWDEBUG_SAY(("Writing %s to RunOnce key\n", path));
|
|
registry_too.Set_String(WINDOWS_SUB_KEY_RUN_ONCE_APP, path);
|
|
} else {
|
|
WWDEBUG_SAY(("Removing RunOnce key\n"));
|
|
registry_too.Delete_Value(WINDOWS_SUB_KEY_RUN_ONCE_APP);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
* AutoRestartClass::Get_Restart_Flag -- Is a restart indicated by the registry? *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: New state *
|
|
* *
|
|
* OUTPUT: Nothing *
|
|
* *
|
|
* WARNINGS: None *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/5/2001 3:32PM ST : Created *
|
|
*=============================================================================================*/
|
|
bool AutoRestartClass::Get_Restart_Flag(void)
|
|
{
|
|
bool flag = false;
|
|
|
|
RegistryClass registry (APPLICATION_SUB_KEY_NAME_WOLSETTINGS);
|
|
if (registry.Is_Valid()) {
|
|
int restart = registry.Get_Int(REG_VALUE_AUTO_RESTART_FLAG, 0);
|
|
flag = restart ? true : false;
|
|
}
|
|
return(flag);
|
|
} |