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.
321 lines
7.5 KiB
C++
321 lines
7.5 KiB
C++
//===========================================================================//
|
|
// File: ProjectileWeapon_Tool.cpp
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 09/09/98 JSE Inital base class based off of Shadowrun/Adept
|
|
// 09/24/98 BDB Inital Weapon subsystem class based off of Subsystem_Tool.cpp
|
|
// 10/19/98 BDB Created LauchedWeapon subsytem based off of Weapon //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Fasa Interactive //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "MW4Headers.hpp"
|
|
|
|
#include "ProjectileWeapon.hpp"
|
|
#include "MWTool.hpp"
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
ProjectileWeapon__GameModel::ConstructGameModel(Script *script)
|
|
{
|
|
Check_Object(script);
|
|
|
|
//
|
|
//--------------
|
|
// Set up stream
|
|
//--------------
|
|
//
|
|
MemoryStream *model_stream = script->modelStream;
|
|
Check_Object(model_stream);
|
|
model_stream->AllocateBytes(sizeof(ProjectileWeapon__GameModel));
|
|
Weapon__GameModel::ConstructGameModel(script);
|
|
#if 0
|
|
ProjectileWeapon__GameModel *model =
|
|
Cast_Pointer(ProjectileWeapon__GameModel*, model_stream->GetPointer());
|
|
|
|
//
|
|
//------------------------------------
|
|
// Set up the The Beam Entity Resource
|
|
//------------------------------------
|
|
//
|
|
NotationFile *model_file = script->modelFile;
|
|
Check_Object(model_file);
|
|
Check_Object(Tool::Instance);
|
|
Tool::Instance->PushFilePath(model_file);
|
|
|
|
model->projectileModelID = ResourceID::Null;
|
|
const char *projectile_entity_name;
|
|
if(model_file->GetEntry("GameData", "ProjectileResource", &projectile_entity_name))
|
|
{
|
|
Resource projectile_resource;
|
|
Tool::Instance->ConstructDataList(&projectile_resource, projectile_entity_name);
|
|
Check_Object(&projectile_resource);
|
|
Verify(projectile_resource.DoesResourceExist());
|
|
model->projectileModelID = projectile_resource.GetResourceID();
|
|
}
|
|
|
|
Tool::Instance->PopFilePath();
|
|
#endif
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
bool
|
|
ProjectileWeapon__GameModel::ReadAndVerify(
|
|
ProjectileWeapon__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 =
|
|
Weapon__GameModel::ReadAndVerify(
|
|
model,
|
|
attribute_entry,
|
|
data,
|
|
error,
|
|
error_buffer
|
|
);
|
|
//
|
|
//---------------------------
|
|
//Verify all the model values
|
|
//---------------------------
|
|
//
|
|
switch(attribute_entry->attributeID)
|
|
{
|
|
case FireRateAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 1.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->fireRate <= 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]FireRate=%f}: value must be > 0!",
|
|
model->fireRate
|
|
);
|
|
result = false;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case InitialLinearVelocityAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->initialLinearVelocity.x < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]InitialLinearVelocity=%f %f %f}: value must be > 0!",
|
|
model->initialLinearVelocity.x,
|
|
model->initialLinearVelocity.y,
|
|
model->initialLinearVelocity.z
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case InitialLinearAccelerationAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if ((model->initialLinearAcceleration.x < 0) ||
|
|
(model->initialLinearAcceleration.z < 0))
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]InitialLinearAcceleration=%f %f %f}: value must be > 0!",
|
|
model->initialLinearAcceleration.x,
|
|
model->initialLinearAcceleration.y,
|
|
model->initialLinearAcceleration.z
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case ProjectileModelResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case TargetLockTimeAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->targetLockTime < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TargetLockTime=%f}: value must be >= 0!",
|
|
model->targetLockTime
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case TimeToPotentialJamAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_timeToPotentialJam < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TimeToPotentialJam=%f}: value must be >= 0!",
|
|
model->m_timeToPotentialJam
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case TimeToJamAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_timeToJam < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TimeToJam=%f}: value must be >= 0!",
|
|
model->m_timeToJam
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case TimeToUnjamAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_timeToUnjam < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TimeToUnjam=%f}: value must be >= 0!",
|
|
model->m_timeToUnjam
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case HeatToJamAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 66.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_heatToJam < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]HeatToJam=%f}: value must be >= 0!",
|
|
model->m_heatToJam
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case HeatToUnjamAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_heatToUnjam < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]HeatToUnjam=%f}: value must be >= 0!",
|
|
model->m_heatToUnjam
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case TimeToAmmoBayAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 7.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if (model->m_timeToAmmoBay < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TimeToAmmoBay=%f}: value must be >= 0!",
|
|
model->m_timeToAmmoBay
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
return result;
|
|
}
|