/*
** 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 .
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Combat *
* *
* $Archive:: /Commando/Code/commando/renegadedialogmgr.cpp $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 2/19/02 2:00p $*
* *
* $Revision:: 51 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "renegadedialogmgr.h"
#include "dialogmgr.h"
#include "dialogbase.h"
#include "dialogtests.h"
#include "dialogresource.h"
#include "dlgloadspgame.h"
#include "dlgevaencyclopedia.h"
#include "dlgmultiplayoptions.h"
#include "dlgcharacteroptions.h"
#include "dlgcheatoptions.h"
#include "dlgtechoptions.h"
#include "dlgmovieoptions.h"
#include "dlgpreviewoptions.h"
#include "dlgcredits.h"
#include "inputctrl.h"
#include "translatedb.h"
#include "string_ids.h"
#include "dlgmplanhostoptions.h"
#include "dlginternetoptions.h"
#include "gamemode.h"
#include "dlgmplangamelist.h"
#include "directinput.h"
#include "input.h"
#include "dlgmainmenu.h"
#include "dlgwebpage.h"
#include "dlgmpwolpagebuddy.h"
#include "dlgmpwolbuddies.h"
#include "dlgmpwolchat.h"
#include "dlgmpwolgamelist.h"
#include "dlgsavegame.h"
#include "dlgcontrols.h"
#include "dlgmpwolquickmatchoptions.h"
#include "dlgmpwolmain.h"
#include "dlgwolsettings.h"
#include "dlghelpscreen.h"
#include "dlgcncreference.h"
#include "wwmemlog.h"
#include "consolemode.h"
#include "specialbuilds.h"
////////////////////////////////////////////////////////////////
// Globals
////////////////////////////////////////////////////////////////
WWUIInputClass * _TheWWUIInput = NULL;
////////////////////////////////////////////////////////////////
// Static data
////////////////////////////////////////////////////////////////
DialogFactoryBaseClass *FactoryArray[FACTORY_COUNT] =
{
new DialogFactoryClass,
NULL,
NULL,
new DialogFactoryClass,
new DialogFactoryClass,
NULL, //IDC_MENU_START_TUTORIAL_BUTTON
new DialogFactoryClass,
NULL, //IDC_MENU_DIFFCULTY01_BUTTON
NULL, //IDC_MENU_DIFFCULTY02_BUTTON
NULL, //IDC_MENU_DIFFCULTY04_BUTTON
NULL, //IDC_MENU_DIFFCULTY04_BUTTON
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
new DialogFactoryClass,
//new DialogFactoryClass,
NULL,
NULL,//new DialogFactoryClass,
new DialogFactoryClass,
NULL,//new DialogFactoryClass,
new DialogFactoryClass,
NULL,
new DialogFactoryClass,
new DialogFactoryClass,
NULL, //IDC_MENU_MP_LAN_JOIN_BUTTON
NULL, //IDC_MENU_MP_LAN_START_BUTTON
};
////////////////////////////////////////////////////////////////
// Local Prototypes
////////////////////////////////////////////////////////////////
bool CALLBACK Default_On_Command (DialogBaseClass *dialog, int ctrl_id, int mesage_id, DWORD param);
void Stop_Main_Loop (int);
////////////////////////////////////////////////////////////////
// RenegadeUIInputClass
////////////////////////////////////////////////////////////////
class RenegadeUIInputClass : public WWUIInputClass
{
const Vector3 &
Get_Mouse_Pos (void) const
{
DirectInput::Get_Cursor_Pos (&MousePos);
return MousePos;
}
void
Set_Mouse_Pos (const Vector3 &pos)
{
MousePos = pos;
DirectInput::Reset_Cursor_Pos (Vector2 (pos.X, pos.Y));
return ;
}
bool
Is_Button_Down (int vk_mouse_button_id)
{
bool retval = false;
switch (vk_mouse_button_id)
{
case VK_LBUTTON:
retval = Input::Is_Button_Down (DirectInput::BUTTON_MOUSE_LEFT);
break;
case VK_MBUTTON:
retval = Input::Is_Button_Down (DirectInput::BUTTON_MOUSE_CENTER);
break;
case VK_RBUTTON:
retval = Input::Is_Button_Down (DirectInput::BUTTON_MOUSE_RIGHT);
break;
}
return retval;
}
void
Enter_Menu_Mode (void)
{
Input::Menu_Enable (true);
return ;
}
void
Exit_Menu_Mode (void)
{
Input::Menu_Enable (false);
DirectInput::Eat_Mouse_Held_States ();
return ;
}
private:
mutable Vector3 MousePos;
};
////////////////////////////////////////////////////////////////
//
// Initialize
//
////////////////////////////////////////////////////////////////
void
RenegadeDialogMgrClass::Initialize (void)
{
WWMEMLOG(MEM_GAMEDATA);
const char * STYLE_MGR_INI = "stylemgr.ini";
_TheWWUIInput = new RenegadeUIInputClass;
_TheWWUIInput->InitIME(MainWindow);
//
// Simple-pass thru to the WWUI dialog mgr system
//
if (!ConsoleBox.Is_Exclusive()) {
DialogBaseClass::Set_Default_Command_Handler (Default_On_Command);
DialogMgrClass::Initialize (STYLE_MGR_INI);
}
DialogMgrClass::Install_Input (_TheWWUIInput);
return ;
}
////////////////////////////////////////////////////////////////
//
// Do_Simple_Dialog
//
////////////////////////////////////////////////////////////////
void
RenegadeDialogMgrClass::Do_Simple_Dialog (int dlg_res_id)
{
//
// Show the dialog
//
PopupDialogClass *dialog = new PopupDialogClass (dlg_res_id);
dialog->Start_Dialog ();
REF_PTR_RELEASE (dialog);
return ;
}
////////////////////////////////////////////////////////////////
//
// Goto_Location
//
////////////////////////////////////////////////////////////////
void
RenegadeDialogMgrClass::Goto_Location (LOCATION location)
{
WWMEMLOG(MEM_GAMEDATA);
switch (location)
{
case LOC_MAIN_MENU:
MainMenuDialogClass::Display ();
break;
case LOC_SPLASH_IN:
START_DIALOG (SplashIntroMenuDialogClass);
break;
case LOC_SPLASH_OUT:
START_DIALOG (SplashOutroMenuDialogClass);
break;
case LOC_INTERNET_MAIN:
MPWolMainMenuClass::Display ();
break;
case LOC_INTERNET_GAME_LIST:
MPWolGameListMenuClass::DoDialog ();
break;
case LOC_LAN_MAIN:
MPLanGameListMenuClass::Display ();
break;
case LOC_ENCYCLOPEDIA:
EVAEncyclopediaMenuClass::Display ();
break;
case LOC_OBJECTIVES:
EVAEncyclopediaMenuClass::Display (EVAEncyclopediaMenuClass::TAB_OBJECTIVES);
break;
case LOC_MAP:
EVAEncyclopediaMenuClass::Display (EVAEncyclopediaMenuClass::TAB_MAP);
break;
case LOC_CNC_REFERENCE:
CnCReferenceMenuClass::Display ();
break;
case LOC_LOAD_GAME:
LoadSPGameMenuClass::Display ();
break;
case LOC_IN_GAME_HELP:
HelpScreenDialogClass::Display ();
break;
//GAMESPY
case LOC_GAMESPY_MAIN:
START_DIALOG (GameSpyMainDialogClass);
break;
}
//
// Activate the menu game mode (if necessary)
//
GameModeClass *menu_game_mode = GameModeManager::Find ("Menu");
if (menu_game_mode != NULL && menu_game_mode->Is_Active () == false) {
menu_game_mode->Activate ();
}
return ;
}
////////////////////////////////////////////////////////////////
//
// Shutdown
//
////////////////////////////////////////////////////////////////
void
RenegadeDialogMgrClass::Shutdown (void)
{
//
// Simple-pass thru to the WWUI dialog mgr system
//
DialogMgrClass::Shutdown ();
//
// Release our hold on the input mechanism
//
REF_PTR_RELEASE (_TheWWUIInput);
//
// Free the factories so we don't get memory leaks when we quit. ST - 6/11/2001 8:23PM
//
for (int i=0 ; i= DIALOG_LINK_FIRST && ctrl_id < DIALOG_LINK_LAST) {
if (FactoryArray[ctrl_id - DIALOG_LINK_FIRST] != NULL) {
//
// Do the dialog associated with this command
//
FactoryArray[ctrl_id - DIALOG_LINK_FIRST]->Do_Dialog ();
}
}
switch (ctrl_id)
{
case IDC_MENU_BACK_BUTTON:
case IDC_BACK:
case IDCANCEL:
{
dialog->End_Dialog ();
break ;
}
case IDC_MP_SHORTCUT_NEWS:
DlgWebPage::DoDialog("News");
break;
case IDC_MP_SHORTCUT_CLANS:
DlgWebPage::DoDialog("BattleClans");
break;
case IDC_MP_SHORTCUT_RANKINGS:
DlgWebPage::DoDialog("Ladder");
break;
case IDC_MP_SHORTCUT_ACCOUNT:
DlgWOLSettings::DoDialog();
break;
#ifdef QUICKMATCH_OPTIONS
case IDC_MP_SHORTCUT_QUICKMATCH_OPTIONS:
START_DIALOG(MPWolQuickMatchOptionsMenuClass);
break;
#endif // QUICKMATCH_OPTIONS
case IDC_MP_SHORTCUT_NET_STATUS:
DlgWebPage::DoDialog("NetStatus");
break;
case IDC_MP_SHORTCUT_BUDDIES:
MPWolBuddiesMenuClass::Display();
break;
case IDC_MP_SHORTCUT_PAGE_BUDDY:
START_DIALOG (MPWolPageBuddyPopupClass);
break;
case IDC_MP_SHORTCUT_CHAT:
MPWolChatMenuClass::DoDialog();
break;
case IDC_MP_SHORTCUT_GAMELIST:
MPWolGameListMenuClass::DoDialog();
break;
case IDC_MP_SHORTCUT_INTERNET_OPTIONS:
START_DIALOG (MultiplayOptionsMenuClass);
break;
case IDC_QUIT:
#ifdef MULTIPLAYERDEMO
DialogMgrClass::Flush_Dialogs ();
START_DIALOG (SplashOutroMenuDialogClass);
/*dialog->End_Dialog ();
{
MainMenuDialogClass *main_menu = MainMenuDialogClass::Get_Instance ();
if (main_menu != NULL) {
main_menu->End_Dialog ();
}
}*/
#else
Stop_Main_Loop (EXIT_SUCCESS);
#endif //MULTIPLAYERDEMO
break ;
default:
handled = false;
break;
}
return handled;
}
//
// Called as follows: If IDS_TEST is the string you wish to load and
// WCHAR Buffer[128] is your buffer, the call would be
// MyLoadStringW(IDS_TEST,Buffer,128);
// If it succeeds, the function returns the number of characters copied
// into the buffer, not including the NULL terminating character, or
// zero if the string resource does not exist.
//
int MyLoadStringW (UINT str_id, LPWSTR buffer, int buffer_len)
{
//
// Compute the block and offset
//
int block = (str_id >> 4) + 1;
int num = str_id & 0xF;
//
// Find the resource
//
HRSRC resource = ::FindResourceEx (NULL, RT_STRING, MAKEINTRESOURCE (block),
MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL));
//
// Load the resource into memory
//
HGLOBAL hglobal = ::LoadResource (NULL, resource);
LPWSTR res_string = (LPWSTR)::LockResource (hglobal);
int length = 0;
if (res_string != NULL) {
for (int index = 0; index < num; index ++) {
res_string += *res_string + 1;
}
//
// Copy the string to our buffer
//
length = min ((int)(buffer_len - 1), (int)(*res_string));
::wcsncpy (buffer, res_string + 1, length);
}
//
// Null terminate the buffer
//
buffer[length] = '\0';
//
// Return the number of bytes copied
//
return length;
}