Files
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

519 lines
12 KiB
C++

//===========================================================================//
// File: DamageObject.hpp //
// Project: Adept Brick: DamageObject //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 03/08/99 DPB Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1998-1999, Virtual World Entertainment, Inc. //
// PROPRIETARY AND CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "Adept.hpp"
#include "Receiver.hpp"
#include "Entity.hpp"
namespace Adept
{
void __cdecl AdeptDamageSecurityCheckStart(void);
void __cdecl AdeptDamageSecurityCheckStop(void);
extern HGOSHEAP
g_DamageObjectHeap;
// MSL 5.03 Lava
enum
{
BeamDamageType = 0,
MissileDamageType,
ProjectileDamageType,
SplashDamageType,
HeatDamageType,
RammingDamageFromAboveType,
RammingDamageFromBelowType,
RammingDamageFromLeftType,
RammingDamageFromRightType,
RammingDamageFromAheadType,
RammingDamageFromBehindType,
HighExplosiveDamageType,
LavaDamageType,
AmmoFireDamageType
};
class Effect;
class InternalDamageObject;
class Site;
class DamageEffectObject
{
public:
Adept::ResourceID resourceID;
Stuff::Scalar armorPercent;
};
typedef Receiver__ClassData InternalDamageObject__ClassData;
typedef Receiver__Message InternalDamageObject__Message;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Internal Damage Object class
//
class InternalDamageObject:
public Receiver
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Inheritance Support
//
public:
typedef InternalDamageObject__ClassData ClassData;
typedef InternalDamageObject__Message Message;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
static void
InitializeClass();
static void
TerminateClass();
static void
ConstructInternalDamageObjectStream(
Stuff::MemoryStream *stream,
Stuff::Page *instance_page,
Stuff::RegisteredClass::ClassID class_id = DefaultData->GetClassID()
);
virtual void
Save(MemoryStream *stream,
Stuff::RegisteredClass::ClassID class_id = DefaultData->GetClassID());
InternalDamageObject(
ClassData *class_data,
Stuff::MemoryStream *stream
);
~InternalDamageObject();
void
Reuse();
void
TestInstance();
void*
operator new(size_t);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Simulation support
//
public:
virtual Scalar
TakeDamage(Stuff::Scalar damage_taken, Entity__TakeDamageMessage *message);
virtual void
InflictCriticalHit()
{}
ResourceID
GetDamageEffectID();
void
PlayDamageEffects(Entity__TakeDamageMessage *message);
Stuff::Scalar
baseInternalDamage,
currentInternalDamage;
Scalar *m_HitPointPointer;
void SetHitPointPointer (Scalar *m_HitPoints)
{ m_HitPointPointer = m_HitPoints; }
Stuff::DynamicArrayOf<DamageEffectObject>
damageEffects;
ResourceID
currentDamageEffectResourceID;
Effect
*currentDamageEffect;
// visual damage types..
// currently we only use
// normal and destroyed
// normal = regular geometry
// damaged = darkened
// destroyed = destroyed geometry
// desimated = no geometry
// this is for network support
enum {
NoDamage = 0,
Damaged,
Destroyed,
Desimated
};
int GetCurrentDamageLevel();
void SetCurrentDamageLevel(int level);
Scalar GetHighResDamageLevel();
void SetHighResDamageLevel(Scalar damage_percentage);
void SilentDestruction();
bool CanRepair()
{Check_Object(this); return GetCurrentDamageLevel() == Damaged;}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Entity Interaction Support
//
public:
enum {
GeneralDamageMode = 0,
GimpLeftDamageMode,
GimpRightDamageMode,
DestructionDamageMode,
DetachableDamageMode,
EngineDamageMode,
NextDamageMode,
// MSL 5.02 headshot
HeadShotDamageMode,
// MSL 5.03 Gyro Hit
GyroHitDamageMode,
// MSL 5.05 Torso
TorsoLeftDamageMode,
TorsoRightDamageMode,
ArmLeftDamageMode,
ArmRightDamageMode,
};
enum {
NullZone=-1,
LeftLegZone = 0, //Mech pieces must follow default zone
RightLegZone,
LeftArmZone,
RightArmZone,
RightTorsoZone,
LeftTorsoZone,
CenterTorsoZone,
HeadZone,
SpecialZone1,
SpecialZone2,
VehicleHullZone, //All Vehicle and non-mech zones must be after the specials
VehicleWeaponZone,
VehicleSpecialZone,
DefaultZone,
NextDamageZone
};
enum{
StandardInternal = 0,
EndoSteelInternal,
TypeCount
};
enum{
DefaultInternalType = StandardInternal
};
void
Initialize(Entity *entity);
static int
DamageModeTextToAscii(const char *mode_name);
static const char *
DamageModeAsciiToText(int damage_mode);
static int
InternalZoneTextToAscii(const char *mode_name);
static const char *
InternalZoneAsciiToText(int internal_zone);
void
SetType(int new_type);
Entity
*parentEntity;
InternalDamageObject
*damagePropagationObject;
int
damagePropagationZoneID;
int
damageMode;
int
damageZone;
MString
parentEntityName;
Stuff::Time
m_firstHitTime;
// MSL 5.02 headshot
bool
m_headShotFlag; //damage mode is really head shot damage mode when true.
// MSL 5.03 Gyro Hit
bool
m_gyrohitFlag; //damage mode is really head shot damage mode when true.
int
m_internalType;
//Used only if we are a special zone.
int
m_specialConnectedTo;
Site*
GetNextWeaponSite();
Site*
GetNextEjectSite();
Stuff::SortedChainOf<Site *, MString> m_sites;
// The same sites were being returned for each call. The iterators
// are now seperated into a weapon port iterator and and eject port
// iterator. Added this change to Vengeance, too --CBT 1/10/2002
Stuff::SortedChainIteratorOf<Site *, MString> m_weaponSiteIterator;
Stuff::SortedChainIteratorOf<Site *, MString> m_ejectionSiteIterator;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// The following helper classes must always be typedef'd or overriden by an
// inheritor
//
typedef Receiver__ClassData DamageObject__ClassData;
typedef Receiver__Message DamageObject__Message;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class DamageObject:
public Receiver
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Inheritance Support
//
public:
typedef DamageObject__ClassData ClassData;
typedef DamageObject__Message Message;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
static void
InitializeClass();
static void
TerminateClass();
static void
ConstructDamageObjectStream(
Stuff::MemoryStream *stream,
Stuff::Page *instance_page
);
virtual void
Save(MemoryStream *stream);
DamageObject(
ClassData *class_data,
Stuff::MemoryStream *stream
);
~DamageObject();
void Reuse();
void
TestInstance();
void*
operator new(size_t);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Simulation support
//
public:
virtual void
TakeDamage(Entity__TakeDamageMessage *message, Entity *entity_hit);
Stuff::Scalar
baseArmorValue,
currentArmorValue,
scaleSplashDamage,
maxArmorValue;
enum {
NullArmorZone=-1,
LeftLegArmorZone = 0,
RightLegArmorZone,
LeftArmArmorZone,
RightArmArmorZone,
RightTorsoArmorZone,
LeftTorsoArmorZone,
CenterTorsoArmorZone,
CenterRearTorsoArmorZone,
HeadArmorZone,
SpecialArmorZone1,
SpecialArmorZone2,
DefaultArmorZone
};
static int
ArmorZoneTextToAscii(const char *armor_name);
static const char *
ArmorZoneAsciiToText(int armor_zone);
enum {
NoArmorDamage = 0,
PartialArmorDamage,
MediumArmorDamage,
BadArmorDamage,
ArmorDestroyedDamage,
InternalDestroyedDamage
};
enum{
StandardArmor = 0,
FerroFiberusArmor,
ReactiveArmor,
ReflectiveArmor,
SolarianArmor,
TypeCount
};
enum{
DefaultArmorType = StandardArmor
};
// visual damage types..
// currently we only use
// normal and destroyed
// normal = regular geometry
// damaged = darkened
// destroyed = destroyed geometry
// desimated = no geometry
// this is for network support
enum {
NoDamage = 0,
Damaged,
Destroyed,
Desimated
};
int GetCurrentDamageLevel();
void SetCurrentDamageLevel(int level);
// Fix Bug #3100
// Damage Object are now refreshed when a mech sustains internal damage
void RefreshCurrentDamageLevel();
Scalar GetHighResDamageLevel();
void SetHighResDamageLevel(Scalar damage_percentage);
void SilentDestruction();
bool CanRepair();
public:
enum {
DmgModifier_Default = 0,
DmgModifier_Splash,
DmgModifier_Count,
};
protected:
// from here by jcem
Stuff::Scalar m_aDamageModifier[DmgModifier_Count * 2]; // (Modifier & Safety)*
// to here by jcem
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Entity Interaction Support
//
public:
// from here by jcem
Stuff::Scalar GetDamageModifier (int nIdx) const;
void SetDamageModifier (int nIdx, Stuff::Scalar newvalue);
// to here by jcem
void
Initialize(Entity *entity);
void
SetDamageArrayEntry(int *array_entry)
{Check_Object(this); damageArrayEntry = array_entry;}
void
SetArmorArrayEntry(Scalar *array_entry)
{Check_Object(this); armorArrayEntry = array_entry;}
int
DetermineDamageLevel();
void
SetType(int new_type);
void
AppendArmor(Stuff::Scalar additive_armor);
Entity
*parentEntity;
InternalDamageObject
*internalDamageObject;
int
internalDamageObjectID;
MString
damageObjectName;
int
armorZone;
int
*damageArrayEntry;
Scalar *armorArrayEntry;
Scalar *m_HitPointPointer;
void SetHitPointPointer (Scalar *m_HitPoints)
{ m_HitPointPointer = m_HitPoints; }
int
damageLevel;
Scalar armorLevel;
int
m_armorType;
int
m_specialConnectedToZone;
//
// There is a problem when splash damage hits multiple entities that share a single damage zone.
//
bool
m_fTakenDamageFromThisEvent;
void
SetTakenDamageFromThisEvent() {m_fTakenDamageFromThisEvent = true;}
void
ClearTakenDamageFromThisEvent() {m_fTakenDamageFromThisEvent = false;}
bool
GetTakenDamageFromThisEvent() {return m_fTakenDamageFromThisEvent;}
public:
void RefrehDamageState(); // jcem
void RepairDamage(Scalar fRepair);
};
}