Files
BT412/engine/MUNGA/VDATA.h
T
arcattackandClaude Opus 4.8 7b7d465e5e Initial commit: bt411 -- standalone Windows BattleTech (Tesla 4.10 port)
Clean, self-contained extraction of the BattleTech-specific work from the
reverse-engineering workspace -- engine + game + content + build, with nothing
from Red Planet or the raw archive dumps. Builds green (Win32) and runs the
single-player drive->animate->target->fire->damage->destroy loop out of the box.

Layout:
  engine/   MUNGA + MUNGA_L4 shared 2007 engine, carrying our BT render/loader
            work (bgfload/L4D3D/L4VIDEO: BSL bit-slice decode, LOD/ground/shadow
            models) + image codec; the minimal rp/ headers the audio HAL needs
  game/     reconstructed BT logic + surviving-original BT source + fwd shims
            + WinMain launcher
  content/  full runtime tree (BTL4.RES, VIDEO/, GAUGE/, AUDIO/, eggs, BTDPL.INI)
  docs/     format specs + reconstruction ledgers
  reference/ raw Ghidra pseudocode (recon source-of-truth) + decomp exporter
  tools/    MP console emulator + map/resource scanners

One top-level CMake builds munga_engine lib + bt410_l4 game lib + btl4.exe.
All paths relativized (186 fwd shims + ~437 CMake abs paths -> repo-relative);
DXSDK is the one external, overridable via -DDXSDK. Verified: builds to a
byte-identical 2.27MB exe and runs combat (TARGET DESTROYED, 0 crashes) against
the bundled content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:03:40 -05:00

303 lines
6.6 KiB
C++

#pragma once
#include "memstrm.h"
class CString;
class ObjectStream;
class NameList;
typedef unsigned long ObjectID;
const ObjectID NullObjectID = 0;
typedef unsigned long RegisteredClassMemoryAddress;
class RegisteredClass SIGNATURED
{
public:
enum ClassID
{
//
//--------------
// Munga classes
//--------------
//
NullClassID = -1,
TrivialClassID = 0,
TrivialPlugClassID,
TrivialNodeClassID,
TrivialComponentClassID,
AttributeWatcherOfClassID,
ReceiverAttributeWatcherOfClassID,
MessageTapClassID,
DerivationClassID,
TrivialReceiverClassID,
EventClassID,
NetworkEventClassID,
GeneralEventQueueClassID,
EventQueueClassID,
DeferredEventQueueClassID,
TrivialModelClassID,
TrivialSubsystemClassID,
TrivialEntityClassID,
NetworkManagerClassID,
EntityManagerClassID,
EntityAttributeHandlerReferenceClassID,
PersistentReferenceClassID,
InterestManagerClassID,
HostManagerClassID,
ControlsInstanceClassID,
ControlsMappingGroupClassID,
ControlsOwnerClassID,
ControlsManagerClassID,
TrivialMoverClassID,
AudioStateTriggerClassID,
AudioMotionScaleClassID,
AudioRendererClassID,
AudioLocationClassID,
ApplicationClassID,
EntityGroupClassID,
GaugeConnectionClassID,
GaugeClassID,
GaugeRendererClassID,
CollisionAssistantClassID,
RendererManagerClassID,
AudioMotionTriggerClassID,
AudioMotionRandomTriggerClassID,
TerrainClassID,
UnscalableTerrainClassID,
AudioControlMixerClassID,
AudioHingeScaleClassID,
AudioControlSmootherClassID,
AudioControlMultiplierClassID,
AudioResourceSelectorClassID,
DropZoneClassID,
ExplosionClassID,
PlayerClassID,
JointSubsystemClassID,
AudioResourceIndexClassID,
AudioScalarScaleClassID,
AudioControlSendClassID,
GaugeEntityListClassID,
DirectControlsInstanceClassID,
EventControlsInstanceClassID,
AudioSampleAndHoldClassID,
AudioScalarTriggerClassID,
AudioEnumerationTriggerClassID,
AudioIntegerTriggerClassID,
AudioLogicalTriggerClassID,
EyeCandyClassID,
WarehouseObjectClassID,
WarehouseBinClassID,
AudioControlsButtonTriggerClassID,
IcomClassID,
IcomManagerClassID,
CameraShipClassID,
CameraDirectorClassID,
ExplosionResourceTableClassID,
ApplicationTaskClassID,
AudioIdleWatcherClassID,
AudioControlEventClassID,
AudioControlSequenceClassID,
AudioControlSplitterClassID,
ApplicationManagerClassID,
DamageZoneClassID,
AudioLFOClassID,
AudioEnumerationDeltaTriggerClassID,
AudioScalarDeltaTriggerClassID,
ControlsStringClassID,
ControlsStringManagerClassID,
AudioEntityClassID,
AudioLevelOfDetailClassID,
LandmarkClassID,
ScenarioRoleClassID,
TeamClassID,
AudioMessageWatcherClassID,
AudioControlsButtonMessageWatcherClassID,
GaugeAlarmManagerClassID,
GaugeAlarmClassID,
LightClassID,
CulturalIconClassID,
DoorFrameClassID,
DoorClassID,
//
//---------------------------------
// Class ID's for Munga LBE classes
//---------------------------------
//
L4AudioLocationClassID = 1000,
DirectPatchSourceClassID,
Dynamic3DPatchSourceClassID,
L4ApplicationClassID,
PatchResourceClassID,
Static3DPatchSourceClassID,
L4AudioCollisionTriggerClassID,
L4GaugeImageManagerClassID,
L4ControlsManagerClassID,
L4IcomClassID,
L4IcomManagerClassID,
PatchLevelOfDetailClassID,
//
//----------------------
// Class ID's for RP
//----------------------
//
RPL4ApplicationClassID = 2000,
VTVClassID,
RivetClassID,
DemolitionPackClassID,
BoosterClassID,
RivetGunClassID,
LaserDrillClassID,
DemolitionPackDropperClassID,
ChuteClassID,
ScoreZoneClassID,
VTVPowerClassID,
ThrusterClassID,
ControlsMapperClassID,
CrusherClassID,
BlockerClassID,
RunnerClassID,
RPDirectorClassID,
RPTeamClassID,
RPPlayerClassID,
//
//------------------
// Class ID's for BT
//------------------
//
BTL4ApplicationClassID = 3000,
MechClassID,
MissileClassID,
MechSubsystemClassID,
HeatableSubsystemClassID,
CondenserClassID,
HeatSinkClassID,
HeatWatcherClassID,
ReservoirClassID,
GeneratorClassID,
PoweredSubsystemClassID,
SensorClassID,
GyroscopeClassID,
TorsoClassID,
MyomersClassID,
CapacitorClassID,
EmitterClassID,
LaserClassID,
ParticleCannonClassID,
AmmoBinClassID,
AmmoFeederClassID,
ProjectileWeaponClassID,
GaussRifleClassID,
BallisticWeaponClassID,
MissileLauncherClassID,
ProjectileClassID,
SeekerClassID,
SubsystemMessageManagerClassID,
PPCClassID,
PowerWatcherClassID,
HUDClassID,
RadarClassID,
SearchlightClassID,
ThermalSightClassID,
BTTeamClassID,
BTPlayerClassID,
BTDirectorClassID,
MechTechClassID,
TurretClassID,
//
//------------------
// Class ID's for ND
//------------------
//
NDL4ApplicationClassID = 4000,
AirplaneClassID,
BulletClassID,
MachineGunClassID,
NDDirectorClassID,
NDTeamClassID,
NDPlayerClassID,
//
//----------------------
// Class ID's for Tools
//----------------------
//
ShapeClassID = 60000,
ShapeGroupListClassID,
ShapeGroupClassID,
ShapePlaneClassID,
ShapePolygonClassID,
ShapeLineClassID,
ShapePointClassID,
VertexReferenceClassID,
VertexClassID,
MaterialLibraryClassID,
MaterialReferenceClassID,
MaterialClassID,
TargaImageClassID,
ShapeListClassID,
SkeletonClassID,
SkeletonJointClassID,
SkeletonSiteClassID,
SkeletonSegmentClassID,
ModelClassID,
//
//---------------------------------
// Class ID's for Munga W4 classes
//---------------------------------
//
W4ApplicationClassID = 70000,
W4ControlsManagerClassID,
//
//-------------
// end of list
//-------------
//
MaxClassID
};
public:
RegisteredClass(ClassID class_id = TrivialClassID);
RegisteredClass(ObjectStream *stream);
virtual ~RegisteredClass();
Logical TestInstance() const;
public:
ClassID GetClassID();
static ClassID GetClassID(const CString &class_name_string);
RegisteredClassMemoryAddress GetMemoryAddress();
public:
static void BuildFromPage(ObjectStream *stream, NameList *name_list, ClassID class_ID, ObjectID object_ID);
private:
ClassID classID;
};
inline RegisteredClass::ClassID RegisteredClass::GetClassID()
{
Check(this);
return classID;
}
inline RegisteredClassMemoryAddress RegisteredClass::GetMemoryAddress()
{
Check(this);
return (RegisteredClassMemoryAddress)this;
}
inline MemoryStream& MemoryStream_Read(MemoryStream* stream, RegisteredClass::ClassID *output)
{ return stream->ReadBytes(output, sizeof(*output)); }
inline MemoryStream& MemoryStream_Write(MemoryStream* stream, const RegisteredClass::ClassID *input)
{ return stream->WriteBytes(input, sizeof(*input)); }