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.
263 lines
6.9 KiB
C++
263 lines
6.9 KiB
C++
//===========================================================================//
|
|
// File: Driver.cpp //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 03/08/99 DPB Created file //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Fasa Interactive //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "AdeptHeaders.hpp"
|
|
|
|
#include "Driver.hpp"
|
|
#include "DropZone.hpp"
|
|
#include "EntityManager.hpp"
|
|
#include "Map.hpp"
|
|
#include "Mover.hpp"
|
|
|
|
//#############################################################################
|
|
//############################### Driver ##############################
|
|
//#############################################################################
|
|
|
|
Driver::ClassData*
|
|
Driver::DefaultData = NULL;
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::InitializeClass()
|
|
{
|
|
Verify(!DefaultData);
|
|
DefaultData =
|
|
new ClassData(
|
|
DriverClassID,
|
|
"Adept::Driver",
|
|
BaseClass::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
|
|
);
|
|
Register_Object(DefaultData);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::TerminateClass()
|
|
{
|
|
Unregister_Object(DefaultData);
|
|
delete DefaultData;
|
|
DefaultData = NULL;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
Driver*
|
|
Driver::Make(
|
|
CreateMessage *message,
|
|
ReplicatorID *base_id
|
|
)
|
|
{
|
|
gos_PushCurrentHeap(g_LibraryHeap);
|
|
Driver *new_entity = new Driver(DefaultData, message, base_id, NULL);
|
|
Check_Object(new_entity);
|
|
gos_PopCurrentHeap();
|
|
return new_entity;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
Replicator::CreateMessage*
|
|
Driver::SaveMakeMessage(MemoryStream *stream, ResourceFile *res_file)
|
|
{
|
|
Check_Object(this);
|
|
Check_Object(stream);
|
|
|
|
stream->AllocateBytes(sizeof(CreateMessage));
|
|
BaseClass::SaveMakeMessage(stream, res_file);
|
|
CreateMessage *message =
|
|
Cast_Pointer(CreateMessage*, stream->GetPointer());
|
|
message->messageLength = sizeof(*message);
|
|
|
|
Verify(message->initialAge != 0.0f);
|
|
message->dropZone = dropZone;
|
|
return message;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
Driver::Driver(
|
|
ClassData *class_data,
|
|
CreateMessage *message,
|
|
ReplicatorID *base_id,
|
|
ElementRenderer::Element *element
|
|
):
|
|
Entity(class_data, message, base_id, element)
|
|
{
|
|
Check_Pointer(this);
|
|
Check_Object(message);
|
|
|
|
isDropped = false;
|
|
//
|
|
//------------------------------------------------------------------------
|
|
//Vehicle needs to be set at a higher level. Player creates and AI links.
|
|
//------------------------------------------------------------------------
|
|
//
|
|
vehicle = NULL;
|
|
|
|
UsePostCollision();
|
|
|
|
dropZone = message->dropZone;
|
|
|
|
//
|
|
//---------------------------------------------------
|
|
// Only ask for a dropzone if we haven't executed yet
|
|
//---------------------------------------------------
|
|
//
|
|
if (owningConnection == Connection::Local)
|
|
{
|
|
if (message->initialAge != 0.0f)
|
|
{
|
|
ElementRenderer::Element *element = vehicle->GetElement();
|
|
Check_Object(element);
|
|
ReceiveDropZone(element->GetNewLocalToParent());
|
|
}
|
|
else
|
|
{
|
|
|
|
if(dropZone != NameTable::NullObjectID)
|
|
{
|
|
DropZone *zone;
|
|
zone = EntityManager::GetInstance()->GetDropZone(dropZone);
|
|
Check_Object(zone);
|
|
|
|
Stuff::LinearMatrix4D drop_location = Stuff::LinearMatrix4D::Identity;
|
|
|
|
drop_location = zone->RequestDrop();
|
|
|
|
ReceiveDropZone(drop_location);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::Respawn(Entity::CreateMessage *message)
|
|
{
|
|
Check_Object(this);
|
|
Check_Object(message);
|
|
|
|
BaseClass::Respawn(message);
|
|
|
|
CreateMessage *driver_message = Cast_Pointer(CreateMessage *, message);
|
|
isDropped = false;
|
|
//
|
|
//------------------------------------------------------------------------
|
|
//Vehicle needs to be set at a higher level. Player creates and AI links.
|
|
//------------------------------------------------------------------------
|
|
//
|
|
|
|
UsePostCollision();
|
|
dropZone = driver_message->dropZone;
|
|
|
|
//
|
|
//---------------------------------------------------
|
|
// Only ask for a dropzone if we haven't executed yet
|
|
//---------------------------------------------------
|
|
//
|
|
if (owningConnection == Connection::Local)
|
|
{
|
|
if (message->initialAge != 0.0f)
|
|
{
|
|
ElementRenderer::Element *element = vehicle->GetElement();
|
|
Check_Object(element);
|
|
ReceiveDropZone(element->GetNewLocalToParent());
|
|
}
|
|
else
|
|
{
|
|
if(dropZone != NameTable::NullObjectID)
|
|
{
|
|
DropZone *zone;
|
|
zone = EntityManager::GetInstance()->GetDropZone(dropZone);
|
|
Check_Object(zone);
|
|
|
|
Stuff::LinearMatrix4D drop_location = Stuff::LinearMatrix4D::Identity;
|
|
|
|
drop_location = zone->RequestDrop();
|
|
|
|
ReceiveDropZone(drop_location);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
Driver::~Driver()
|
|
{
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::ReceiveDropZone(const Stuff::LinearMatrix4D& drop_location)
|
|
{
|
|
STOP(("Driver::ReceiveDropZoneMessageHandler : NOT IMPLIMENTED"));
|
|
|
|
Check_Object(this);
|
|
|
|
isDropped = true;
|
|
|
|
vehicle->SetNewLocalToParent(drop_location);
|
|
SyncMatrices(true);
|
|
|
|
}
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::PostCollisionExecute(Time till)
|
|
{
|
|
Check_Object(this);
|
|
POSTCOLLISION_LOGIC("Driver");
|
|
|
|
|
|
SetNewLocalToParent(vehicle->GetLocalToWorld());
|
|
|
|
SyncMatrices(true);
|
|
BaseClass::PostCollisionExecute(till);
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
Stuff::LinearMatrix4D
|
|
Driver::GetEyePoint()
|
|
{
|
|
return vehicle->GetLocalToWorld();
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
Driver::TestInstance()
|
|
{
|
|
Verify(IsDerivedFrom(DefaultData));
|
|
}
|
|
|