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.
438 lines
11 KiB
C++
438 lines
11 KiB
C++
//===========================================================================//
|
|
// File: VehicleInterface_Tool.cpp //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 09/09/98 JSE Inital base class based off of Shadowrun/Adept //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Fasa Interactive //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "MW4Headers.hpp"
|
|
|
|
#include "VehicleInterface.hpp"
|
|
#include "MWTool.hpp"
|
|
#include "MWGUIManager.hpp"
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
VehicleInterface__CreateMessage::ConstructCreateMessage(Script *script)
|
|
{
|
|
Check_Object(script);
|
|
|
|
//
|
|
//--------------
|
|
// Set up stream
|
|
//--------------
|
|
//
|
|
MemoryStream *message_stream = script->messageStream;
|
|
Check_Object(message_stream);
|
|
message_stream->AllocateBytes(sizeof(VehicleInterface__CreateMessage));
|
|
BaseClass::ConstructCreateMessage(script);
|
|
VehicleInterface__CreateMessage *message =
|
|
Cast_Pointer(
|
|
VehicleInterface__CreateMessage*,
|
|
message_stream->GetPointer()
|
|
);
|
|
message->messageLength = sizeof(*message);
|
|
|
|
//
|
|
//---------------------------
|
|
// Point at the notation file
|
|
//---------------------------
|
|
//
|
|
Page *page = script->instancePage;
|
|
Check_Object(page);
|
|
Check_Object(Tool::Instance);
|
|
|
|
//
|
|
//----------------------------------
|
|
//Create the GUI (This is temporary)
|
|
//----------------------------------
|
|
//
|
|
NotationFile gui_file;
|
|
message->guiStreamResourceID = ResourceID::Null;
|
|
if (page->GetEntry("GUIContents", &gui_file))
|
|
{
|
|
//
|
|
//-------------------------------------------------------------
|
|
// Look for the gui stream resource to see if it is up to date
|
|
//-------------------------------------------------------------
|
|
//
|
|
const char *gui_file_name = gui_file.GetFileName();
|
|
Check_Pointer(gui_file_name);
|
|
Resource gui_resource(gui_file_name);
|
|
if (
|
|
gui_resource.DoesResourceExist() &&
|
|
gui_resource.IsResourceUpToDate()
|
|
)
|
|
{
|
|
message->guiStreamResourceID = gui_resource.GetResourceID();
|
|
if (!gui_resource.IsRegistered())
|
|
gui_resource.AddFileDependenciesTo(Resource::ParentFileDependencies);
|
|
}
|
|
else
|
|
{
|
|
FileDependencies gui_deps(*gui_file.GetFileDependencies());
|
|
FileDependencies *parent = Resource::ParentFileDependencies;
|
|
Resource::ParentFileDependencies = &gui_deps;
|
|
|
|
if (MWGUIManager::GetInstance() != NULL)
|
|
{
|
|
Check_Object(MWGUIManager::GetInstance());
|
|
// MWGUIManager::GetInstance()->ReadObjectsFromNotation(gui_file);
|
|
DynamicMemoryStream gui_stream;
|
|
// MWGUIManager::GetInstance()->SaveObjectsToStream(&gui_stream);
|
|
MWGUIManager::GetInstance()->WriteObjectsFromFileToStream(&gui_file, &gui_stream);
|
|
if (gui_stream.GetBytesUsed())
|
|
{
|
|
gui_resource.Save(&gui_stream, &gui_deps);
|
|
Check_Object(&gui_resource);
|
|
message->guiStreamResourceID = gui_resource.GetResourceID();
|
|
if (!gui_resource.IsRegistered())
|
|
gui_resource.AddFileDependenciesTo(&gui_deps);
|
|
}
|
|
else
|
|
{
|
|
message->guiStreamResourceID = ResourceID::Null;
|
|
}
|
|
}
|
|
Resource::ParentFileDependencies = parent;
|
|
}
|
|
}
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
VehicleInterface__GameModel::ConstructGameModel(Script *script)
|
|
{
|
|
Check_Object(script);
|
|
|
|
//
|
|
//--------------
|
|
// Set up stream
|
|
//--------------
|
|
//
|
|
MemoryStream *model_stream = script->modelStream;
|
|
Check_Object(model_stream);
|
|
model_stream->AllocateBytes(sizeof(VehicleInterface__GameModel));
|
|
BaseClass::ConstructGameModel(script);
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
bool
|
|
VehicleInterface__GameModel::ReadAndVerify(
|
|
VehicleInterface__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 =
|
|
BaseClass::ReadAndVerify(
|
|
model,
|
|
attribute_entry,
|
|
data,
|
|
error,
|
|
error_buffer
|
|
);
|
|
//
|
|
//---------------------------
|
|
//Verify all the model values
|
|
//---------------------------
|
|
//
|
|
switch(attribute_entry->attributeID)
|
|
{
|
|
case BRBModeAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
int value = 0;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->brbMode < 0)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]BRBMode=%f}: value must be >= 0!",
|
|
model->brbMode
|
|
);
|
|
result = false;
|
|
}
|
|
break;
|
|
}
|
|
case CameraStartOffsetAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case CameraExternalTargetStartOffset1AttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case CameraExternalTargetStartOffset2AttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case CameraExternalTargetStartOffset3AttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Vector3D value = Vector3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
case CameraStartAngleAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
UnitQuaternion value = UnitQuaternion::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case MaxTargetDistanceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 1000.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->maxTargetDistance <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]MaxTargetDistance=%f}: value must be > 0!",
|
|
model->maxTargetDistance
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
case TurnSpeedZoomModifierYawAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 3.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->turnSpeedZoomModifierYaw <= 0.0f || Small_Enough(model->turnSpeedZoomModifierYaw) ||
|
|
model->turnSpeedZoomModifierYaw >= 10.0f)
|
|
{
|
|
model->turnSpeedZoomModifierYaw = 1.0f / 3.0f;
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TurnSpeedZoomModifierYaw=%f}: value must be > 0!",
|
|
model->turnSpeedZoomModifierYaw
|
|
);
|
|
}
|
|
else
|
|
{
|
|
model->turnSpeedZoomModifierYaw = 1.0f / model->turnSpeedZoomModifierYaw;
|
|
}
|
|
break;
|
|
}
|
|
case TurnSpeedZoomModifierPitchAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 3.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->turnSpeedZoomModifierPitch <= 0.0f || Small_Enough(model->turnSpeedZoomModifierPitch) ||
|
|
model->turnSpeedZoomModifierPitch >= 10.0f)
|
|
{
|
|
model->turnSpeedZoomModifierPitch = 1.0f / 3.0f;
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TurnSpeedZoomModifierPitch=%f}: value must be > 0!",
|
|
model->turnSpeedZoomModifierPitch
|
|
);
|
|
}
|
|
else
|
|
{
|
|
model->turnSpeedZoomModifierPitch = 1.0f / model->turnSpeedZoomModifierPitch;
|
|
}
|
|
break;
|
|
}
|
|
case TurnSpeedZoomModifierTorsoAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 3.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->turnSpeedZoomModifierTorso <= 0.0f || Small_Enough(model->turnSpeedZoomModifierTorso) ||
|
|
model->turnSpeedZoomModifierTorso >= 10.0f)
|
|
{
|
|
model->turnSpeedZoomModifierTorso = 1.0f / 3.0f;
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TurnSpeedZoomModifierTorso=%f}: value must be > 0!",
|
|
model->turnSpeedZoomModifierTorso
|
|
);
|
|
}
|
|
else
|
|
{
|
|
model->turnSpeedZoomModifierTorso = 1.0f / model->turnSpeedZoomModifierTorso;
|
|
}
|
|
break;
|
|
}
|
|
case RotationPerSecondAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Radian value;
|
|
value.angle = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->rotationPerSecond.angle <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]RotationPerSecond=%f}: value must be > 0!",
|
|
model->rotationPerSecond.angle
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
case TranslationPerSecondAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Point3D value = Point3D::Identity;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->translationPerSecond.x <= 0.0f || model->translationPerSecond.y <= 0.0f || model->translationPerSecond.z <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]TranslationPerSecond=%f %f %f}: values must be > 0!",
|
|
model->translationPerSecond.x,
|
|
model->translationPerSecond.y,
|
|
model->translationPerSecond.z
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case DeathTimerAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->deathTimer <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]DeathTimer=%f}: value must be > 0!",
|
|
model->deathTimer
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
case DelayTorsoCenterAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->delayTorsoCenter <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]DelayTorsoCenter=%f}: value must be >= 0!",
|
|
model->deathTimer
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
case MaxSpeedAboveMinTransToTorsoCenterKPHAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
Scalar value = 0.0f;
|
|
attribute_entry->SetValue(model, &value);
|
|
result = true;
|
|
}
|
|
if(model->maxSpeedAboveMinTransToTorsoCenterKPH <= 0.0f)
|
|
{
|
|
_snprintf(
|
|
*error,
|
|
error_buffer,
|
|
"{[GameData]MaxSpeedAboveMinTransToTorsoCenterKPH=%f}: value must be >= 0!",
|
|
model->deathTimer
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
case PlayerAIResourceAttributeID:
|
|
{
|
|
if(!valid_data)
|
|
{
|
|
ResourceID value = ResourceID::Null;
|
|
attribute_entry->SetValue(model, (void *)&value);
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
return result;
|
|
} |