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

416 lines
10 KiB
C++

//===========================================================================//
// File: Missile.hpp
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 05/27/99 DPB Created File and Initial Functionality
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Fasa Interactive //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "MW4.hpp"
#include "WeaponMover.hpp"
namespace MechWarrior4
{
class Missile;
class MWObject;
//##########################################################################
//########################### Missile::GameModel ######################
//##########################################################################
class Missile__GameModel:
public WeaponMover__GameModel
{
public:
Stuff::Scalar
maxTurnAngle,
maxLiveTime,
thrusterAcceleration;
Stuff::Scalar
proximityFuseDistance;
enum {
MaxTurnAngleAttributeID = WeaponMover__GameModel::NextAttributeID,
ThrusterAccelerationAttributeID,
MaxLiveTimeAttributeID,
ProximityFuseDistanceAttributeID,
NextAttributeID
};
static bool
ReadAndVerify(
Missile__GameModel *model,
ModelAttributeEntry *attribute_entry,
const char *data,
char **error,
int error_buffer = 128
);
static void
ConstructGameModel(Script *script);
};
//##########################################################################
//################## WeaponMover::CreateMessage ######################
//##########################################################################
class Missile__CreateMessage:
public WeaponMover__CreateMessage
{
public:
Adept::ReplicatorID
targetID;
Stuff::Point3D
targetPoint;
Stuff::Scalar
burnTime;
Missile__CreateMessage(
size_t length,
int priority,
int message_flags,
Stuff::RegisteredClass::ClassID class_id,
int replicator_flags,
const ResourceID& instance_id,
const Stuff::LinearMatrix4D &creation_matrix,
Stuff::Scalar age,
int execution_state,
int name_id,
int entity_alignment,
const Stuff::Motion3D &initial_velocity,
const Stuff::Motion3D &initial_acceleration,
Stuff::Scalar damage_amount,
Stuff::Scalar heat_amount,
Stuff::Scalar max_distance,
// MSL 5.03 Min Distance
// Stuff::Scalar min_distance,
const Adept::ReplicatorID& inflicting_id,
Stuff::Scalar splash_radius,
Stuff::Scalar percentage_damage_direct_hit,
Stuff::Scalar min_percentage_damage_sphere,
Stuff::Scalar max_percentage_damage_sphere,
int item_id,
const Adept::ReplicatorID& target_id,
const Stuff::Point3D& target_point,
Stuff::Scalar burn_time
):
WeaponMover__CreateMessage(
length,
priority,
message_flags,
class_id,
replicator_flags,
instance_id,
creation_matrix,
age,
execution_state,
name_id,
entity_alignment,
initial_velocity,
initial_acceleration,
damage_amount,
heat_amount,
max_distance,
// MSL 5.03 Min Distance
// min_distance,
inflicting_id,
splash_radius,
percentage_damage_direct_hit,
min_percentage_damage_sphere,
max_percentage_damage_sphere,
item_id
),
targetID(target_id),
targetPoint(target_point),
burnTime(burn_time)
{}
};
//##########################################################################
//############### Missile::ExecutionStateEngine ######################
//##########################################################################
class Missile__ExecutionStateEngine:
public WeaponMover__ExecutionStateEngine
{
public:
static void
InitializeClass();
static void
TerminateClass();
typedef WeaponMover__ExecutionStateEngine BaseClass;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run-time Construction and Destruction Support
//
public:
typedef Missile__ExecutionStateEngine*
(*Factory)(
Missile *weapon,
FactoryRequest *request
);
static Missile__ExecutionStateEngine*
Make(
Missile *weapon,
FactoryRequest *request
);
protected:
Missile__ExecutionStateEngine(
ClassData *class_data,
Missile *weapon,
FactoryRequest *request
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State stuff
//
public:
enum {
LRMMotionState = WeaponMover__ExecutionStateEngine::StateCount,
SRMMotionState,
MRMMotionState,
SSRMMotionState,
BombMotionState,
LongTomMotionState,
StateCount
};
protected:
static const StateEntry
StateEntries[];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance() const;
};
//##########################################################################
//############################ Missile ###############################
//##########################################################################
//-------------------------------------------------------------------------
// The following helper classes must always be typedef'd or overriden by an
// inheritor
//
typedef WeaponMover__ClassData Missile__ClassData;
typedef WeaponMover__Message Missile__Message;
extern DWORD Executed_Missile_Count;
//----------------------- End of inheritance stuff ------------------------
class Missile:
public WeaponMover
{
public:
static void
InitializeClass();
static void
TerminateClass();
typedef WeaponMover BaseClass;
//##########################################################################
// Inheritance support
//
public:
typedef Missile__ClassData ClassData;
typedef Missile__GameModel GameModel;
typedef Missile__Message Message;
typedef Missile__ExecutionStateEngine ExecutionStateEngine;
typedef Missile__CreateMessage CreateMessage;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run-time Construction and Destruction Support
//
public:
static Missile*
Make(
CreateMessage *message,
ReplicatorID *base_id
);
Missile(
ClassData *class_data,
CreateMessage *message,
ReplicatorID *base_id,
ElementRenderer::Element *element
);
~Missile();
void
Reuse(
const CreateMessage *message,
ReplicatorID *base_id
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Flag Support
//
public:
enum
{
DoesAMSDestroyBit = WeaponMover::NextFlagBit,
NextFlagBit
};
enum
{
DoesAMSDestroyFlag = 1<<DoesAMSDestroyBit
};
bool
DoesAMSDestroy()
{Check_Object(this); return (replicatorFlags&DoesAMSDestroyFlag) != 0;}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Game Model support
//
public:
const GameModel*
GetGameModel()
{return Cast_Pointer(const GameModel*, gameModelResource.GetPointer());}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execution Support
//
public:
void
PreCollisionExecute(Stuff::Time till);
bool
CollisionHandler(
Stuff::LinearMatrix4D *new_position,
Stuff::DynamicArrayOf<CollisionData> *collisions
);
void
PostCollisionExecute(Stuff::Time till);
void
LRMSeekerModel(Stuff::Time till);
void
MRMSeekerModel(Stuff::Time till);
void
SRMSeekerModel(Stuff::Time till);
void
SSRMSeekerModel(Stuff::Time till);
void
LongTomSeekerModel();
void
SeekingThrusterSimulation(Stuff::Time till);
void
UpdateNewLocalToParents(Stuff::Time till);
void
ConveyDistanceToTarget(Stuff::Scalar distance);
void
CreateEffect(const Adept::ResourceID& effect_id);
void
LinearDragMotionSimulation(Stuff::Time till);
void
ProximityCheck(Stuff::Time till);
void
GetTargetCollisionVolume();
Entity*
GetFirstAcceptableParentEntity(Entity* entity);
Entity*
Missile::TraceToParent(Entity *entity);
Stuff::SlotOf<Adept::Entity*>
targetEntity;
Stuff::SlotOf<MWObject *>
targetMWObject;
CollisionVolume *
target_collision_volume;
Stuff::Point3D
targetPoint;
Stuff::Point3D
targetOffsetFromEntity;
Stuff::Point3D
targetPosition;
Stuff::Scalar
timeInAir;
Stuff::Scalar
burnTime;
bool
m_fAllowArcMissile; // used to allow us to not arc for objects like helicoptors
bool
m_fTurnOffSeek; // so that we don't keep seeking a destroyed object, or we don't keep circling
Stuff::Motion3D
lastWorldSpaceVelocity;
int
m_nDoubleTeleportPreventor; // this is used to prevent us from continually teleporting to the same spot.
int
m_nMissCount; // used to prevent constantly circling missiles
Stuff::UnitVector3D
srmPitchVector;
Stuff::Scalar
srmYTargetOffset;
private:
Stuff::Point3D&
CalculateTargetPosition(Stuff::Point3D *new_position, Stuff::Time till);
bool doesAMSDestroyThisFrame;
Adept::ResourceID amsExplosionResource;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance() const;
};
inline
Missile__ExecutionStateEngine::Missile__ExecutionStateEngine(
ClassData *class_data,
Missile *mover,
FactoryRequest *request
):
WeaponMover__ExecutionStateEngine(class_data, mover, request)
{
}
}