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

255 lines
6.1 KiB
C++

//===========================================================================//
// File: MODL.cpp
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 05/21/01 JPS Class for the MODL in the expansion
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Fasa Interactive //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include "MW4Headers.hpp"
#include "MODL.hpp"
#include "gameinfo.hpp"
#include "AI.hpp"
#include "AI_UserConstants.hpp"
#include "Mech.hpp"
#include "Torso.hpp"
#include "MWDamageObject.hpp"
#include <adept\effect.hpp>
#include <Adept\Site.hpp>
#include "obstacle.hpp"
#include <Adept\EntityManager.hpp>
#include <Adept\CollisionVolume.hpp>
#include <Adept\DamageObject.hpp>
#include <Adept\Map.hpp>
//#############################################################################
//############################### MODL ##############################
//#############################################################################
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MODL::ClassData*
MODL::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::InitializeClass()
{
Check_Object(MWMover::ExecutionStateEngine::DefaultData);
Verify(!DefaultData);
DefaultData =
new ClassData(
MODLClassID,
"MechWarrior4::MODL",
BaseClass::DefaultData,
0, NULL,
(Entity::Factory)Make,
(Entity::CreateMessage::Factory)CreateMessage::ConstructCreateMessage,
ExecutionStateEngine::DefaultData,
(Entity::GameModel::Factory)GameModel::ConstructGameModel,
(Entity::GameModel::Factory)GameModel::ConstructOBBStream,
(Entity::GameModel::ReadAndVerifier)GameModel::ReadAndVerify,
(Entity::GameModel::ModelWrite)GameModel::WriteToText,
(Entity::GameModel::ModelSave)GameModel::SaveGameModel,
AnimationStateEngine::Make
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MODL*
MODL::Make(
CreateMessage *message,
ReplicatorID *base_id
)
{
Check_Object(message);
gos_PushCurrentHeap(Heap);
MODL *new_entity = new
MODL(DefaultData, message, base_id, NULL);
gos_PopCurrentHeap();
Check_Object(new_entity);
Check_Object(EntityManager::GetInstance());
EntityManager::GetInstance()->AddMover(new_entity);
return new_entity;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MODL::MODL(
ClassData *class_data,
CreateMessage *message,
ReplicatorID *base_id,
ElementRenderer::Element *element
):
Tank(class_data, message, base_id, element),
m_enginesDead (false),
m_fireCannon (false)
{
Check_Pointer(this);
Check_Object(message);
HookUpSubsystems();
CommonCreation(message);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MODL::~MODL()
{
Check_Object(EntityManager::GetInstance());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::Reuse(
const CreateMessage *message,
ReplicatorID *base_id
)
{
Check_Object(this);
Check_Object(message);
STOP(("Not implemented"));
BaseClass::Reuse(message, base_id);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::CommonCreation(CreateMessage *message)
{
Check_Object(this);
Check_Object(message);
InitializeDamageArray();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::Respawn(Entity::CreateMessage *message)
{
Check_Object(this);
Check_Object(message);
BaseClass::Respawn(message);
CreateMessage *vehicle_message = Cast_Pointer(CreateMessage *, message);
CommonCreation(vehicle_message);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MODL::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}
void
MODL::SaveInstanceText(Page *instance_page)
{
Check_Object(this);
Check_Object(instance_page);
BaseClass::SaveInstanceText(instance_page);
}
void
MODL::InitializeDamageArray()
{
Check_Object(this);
memset(damageArray, -1, sizeof(int) * 11);
for(int i=0; i<11; i++)
{
DamageObject *damage_object = damageObjects.Find(i);
if(damage_object)
{
damageArray[i] = damage_object->damageLevel;
damage_object->SetDamageArrayEntry(&damageArray[i]);
}
else
{
damageArray[i] = -1;
}
}
}
void MODL::Eject()
{
m_fireCannon = true;
}
void MODL::EngineDead(void)
{
//The engine internal damage zone has been destroyed,
//The MODL must now stop
m_enginesDead = true;
}
void
MODL::ComputeForwardSpeed(Stuff::Scalar time_slice)
{
if (m_enginesDead)
{
speedDemand = 0.0f;
speedDemandKPH = 0.0f;
}
BaseClass::ComputeForwardSpeed (time_slice);
}
void MODL::PostCollisionExecute (Stuff::Time time)
{
Tank::PostCollisionExecute(time);
if (m_fireCannon)
{
//check to see if still has a right arm
DamageObject *damage_object = damageObjects.Find(3);
if (damage_object->currentArmorValue != 0)
{
const GameModel *model = GetGameModel();
Adept::Site* cannonSite = FindSite ("site_biggun");
Resource resource(model->ejectEffectResource);
Verify(resource.DoesResourceExist());
CreateEffect (model->ejectEffectResource,cannonSite,true);
}
m_fireCannon = false;
}
}