Files
TeslaRel410/CODE/RP/MUNGA/UPDATE.CPP
T
CydandClaude Fable 5 fdd9ac9d97 Initial import: Tesla Release 4.10 (Tesla:BattleTech & Tesla:Red Planet)
Archival snapshot of the Virtual World Entertainment Tesla cockpit
software, 1994-1996: MUNGA engine and L4 pod layer source (Borland
C++ 5.0), BT/RP game code, and game content (models, audio, maps,
gauges, Division renderer data). Includes third-party libraries:
Division dVS/DPL graphics, HMI SOS audio, WATTCP networking.

Files are preserved byte-for-byte (.gitattributes disables all
line-ending conversion). README.md documents the layout, target
hardware, and toolchain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:21:58 -05:00

274 lines
7.7 KiB
C++

//===========================================================================//
// File: update.cc //
// Project: MUNGA Brick: Update Manager //
// Contents: //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 12/20/94 ECH Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include <munga.hpp>
#pragma hdrstop
#if !defined(UPDATE_HPP)
# include <update.hpp>
#endif
#if !defined(APP_HPP)
#include <app.hpp>
#endif
#if !defined(HOSTMGR_HPP)
#include <hostmgr.hpp>
#endif
#if !defined(INTEREST_HPP)
#include <interest.hpp>
#endif
#if !defined(ENTITY_HPP)
#include <entity.hpp>
#endif
#if defined(TRACE_UPDATE_REPLICANTS)
static BitTrace Update_Replicants("Update Replicants");
#define SET_UPDATE_REPLICANTS() Update_Replicants.Set()
#define CLEAR_UPDATE_REPLICANTS() Update_Replicants.Clear()
#else
#define SET_UPDATE_REPLICANTS()
#define CLEAR_UPDATE_REPLICANTS()
#endif
#if defined(TRACE_UPDATE_MASTERS)
static BitTrace Update_Masters("Update Masters");
#define SET_UPDATE_MASTERS() Update_Masters.Set()
#define CLEAR_UPDATE_MASTERS() Update_Masters.Clear()
#else
#define SET_UPDATE_MASTERS()
#define CLEAR_UPDATE_MASTERS()
#endif
MemoryBlock
SimulationEncore::AllocatedMemory(
sizeof(SimulationEncore),
10,
10,
"Simulation Encores"
);
SimulationEncore::SimulationEncore(
Simulation *sim,
Simulation::Encore callback
)
{
encoreSimulation = sim;
encoreCallback = callback;
runWatchers = True;
}
SimulationEncore::~SimulationEncore()
{
}
//
//#############################################################################
//#############################################################################
//
UpdateManager::UpdateManager():
simulationEncores(NULL)
{
}
//
//#############################################################################
//#############################################################################
//
UpdateManager::~UpdateManager()
{
ChainIteratorOf<SimulationEncore*> encores(simulationEncores);
SimulationEncore *encore;
while ((encore = encores.ReadAndNext()) != NULL)
{
Unregister_Object(encore);
delete encore;
}
}
//
//#############################################################################
//#############################################################################
//
Logical
UpdateManager::TestInstance() const
{
Node::TestInstance();
return True;
}
//
//#############################################################################
//#############################################################################
//
void
UpdateManager::Execute(Time target_render_time)
{
Check(this);
//
//--------------------------------------------------------------------------
// Execute the replicants and masters that are interesting and dynamic
//--------------------------------------------------------------------------
//
Check(application);
Check(application->GetHostManager());
HostManager::DynamicReplicantEntityIterator
replicant_entity_iterator(application->GetHostManager());
HostManager::DynamicMasterEntityIterator
master_entity_iterator(application->GetHostManager());
//
//--------------------------------------------------------------------------
// Execute the replicants
//--------------------------------------------------------------------------
//
SET_UPDATE_REPLICANTS();
Entity
*replicant;
while ((replicant = replicant_entity_iterator.ReadAndNext()) != NULL)
{
Check(replicant);
if (replicant->IsReplicantExecutable())
{
replicant->Execute(target_render_time);
}
}
CLEAR_UPDATE_REPLICANTS();
//
//--------------------------------------------------------------------------
// Execute the master entities, if they need to be updated then send
// update messages, and notify the interest manager of moved entities
//--------------------------------------------------------------------------
//
SET_UPDATE_MASTERS();
Entity
*entity;
Entity::UpdateMessage
*update_message;
while ((entity = master_entity_iterator.ReadAndNext()) != NULL)
{
Check(entity);
//
//-----------------------------------------------------------------------
// If the entity is not interesting then skip it
//-----------------------------------------------------------------------
//
if (!entity->IsInteresting() || !entity->IsNonReplicantExecutable())
{
continue;
}
//
//-----------------------------------------------------------------------
// Run the execute method
//-----------------------------------------------------------------------
//
update_message = entity->Execute(target_render_time);
//
//-----------------------------------------------------------------------
// Update the interest zone id
//-----------------------------------------------------------------------
//
Check(application);
Check(application->GetInterestManager());
application->GetInterestManager()->EntityUpdateInterestZone(entity);
//
//-----------------------------------------------------------------------
// If update message is not null then send the change
//-----------------------------------------------------------------------
//
if (update_message != NULL)
{
Check(update_message);
Check(application);
application->GetInterestManager()->EntityUpdateReplicants(
entity,
update_message
);
}
}
//
//--------------------------------------------------------------------------
// Lastly, run through and do any requested encores
//--------------------------------------------------------------------------
//
ChainIteratorOf<SimulationEncore*>
encores(simulationEncores);
SimulationEncore
*encore;
while ((encore = encores.ReadAndNext()) != NULL)
{
Check(encore);
Check(encore->encoreSimulation);
(encore->encoreSimulation->*encore->encoreCallback)();
if (encore->runWatchers)
{
encore->encoreSimulation->ExecuteWatchers();
encore->encoreSimulation->ClearWatcherDelay();
}
Unregister_Object(encore);
delete encore;
}
CLEAR_UPDATE_MASTERS();
}
//
//#############################################################################
//#############################################################################
//
void
UpdateManager::RequestEncore(
Simulation *simulation,
Simulation::Encore encore
)
{
//
//----------------------------------------------------------------------
// Make sure that we only run the watcher on a given simulation once per
// frame
//----------------------------------------------------------------------
//
ChainIteratorOf<SimulationEncore*> encores(simulationEncores);
SimulationEncore *i;
while ((i = encores.ReadAndNext()) != NULL)
{
if (i->encoreSimulation == simulation && i->runWatchers)
{
i->runWatchers = False;
break;
}
}
SimulationEncore *request = new SimulationEncore(simulation, encore);
Register_Object(request);
simulationEncores.Add(request);
}