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

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;
}