Files
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

440 lines
12 KiB
C++

#include "MW4Headers.hpp"
#include "Salvage.hpp"
#include "Subsystem.hpp"
#include "Mech.hpp"
#include "MWTable.hpp"
#include "MWApplication.hpp"
#include "..\buildnum\buildnum.h"
#include <Adept\Tool.hpp>
//#############################################################################
//#################### SalvagePlug ######################################
//#############################################################################
SalvagePlug::SalvagePlug(Subsystem *subsystem, const char *salvage_string) :
Plug(Plug::DefaultData)
{
Check_Pointer(subsystem);
m_subsystem = subsystem;
m_salvageID = subsystem->GetGameModelResourceID();
m_dataListID = subsystem->GetDataListResourceID();
m_count = 1;
m_newCount = 0;
m_salvageName = salvage_string;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvagePlug::SalvagePlug(ResourceID salvage_id, ResourceID data_list, const char *salvage_string) :
Plug(Plug::DefaultData)
{
m_subsystem = NULL;
m_salvageID = salvage_id;
m_dataListID = data_list;
m_count = 1;
m_newCount = 0;
m_salvageName = salvage_string;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvagePlug::~SalvagePlug()
{
}
//#############################################################################
//########################### Salvage ###################################
//#############################################################################
SalvageManager::ClassData*
SalvageManager::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
SalvageManagerClassID,
"MechWarrior4::SalvageManager",
Receiver::DefaultData,
0,
NULL
);
Check_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::TerminateClass()
{
Check_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvageManager::SalvageManager(MemoryStream *stream):
Receiver(DefaultData),
m_salvageList(NULL, true),
m_mechSalvageNames(NULL)
{
m_totalSalvage = 0;
if(stream)
{
Check_Pointer(stream);
int salvage_count;
*stream >> salvage_count;
for(int i=0; i<salvage_count; i++)
{
ResourceID salvage_id;
ResourceID data_id;
MString salvage_name;
*stream >> salvage_id;
*stream >> data_id;
*stream >> salvage_name;
AddSalvage(salvage_id, data_id, salvage_name);
}
while(stream->GetBytesRemaining() > 0)
{
MString mech_name;
*stream >> mech_name;
PlugOf<MString> *name_plug = new PlugOf<MString>(mech_name);
m_mechSalvageNames.Add(name_plug);
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvageManager::~SalvageManager()
{
Check_Object(this);
m_salvageList.DeletePlugs();
m_mechSalvageNames.DeletePlugs();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvageManager*
SalvageManager::MakeNewSalvageManager(const ResourceID& salvage_resource_id)
{
SalvageManager *new_salvage;
if(salvage_resource_id != ResourceID::Null)
{
Resource salvage_resource(salvage_resource_id);
Verify(salvage_resource.DoesResourceExist());
salvage_resource.LoadData();
new_salvage = new SalvageManager(&salvage_resource);
Check_Object(new_salvage);
}
else
new_salvage = new SalvageManager(NULL);
return new_salvage;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SalvageManager*
SalvageManager::MakeNewSalvageManager(const char *salvage_name)
{
SalvageManager *new_salvage;
Resource salvage_resource(salvage_name);
if(salvage_resource.DoesResourceExist())
{
salvage_resource.LoadData();
new_salvage = new SalvageManager(&salvage_resource);
Check_Object(new_salvage);
}
else
new_salvage = new SalvageManager(NULL);
return new_salvage;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::ConstructSalvageStream(
MemoryStream *stream,
NotationFile *notation_file
)
{
Check_Pointer(stream);
Check_Pointer(notation_file);
Page *page = notation_file->GetPage("Salvage");
ChainOf<Note*> *salvage_chain = page->MakeNoteChain("Item");
Check_Object(salvage_chain);
Page::NoteIterator salvage_iterator(salvage_chain);
Note *salvage_entry;
*stream << salvage_chain->GetSize();
while((salvage_entry = salvage_iterator.ReadAndNext()) != NULL)
{
Check_Object(salvage_entry);
const char *salvage_name;
salvage_entry->GetEntry(&salvage_name);
MString salvage_string = salvage_name;
Resource data_list(salvage_string);
Verify(data_list.DoesResourceExist());
salvage_string += "{gameModel}";
Resource salvage_resource(salvage_string);
Verify(salvage_resource.DoesResourceExist());
*stream << salvage_resource.GetResourceID();
*stream << data_list.GetResourceID();
//This is here because they will never have anything here to start...if they do this MUST CHANGE
//Since this name is bullshit and not the real name
*stream << salvage_string;
}
ChainOf<Note*> *mech_chain = page->MakeNoteChain("Mech");
Check_Object(mech_chain);
Page::NoteIterator mech_iterator(mech_chain);
Note *mech_entry;
while((mech_entry = mech_iterator.ReadAndNext()) != NULL)
{
Check_Object(mech_entry);
const char *mech_name;
mech_entry->GetEntry(&mech_name);
MString mech_string = mech_name;
*stream << mech_string;
}
delete mech_chain;
delete salvage_chain;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::Save(MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
SalvagePlug *salvage_item;
SortedChainIteratorOf<SalvagePlug *, int> iterator(&m_salvageList);
*stream << m_totalSalvage;
while((salvage_item = iterator.ReadAndNext()) != NULL)
{
Check_Object(salvage_item);
for(int i=0; i<salvage_item->m_count; i++)
{
*stream << salvage_item->m_salvageID;
*stream << salvage_item->m_dataListID;
*stream << salvage_item->m_salvageName;
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::WriteToText(const char *file_name)
{
NotationFile *salvage_file = new NotationFile(file_name);
Check_Object(salvage_file);
STOP(("THIS IS NOT IMPLEMENTED CORRECTLY"));
Page *page = salvage_file->AddPage("Salvage");
SalvagePlug *salvage_plug;
SortedChainIteratorOf<SalvagePlug *, int> iterator(&m_salvageList);
while((salvage_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(salvage_plug);
Resource salvage_resource(salvage_plug->m_salvageID);
Verify(salvage_resource.DoesResourceExist());
page->AppendEntry("Item", salvage_resource.GetName());
}
salvage_file->Save();
// delete salvage_file;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::GetAndAddComponentSalvage(const char *salvage_string, int number)
{
// MWTable *sub_table;
Check_Object(MWApplication::GetInstance());
Check_Object(MWApplication::GetInstance()->m_subsystemTable);
// sub_table = MWApplication::GetInstance()->m_subsystemTable;
MWTableEntry *sub_entry = MWApplication::GetInstance()->m_subsystemTable->FindEntry(salvage_string);
Check_Object(sub_entry);
Resource model_resource;
Entity::GetGameModelResourceFromDataListID(&model_resource, sub_entry->GetEntryResourceID());
Verify(model_resource.DoesResourceExist());
for(int i=0; i<number; i++)
AddSalvage(model_resource.GetResourceID(),
sub_entry->GetEntryResourceID(),
sub_entry->GetEntryName(),
true
);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::GetAndAddWeaponSalvage(const char *salvage_string, int number)
{
// MWTable *weapon_table;
Check_Object(MWApplication::GetInstance());
Check_Object(MWApplication::GetInstance()->m_weaponsTable);
// weapon_table = MWApplication::GetInstance()->m_weaponsTable;
MWTableEntry *weapon_entry = MWApplication::GetInstance()->m_weaponsTable->FindEntry(salvage_string);
Check_Object(weapon_entry);
Resource model_resource;
Entity::GetGameModelResourceFromDataListID(&model_resource, weapon_entry->GetEntryResourceID());
Verify(model_resource.DoesResourceExist());
for(int i=0; i<number; i++)
AddSalvage(model_resource.GetResourceID(),
weapon_entry->GetEntryResourceID(),
weapon_entry->GetEntryName(),
true
);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::AddSalvage(Subsystem *subsystem, const char *salvage_string, bool is_new)
{
Check_Object(this);
Check_Object(subsystem);
const Subsystem::GameModel *sub_model = subsystem->GetGameModel();
Check_Object(sub_model);
SalvagePlug *salvage_plug;
if((salvage_plug = m_salvageList.Find(sub_model->itemID)) != NULL)
{
salvage_plug->m_count ++;
}
else
{
salvage_plug = new SalvagePlug(subsystem, salvage_string);
m_salvageList.AddValue(salvage_plug, sub_model->itemID);
}
if(is_new)
{
salvage_plug->m_newCount++;
}
m_totalSalvage ++;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::AddSalvage(const ResourceID& salvage_id, const ResourceID& data_list, const char *salvage_string, bool is_new)
{
Check_Object(this);
Resource model_resource(salvage_id);
Verify(model_resource.DoesResourceExist());
const Subsystem::GameModel *sub_model =
Cast_Pointer(Subsystem::GameModel *, model_resource.GetPointer());
Check_Pointer(sub_model);
SalvagePlug *salvage_plug;
if((salvage_plug = m_salvageList.Find(sub_model->itemID)) != NULL)
{
salvage_plug->m_count ++;
}
else
{
salvage_plug = new SalvagePlug(salvage_id, data_list, salvage_string);
m_salvageList.AddValue(salvage_plug, sub_model->itemID);
}
if(is_new)
{
salvage_plug->m_newCount++;
}
m_totalSalvage ++;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::RemoveSalvage(Subsystem *subsystem)
{
Check_Object(this);
Check_Object(subsystem);
const Subsystem::GameModel *sub_model = subsystem->GetGameModel();
Check_Object(sub_model);
SalvagePlug *salvage_plug;
if((salvage_plug = m_salvageList.Find(sub_model->itemID)) != NULL)
{
salvage_plug->m_count --;
if(salvage_plug->m_count <= 0)
{
m_salvageList.Remove(salvage_plug);
delete salvage_plug;
}
m_totalSalvage --;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::RemoveSalvage(const ResourceID& salvage_id)
{
Check_Object(this);
Resource model_resource(salvage_id);
Verify(model_resource.DoesResourceExist());
const Subsystem::GameModel *sub_model =
Cast_Pointer(Subsystem::GameModel *, model_resource.GetPointer());
Check_Pointer(sub_model);
SalvagePlug *salvage_plug;
if((salvage_plug = m_salvageList.Find(sub_model->itemID)) != NULL)
{
salvage_plug->m_count --;
if(salvage_plug->m_count <= 0)
{
m_salvageList.Remove(salvage_plug);
delete salvage_plug;
}
m_totalSalvage --;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SalvageManager::TestInstance()
{
Verify(IsDerivedFrom(DefaultData));
}