summaryrefslogtreecommitdiffstats
path: root/game/code/contexts/demo/democontext.cpp
diff options
context:
space:
mode:
authorSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
committerSvxy <aidan61605@gmail.com>2023-05-31 23:31:32 +0200
commiteb4b3404aa00220d659e532151dab13d642c17a3 (patch)
tree7e1107c4995489a26c4007e41b53ea8d00ab2134 /game/code/contexts/demo/democontext.cpp
downloadThe-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.gz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.bz2
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.lz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.xz
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.tar.zst
The-Simpsons-Hit-and-Run-eb4b3404aa00220d659e532151dab13d642c17a3.zip
Diffstat (limited to 'game/code/contexts/demo/democontext.cpp')
-rw-r--r--game/code/contexts/demo/democontext.cpp563
1 files changed, 563 insertions, 0 deletions
diff --git a/game/code/contexts/demo/democontext.cpp b/game/code/contexts/demo/democontext.cpp
new file mode 100644
index 0000000..f1d2cfd
--- /dev/null
+++ b/game/code/contexts/demo/democontext.cpp
@@ -0,0 +1,563 @@
+//=============================================================================
+// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
+//
+// File:
+//
+// Description: Implement DemoContext
+//
+// History: 21/05/2002 + Created -- NAME
+//
+//=============================================================================
+
+//========================================
+// System Includes
+//========================================
+#include <p3d/shadow.hpp>
+
+//========================================
+// Project Includes
+//========================================
+#include <ai/vehicle/vehicleairender.h>
+
+#include <contexts/demo/democontext.h>
+#include <gameflow/gameflow.h>
+#include <main/commandlineoptions.h>
+#include <main/game.h>
+#include <memory/srrmemory.h>
+#include <memory/leakdetection.h>
+#include <mission/gameplaymanager.h>
+#include <presentation/gui/guisystem.h>
+#include <render/rendermanager/rendermanager.h>
+#include <render/DSG/StatePropDSG.h>
+#include <render/rendermanager/renderlayer.h>
+#include <ai/actor/actormanager.h>
+
+#include <worldsim/character/footprint/footprintmanager.h>
+#include <worldsim/coins/coinmanager.h>
+#include <worldsim/coins/sparkle.h>
+#include <worldsim/hitnrunmanager.h>
+#include <worldsim/vehiclecentral.h>
+#include <worldsim/worldphysicsmanager.h>
+#include <worldsim/avatarmanager.h>
+#include <worldsim/character/charactermanager.h>
+#include <worldsim/traffic/trafficmanager.h>
+#include <worldsim/ped/pedestrianmanager.h>
+
+#include <worldsim/skidmarks/skidmarkmanager.h>
+
+#include <camera/walkercam.h>
+#include <camera/followcam.h>
+#include <camera/wrecklesscam.h>
+#include <camera/chasecam.h>
+#include <camera/conversationcam.h>
+#include <camera/supercammanager.h>
+
+#include <render/breakables/breakablesmanager.h>
+#include <render/particles/particlemanager.h>
+#include <render/animentitydsgmanager/animentitydsgmanager.h>
+#include <render/RenderManager/WorldRenderLayer.h>
+#include <worldsim/skidmarks/skidmarkgenerator.h>
+#include <sound/soundmanager.h>
+#include <meta/triggervolumetracker.h>
+#include <render/Loaders/AnimDynaPhysLoader.h>
+
+#include <pedpaths/pathmanager.h>
+
+#include <input/inputmanager.h>
+
+// TODO: Remove once we put CreateRoadNetwork in the levels pipe
+#include <roads/roadmanager.h>
+#include <p3d/light.hpp>
+#include <p3d/view.hpp>
+
+#include <worldsim/worldobject.h>
+#include <ai/actionbuttonmanager.h>
+
+#include <presentation/presentation.h>
+
+#include <mission/animatedicon.h>
+
+#include <render/animentitydsgmanager/animentitydsgmanager.h>
+
+//******************************************************************************
+//
+// Global Data, Local Data, Local Classes
+//
+//******************************************************************************
+
+extern bool g_inDemoMode;
+
+// Static pointer to instance of singleton.
+DemoContext* DemoContext::spInstance = NULL;
+
+const unsigned int DEMO_LOOP_TIME = 60000; // in msec
+
+//******************************************************************************
+//
+// Public Member Functions
+//
+//******************************************************************************
+
+//==============================================================================
+// DemoContext::GetInstance
+//==============================================================================
+//
+// Description: - Access point for the DemoContext singleton.
+// - Creates the DemoContext if needed.
+//
+// Parameters: None.
+//
+// Return: Pointer to the DemoContext.
+//
+// Constraints: This is a singleton so only one instance is allowed.
+//
+//==============================================================================
+DemoContext* DemoContext::GetInstance()
+{
+ if( spInstance == NULL )
+ {
+ spInstance = new DemoContext;
+ rAssert( spInstance );
+ }
+
+ return spInstance;
+}
+
+//==============================================================================
+// DemoContext::DemoContext
+//==============================================================================
+// Description: Constructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+DemoContext::DemoContext()
+: m_demoLoopTime( DEMO_LOOP_TIME ),
+ m_elapsedTime( -1 )
+{
+}
+
+//==============================================================================
+// DemoContext::~DemoContext
+//==============================================================================
+// Description: Destructor.
+//
+// Parameters: None.
+//
+// Return: N/A.
+//
+//==============================================================================
+DemoContext::~DemoContext()
+{
+}
+
+//******************************************************************************
+//
+// Private Member Functions
+//
+//******************************************************************************
+
+//=============================================================================
+// DemoContext::OnStart
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( ContextEnum previousContext )
+//
+// Return: void
+//
+//=============================================================================
+void DemoContext::OnStart( ContextEnum previousContext )
+{
+ // Common to all playing contexts.
+ //
+ PlayingContext::OnStart( previousContext );
+
+ GetInputManager()->SetGameState( Input::ACTIVE_FRONTEND );
+
+ // We count the number of demos run.
+ //
+ GetGame()->IncrementDemoCount();
+
+ m_elapsedTime = 0; // reset elapsed demo time
+
+ ////////////////////////////////////////////////////////////
+ // RenderManager
+ RenderManager* rm = GetRenderManager();
+ RenderLayer* rl = rm->mpLayer( RenderEnums::LevelSlot );
+ rAssert( rl );
+
+#ifdef DEBUGWATCH
+ // bootstrap vehicleai renderer
+ VehicleAIRender::GetVehicleAIRender();
+#endif
+
+ ////////////////////////////////////////////////////////////
+ // Cameras set up
+ unsigned int iNumPlayers = GetGameplayManager()->GetNumPlayers();
+ rl->SetNumViews( iNumPlayers );
+ rl->SetUpViewCam();
+
+ p3d::inventory->SelectSection("Default");
+ tLightGroup* sun = p3d::find<tLightGroup>("sun");
+ rAssert( sun );
+ rm->SetLevelLayerLights( sun );
+
+ float aspect = p3d::display->IsWidescreen() ? (16.0f / 9.0f) : (4.0f / 3.0f);
+
+ unsigned int view = 0;
+
+ tPointCamera* cam = static_cast<tPointCamera*>( rl->pCam( view ) );
+ rAssert( dynamic_cast<tPointCamera*> ( cam ) != NULL );
+ rAssert( cam );
+
+ SuperCamCentral* scc = GetSuperCamManager()->GetSCC( view );
+ rAssert( scc );
+
+ scc->SetCamera( cam );
+
+ FollowCam* fc = new FollowCam( FollowCam::FOLLOW_NEAR );
+ fc->SetAspect( aspect );
+ fc->CopyToData();
+ scc->RegisterSuperCam( fc );
+
+ fc = new FollowCam( FollowCam::FOLLOW_FAR );
+ fc->SetAspect( aspect );
+ fc->CopyToData();
+ scc->RegisterSuperCam( fc );
+
+ SuperCam* sc = new WalkerCam();
+ sc->SetAspect( aspect );
+ scc->RegisterSuperCam( sc );
+
+ sc = new ChaseCam();
+ sc->SetAspect( aspect );
+ scc->RegisterSuperCam( sc );
+
+ sc = new WrecklessCam();
+ sc->SetAspect( aspect );
+ scc->RegisterSuperCam( sc );
+
+ sc = new ConversationCam();
+ sc->SetAspect( aspect );
+ scc->RegisterSuperCam( sc );
+
+
+ ////////////////////////////////////////////////////////////
+ // AvatarManager Bootstrapping
+ GetAvatarManager( )->EnterGame( );
+ /*
+ GetActionButtonManager( )->EnterGame( );
+ */
+
+ ////////////////////////////////////////////////////////////
+ // TrafficManager Init
+ TrafficManager::GetInstance()->Init();
+
+ ////////////////////////////////////////////////////////////
+ // PedestrianManager Init
+ PedestrianManager::GetInstance()->Init();
+
+ // TODO: Move this into level pipe
+ //Set up the sorting of the intersections and stuff.
+ RoadManager::GetInstance()->CreateRoadNetwork();
+
+ ////////////////////////////////////////////////////////////
+ // SkidMark Init Init
+ //Find skid mark shaders in the inventory and set proper values
+ SkidMarkGenerator::InitShaders();
+
+ GetSkidmarkManager()->Init();
+
+ ////////////////////////////////////////////////////////////
+ // OnStart calls
+ //
+ // Notify the sound system of gameplay start. This has been moved after
+ // the GUI startup above, since that leads to a mission reset, which causes
+ // character position in or out of the car to be decided, which the sound
+ // system uses to determine which sounds to start playing.
+ //
+ SoundManager::GetInstance()->OnGameplayStart();
+ /*
+ GetPresentationManager()->OnGameplayStart();
+ */
+
+ GetGuiSystem()->HandleMessage( GUI_MSG_RUN_INGAME );
+ GetGuiSystem()->HandleMessage( GUI_MSG_RUN_DEMO ); // TC: must be called after GUI_MSG_RUN_INGAME
+
+ GetGuiSystem()->RegisterUserInputHandlers();
+
+ GetGame()->SetTime( 0 );
+
+ g_inDemoMode = true;
+}
+
+//=============================================================================
+// DemoContext::OnStop
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( ContextEnum nextContext )
+//
+// Return: void
+//
+//=============================================================================
+void DemoContext::OnStop( ContextEnum nextContext )
+{
+ HeapMgr()->PushHeap (GMA_TEMP);
+
+ //
+ // This is called to prevent DMA of destroyed textures,
+ // because we don't swap buffers until the next frame.
+ //
+ p3d::pddi->DrawSync();
+
+ // Clear the shadow list
+ AnimDynaPhysLoader::ClearShadowList();
+
+ GetCoinManager()->Destroy();
+ GetSparkleManager()->Destroy();
+ GetSkidmarkManager()->Destroy();
+ GetHitnRunManager()->Destroy();
+
+ StatePropDSG::RemoveAllSharedtPoses();
+
+
+ const bool shutdown = true;
+ GetSuperCamManager()->Init( shutdown );
+
+ TriggerVolumeTracker::GetInstance()->Cleanup();
+
+ // Clean up lights!
+ //
+ RenderLayer* rl = GetRenderManager()->mpLayer( RenderEnums::LevelSlot );
+ rAssert( rl );
+ for( unsigned int i = 0; i < rl->GetNumViews(); i++ )
+ {
+ rl->pView(i)->RemoveAllLights ();
+ }
+
+#ifdef DEBUGWATCH
+ VehicleAIRender::Destroy();
+#endif
+
+ GetPresentationManager()->OnGameplayStop();
+
+ GetPresentationManager()->Finalize();
+
+ //Destroy Avatars stuff first
+
+ GetGameplayManager()->Finalize();
+ SetGameplayManager( NULL );
+
+ GetAvatarManager()->Destroy();
+
+ TrafficManager::DestroyInstance();
+ PedestrianManager::DestroyInstance();
+ GetCharacterManager()->Destroy();
+ GetVehicleCentral()->Unload();
+ GetActorManager()->RemoveAllActors();
+ GetActorManager()->RemoveAllSpawnPoints();
+
+ //We never entered.
+ //GetActionButtonManager( )->Destroy( );
+
+ GetBreakablesManager()->FreeAllBreakables();
+ GetParticleManager()->ClearSystems();
+ GetRenderManager()->DumpAllLoadedData();
+ SkidMarkGenerator::ReleaseShaders();
+
+ GetSoundManager()->OnGameplayEnd( true );
+
+ PathManager::GetInstance()->Destroy();
+
+
+ // TODO - Darryl?
+ //
+ // all active vehicles should be destroyed
+ // they are owned by the missions that created them.
+
+ //This does cleanup.
+ RoadManager::GetInstance()->Destroy();
+
+ // release GUI in-game
+ GetGuiSystem()->HandleMessage( GUI_MSG_RELEASE_INGAME );
+
+ /*
+ // enable screen clearing
+ GetRenderManager()->mpLayer(RenderEnums::GUI)->pView( 0 )->SetClearMask( PDDI_BUFFER_ALL );
+ */
+
+ // Cleanup the Avatar Manager
+ //
+ GetAvatarManager()->ExitGame();
+
+ // Flush out the special section used by physics to cache SkeletonInfos.
+ //
+ p3d::inventory->RemoveSectionElements (SKELCACHE);
+ p3d::inventory->DeleteSection (SKELCACHE);
+
+ GetGuiSystem()->UnregisterUserInputHandlers();
+
+ // enable screen clearing
+ //
+ GetRenderManager()->mpLayer( RenderEnums::GUI )->pView( 0 )->SetClearMask( PDDI_BUFFER_ALL );
+
+#ifndef RAD_RELEASE
+ // Dump out the contents of the inventory sections
+ //
+ p3d::inventory->Dump (true);
+#endif
+
+ AnimatedIcon::ShutdownAnimatedIcons();
+ GetAnimEntityDSGManager()->RemoveAll();
+
+ HeapMgr()->PopHeap (GMA_TEMP);
+
+
+ // Common to all playing contexts.
+ //
+ PlayingContext::OnStop( nextContext );
+}
+
+//=============================================================================
+// DemoContext::OnUpdate
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ( unsigned int elapsedTime )
+//
+// Return: void
+//
+//=============================================================================
+void DemoContext::OnUpdate( unsigned int elapsedTime )
+{
+ if ( !mQuitting )
+ {
+ bool cont = true;
+
+ if( m_elapsedTime != -1 )
+ {
+ m_elapsedTime += static_cast<int>( elapsedTime );
+ if( m_elapsedTime > static_cast<int>( m_demoLoopTime ) )
+ {
+ if ( GetLoadingManager()->IsLoading() )
+ {
+ //HACK!
+ //Oops! Can't quit yet!
+ m_elapsedTime -= static_cast<int>( elapsedTime );
+ }
+ else
+ {
+ // demo loop time expired, quit out of demo
+ //
+ GetGuiSystem()->HandleMessage( GUI_MSG_QUIT_DEMO );
+
+ m_elapsedTime = -1;
+ mQuitting = true; //Now we're quitting
+ }
+ cont = false;
+ }
+ }
+
+ if ( cont )
+ {
+ float timeins = (float)(elapsedTime) / 1000.0f;
+ GetAvatarManager()->Update( timeins );
+
+ GetCharacterManager()->GarbageCollect( );
+
+ ///////////////////////////////////////////////////////////////
+ // Update Particles
+ GetParticleManager()->Update( elapsedTime );
+ GetBreakablesManager()->Update( elapsedTime );
+ GetAnimEntityDSGManager()->Update( elapsedTime );
+
+ ///////////////////////////////////////////////////////////////
+ // Update Gameplay Manager
+ GetGameplayManager()->Update( elapsedTime );
+
+ ///////////////////////////////////////////////////////////////
+ // Update Physics
+ GetWorldPhysicsManager()->Update(elapsedTime);
+
+ ///////////////////////////////////////////////////////////////
+ // Update Peds
+ // ordering is important. Unless other parts of code change, we must call
+ // this before WorldPhysManager::Update() because PedestrianManager
+ // sets the flags for all characters to be updated in WorldPhys Update
+ PedestrianManager::GetInstance()->Update( elapsedTime );
+
+ /*
+ ///////////////////////////////////////////////////////////////
+ // Update PresentationManager
+ GetPresentationManager()->Update( elapsedTime );
+ */
+
+ ///////////////////////////////////////////////////////////////
+ // Update Trigger volumes
+ GetTriggerVolumeTracker()->Update( elapsedTime );
+
+ ///////////////////////////////////////////////////////////////
+ // Update Traffic
+ TrafficManager::GetInstance()->Update( elapsedTime );
+
+ /*
+ ///////////////////////////////////////////////////////////////
+ // Update Interiors
+ GetInteriorManager()->Update( elapsedTime );
+ */
+
+ //extra updates
+ GetFootprintManager()->Update( elapsedTime );
+ BEGIN_PROFILE("SkidmarkManager");
+ GetSkidmarkManager()->Update( elapsedTime );
+ END_PROFILE("SkidmarkManager");
+ ActorManager::GetInstance()->Update( elapsedTime );
+ GetCoinManager()->Update( elapsedTime );
+ GetSparkleManager()->Update( elapsedTime );
+ GetHitnRunManager()->Update( elapsedTime );
+ }
+ } //!mQuitting
+
+ // Common to all playing contexts.
+ //
+ PlayingContext::OnUpdate( elapsedTime );
+}
+
+//=============================================================================
+// DemoContext::OnSuspend
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void DemoContext::OnSuspend()
+{
+ // Common to all playing contexts.
+ //
+ PlayingContext::OnSuspend();
+}
+
+//=============================================================================
+// DemoContext::OnResume
+//=============================================================================
+// Description: Comment
+//
+// Parameters: ()
+//
+// Return: void
+//
+//=============================================================================
+void DemoContext::OnResume()
+{
+ // Common to all playing contexts.
+ //
+ PlayingContext::OnResume();
+}
+