Files
firestorm/Gameleap/code/mw4/Code/MW4/MWGame.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

1247 lines
37 KiB
C++

#include "MW4Headers.hpp"
#include "MWGame.hpp"
#include "MWMission.hpp"
#include "Salvage.hpp"
#include "lancemate.hpp"
#include "MWCampaign.hpp"
#include "MWApplication.hpp"
#include "ScriptErrorHeader.hpp"
#include "MWTable.hpp"
#include "MWDamageObject.hpp"
#include "AI_Groups.hpp"
#include "SearchLight.hpp"
#include <Adept\Tool.hpp>
#include <MissionLang\Resource.h>
#include "..\buildnum\buildnum.h"
extern bool g_bCOOP; // COin OPeration
//#############################################################################
//############################## PilotPlug ##############################
//#############################################################################
void
PilotPlug::SavePilotToStream(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
*stream << m_isLeader;
//Write out the mech plug info
MString mech_plug_name = "";
if(m_mechPlug)
mech_plug_name = m_mechPlug->GetMechName();
*stream << mech_plug_name;
//Write out the lance pilot plug info
MString lance_plug_name = "";
if(m_pilot)
lance_plug_name = m_pilot->m_lancemateName;
*stream << lance_plug_name;
}
//#############################################################################
//############################## MWGame #################################
//#############################################################################
MWGame::MWGame(const char *game_file_name) :
Plug(Plug::DefaultData),
m_lancePilots(NULL, true),
m_mechTable(NULL, true),
m_gameResourceFile(NULL)
{
Check_Pointer(game_file_name);
//
//----------------------------------------------
//We need to open the resource file for our game
//----------------------------------------------
//
//MString res_path = "Resource\\Games\\";
MString res_path = "Resource\\Pilots\\";
res_path += MWApplication::GetInstance()->m_pilotName;
res_path += "\\Games\\";
res_path += game_file_name;
MString res_file = res_path;
res_file += ".mw4";
// MString dep_file = res_path;
// dep_file += ".dep";
Check_Object(ResourceManager::Instance);
ResourceFile *resource_file = ResourceManager::Instance->OpenResourceFile(
(const char *)res_file,
NULL,
GameResourceFileID,
VER_CONTENTVERSION,
false,
false,
false
);
Check_Object(resource_file);
m_gameResourceFile.Add(resource_file);
//
//-------------------------------------------------------------
//We need to create all of our parts with the correct resources
//-------------------------------------------------------------
//
//First check the version resource and verify this is a good save game
ResourceID version_id(GameResourceFileID, VersionResourceID);
Resource version_resource(version_id);
Verify(version_resource.DoesResourceExist());
MString version;
version_resource >> version;
MString curver = CURRENT_BUILD_FULL_STRING;
if (version > curver)
{
PAUSE(("You are loading a game saved by a newer game version. The saved game might not work correctly."));
}
//General Game Data
ResourceID game_data_id(GameResourceFileID, GeneralGameResourceID);
Resource game_data_resource(game_data_id);
Verify(game_data_resource.DoesResourceExist());
LoadGeneralGameData(&game_data_resource);
//Campaign
ResourceID campaign_id(GameResourceFileID, CampaignResourceID);
Resource campaign_resource(campaign_id);
Verify(campaign_resource.DoesResourceExist());
m_campaign = MWCampaign::MakeNewCampaign(campaign_id);
Check_Object(m_campaign);
//Salvage
ResourceID salvage_id(GameResourceFileID, SalvageResourceID);
Resource salvage_resource(salvage_id);
Verify(salvage_resource.DoesResourceExist());
m_salvageManager = SalvageManager::MakeNewSalvageManager(salvage_id);
Check_Object(m_salvageManager);
//Lancemate
ResourceID lancemate_id(GameResourceFileID, LancemateResourceID);
Resource lancemate_resource(lancemate_id);
Verify(lancemate_resource.DoesResourceExist());
m_lancemates = LancemateManager::MakeNewLancemateManager(lancemate_id);
Check_Object(m_lancemates);
//Mission
Resource mission_resource("{Mission}", m_gameResourceFile.GetCurrent());
if(mission_resource.DoesResourceExist())
{
//this tells us that we have an in game save
m_hasInGameSave = true;
}
m_hasInGameSave = false;
//Mech and Lancemate setup
ResourceID game_setup_id(GameResourceFileID, SetupResourceID);
Resource game_setup_resource(game_setup_id);
Verify(game_setup_resource.DoesResourceExist());
//Mech Table
ResourceID mech_table_id(GameResourceFileID, MechTableResourceID);
Resource mech_table_resource(mech_table_id);
Verify(mech_table_resource.DoesResourceExist());
mech_table_resource.Rewind();
CreateMechTable(&mech_table_resource);
//MUST HAPPEN AFTER THE MECH TABLE IS CONSTRUCTED!
game_setup_resource.Rewind();
LoadGameSetup(&game_setup_resource);
MWApplication::GetInstance()->SetDifficultyLevel(m_gameLevel);
m_gameName = game_file_name;
m_currentMechPlug = NULL;
// InitializePilots(4);
//Ok so here we want to react to finishing a mission....because we did at one point and
//we want to reque all movies.
//First check if we have killed anyone
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
PilotPlug *pilot;
while((pilot = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot);
if(pilot->GetPilot())
{
if(pilot->GetPilot()->State() > 1)
{
m_campaign->m_movieManager->ExecuteLancemateReturn(pilot->GetPilot()->m_lancemateName);
}
pilot->GetPilot()->State(LancematePlug::OK);
}
}
//Second see if anyone is returning
//DAVE MUST RETURN STUFF HERE
//Third play all success movies
if(m_campaign->m_lastMissionPlug->m_status == MWCampaign::Completed)
{
MString mission_name = m_campaign->m_lastMissionPlug->m_missionName;
mission_name.StripDirectory();
mission_name.StripExtension();
m_campaign->m_movieManager->ExecuteMissionSuccess(mission_name);
}
m_hasLaunched = false;
m_isNewGame = false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MWGame::MWGame(const char *game_file_name, const char *campaign_name) :
Plug(Plug::DefaultData),
m_lancePilots(NULL, true),
m_mechTable(NULL, true),
m_gameResourceFile(NULL)
{
//
//----------------------------------------------
//We need to open the resource file for our game
//----------------------------------------------
//
MString res_path = "Resource\\Pilots\\";
res_path += MWApplication::GetInstance()->m_pilotName;
res_path += "\\Games\\";
res_path += game_file_name;
MString res_file = res_path;
res_file += ".mw4";
// MString dep_file = res_path;
// dep_file += ".dep";
Check_Object(ResourceManager::Instance);
ResourceFile *resource_file = ResourceManager::Instance->OpenResourceFile(
(const char *)res_file,
NULL,
GameResourceFileID,
VER_CONTENTVERSION,
false,
true,
false
);
Check_Object(resource_file);
m_gameResourceFile.Add(resource_file);
MString campaign_path = campaign_name;
campaign_path.StripExtension();
m_hasInGameSave = false;
m_campaign = MWCampaign::MakeNewCampaign(campaign_name);
Check_Object(m_campaign);
MString salvage_name = campaign_path;
salvage_name += ".salvage";
m_salvageManager = SalvageManager::MakeNewSalvageManager(salvage_name);
Check_Object(m_salvageManager);
MString lancemate_name = campaign_path;
lancemate_name += ".lancemate";
m_lancemates = LancemateManager::MakeNewLancemateManager(lancemate_name);
Check_Object(m_lancemates);
m_mission = NULL;
m_gameLevel = 1;
MWApplication::GetInstance()->SetDifficultyLevel(m_gameLevel);
//
//------------------------------------------------------------
//We need to create slots for all the resources in a save game
//------------------------------------------------------------
//
Resource dependancy_resource((const char *)res_file, m_gameResourceFile.GetCurrent());
DynamicMemoryStream dependancy_stream;
MString dependancy_string = "";
dependancy_stream << dependancy_string;
dependancy_resource.Save(&dependancy_stream, NULL);
Resource version_resource("{Version}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream version_stream;
MString version_string = CURRENT_BUILD_FULL_STRING;
version_stream << version_string;
version_resource.Save(&version_stream, NULL);
Verify(version_resource.GetResourceID().GetRecordID() == VersionResourceID);
Resource game_data_resource("{GameData}", m_gameResourceFile.GetCurrent());
game_data_resource.Save(NULL, NULL);
Verify(game_data_resource.GetResourceID().GetRecordID() == GeneralGameResourceID);
Resource campaign_resource("{Campaign}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream campaign_stream;
m_campaign->Save(&campaign_stream);
campaign_resource.Save(&campaign_stream, NULL);
Verify(campaign_resource.GetResourceID().GetRecordID() == CampaignResourceID);
Resource salvage_resource("{Salvage}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream salvage_stream;
m_salvageManager->Save(&salvage_stream);
salvage_resource.Save(&salvage_stream, NULL);
Verify(salvage_resource.GetResourceID().GetRecordID() == SalvageResourceID);
Resource lancemate_resource("{Lancemates}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream lancemate_stream;
m_lancemates->Save(&lancemate_stream);
lancemate_resource.Save(&lancemate_stream, NULL);
Verify(lancemate_resource.GetResourceID().GetRecordID() == LancemateResourceID);
Resource mission_resource("{Mission}", m_gameResourceFile.GetCurrent());
mission_resource.Save(NULL, NULL);
Verify(mission_resource.GetResourceID().GetRecordID() == MissionResourceID);
Resource game_setup_resource("{GameSetup}", m_gameResourceFile.GetCurrent());
game_setup_resource.Save(NULL, NULL);
Verify(game_setup_resource.GetResourceID().GetRecordID() == SetupResourceID);
Resource mech_table_resource("{MechTable}", m_gameResourceFile.GetCurrent());
mech_table_resource.Save(NULL, NULL);
Verify(mech_table_resource.GetResourceID().GetRecordID() == MechTableResourceID);
m_gameName = game_file_name;
m_currentMechPlug = NULL;
InitializeMechTable(true);
InitializePilots(4);
m_hasLaunched = false;
m_isNewGame = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MWGame::~MWGame()
{
m_lancePilots.DeletePlugs();
m_mechTable.DeletePlugs();
if(m_lancemates)
delete m_lancemates;
if(m_salvageManager)
delete m_salvageManager;
if(m_gameResourceFile.GetCurrent())
delete m_gameResourceFile.GetCurrent();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::CreateMechTable(Stuff::MemoryStream *stream)
{
Check_Pointer(stream);
while(stream->GetBytesRemaining() > 0)
{
MechTablePlug *mech_plug = new MechTablePlug(stream);
Check_Object(mech_plug);
m_mechTable.AddValue(mech_plug, mech_plug->GetMechName());
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SaveMechTable(Stuff::MemoryStream *stream)
{
Check_Pointer(stream);
SortedChainIteratorOf<MechTablePlug *, MString> iterator(&m_mechTable);
MechTablePlug *mech_plug;
while((mech_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(mech_plug);
mech_plug->SaveMechTablePlug(stream);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::ConstructMWGameStream(NotationFile *notation_file, MemoryStream *stream)
{
Check_Pointer(notation_file);
Check_Pointer(stream);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SaveInMissionGame()
{
Check_Object(this);
MString game_file_name = m_gameName;
game_file_name += "(In Game)";
if(m_hasInGameSave)
{
//This means we already have one so overwrite!
SaveMWGame((const char *)game_file_name, true, true);
}
else
{
SaveMWGame((const char *)game_file_name, false, true);
}
m_hasInGameSave = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SaveMWGame(const char *game_file_name, bool overwrite, bool save_mission)
{
Check_Object(this);
Check_Pointer(game_file_name);
//
//----------------------------------------------
//We need to open the resource file for our game
//----------------------------------------------
//
MString res_path = "Resource\\Pilots\\";
res_path += MWApplication::GetInstance()->m_pilotName;
res_path += "\\Games\\";
res_path += game_file_name;
MString res_file = res_path;
res_file += ".mw4";
// MString dep_file = res_path;
// dep_file += ".dep";
//This is written this way because we do not have a save. All Saves work like
//Save As and therefore we must shut down the last file and open a new one. If
//we ever do have a save that overwrites a file of the same name this should
//be removed
// if(m_gameResourceFile)
// {
// Check_Object(m_gameResourceFile);
// m_gameResourceFile->Save();
// delete m_gameResourceFile;
// m_gameResourceFile = NULL;
#if 0
if(overwrite)
{
//We are to delete our last file.
MString old_res_path = "Resource\\Pilots\\";
old_res_path += MWApplication::GetInstance()->m_pilotName;
old_res_path += "\\Games\\";
old_res_path += m_gameName;
MString old_res_file = old_res_path;
old_res_file += ".mw4";
gos_DeleteFile(old_res_file);
}
#endif
// }
#if 0
Check_Object(ResourceManager::Instance);
m_gameResourceFile = ResourceManager::Instance->OpenResourceFile(
(const char *)res_file,
NULL,
GameResourceFileID,
VER_CONTENTVERSION,
false,
true,
false
);
#endif
//
//------------------------------------------------------------
//We need to create slots for all the resources in a save game
//------------------------------------------------------------
//
{
// if(overwrite)
// {
ResourceID dependancy_id(GameResourceFileID, 0);
// Resource dependancy_resource((const char *)res_file, m_gameResourceFile);
Resource dependancy_resource(dependancy_id);
dependancy_resource.ChangeName(res_file);
// }
#if 0
DynamicMemoryStream dependancy_stream;
MString dependancy_string = "";
dependancy_stream << dependancy_string;
dependancy_resource.Save(&dependancy_stream, NULL);
#endif
Resource version_resource("{Version}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream version_stream;
MString version_string = CURRENT_BUILD_FULL_STRING;
version_stream << version_string;
version_resource.Save(&version_stream, NULL);
Verify(version_resource.GetResourceID().GetRecordID() == VersionResourceID);
m_gameLevel = MWApplication::GetInstance()->GetDifficultyLevel();
Resource game_data_resource("{GameData}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream game_data_stream;
SaveGeneralGameData(&game_data_stream);
game_data_resource.Save(&game_data_stream, NULL);
Verify(game_data_resource.GetResourceID().GetRecordID() == GeneralGameResourceID);
Resource campaign_resource("{Campaign}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream campaign_stream;
m_campaign->Save(&campaign_stream);
campaign_resource.Save(&campaign_stream, NULL);
Verify(campaign_resource.GetResourceID().GetRecordID() == CampaignResourceID);
Resource salvage_resource("{Salvage}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream salvage_stream;
m_salvageManager->Save(&salvage_stream);
salvage_resource.Save(&salvage_stream, NULL);
Verify(salvage_resource.GetResourceID().GetRecordID() == SalvageResourceID);
Resource lancemate_resource("{Lancemates}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream lancemate_stream;
m_lancemates->Save(&lancemate_stream);
lancemate_resource.Save(&lancemate_stream, NULL);
Verify(lancemate_resource.GetResourceID().GetRecordID() == LancemateResourceID);
if(save_mission)
{
Resource mission_resource("{Mission}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream mission_stream;
Check_Object(Mission::GetInstance());
Mission::GetInstance()->SaveMakeMessage(&mission_stream, m_gameResourceFile.GetCurrent());
mission_resource.Save(&mission_stream, NULL);
Verify(mission_resource.GetResourceID().GetRecordID() == MissionResourceID);
}
else
{
Resource mission_resource("{Mission}", m_gameResourceFile.GetCurrent());
mission_resource.Save(NULL, NULL);
Verify(mission_resource.GetResourceID().GetRecordID() == MissionResourceID);
m_hasInGameSave = false;
}
Resource game_setup_resource("{GameSetup}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream game_setup_stream;
SaveGameSetup(&game_setup_stream);
game_setup_resource.Save(&game_setup_stream, NULL);
Verify(game_setup_resource.GetResourceID().GetRecordID() == SetupResourceID);
Resource mech_table_resource("{MechTable}", m_gameResourceFile.GetCurrent());
DynamicMemoryStream mech_table_stream;
SaveMechTable(&mech_table_stream);
mech_table_resource.Save(&mech_table_stream, NULL);
Verify(mech_table_resource.GetResourceID().GetRecordID() == MechTableResourceID);
}
m_gameResourceFile.GetCurrent()->SaveAs(res_file);
if(overwrite)
{
//We are to delete our last file.
MString old_res_path = "Resource\\Pilots\\";
old_res_path += MWApplication::GetInstance()->m_pilotName;
old_res_path += "\\Games\\";
old_res_path += m_gameName;
MString old_res_file = old_res_path;
old_res_file += ".mw4";
gos_DeleteFile(old_res_file);
}
if ((char *)m_gameName != game_file_name)
m_gameName = game_file_name;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::Reload()
{
Check_Object(this);
Check_Object(m_gameResourceFile.GetCurrent());
//---------------------------------
//We need to reset all of our parts
//---------------------------------
//
//First check the version resource and verify this is a good save game
ResourceID version_id(GameResourceFileID, VersionResourceID);
Resource version_resource(version_id);
Verify(version_resource.DoesResourceExist());
MString version;
version_resource >> version;
MString curver = CURRENT_BUILD_FULL_STRING;
if (version > curver)
{
PAUSE(("You are loading a game saved by a newer game version. The saved game might not work correctly."));
}
//Campaign
ResourceID campaign_id(GameResourceFileID, CampaignResourceID);
Resource campaign_resource(campaign_id);
Verify(campaign_resource.DoesResourceExist());
m_campaign = MWCampaign::MakeNewCampaign(campaign_id);
Check_Object(m_campaign);
//Salvage
ResourceID salvage_id(GameResourceFileID, SalvageResourceID);
Resource salvage_resource(salvage_id);
Verify(salvage_resource.DoesResourceExist());
m_salvageManager = SalvageManager::MakeNewSalvageManager(salvage_id);
Check_Object(m_salvageManager);
//Lancemate
ResourceID lancemate_id(GameResourceFileID, LancemateResourceID);
Resource lancemate_resource(lancemate_id);
Verify(lancemate_resource.DoesResourceExist());
m_lancemates = LancemateManager::MakeNewLancemateManager(lancemate_id);
Check_Object(m_lancemates);
//Mission
Resource mission_resource("{Mission}", m_gameResourceFile.GetCurrent());
if(mission_resource.DoesResourceExist())
{
//this tells us that we have an in game save
m_hasInGameSave = true;
}
m_hasInGameSave = false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::LoadMWGame(const char *game_file_name)
{
Check_Pointer(game_file_name);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::ReactToEndMission(bool success)
{
Check_Object(this);
Check_Object(m_campaign);
Check_Object(m_campaign->m_currentMissionPlug);
if(m_hasLaunched)
{
//if we have succeded then we must mark the mission a success and save
//We also must check the status of the lancemates(this will be set by their deaths)
Check_Object(MWMission::GetInstance());
MWMission *mission = Cast_Object(MWMission*,MWMission::GetInstance());
EarlyReactToEndMission(); // jcem
m_hasLaunched = false;
int name_index = m_campaign->m_currentMissionPlug->m_displayNameIndex;
MString file_name = MWApplication::GetInstance()->GetLocString(name_index);
if(mission->EndMissionState())
{
//We have succeeded!
m_campaign->MissionSuccess();
char *completed_string = MWApplication::GetInstance()->GetLocString(IDS_COMPLETEDLOC);
file_name += completed_string;
//First run through the mechs and mark the damaged ones to being ready
SortedChainIteratorOf<MechTablePlug *, MString> mech_iterator(&m_mechTable);
MechTablePlug *mech_plug;
while((mech_plug = mech_iterator.ReadAndNext()) != NULL)
{
if(mech_plug->GetStatus() == MechTablePlug::DamagedStatus)
mech_plug->SetStatus(MechTablePlug::ReadyStatus);
}
//Here we should run through and reset damaged mechs to being fixed and set mechs
//to being damaged if the have been damaged in the game past a certain point.
std::vector<MWObject*> members;
MW4AI::Groups::GetLancemates(members, true);
std::vector<MWObject*>::iterator i = members.begin();
int damage_count = 0;
while((i != members.end()) && (damage_count < 2))
{
Mech *lance_mech = Cast_Object(Mech *, *i);
if(lance_mech->IsDestroyed())
{
if (!g_bCOOP) // jcem
lance_mech->m_mechTablePlug->SetStatus(MechTablePlug::DestroyedStatus);
}
else
{
//First check mech damage
MWInternalDamageObject *center_torso = lance_mech->internalDamageObjects.Find(InternalDamageObject::CenterTorsoZone);
if(center_torso)
{
if(center_torso->CanRepair())
{
lance_mech->m_mechTablePlug->SetStatus(MechTablePlug::DamagedStatus);
damage_count ++;
}
}
}
i++;
}
//If we are the last mission then don't save
if(!m_campaign->m_currentMissionPlug->m_doesEnd)
{
//If we have saved in the middle
if(m_hasInGameSave)
SaveMWGame(file_name, true);
else
SaveMWGame(file_name, false);
}
else
{
MWApplication::GetInstance()->m_campaignIsComplete = true;
}
}
else
{
//If we have failed then we need to do a "re-load" to erase all of their failing
//progress.
//We need to write the file out since we opened with an overwrite
// m_gameResourceFile->Save();
MString res_path = "Resource\\Pilots\\";
res_path += MWApplication::GetInstance()->m_pilotName;
res_path += "\\Games\\";
res_path += file_name;
MString res_file = res_path;
res_file += ".mw4";
m_gameResourceFile.GetCurrent()->SaveAs(res_file);
}
// m_campaign->m_currentMissionPlug = NULL;
}
}
void MWGame::EarlyReactToEndMission()
{
MWApplication* app = MWApplication::GetInstance();
if (0 < app->m_nCamp_Stage) {
if(m_hasLaunched)
{
//if we have succeded then we must mark the mission a success and save
//We also must check the status of the lancemates(this will be set by their deaths)
Check_Object(MWMission::GetInstance());
MWMission *mission = Cast_Object(MWMission*,MWMission::GetInstance());
MechTablePlug *mech_plug = MWGame::GetInstance()->GetPilotLeader()->GetMechPlug();
Check_Object(mech_plug);
// from here jcem
if (mission) {
app->m_nCamp_Time += (int)(mission->GetMissionTime() * 1000);
}
app->m_nCamp_Mech = mech_plug->m_mechID;
int nCamp_Stage_Saved = app->m_nCamp_Stage;
app->CheckCampaignEnd(); // jcem - m_nCamp_Stage will be changed...
NotationFile highscore_ini("highscore.ini", NotationFile::Standard, true);
Page *page = highscore_ini.SetPage("single");
Note* pNote = page->SetNote("last");
char sz[100];
sprintf(sz, "%s,%d,%d,%d,%d,%d,%d,%d",
"", // pilot name...
nCamp_Stage_Saved,
app->m_nCamp_Score, app->m_nCamp_Kills, app->m_nCamp_Deaths,
app->m_nCamp_Time, app->m_nCamp_Mech, app->m_bCamp_Success);
pNote->SetEntry(sz);
highscore_ini.Save();
// to here jcem
} else {
// already processed?
#if 0
// from here jcem
NotationFile highscore_ini("highscore.ini", NotationFile::Standard, true);
Page *page = highscore_ini.FindPage("single");
if (page) {
Note* pNote = page->FindNote("last");
if (pNote)
pNote->SetEntry("");
}
highscore_ini.Save();
// from here jcem
#endif
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::StartMission(char *mission_name)
{
Check_Object(this);
//Tell the campaign what the new mission is!
CampaignMissionPlug *mission_plug;
MString mission_path = "content\\missions\\";
mission_path += mission_name;
mission_path += "\\";
mission_path += mission_name;
mission_path += ".instance";
m_hasLaunched = true;
mission_plug = m_campaign->FindMission(mission_path);
Check_Object(mission_plug);
int maxlance,count;
maxlance = mission_plug->m_NumLancemates;
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
PilotPlug *pilot_plug;
count = 0;
while((pilot_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot_plug);
if (count>maxlance)
{
pilot_plug->SetLancePlug (NULL);
}
count++;
}
//Save the mission and overwrite the (Completed) one!
m_campaign->m_currentMissionPlug = mission_plug;
MString game_name = MWApplication::GetInstance()->GetLocString(mission_plug->m_displayNameIndex);
char *completed_string = MWApplication::GetInstance()->GetLocString(IDS_COMPLETEDLOC);
if(strstr((const char *)m_gameName, completed_string))
SaveMWGame((char *)game_name, true);
else
SaveMWGame((char *)game_name, false);
m_currentMechPlug = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::InitializePilots(int num)
{
Check_Object(this);
m_lancePilots.DeletePlugs();
//Create and add the first plug as the player (leader)
PilotPlug *leader_plug = new PilotPlug(NULL, true);
Check_Object(leader_plug);
m_lancePilots.AddValue(leader_plug, 0);
MechTablePlug *mech_plug;
SortedChainIteratorOf<MechTablePlug *, MString> iterator(&m_mechTable);
mech_plug = iterator.GetCurrent();
if(mech_plug)
leader_plug->SetMech(mech_plug);
for(int i=1; i<num; i++)
{
PilotPlug *plug = new PilotPlug(NULL);
Check_Object(plug);
m_lancePilots.AddValue(plug, i);
}
m_currentPilot = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
PilotPlug*
MWGame::GetPilot(int id)
{
Check_Object(this);
Verify(id < m_lancePilots.GetSize());
return m_lancePilots.Find(id);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
MWGame::SetLancemate(int lance_id, char *lance_name)
{
return 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
MWGame::SetLancemateMech(int lance_id, char *mech_name)
{
Check_Object(this);
Check_Pointer(mech_name);
Check_Object(this);
Verify(lance_id >= 0);
MechTablePlug *mech_plug = m_mechTable.Find(mech_name);
PilotPlug *current_pilot_plug = GetPilot(lance_id);
Check_Object(current_pilot_plug);
if(mech_plug)
{
//First we need to see if someone is already him! If so make him ""
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
PilotPlug *pilot_plug;
while((pilot_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot_plug);
if(pilot_plug->GetMechPlug())
{
if(!_stricmp(pilot_plug->GetMechPlug()->GetMechName(), mech_name))
{
pilot_plug->SetMech(NULL);
}
}
}
}
//Then we need to make our new assignment!
current_pilot_plug->SetMech(mech_plug);
return 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SetPilot(int lance_id, const MString& lance_name)
{
Check_Object(this);
Verify(lance_id >= 0);
LancematePlug *lance_plug = m_lancemates->FindLancemate(lance_name);
PilotPlug *current_pilot_plug = GetPilot(lance_id);
Check_Object(current_pilot_plug);
//First we need to see if someone is already him! If so make him ""
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
PilotPlug *pilot_plug;
while((pilot_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot_plug);
if(pilot_plug->GetPilot())
{
if(pilot_plug->GetPilot()->m_lancemateName == lance_name)
{
pilot_plug->SetLancePlug(NULL);
}
}
}
//Then we need to make our new assignment!
current_pilot_plug->SetLancePlug(lance_plug);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
MWGame::VerifyLaunchData()
{
Check_Object(this);
//This is to make sure that the have mechs and such set before clicking launch
PilotPlug *pilot_plug;
int maxlance,count;
maxlance = m_campaign->m_currentMissionPlug->m_NumLancemates;
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
count = 0;
while((pilot_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot_plug);
if (count>maxlance)
{
pilot_plug->SetLancePlug (NULL);
pilot_plug->SetMech(NULL);
}
count++;
}
iterator.First();
while((pilot_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot_plug);
if(pilot_plug->IsPlayer())
{
//we are the player...just verify we have a mech!
if(!pilot_plug->GetMechPlug())
{
return E_NoPlayerMechSelected; //Player does not have a mech assigned
}
}
else
{
//we are a lance...make sure that we have both pilot and mech or none
if(!pilot_plug->GetPilot() && pilot_plug->GetMechPlug())
{
return E_NoLancemateLanceSelected;
}
if(!pilot_plug->GetMechPlug() && pilot_plug->GetPilot())
{
return E_NoLancemateMechSelected;
}
}
}
return 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::GetAndAddMechInstance(const char *salvage_string, int is_new)
{
Check_Pointer(salvage_string);
//First dig out the instance resource of the thing we are adding.
// MWTable *mech_table;
Check_Object(MWApplication::GetInstance());
Check_Object(MWApplication::GetInstance()->m_mechTable);
// mech_table = MWApplication::GetInstance()->m_mechTable;
MWTableEntry *mech_entry = MWApplication::GetInstance()->m_mechTable->FindEntry(salvage_string);
Check_Object(mech_entry);
Resource mech_resource(mech_entry->GetEntryResourceID());
Verify(mech_resource.DoesResourceExist());
//Name the resourece and make sure that it will be unique
char original_name[256];
sprintf(original_name, "%s%d",salvage_string, m_mechTable.GetSize());
Resource new_mech_resource(original_name, m_gameResourceFile.GetCurrent());
new_mech_resource.Save(NULL, NULL);
//Save the resource
mech_resource.Rewind();
// Stuff::FileDependencies dependancies;
// dependancies.AddDependency("");
new_mech_resource.Save(&mech_resource, NULL);
//create an entry in the mech table
MString new_mech_name = original_name;
Mech::CreateMessage *mech_create_message;
mech_create_message = Cast_Pointer(Mech::CreateMessage *, mech_resource.GetPointer());
Resource model_resource;
Entity::GetGameModelResourceFromDataListID(&model_resource, mech_create_message->dataListID);
Mech::GameModel *mech_model = Cast_Pointer(Mech::GameModel *, model_resource.GetPointer());
MechTablePlug *mech_plug = new MechTablePlug(new_mech_resource.GetResourceID(), new_mech_name, mech_model->mechID, is_new);
Check_Object(mech_plug);
m_mechTable.AddValue(mech_plug, mech_plug->GetMechName());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::AddMechInstance(Mech *mech)
{
Check_Object(mech);
//First make the alignment to Player
mech->m_doesHaveInstanceName = true;
mech->m_localizeIndex = -1;
mech->executionState->RequestState(Mech::ExecutionStateEngine::NeverExecuteState);
mech->SetAlignment(Entity::Player);
mech->ReuseArmature();
Resource sub_resource(mech->subsystemStreamResourceID);
Verify(sub_resource.DoesResourceExist());
mech->ReuseSubsystems(&sub_resource);
//Name the resourece and make sure that it will be unique
char original_name[256];
MString model_name = mech->GetModelName();
model_name.StripExtension();
model_name.StripDirectory();
sprintf(original_name, "%s%d",(char*)model_name, m_mechTable.GetSize());
Resource new_mech_resource(original_name, m_gameResourceFile.GetCurrent());
new_mech_resource.Save(NULL, NULL);
DynamicMemoryStream stream;
//Fake it from thinking that it is dead
mech->ClearDestroyedFlag();
mech->SaveMakeMessage(&stream, m_gameResourceFile.GetCurrent());
//Make it dead again.
mech->SetDestroyedFlag(InternalDamageObject::DestructionDamageMode);
stream.Rewind();
Mech::CreateMessage *mech_message = Cast_Pointer(Mech::CreateMessage *, stream.GetPointer());
mech_message->initialAge = 0.0f;
mech_message->teamDecal = 2;
mech_message->pilotDecal = 2;
if(mech->GetSearchLight())
mech->GetSearchLight()->SyncMatrices(true);
//Save the resource
// Stuff::FileDependencies dependancies;
// dependancies.AddDependency("");
new_mech_resource.Save(&stream, NULL);
//create an entry in the mech table
MString new_mech_name = original_name;
const Mech::GameModel *mech_model = mech->GetGameModel();
Check_Object(mech_model);
MechTablePlug *mech_plug = new MechTablePlug(new_mech_resource.GetResourceID(), new_mech_name, mech_model->mechID);
Check_Object(mech_plug);
m_mechTable.AddValue(mech_plug, mech_plug->GetMechName());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::InitializeMechTable(bool new_campaign)
{
Check_Object(m_salvageManager);
ChainIteratorOf<PlugOf<MString>*> iterator(&m_salvageManager->m_mechSalvageNames);
PlugOf<MString> *name_plug;
while((name_plug = iterator.ReadAndNext()) != NULL)
{
Check_Object(name_plug);
if(new_campaign)
GetAndAddMechInstance(name_plug->GetItem(), 0);
else
GetAndAddMechInstance(name_plug->GetItem());
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::LoadGeneralGameData(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
*stream >> m_gameLevel;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SaveGeneralGameData(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
*stream << m_gameLevel;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::LoadGameSetup(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
//This is used to store the last setup of mechs and lances the user had. It will also
//store some other information too.
int i = 0;
// int num_pilots;
// *stream >> num_pilots;
while(stream->GetBytesRemaining() > 0)
{
bool is_leader;
*stream >> is_leader;
PilotPlug *pilot_plug = new PilotPlug(NULL, is_leader);
//Ok I hope that this works right
MString mech_plug_name;
*stream >> mech_plug_name;
if(mech_plug_name)
{
MechTablePlug *mech_plug = m_mechTable.Find(mech_plug_name);
if(mech_plug)
pilot_plug->SetMech(mech_plug);
}
MString lance_plug_name;
*stream >> lance_plug_name;
if(lance_plug_name)
{
LancematePlug *lance_plug = m_lancemates->FindLancemate(lance_plug_name);
if(lance_plug)
pilot_plug->SetLancePlug(lance_plug);
}
m_lancePilots.AddValue(pilot_plug, i);
i++;
}
//Seed the rest so that they are empty.
// for(int j=i; j<num_pilots; j++)
// {
// PilotPlug *pilot_plug = new PilotPlug(NULL, false);
// m_lancePilots.AddValue(pilot_plug, i);
// }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::SaveGameSetup(Stuff::MemoryStream *stream)
{
Check_Object(this);
Check_Pointer(stream);
SortedChainIteratorOf<PilotPlug *, int> iterator(&m_lancePilots);
PilotPlug *pilot;
// *stream << m_lancePilots.GetSize();
while((pilot = iterator.ReadAndNext()) != NULL)
{
Check_Object(pilot);
pilot->SavePilotToStream(stream);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MWGame::ResetSalvageManager()
{
Check_Object(this);
if(m_salvageManager)
delete m_salvageManager;
ResourceID salvage_id(GameResourceFileID, SalvageResourceID);
Resource salvage_resource(salvage_id);
Verify(salvage_resource.DoesResourceExist());
m_salvageManager = SalvageManager::MakeNewSalvageManager(salvage_id);
Check_Object(m_salvageManager);
}