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.
229 lines
6.1 KiB
C++
229 lines
6.1 KiB
C++
//===========================================================================//
|
|
// File: WeaponMover_Tool.cpp
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 09/09/98 JSE Inital base class based off of Shadowrun/Adept
|
|
// 09/25/98 BDB Inital WeaponMover class based off of Vehicle_Tool
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Fasa Interactive //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "MW4Headers.hpp"
|
|
|
|
#include "WeaponMover.hpp"
|
|
#include "MWObject.hpp"
|
|
#include "MWTool.hpp"
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
WeaponMover__GameModel::ConstructGameModel(Script *script)
|
|
{
|
|
Check_Object(script);
|
|
|
|
//
|
|
//--------------
|
|
// Set up stream
|
|
//--------------
|
|
//
|
|
MemoryStream *model_stream = script->modelStream;
|
|
Check_Object(model_stream);
|
|
model_stream->AllocateBytes(sizeof(WeaponMover__GameModel));
|
|
Mover__GameModel::ConstructGameModel(script);
|
|
WeaponMover__GameModel *model =
|
|
Cast_Pointer(WeaponMover__GameModel*, model_stream->GetPointer());
|
|
//
|
|
//------------------------------
|
|
// Set up the model file pointer
|
|
//------------------------------
|
|
//
|
|
NotationFile *model_file = script->modelFile;
|
|
Check_Object(model_file);
|
|
model->hitEffectMaterialTable = ResourceID::Null;
|
|
Page *page = model_file->GetPage("GameData");
|
|
Check_Object(page);
|
|
NotationFile effects_file;
|
|
if (page->GetEntry("HitEffectsFile", &effects_file))
|
|
{
|
|
FileDependencies *old_deps = Resource::ParentFileDependencies;
|
|
FileDependencies effect_deps(*effects_file.GetFileDependencies());
|
|
Resource::ParentFileDependencies = &effect_deps;
|
|
model->hitEffectMaterialTable = MWObject__GameModel::CreateEffectTableResource(&effects_file, MaterialCount);
|
|
Resource::ParentFileDependencies = old_deps;
|
|
old_deps->AddDependencies(&effect_deps);
|
|
}
|
|
model->secondaryHitEffectMaterialTable = ResourceID::Null;
|
|
if (page->GetEntry("SecondaryHitEffectsFile", &effects_file))
|
|
{
|
|
FileDependencies *old_deps = Resource::ParentFileDependencies;
|
|
FileDependencies effect_deps(*effects_file.GetFileDependencies());
|
|
Resource::ParentFileDependencies = &effect_deps;
|
|
model->secondaryHitEffectMaterialTable = MWObject__GameModel::CreateEffectTableResource(&effects_file, MaterialCount);
|
|
Resource::ParentFileDependencies = old_deps;
|
|
old_deps->AddDependencies(&effect_deps);
|
|
}
|
|
|
|
model->m_craterID = -1;
|
|
const char *crater_string;
|
|
if(page->GetEntry("CraterName", &crater_string))
|
|
{
|
|
MString crater_mstring = crater_string;
|
|
model->m_craterID = crater_mstring.GetHashValue();
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
bool
|
|
WeaponMover__GameModel::ReadAndVerify(
|
|
WeaponMover__GameModel *model,
|
|
ModelAttributeEntry *attribute_entry,
|
|
const char *data,
|
|
char **error,
|
|
int error_buffer
|
|
)
|
|
{
|
|
Check_Object(attribute_entry);
|
|
|
|
bool result = false;
|
|
bool valid_data = (*data != '\0');
|
|
|
|
//
|
|
//----------------------------------------
|
|
//Read in the values from the data entered
|
|
//----------------------------------------
|
|
//
|
|
result =
|
|
Mover__GameModel::ReadAndVerify(
|
|
model,
|
|
attribute_entry,
|
|
data,
|
|
error,
|
|
error_buffer
|
|
);
|
|
//
|
|
//---------------------------
|
|
//Verify all the model values
|
|
//---------------------------
|
|
//
|
|
switch(attribute_entry->attributeID)
|
|
{
|
|
case MaxDistanceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 500.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->maxDistance <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]MaxDistance=%f}: value must be > 0!",
|
|
model->maxDistance
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
// MSL 5.03 Min Distance
|
|
// case MinDistanceAttributeID:
|
|
// {
|
|
// if(!valid_data)
|
|
// {
|
|
// Scalar value = 0.0f;
|
|
// attribute_entry->SetValue(model, &value);
|
|
// result = true;
|
|
// }
|
|
// if(model->minDistance < 0.0f)
|
|
// {
|
|
// _snprintf(
|
|
// *error,
|
|
// error_buffer,
|
|
// "{[GameData]MinDistance=%f}: value must be >= 0!",
|
|
// model->minDistance
|
|
// );
|
|
// result = false;
|
|
// }
|
|
// break;
|
|
// }
|
|
case TrailResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case DoesPlaceCraterAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
bool value = false;
|
|
attribute_entry->SetValue(model,&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case HitEffectResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case SecondaryHitEffectResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case DamageDecalResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case LightAmpFlareOutAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->m_lightAmpFlareOut < 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]LightAmpFlareOut=%f}: value must be >= 0!",
|
|
model->m_lightAmpFlareOut
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
return result;
|
|
} |