1015 lines
27 KiB
C++
1015 lines
27 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/>.
|
|
*/
|
|
|
|
/***********************************************************************************************
|
|
*** 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 : Commando *
|
|
* *
|
|
* $Archive:: /Commando/Code/Commando/dlgcncpurchasemainmenu.cpp $*
|
|
* *
|
|
* Author:: Patrick Smith *
|
|
* *
|
|
* $Modtime:: 2/15/02 9:41p $*
|
|
* *
|
|
* $Revision:: 21 $*
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#include "dlgcncpurchasemainmenu.h"
|
|
#include "dlgcncpurchasemenu.h"
|
|
#include "resource.h"
|
|
#include "buttonctrl.h"
|
|
#include "globalsettings.h"
|
|
#include "combat.h"
|
|
#include "basecontroller.h"
|
|
#include "soldier.h"
|
|
#include "playertype.h"
|
|
#include "string_ids.h"
|
|
#include "vehiclefactorygameobj.h"
|
|
#include "soldierfactorygameobj.h"
|
|
#include "translatedb.h"
|
|
#include "assets.h"
|
|
#include "purchasesettings.h"
|
|
#include "dlgmpingamechat.h"
|
|
#include "gamemode.h"
|
|
#include "gameinitmgr.h"
|
|
#include "merchandisectrl.h"
|
|
#include "teampurchasesettings.h"
|
|
#include "vendor.h"
|
|
#include "playerdata.h"
|
|
#include "dialogmgr.h"
|
|
#include "combat.h"
|
|
#include "listctrl.h"
|
|
#include "messagewindow.h"
|
|
#include "weapons.h"
|
|
#include "weaponbag.h"
|
|
#include "powerup.h"
|
|
#include "input.h"
|
|
#include "dinput.h"
|
|
#include "hud.h"
|
|
#include "gamedata.h"
|
|
#include "specialbuilds.h"
|
|
|
|
|
|
bool CNCPurchaseMainMenuClass::SecretsEnabled = false;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// CNCPurchaseMainMenuClass
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
CNCPurchaseMainMenuClass::CNCPurchaseMainMenuClass (void) :
|
|
Team (PurchaseSettingsDefClass::TEAM_GDI),
|
|
ChatModule (NULL),
|
|
RefreshTimer (0),
|
|
MessageLogLength (0),
|
|
MenuDialogClass (IDD_CNC_PURCHASE_MAIN_SCREEN)
|
|
{
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// ~CNCPurchaseMainMenuClass
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
CNCPurchaseMainMenuClass::~CNCPurchaseMainMenuClass (void)
|
|
{
|
|
GameInitMgrClass::Continue_Game ();
|
|
REF_PTR_RELEASE (ChatModule);
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Init_Dialog
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Init_Dialog (void)
|
|
{
|
|
ButtonCtrlClass *chars_button = (ButtonCtrlClass *)Get_Dlg_Item (IDC_CHARACTERS_BUTTON);
|
|
ButtonCtrlClass *vehicles_button = (ButtonCtrlClass *)Get_Dlg_Item (IDC_VEHICLES_BUTTON);
|
|
|
|
//
|
|
// Get the global settings
|
|
//
|
|
GlobalSettingsDef *settings = GlobalSettingsDef::Get_Global_Settings ();
|
|
|
|
StringClass chars_texture;
|
|
StringClass vehicles_texture;
|
|
|
|
//
|
|
// Determine which textures to use for the buttons
|
|
//
|
|
if (Team == PurchaseSettingsDefClass::TEAM_GDI) {
|
|
::Strip_Path_From_Filename (chars_texture, settings->Get_Purchase_GDI_Characters_Texture ());
|
|
::Strip_Path_From_Filename (vehicles_texture, settings->Get_Purchase_GDI_Vehicles_Texture ());
|
|
} else if (Team == PurchaseSettingsDefClass::TEAM_NOD) {
|
|
::Strip_Path_From_Filename (chars_texture, settings->Get_Purchase_NOD_Characters_Texture ());
|
|
::Strip_Path_From_Filename (vehicles_texture, settings->Get_Purchase_NOD_Vehicles_Texture ());
|
|
} else if (Team == PurchaseSettingsDefClass::TEAM_MUTANT_NOD) {
|
|
::Strip_Path_From_Filename (chars_texture, settings->Get_Purchase_NOD_MUT_Characters_Texture ());
|
|
::Strip_Path_From_Filename (vehicles_texture, settings->Get_Purchase_NOD_MUT_Vehicles_Texture ());
|
|
} else {
|
|
::Strip_Path_From_Filename (chars_texture, settings->Get_Purchase_GDI_MUT_Characters_Texture ());
|
|
::Strip_Path_From_Filename (vehicles_texture, settings->Get_Purchase_GDI_MUT_Vehicles_Texture ());
|
|
}
|
|
|
|
//
|
|
// Configure the bitmap buttons
|
|
//
|
|
chars_button->Set_Bitmap (chars_texture, NULL);
|
|
vehicles_button->Set_Bitmap (vehicles_texture, NULL);
|
|
|
|
RefreshTimer = 0;
|
|
|
|
Configure_Purchase_Controls ();
|
|
|
|
//
|
|
// Get the rectangle where the chat UI will exist
|
|
//
|
|
const RectClass &chat_rect = Get_Dlg_Item (IDC_CHAT_AREA)->Get_Window_Rect ();
|
|
|
|
//
|
|
// Insert the chat module dialog into the bottom portion of our window
|
|
//
|
|
ChatModule = new MPChatChildDialogClass;
|
|
ChatModule->Set_Default_Type (TEXT_MESSAGE_TEAM);
|
|
ChatModule->Start_Dialog ();
|
|
Add_Child_Dialog (ChatModule);
|
|
ChatModule->Set_Rect (chat_rect);
|
|
ChatModule->Set_End_Dialog_On_Send (false);
|
|
|
|
//
|
|
// Force the hot-key colors to be white
|
|
//
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_01)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_02)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_03)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_04)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_05)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_06)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_07)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_08)->Set_Text_Color (Vector3 (1.0F, 1.0F, 1.0F));
|
|
|
|
//
|
|
// Configure the message log list ctrl
|
|
//
|
|
ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_LIST_CTRL);
|
|
if (list_ctrl != NULL) {
|
|
list_ctrl->Add_Column (L"", 1.0F, Vector3 (1, 1, 1));
|
|
}
|
|
|
|
//
|
|
// 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 ();
|
|
}
|
|
|
|
MenuDialogClass::On_Init_Dialog ();
|
|
|
|
//
|
|
// Force focus to be on the "characters" button
|
|
//
|
|
Get_Dlg_Item (IDC_CHARACTERS_BUTTON)->Set_Focus ();
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Destroy
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Destroy (void)
|
|
{
|
|
MenuDialogClass::On_Destroy ();
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Configure_Purchase_Controls
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Configure_Purchase_Controls (void)
|
|
{
|
|
const int CTRL_IDS[4] =
|
|
{
|
|
IDC_ENLISTED_PURCHASE_01,
|
|
IDC_ENLISTED_PURCHASE_02,
|
|
IDC_ENLISTED_PURCHASE_03,
|
|
IDC_ENLISTED_PURCHASE_04
|
|
};
|
|
|
|
//
|
|
// Lookup the purchase settings for this team
|
|
//
|
|
TeamPurchaseSettingsDefClass *definition = NULL;
|
|
definition = TeamPurchaseSettingsDefClass::Get_Definition ((TeamPurchaseSettingsDefClass::TEAM)Team);
|
|
|
|
for (int index = 0; index < 4; index ++) {
|
|
|
|
//
|
|
// Get the control for this entry
|
|
//
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (CTRL_IDS[index]);
|
|
if (ctrl != NULL) {
|
|
|
|
//
|
|
// Configure the merchandise settings
|
|
//
|
|
ctrl->Set_Text (definition->Get_Enlisted_Name (index));
|
|
ctrl->Set_Cost (0);
|
|
ctrl->Set_Texture (definition->Get_Enlisted_Texture (index));
|
|
ctrl->Set_User_Data (index);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Configure the beacon purchase object
|
|
//
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (IDC_BEACON_PURCHASE);
|
|
if (ctrl != NULL) {
|
|
ctrl->Set_Text (definition->Get_Beacon_Name ());
|
|
ctrl->Set_Cost (definition->Get_Beacon_Cost ());
|
|
ctrl->Set_Texture (definition->Get_Beacon_Texture ());
|
|
}
|
|
|
|
//
|
|
// Configure the supply purchase object
|
|
//
|
|
ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (IDC_SUPPLY_PURCHASE);
|
|
if (ctrl != NULL) {
|
|
ctrl->Set_Text (definition->Get_Supply_Name ());
|
|
ctrl->Set_Cost (0);
|
|
ctrl->Set_Texture (definition->Get_Supply_Texture ());
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Render
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Render (void)
|
|
{
|
|
MenuDialogClass::Render ();
|
|
HUDClass::Damage_Render ();
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Command
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Command (int ctrl_id, int message_id, DWORD param)
|
|
{
|
|
if (SecretsEnabled && The_Game()->IsLaddered.Is_True()) {
|
|
SecretsEnabled = false;
|
|
}
|
|
|
|
switch (ctrl_id)
|
|
{
|
|
case IDC_BUY:
|
|
Purchase ();
|
|
break;
|
|
|
|
case IDC_CHARACTERS_BUTTON:
|
|
#ifdef MULTIPLAYERDEMO
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_CLASSES);
|
|
#else
|
|
if ((SecretsEnabled) && (Input::Is_Button_Down(DIK_LMENU))) {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_SECRET_CLASSES);
|
|
} else {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_CLASSES);
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case IDC_VEHICLES_BUTTON:
|
|
#ifdef MULTIPLAYERDEMO
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_VEHICLES);
|
|
#else
|
|
if ((SecretsEnabled) && (Input::Is_Button_Down(DIK_LMENU))) {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_SECRET_VEHICLES);
|
|
} else {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_VEHICLES);
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
MenuDialogClass::On_Command (ctrl_id, message_id, param);
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Do_Purchase_Screen
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE type)
|
|
{
|
|
//
|
|
// Lookup the definition based on the type and team
|
|
//
|
|
PurchaseSettingsDefClass *definition = NULL;
|
|
definition = PurchaseSettingsDefClass::Find_Definition (type, Team);
|
|
|
|
if (definition != NULL) {
|
|
|
|
//
|
|
// Show the purchase dialog
|
|
//
|
|
CNCPurchaseMenuClass *dialog = new CNCPurchaseMenuClass;
|
|
dialog->Set_Definition (definition);
|
|
dialog->Set_Type (type);
|
|
|
|
//
|
|
// Let the dialog know what "team" this purchase is for...
|
|
//
|
|
if (Team == PurchaseSettingsDefClass::TEAM_GDI) {
|
|
dialog->Set_Team (PlayerTerminalClass::TYPE_GDI);
|
|
} else if (Team == PurchaseSettingsDefClass::TEAM_NOD) {
|
|
dialog->Set_Team (PlayerTerminalClass::TYPE_NOD);
|
|
} else {
|
|
dialog->Set_Team (PlayerTerminalClass::TYPE_MUTANT);
|
|
}
|
|
|
|
//
|
|
// Examine the base for this player to decide what purchase options they have
|
|
//
|
|
BaseControllerClass *base = BaseControllerClass::Find_Base_For_Star ();
|
|
if (base != NULL) {
|
|
|
|
//
|
|
// If the base is powered down then all prices double in cost
|
|
//
|
|
if (base->Is_Base_Powered () == false) {
|
|
dialog->Set_Cost_Scaling_Factor (2.0F);
|
|
}
|
|
|
|
//
|
|
// If the base can't generate new soldiers, then let the dialog know that
|
|
// only "free" items are available
|
|
//
|
|
if (type == PurchaseSettingsDefClass::TYPE_CLASSES && base->Can_Generate_Soldiers () == false) {
|
|
dialog->Enable_Production (false);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Disable multiple purchases for vehicles and soldiers
|
|
//
|
|
if ( type == PurchaseSettingsDefClass::TYPE_CLASSES ||
|
|
type == PurchaseSettingsDefClass::TYPE_VEHICLES)
|
|
{
|
|
dialog->Enable_Multiple_Purchases (false);
|
|
}
|
|
|
|
dialog->Start_Dialog ();
|
|
REF_PTR_RELEASE (dialog);
|
|
|
|
//
|
|
// Reset any selections on this page
|
|
//
|
|
Clear_Selections ();
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Clear_Selections
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Clear_Selections (void)
|
|
{
|
|
const int CTRL_IDS[] =
|
|
{
|
|
IDC_ENLISTED_PURCHASE_01,
|
|
IDC_ENLISTED_PURCHASE_02,
|
|
IDC_ENLISTED_PURCHASE_03,
|
|
IDC_ENLISTED_PURCHASE_04,
|
|
IDC_SUPPLY_PURCHASE,
|
|
IDC_BEACON_PURCHASE
|
|
};
|
|
|
|
//
|
|
// Find out which options are selected for purchase
|
|
//
|
|
for (int index = 0; index < 6; index ++) {
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (CTRL_IDS[index]);
|
|
if (ctrl != NULL && ctrl->Get_Purchase_Count () > 0) {
|
|
ctrl->Reset_Purchase_Count ();
|
|
}
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Purchase
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Purchase (void)
|
|
{
|
|
const int CTRL_IDS[] =
|
|
{
|
|
IDC_ENLISTED_PURCHASE_01,
|
|
IDC_ENLISTED_PURCHASE_02,
|
|
IDC_ENLISTED_PURCHASE_03,
|
|
IDC_ENLISTED_PURCHASE_04,
|
|
IDC_SUPPLY_PURCHASE,
|
|
IDC_BEACON_PURCHASE
|
|
};
|
|
|
|
//
|
|
// Lookup the purchase settings for this team
|
|
//
|
|
TeamPurchaseSettingsDefClass *definition = NULL;
|
|
definition = TeamPurchaseSettingsDefClass::Get_Definition ((TeamPurchaseSettingsDefClass::TEAM)Team);
|
|
|
|
//
|
|
// Find out which options are selected for purchase
|
|
//
|
|
for (int index = 0; index < 6; index ++) {
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (CTRL_IDS[index]);
|
|
if (ctrl != NULL && ctrl->Get_Purchase_Count () > 0) {
|
|
|
|
switch (CTRL_IDS[index])
|
|
{
|
|
case IDC_ENLISTED_PURCHASE_01:
|
|
case IDC_ENLISTED_PURCHASE_02:
|
|
case IDC_ENLISTED_PURCHASE_03:
|
|
case IDC_ENLISTED_PURCHASE_04:
|
|
{
|
|
VendorClass::Purchase_Item (COMBAT_STAR, VendorClass::TYPE_ENLISTED_CHARACTER, ctrl->Get_User_Data ());
|
|
break;
|
|
}
|
|
|
|
case IDC_SUPPLY_PURCHASE:
|
|
VendorClass::Purchase_Item (COMBAT_STAR, VendorClass::TYPE_SUPPLY, 0);
|
|
break;
|
|
|
|
case IDC_BEACON_PURCHASE:
|
|
VendorClass::Purchase_Item (COMBAT_STAR, VendorClass::TYPE_BEACON, 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Resume play after a purchase
|
|
//
|
|
End_Dialog ();
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Merchandise_Selected
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Merchandise_Selected (MerchandiseCtrlClass *ctrl, int ctrl_id)
|
|
{
|
|
const int CTRL_IDS[] =
|
|
{
|
|
IDC_ENLISTED_PURCHASE_01,
|
|
IDC_ENLISTED_PURCHASE_02,
|
|
IDC_ENLISTED_PURCHASE_03,
|
|
IDC_ENLISTED_PURCHASE_04
|
|
};
|
|
|
|
//
|
|
// Update the counter on the merchandise control
|
|
//
|
|
if (ctrl != NULL) {
|
|
|
|
if (ctrl->Get_Purchase_Count () == 0) {
|
|
ctrl->Increment_Purchase_Count ();
|
|
|
|
//
|
|
// Check to ensure we don't select more then one of the
|
|
// enlisted controls.
|
|
//
|
|
switch (ctrl_id)
|
|
{
|
|
case IDC_ENLISTED_PURCHASE_01:
|
|
case IDC_ENLISTED_PURCHASE_02:
|
|
case IDC_ENLISTED_PURCHASE_03:
|
|
case IDC_ENLISTED_PURCHASE_04:
|
|
{
|
|
//
|
|
// Make the enlisted purchases mutually exclusive
|
|
//
|
|
for (int index = 0; index < 4; index ++) {
|
|
MerchandiseCtrlClass *other_ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (CTRL_IDS[index]);
|
|
if (other_ctrl != NULL && other_ctrl != ctrl) {
|
|
other_ctrl->Reset_Purchase_Count ();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
ctrl->Reset_Purchase_Count ();
|
|
}
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Merchandise_DblClk
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Merchandise_DblClk (MerchandiseCtrlClass *ctrl, int ctrl_id)
|
|
{
|
|
Purchase_Item (ctrl_id);
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Purchase_Item
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Purchase_Item (int ctrl_id)
|
|
{
|
|
const int CTRL_IDS[] =
|
|
{
|
|
IDC_ENLISTED_PURCHASE_01,
|
|
IDC_ENLISTED_PURCHASE_02,
|
|
IDC_ENLISTED_PURCHASE_03,
|
|
IDC_ENLISTED_PURCHASE_04,
|
|
IDC_SUPPLY_PURCHASE,
|
|
IDC_BEACON_PURCHASE
|
|
};
|
|
|
|
//
|
|
// Reset all purchase controls
|
|
//
|
|
for (int index = 0; index < 6; index ++) {
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (CTRL_IDS[index]);
|
|
if (ctrl != NULL) {
|
|
ctrl->Reset_Purchase_Count ();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Purchase the item and close the dialog
|
|
//
|
|
MerchandiseCtrlClass *ctrl = (MerchandiseCtrlClass *)Get_Dlg_Item (ctrl_id);
|
|
if (ctrl != NULL) {
|
|
ctrl->Increment_Purchase_Count ();
|
|
Purchase ();
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Frame_Update
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::On_Frame_Update (void)
|
|
{
|
|
if (COMBAT_STAR == NULL) {
|
|
return ;
|
|
}
|
|
|
|
//
|
|
// Update the player's money every frame
|
|
// TSS120301 - I'm not sure how player data can be null here but we are crashing
|
|
// with that, so let's test against it.
|
|
//
|
|
if (COMBAT_STAR->Get_Player_Data () != NULL) {
|
|
int old_money = Get_Dlg_Item_Int (IDC_CREDITS_TEXT);
|
|
int new_money = (int) COMBAT_STAR->Get_Player_Data ()->Get_Money ();
|
|
if (new_money != old_money) {
|
|
Set_Dlg_Item_Int (IDC_CREDITS_TEXT, new_money);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check to see if we should refresh the purchase button states
|
|
//
|
|
RefreshTimer -= DialogMgrClass::Get_Frame_Time ();
|
|
if (RefreshTimer <= 0) {
|
|
RefreshTimer = 0.5F;
|
|
Refresh_Button_States ();
|
|
Refresh_Beacon_State ();
|
|
}
|
|
|
|
//
|
|
// Update the message log every frame
|
|
//
|
|
Refresh_Message_Log ();
|
|
|
|
MenuDialogClass::On_Frame_Update ();
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Refresh_Beacon_State
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Refresh_Beacon_State (void)
|
|
{
|
|
if (COMBAT_STAR == NULL) {
|
|
return ;
|
|
}
|
|
|
|
//
|
|
// Lookup the purchase settings for this team
|
|
//
|
|
TeamPurchaseSettingsDefClass *definition = NULL;
|
|
definition = TeamPurchaseSettingsDefClass::Get_Definition ((TeamPurchaseSettingsDefClass::TEAM)Team);
|
|
|
|
//
|
|
// Get the beacon cost and the player's current cash supply
|
|
//
|
|
float cost = definition->Get_Beacon_Cost ();
|
|
int funds = 0;
|
|
if (COMBAT_STAR->Get_Player_Data() != NULL) {
|
|
funds = (int) COMBAT_STAR->Get_Player_Data ()->Get_Money ();
|
|
}
|
|
|
|
//
|
|
// Enabled or disable the beacon ctrl as necessary
|
|
//
|
|
if (funds >= cost) {
|
|
bool enable = true;
|
|
|
|
//
|
|
// Get the player's weapon bag
|
|
//
|
|
WeaponBagClass *weapon_bag = COMBAT_STAR->Get_Weapon_Bag ();
|
|
if (weapon_bag != NULL) {
|
|
|
|
//
|
|
// Beacons are purchased via a powerup, so lookup the powerup
|
|
// that grants the beacon weapon so we can check to ensure
|
|
// the player isn't already maxed out.
|
|
//
|
|
PowerUpGameObjDef *powerup_def = (PowerUpGameObjDef *)DefinitionMgrClass::Find_Definition (definition->Get_Beacon_Definition ());
|
|
if (powerup_def != NULL) {
|
|
|
|
//
|
|
// Loop over all the weapons in the bag
|
|
//
|
|
int beacon_id = powerup_def->Get_Grant_Weapon_ID ();
|
|
int weapon_count = weapon_bag->Get_Count ();
|
|
for (int index = 0; index < weapon_count; index ++) {
|
|
WeaponClass *weapon = weapon_bag->Peek_Weapon (index);
|
|
if (weapon != NULL && weapon->Get_ID () == beacon_id) {
|
|
|
|
//
|
|
// Don't allow the player to purchase more beacons then
|
|
// they can hold.
|
|
//
|
|
if (weapon->Is_Ammo_Maxed ()) {
|
|
enable = false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Get_Dlg_Item (IDC_BEACON_PURCHASE)->Enable (enable);
|
|
} else {
|
|
Get_Dlg_Item (IDC_BEACON_PURCHASE)->Enable (false);
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Refresh_Button_States
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Refresh_Button_States (void)
|
|
{
|
|
ButtonCtrlClass *chars_button = (ButtonCtrlClass *)Get_Dlg_Item (IDC_CHARACTERS_BUTTON);
|
|
ButtonCtrlClass *vehicles_button = (ButtonCtrlClass *)Get_Dlg_Item (IDC_VEHICLES_BUTTON);
|
|
|
|
//
|
|
// Determine whether or not the player can purchase vehicles or characters
|
|
//
|
|
bool enable_vehicles = true;
|
|
bool enable_chars = true;
|
|
|
|
//
|
|
// Check to see if the player can generate vehicles. If not, then disable
|
|
// the vehicles button
|
|
//
|
|
BaseControllerClass *base_controller = BaseControllerClass::Find_Base_For_Star ();
|
|
if (base_controller != NULL) {
|
|
|
|
//
|
|
// Try to find the vehicle factory for this level
|
|
//
|
|
BuildingGameObj *building = base_controller->Find_Building (BuildingConstants::TYPE_VEHICLE_FACTORY);
|
|
if (building != NULL && building->As_VehicleFactoryGameObj () != NULL) {
|
|
VehicleFactoryGameObj *factory = building->As_VehicleFactoryGameObj ();
|
|
|
|
//
|
|
// Determine if the factory is busy or destroyed
|
|
//
|
|
if (factory->Is_Busy ()) {
|
|
Set_Dlg_Item_Text (IDC_VEHICLES_STATIC, TRANSLATE (IDS_CNC_PURCHASE_VB_BUSY));
|
|
enable_vehicles = false;
|
|
} else if (factory->Is_Destroyed ()) {
|
|
Set_Dlg_Item_Text (IDC_VEHICLES_STATIC, TRANSLATE (IDS_CNC_PURCHASE_VB_DESTROYED));
|
|
enable_vehicles = false;
|
|
} else {
|
|
Set_Dlg_Item_Text (IDC_VEHICLES_STATIC, TRANSLATE (IDS_MENU_VEHICLES));
|
|
}
|
|
|
|
} else {
|
|
|
|
//
|
|
// Let the user know that there is now vehicle factory
|
|
//
|
|
Set_Dlg_Item_Text (IDC_VEHICLES_STATIC, TRANSLATE (IDS_CNC_PURCHASE_VB_UNAVAILABLE));
|
|
enable_vehicles = false;
|
|
}
|
|
|
|
//
|
|
// Try to find the vehicle factory for this level
|
|
//
|
|
building = base_controller->Find_Building (BuildingConstants::TYPE_SOLDIER_FACTORY);
|
|
if (building != NULL && building->As_SoldierFactoryGameObj () != NULL) {
|
|
SoldierFactoryGameObj *factory = building->As_SoldierFactoryGameObj ();
|
|
|
|
//
|
|
// Determine if the factory is busy or destroyed
|
|
//
|
|
if (factory->Is_Destroyed ()) {
|
|
Set_Dlg_Item_Text (IDC_SOLDIERS_STATIC, TRANSLATE (IDS_CNC_PURCHASE_VB_DESTROYED));
|
|
enable_chars = false;
|
|
} else {
|
|
Set_Dlg_Item_Text (IDC_SOLDIERS_STATIC, TRANSLATE (IDS_MENU_CHARACTERS));
|
|
}
|
|
|
|
} else {
|
|
|
|
//
|
|
// Let the user know that there is no soldier factory
|
|
//
|
|
Set_Dlg_Item_Text (IDC_SOLDIERS_STATIC, TRANSLATE (IDS_CNC_PURCHASE_VB_UNAVAILABLE));
|
|
enable_chars = false;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check to see if this team has reached its limit on vehicles.
|
|
//
|
|
if (enable_vehicles) {
|
|
|
|
//
|
|
// Count team vehicles.
|
|
//
|
|
BaseControllerClass *base = BaseControllerClass::Find_Base_For_Star ();
|
|
|
|
if (base != NULL) {
|
|
|
|
//
|
|
// Find the vehicle factory
|
|
//
|
|
BuildingGameObj *building = base->Find_Building (BuildingConstants::TYPE_VEHICLE_FACTORY);
|
|
|
|
if ((building != NULL) && (building->As_VehicleFactoryGameObj())) {
|
|
|
|
//
|
|
// See if the team already maxed out the number of vehicles
|
|
//
|
|
VehicleFactoryGameObj *factory = building->As_VehicleFactoryGameObj ();
|
|
if (factory->Get_Team_Vehicle_Count() >= factory->Get_Max_Vehicles_Per_Team()) {
|
|
Set_Dlg_Item_Text (IDC_VEHICLES_STATIC, TRANSLATE (IDS_MENU_LIMIT_REACHED));
|
|
enable_vehicles = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Enable or disable the vehicles and characters button
|
|
//
|
|
chars_button->Enable (enable_chars);
|
|
vehicles_button->Enable (enable_vehicles);
|
|
Get_Dlg_Item (IDC_SOLDIERS_STATIC)->Enable (enable_chars);
|
|
Get_Dlg_Item (IDC_VEHICLES_STATIC)->Enable (enable_vehicles);
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_06)->Set_Text_Color (enable_chars ? Vector3 (1.0F, 1.0F, 1.0F) : Vector3 (0.5F, 0.5F, 0.5F));
|
|
Get_Dlg_Item (IDC_HOTKEY_TEXT_07)->Set_Text_Color (enable_vehicles ? Vector3 (1.0F, 1.0F, 1.0F) : Vector3 (0.5F, 0.5F, 0.5F));
|
|
return ;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// On_Key_Down
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
bool
|
|
CNCPurchaseMainMenuClass::On_Key_Down (uint32 key_id, uint32 key_data)
|
|
{
|
|
bool retval = false;
|
|
|
|
//
|
|
// Don't process hot keys if an edit control has the focus
|
|
//
|
|
DialogControlClass *focus_ctrl = DialogMgrClass::Get_Focus ();
|
|
if (focus_ctrl == NULL || focus_ctrl->As_EditCtrlClass () == NULL) {
|
|
|
|
//
|
|
// Check to see if a hotkey was pressed
|
|
//
|
|
retval = true;
|
|
switch (key_id)
|
|
{
|
|
case '1':
|
|
Purchase_Item (IDC_ENLISTED_PURCHASE_01);
|
|
break;
|
|
|
|
case '2':
|
|
Purchase_Item (IDC_ENLISTED_PURCHASE_02);
|
|
break;
|
|
|
|
case '3':
|
|
Purchase_Item (IDC_ENLISTED_PURCHASE_03);
|
|
break;
|
|
|
|
case '4':
|
|
Purchase_Item (IDC_ENLISTED_PURCHASE_04);
|
|
break;
|
|
|
|
case '5':
|
|
Purchase_Item (IDC_SUPPLY_PURCHASE);
|
|
break;
|
|
|
|
case '6':
|
|
if (Get_Dlg_Item (IDC_CHARACTERS_BUTTON)->Is_Enabled ()) {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_CLASSES);
|
|
}
|
|
break;
|
|
|
|
case '7':
|
|
if (Get_Dlg_Item (IDC_VEHICLES_BUTTON)->Is_Enabled ()) {
|
|
Do_Purchase_Screen (PurchaseSettingsDefClass::TYPE_VEHICLES);
|
|
}
|
|
break;
|
|
|
|
case '8':
|
|
if (Get_Dlg_Item (IDC_BEACON_PURCHASE)->Is_Enabled ()) {
|
|
Purchase_Item (IDC_BEACON_PURCHASE);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
retval = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// If we didn't process the key, then let the base class handle it
|
|
//
|
|
if (retval == false) {
|
|
retval = MenuDialogClass::On_Key_Down (key_id, key_data);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
//
|
|
// Refresh_Message_Log
|
|
//
|
|
////////////////////////////////////////////////////////////////
|
|
void
|
|
CNCPurchaseMainMenuClass::Refresh_Message_Log (void)
|
|
{
|
|
ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_LIST_CTRL);
|
|
MessageWindowClass *message_window = CombatManager::Get_Message_Window ();
|
|
if (list_ctrl == NULL || message_window == NULL) {
|
|
return ;
|
|
}
|
|
|
|
//
|
|
// Don't do anything if the log hasn't changed size...
|
|
//
|
|
int count = message_window->Get_Log_Count ();
|
|
if (count != MessageLogLength) {
|
|
MessageLogLength = count;
|
|
|
|
//
|
|
// Start fresh
|
|
//
|
|
list_ctrl->Delete_All_Entries ();
|
|
|
|
//
|
|
// Add all the messages to the log...
|
|
//
|
|
for (int index = 0; index < count; index ++) {
|
|
|
|
//
|
|
// Get the message to display
|
|
//
|
|
const WCHAR *message = message_window->Get_Log_Entry (index);
|
|
const Vector3 &color = message_window->Get_Log_Color (index);
|
|
WideStringClass temp_string (message, true);
|
|
int len = temp_string.Get_Length ();
|
|
|
|
//
|
|
// Strip off any unnecessary newlines
|
|
//
|
|
if (len > 0 && message[len - 1] == L'\n') {
|
|
temp_string.Erase (len - 1, 1);
|
|
}
|
|
|
|
//
|
|
// Add this message to the log
|
|
//
|
|
int item_index = list_ctrl->Insert_Entry (index, temp_string);
|
|
if (item_index != -1) {
|
|
list_ctrl->Set_Entry_Color (item_index, 0, color);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Scroll to the end of the message log
|
|
//.
|
|
list_ctrl->Scroll_To_End ();
|
|
}
|
|
|
|
return ;
|
|
}
|