Files
firestorm/Gameleap/code/mw4/Code/MW4/GUIWeaponManager.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

602 lines
16 KiB
C++

#include "MW4Headers.hpp"
#include "GUIWeaponManager.hpp"
#include "VehicleInterface.hpp"
#include "MWGUIManager.hpp"
#include "Weapon.hpp"
#include "AI_DebugRenderer.hpp"
#include "ShellScriptHeaders.hpp"
#include <MLR\MLR.hpp>
GUIWeapon::ClassData*
GUIWeapon::DefaultData = NULL;
using namespace MidLevelRenderer;
DECLARE_TIMER(static, Weapon_Text_Draw);
//#######################################################################
//######################### GUIWeapon #########################
//#######################################################################
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
GUIWeaponClassID,
"MechWarrior4::GUIWeapon",
Plug::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIWeapon::GUIWeapon(
const char *weapon_name,
Scalar weapon_count,
RGBAColor *weapon_color,
int *ammo_count,
Weapon *weapon
) :
Plug(DefaultData)
{
int length = strlen(weapon_name);
Verify(length > 0);
length ++;
weaponName = new char [length];
Register_Pointer(weapon_name);
Str_Copy(weaponName, weapon_name, length + 1);
weaponCount = weapon_count;
weaponColor.alpha = weapon_color->alpha;
weaponColor.red = weapon_color->red;
weaponColor.green = weapon_color->green;
weaponColor.blue = weapon_color->blue;
readyColor.alpha = weapon_color->alpha;
readyColor.red = weapon_color->red;
readyColor.green = weapon_color->green;
readyColor.blue = weapon_color->blue;
ammoCount = ammo_count;
m_weapon = weapon;
m_status = ReadyStatus;
const Weapon__GameModel *model = weapon->GetGameModel ();
m_Range = model->maxDistance;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIWeapon::~GUIWeapon()
{
Check_Object(this);
Unregister_Pointer(weaponName);
delete [] weaponName;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::Draw(int y_location)
{
Check_Object(this);
DWORD gos_color = MidLevelRenderer::GOSCopyColor(&weaponColor);
char text_string[128];
sprintf(text_string, "/color=%8x%s :", gos_color, weaponName);
gos_TextDraw(text_string);
gos_TextSetPosition((int)(0.895f * Environment.screenWidth), y_location);
sprintf(text_string, "/color=%8x%.3f",gos_color, weaponCount);
gos_TextDraw(text_string);
if(DECRYPT(*ammoCount) != -1)
{
gos_TextSetPosition((int)(0.95f * Environment.screenWidth), y_location);
sprintf(text_string, "/color=%8x%d",gos_color, DECRYPT(*ammoCount));
gos_TextDraw(text_string);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::Reload()
{
Check_Object(this);
SetStatus(ReloadingStatus);
weaponColor.red = 1.0f;
weaponColor.green = 0.0f;
weaponColor.blue = 0.0f;
}
// MSL 5.03 RTX
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUIWeapon::RecoverFromFire()
{
Check_Object(this);
SetStatus(AmmoFireStatus);
weaponColor.red = 1.0f;
weaponColor.green = 0.0f;
weaponColor.blue = 0.0f;
}
// MSL 5.03 RTX
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUIWeapon::RecoverFromJam()
{
Check_Object(this);
//check if we are a rotary autocannon?
SetStatus(JammedStatus);
// SetStatus(ReloadingStatus);
weaponColor.red = 1.0f;
weaponColor.green = 0.0f;
weaponColor.blue = 0.0f;
}
// MSL 5.03 RTX
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::SetJamCount(Scalar new_count)
{
Check_Object(this);
weaponJamCount = new_count;
}
// MSL 5.03 Ammo Bay Fire
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::SetFireCount(Scalar new_count)
{
Check_Object(this);
weaponFireCount = new_count;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::SetCount(Scalar new_count)
{
Check_Object(this);
weaponCount = new_count;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::Ready()
{
Check_Object(this);
SetStatus(ReadyStatus);
weaponColor.red = readyColor.red;
weaponColor.green = readyColor.green;
weaponColor.blue = readyColor.blue;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeapon::Select()
{
Check_Object(this);
readyColor.red = 0.0f;
readyColor.green = 1.0f;
readyColor.blue = 0.0f;
}
//#######################################################################
//########################### GUIWeaponManager #####################
//#######################################################################
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIWeaponManager::GUIWeaponManager() :
Plug(Plug::DefaultData),
weaponList(NULL)
{
SPEW(("daberger", "Weapon Font should be set not hard coded"));
// weaponFontHandle = gos_LoadFont("Assets\\Graphics\\arial8.tga", 0);
guiManager = NULL;
Initialize_Timer(Weapon_Text_Draw, "Weapon Text Draw");
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIWeaponManager::~GUIWeaponManager()
{
weaponList.DeletePlugs();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUIWeapon*
GUIWeaponManager::MakeGUIWeapon(
const char *weapon_name,
Scalar weapon_count,
RGBAColor *weapon_color,
int *ammo_count,
Weapon *owning_weapon
)
{
Check_Object(this);
Check_Pointer(weapon_name);
Check_Pointer(weapon_color);
GUIWeapon *weapon =
new GUIWeapon(weapon_name, weapon_count, weapon_color, ammo_count, owning_weapon);
Check_Object(weapon);
weaponList.Add(weapon);
return weapon;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeaponManager::ChangeGroup(GUIWeapon *weapon)
{
Check_Object(this);
Check_Object(weapon);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeaponManager::ClearWeaponsManager()
{
Check_Object(this);
weaponList.DeletePlugs();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUIWeaponManager::Draw()
{
#if 0
Check_Object(this);
//
//----------------------------------------
//This is the draw routine for the weapons
//----------------------------------------
//
switch(drawMode)
{
case VehicleInterface::ChainFireMode:
case VehicleInterface::SingleFireMode:
{
char text_string[128];
if(drawMode == VehicleInterface::ChainFireMode)
sprintf(text_string, "/color=%8xChain Fire Mode", 0xff00ff00);
else
sprintf(text_string, "/color=%8xSingle Fire Mode", 0xff00ff00);
int chain_size;
ChainIteratorOf<GUIWeapon *> iterator(&weaponList);
chain_size = iterator.GetSize();
if(chain_size == 0)
{
return;
}
gos_SetRenderState( gos_State_Texture, 0 );
gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha );
gos_SetRenderState( gos_State_Clipping, 0 );
gos_SetRenderState( gos_State_ZWrite, 0 );
gos_SetRenderState( gos_State_Filter, gos_FilterNone );
gos_SetRenderState( gos_State_ZCompare, 0 );
gos_SetRenderState( gos_State_WireframeMode, 0 );
gos_SetRenderState( gos_State_Specular, 0 );
gos_SetRenderState( gos_State_Dither, 0 );
gos_SetRenderState( gos_State_ShadeMode, gos_ShadeFlat );
gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate );
gos_SetRenderState( gos_State_AlphaTest, 0 );
gos_SetRenderState( gos_State_Fog, 0 );
//First we need to Draw the Quad for the Window
gos_VERTEX quad_verticies[4];
memset(quad_verticies, 0, sizeof(quad_verticies));
int y_size = ((int)chain_size + 1) * 15;
Max_Clamp(y_size, Environment.screenHeight);
Scalar y_position = (float)y_size + 20;
quad_verticies[0].rhw = 1.0;
quad_verticies[1].rhw = 1.0;
quad_verticies[2].rhw = 1.0;
quad_verticies[3].rhw = 1.0;
quad_verticies[0].x = (0.76f * Environment.screenWidth);
quad_verticies[0].y = 10.0f;
quad_verticies[0].z = 0.9f;
quad_verticies[0].argb = 0x77000000;
quad_verticies[1].x = (0.98f * Environment.screenWidth);
quad_verticies[1].y = 10.0f;
quad_verticies[1].z = 0.9f;
quad_verticies[1].argb = 0x77000000;
quad_verticies[2].x = (0.98f * Environment.screenWidth);
quad_verticies[2].y = y_position;
quad_verticies[2].z = 0.9f;
quad_verticies[2].argb = 0x77000000;
quad_verticies[3].x = (0.76f * Environment.screenWidth);
quad_verticies[3].y = y_position;
quad_verticies[3].z = 0.9f;
quad_verticies[3].argb = 0x77000000;
gos_DrawQuads(quad_verticies, 4);
//Second we need to set up all of the String Attributes
gos_TextSetRegion(
(int)(0.72f * Environment.screenWidth),
10,
(int)(0.98f * Environment.screenWidth),
(int)y_position
);
gos_TextSetAttributes(
weaponFontHandle,
0xffffffff,
1.0f,
false,
true,
false,
false
);
GUIWeapon *gui_weapon;
int count = 1;
//
//-----------------------------------------
//Write out the group number that we are in
//-----------------------------------------
//
int y_location = (count * 15) + 5;
gos_TextSetPosition((int)(0.77f * Environment.screenWidth), y_location);
Start_Timer(Weapon_Text_Draw);
gos_TextDraw(text_string);
Stop_Timer(Weapon_Text_Draw);
count = 2;
while(((gui_weapon = iterator.ReadAndNext()) != NULL) &&
(count <= 23))
{
Check_Object(gui_weapon);
y_location = (count * 15) + 5;
gos_TextSetPosition((int)(0.77f * Environment.screenWidth), y_location);
Start_Timer(Weapon_Text_Draw);
gui_weapon->Draw(y_location);
Stop_Timer(Weapon_Text_Draw);
count ++;
}
break;
}
case VehicleInterface::GroupFireMode:
{
ChainIteratorOf<Weapon *> *iterator;
char text_string[128];
if (NULL == guiManager->vehicleInterface)
return;
switch(guiManager->vehicleInterface->selectedWeaponGroup)
{
case 1:
iterator = new ChainIteratorOf<Weapon *>(&guiManager->vehicleInterface->weaponGroup1);
sprintf(text_string, "/color=%8xWeapon Group 1", 0xff00ff00);
break;
case 2:
iterator = new ChainIteratorOf<Weapon *>(&guiManager->vehicleInterface->weaponGroup2);
sprintf(text_string, "/color=%8xWeapon Group 2", 0xff00ff00);
break;
case 3:
iterator = new ChainIteratorOf<Weapon *>(&guiManager->vehicleInterface->weaponGroup3);
sprintf(text_string, "/color=%8xWeapon Group 3", 0xff00ff00);
break;
case 4:
iterator = new ChainIteratorOf<Weapon *>(&guiManager->vehicleInterface->weaponGroup4);
sprintf(text_string, "/color=%8xWeapon Group 4", 0xff00ff00);
break;
case 5:
iterator = new ChainIteratorOf<Weapon *>(&guiManager->vehicleInterface->weaponGroup5);
sprintf(text_string, "/color=%8xWeapon Group 5", 0xff00ff00);
break;
default:
return;
}
int chain_size = iterator->GetSize();
if(chain_size == 0)
{
return;
}
gos_SetRenderState( gos_State_Texture, 0 );
gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha );
gos_SetRenderState( gos_State_Clipping, 0 );
gos_SetRenderState( gos_State_ZWrite, 0 );
gos_SetRenderState( gos_State_Filter, gos_FilterNone );
gos_SetRenderState( gos_State_ZCompare, 0 );
gos_SetRenderState( gos_State_WireframeMode, 0 );
gos_SetRenderState( gos_State_Specular, 0 );
gos_SetRenderState( gos_State_Dither, 0 );
gos_SetRenderState( gos_State_ShadeMode, gos_ShadeFlat );
gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulate );
gos_SetRenderState( gos_State_AlphaTest, 0 );
gos_SetRenderState( gos_State_Fog, 0 );
//First we need to Draw the Quad for the Window
gos_VERTEX quad_verticies[4];
memset(quad_verticies, 0, sizeof(quad_verticies));
int y_size = ((int)chain_size + 1) * 15;
Max_Clamp(y_size, Environment.screenHeight);
Scalar y_position = (float)y_size + 20;
quad_verticies[0].rhw = 1.0;
quad_verticies[1].rhw = 1.0;
quad_verticies[2].rhw = 1.0;
quad_verticies[3].rhw = 1.0;
quad_verticies[0].x = (0.76f * Environment.screenWidth);
quad_verticies[0].y = 10.0f;
quad_verticies[0].z = 0.9f;
quad_verticies[0].argb = 0x77000000;
quad_verticies[1].x = (0.98f * Environment.screenWidth);
quad_verticies[1].y = 10.0f;
quad_verticies[1].z = 0.9f;
quad_verticies[1].argb = 0x77000000;
quad_verticies[2].x = (0.98f * Environment.screenWidth);
quad_verticies[2].y = y_position;
quad_verticies[2].z = 0.9f;
quad_verticies[2].argb = 0x77000000;
quad_verticies[3].x = (0.76f * Environment.screenWidth);
quad_verticies[3].y = y_position;
quad_verticies[3].z = 0.9f;
quad_verticies[3].argb = 0x77000000;
gos_DrawQuads(quad_verticies, 4);
//Second we need to set up all of the String Attributes
gos_TextSetRegion(
(int)(0.72f * Environment.screenWidth),
10,
(int)(0.98f * Environment.screenWidth),
(int)y_position
);
gos_TextSetAttributes(
weaponFontHandle,
0xffffffff,
1.0f,
false,
true,
false,
false
);
Weapon *weapon;
int count = 1;
//
//-----------------------------------------
//Write out the group number that we are in
//-----------------------------------------
//
int y_location = (count * 15) + 5;
gos_TextSetPosition((int)(0.77f * Environment.screenWidth), y_location);
Start_Timer(Weapon_Text_Draw);
gos_TextDraw(text_string);
Stop_Timer(Weapon_Text_Draw);
count = 2;
while(((weapon = iterator->ReadAndNext()) != NULL) &&
(count <= 23))
{
Check_Object(weapon);
if(weapon->guiWeapon.GetCurrent())
{
y_location = (count * 15) + 5;
gos_TextSetPosition((int)(0.77f * Environment.screenWidth), y_location);
Start_Timer(Weapon_Text_Draw);
weapon->guiWeapon.GetCurrent()->Draw(y_location);
Stop_Timer(Weapon_Text_Draw);
count ++;
}
}
delete iterator;
break;
}
}
#endif
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int GUIWeaponManager::GetWeaponInfo (char **name_array, int *status,int *ammo,Stuff::Scalar *reloads,Stuff::Scalar *current_time,int *group_1,int *group_2,int *group_3, int *group_4,int *group_5,int *group_6,int *num_weapons, int array_size)
{
ChainIteratorOf<GUIWeapon *> iterator(&weaponList);
GUIWeapon *weapon;
int i = 0;
while(((weapon = iterator.ReadAndNext()) != NULL) &&
(i < array_size))
{
Check_Object(weapon);
FREEANDNULL(name_array[i]);
name_array[i] = (char *)gos_Malloc(128);
Str_Copy(
name_array[i],
(const char *)weapon->weaponName,
(strlen(weapon->weaponName) + 1)
);
ammo[i] = DECRYPT(*weapon->ammoCount);
status[i] = weapon->m_status;
if(weapon->m_weapon)
{
const Weapon::GameModel *weapon_model = weapon->m_weapon->GetGameModel();
Check_Object(weapon_model);
reloads[i] = weapon_model->reloadTime;
group_1[i] = weapon->m_weapon->IsInWeaponGroup1();
group_2[i] = weapon->m_weapon->IsInWeaponGroup2();
group_3[i] = weapon->m_weapon->IsInWeaponGroup3();
group_4[i] = weapon->m_weapon->IsInWeaponGroup4();
group_5[i] = weapon->m_weapon->IsInWeaponGroup5();
group_6[i] = 0;
}
else
{
reloads[i] = 0.0f;
group_1[i] = 0;
group_2[i] = 0;
group_3[i] = 0;
group_4[i] = 0;
group_5[i] = 0;
group_6[i] = 0;
}
current_time[i] = weapon->weaponCount;
i++;
}
*num_weapons = i;
return 1;
}