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

241 lines
7.1 KiB
C++

//===========================================================================//
// File: SRMWeaponSubsystem.cpp
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 05/18/99 DPB Created File
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Fasa Interactive //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include "MW4Headers.hpp"
#include "SRMWeaponSubsystem.hpp"
#include "Missile.hpp"
#include "MWObject.hpp"
#include "SubsystemClassData.hpp"
#include <Adept\Map.hpp>
#include <Adept\Site.hpp>
#include <MLR\MLRTexturePool.hpp>
//#############################################################################
//############################ SRMWeaponSubsystem #########################
//#############################################################################
SRMWeaponSubsystem::ClassData*
SRMWeaponSubsystem::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SRMWeaponSubsystem::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
SRMWeaponSubsystemClassID,
"MechWarrior4::SRMWeaponSubsystem",
MissileWeapon::DefaultData,
0, NULL,
(Entity::Factory)Make,
(Entity::CreateMessage::Factory)CreateMessage::ConstructCreateMessage,
ExecutionStateEngine::DefaultData,
(Entity::GameModel::Factory)GameModel::ConstructGameModel,
NULL,
(Entity::GameModel::ReadAndVerifier)GameModel::ReadAndVerify,
(Entity::GameModel::ModelWrite)GameModel::WriteToText,
(Entity::GameModel::ModelSave)GameModel::SaveGameModel,
(Subsystem::StreamCreate)CreateStream
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SRMWeaponSubsystem::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SRMWeaponSubsystem*
SRMWeaponSubsystem::Make(
CreateMessage *message,
ReplicatorID *base_id
)
{
Check_Object(message);
gos_PushCurrentHeap(Heap);
SRMWeaponSubsystem *new_entity =
new SRMWeaponSubsystem(DefaultData, message, base_id, NULL);
gos_PopCurrentHeap();
Check_Object(new_entity);
return new_entity;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SRMWeaponSubsystem::SRMWeaponSubsystem(
ClassData *class_data,
CreateMessage *message,
ReplicatorID *base_id,
ElementRenderer::Element *element
):
MissileWeapon(class_data, message, base_id, element)
{
Check_Pointer(this);
Check_Object(message);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
SRMWeaponSubsystem::~SRMWeaponSubsystem()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SRMWeaponSubsystem::CreateProjectile(Time till)
{
Check_Object(this);
const GameModel *model = GetGameModel();
Check_Object(model);
if(model->projectileModelResource != ResourceID::Null)
{
//
//---------------------------------
//Get the ClassID from the Resource
//---------------------------------
//
ClassID class_ID;
class_ID = GetClassIDFromDataListID(model->projectileModelResource);
Verify(class_ID != NullClassID);
ReplicatorID site_id = ReplicatorID::Null;
Normal3D target_normal;
Motion3D initial_velocity = Motion3D::Identity;
Motion3D initial_acceleration = Motion3D::Identity;
LinearMatrix4D site_local_to_world;
//--------------------------------
//Initialize the velocities
//--------------------------------
//
Check_Object(sitePointer);
site_local_to_world = sitePointer->GetLocalToWorld();
// Check_Object(sitePointer);
// site_local_to_world = sitePointer->GetLocalToWorld();
// MSL 5.02 SRM Tracking
initial_velocity.linearMotion.Multiply(
model->initialLinearVelocity,
site_local_to_world
);
initial_acceleration.linearMotion = model->initialLinearAcceleration;
ReplicatorID target_id;
target_id = ReplicatorID::Null;
Point3D target_point;
Entity *ray_source = targetQueryEntity.GetCurrent();
if(ray_source)
{
Check_Object(ray_source);
target_id = ray_source->GetReplicatorID();
// Point3D trans;
// targetQuery.m_line->FindEnd(&trans);
// target_point.MultiplyByInverse(
// trans,
// ray_source->GetLocalToWorld()
// );
// MSL 5.02 SRM Tracking
target_point = m_lockedTargetEntityPartOffset;
}
else
{
targetQuery.m_line->FindEnd(&target_point);
}
// MSL 5.02 SRM Tracking
// Vector3D direction;
// direction.Subtract(target_point,(Stuff::Point3D)site_local_to_world);
// LinearMatrix4D direction_matrix = LinearMatrix4D::Identity;
// direction_matrix.BuildTranslation((Stuff::Point3D)site_local_to_world);
// direction_matrix.AlignLocalAxisToWorldVector(direction, Z_Axis, Y_Axis, X_Axis);
// initial_velocity.linearMotion.Multiply(model->initialLinearVelocity, direction_matrix);
//
//------------------------------------
//Create the Missile CreateMessage
//------------------------------------
//
// MSL 5.02 SRM Tracking
int flags = WeaponMover::DefaultFlags;
if(numberEffectedByAMS > 0)
{
numberEffectedByAMS --;
flags |= Missile::DoesAMSDestroyFlag;
}
Missile::CreateMessage projectile_create_message(
sizeof(Missile::CreateMessage),
DefaultEventPriority,
CreateMessage::DefaultFlags,
class_ID,
flags,
// WeaponMover::DefaultFlags,
model->projectileModelResource,
// direction_matrix,
sitePointer->GetLocalToWorld(),
0.0f,
Missile::ExecutionStateEngine::SSRMMotionState,
NameTable::NullObjectID,
Entity::DefaultAlignment,
initial_velocity,
initial_acceleration,
model->damageAmount,
model->heatToDeal,
model->maxDistance,
// MSL 5.03 Min Distance
// model->minDistance,
GetParentVehicle()->GetReplicatorID(),
model->splashRadius,
model->percentageOfDamageToDirectHit,
model->minPercentageOfDamageToSphereHit,
model->maxPercentageOfDamageToSphereHit,
model->itemID,
target_id,
target_point,
model->burnTime
);
MemoryStream stream(&projectile_create_message, projectile_create_message.messageLength);
Entity *entity;
ReplicatorID projectile_id = Connection::Hermit->GetNextReplicatorID();
entity = CreateEntity(&stream, &projectile_id, false);
Check_Object(entity);
Map::GetInstance()->AddChild(entity);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SRMWeaponSubsystem::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}