OpenBarnyard
 
Loading...
Searching...
No Matches
ARootTask.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "ARandom.h"
3#include "ARootTask.h"
7#include "Memory/AMemory.h"
10#include "GUI/AGUI2.h"
11#include "GUI/AGUISystem.h"
13#include "GUI/AFadeManager.h"
14#include "GUI/AGUIPicture.h"
21#include "Sound/ASoundManager.h"
23#include "ALoadScreen.h"
26
27#include "SoundBank/music.h"
28#include "SoundBank/ui.h"
29
31#include <Toshi/TScheduler.h>
32#include <Toshi/T2ObjectPool.h>
33
34//-----------------------------------------------------------------------------
35// Enables memory debugging.
36// Note: Should be the last include!
37//-----------------------------------------------------------------------------
38#include <Core/TMemoryDebugOn.h>
39
41
43
45{
46 TIMPLEMENT();
47
48 m_bStartedGame = TFALSE;
49 m_bRenderWorld = TFALSE;
50 m_bPaused = TFALSE;
51 m_bStopRenderingScene = TFALSE;
52 m_bGameSystemCreated = TFALSE;
53 m_pOptions = AOptions::CreateSingleton();
55
56 auto pScheduler = g_oSystemManager.GetScheduler();
57
58 m_pGUISystem = pScheduler->CreateTask<AGUISystem>( this );
59 m_pGUI2 = pScheduler->CreateTask<AGUI2>( this );
60 m_pRenderer = pScheduler->CreateTask<ARenderer>( this );
61 m_pInputHandler = pScheduler->CreateTask<AInputHandler>( this );
62 m_pGameStateController = pScheduler->CreateTask<AGameStateController>( this );
63 m_pSoundManager = pScheduler->CreateTask<ASoundManager>( this );
64 m_pMoviePlayer = pScheduler->CreateTask<ABINKMoviePlayer>( this );
65 m_bGameSystemCreated = TFALSE;
66}
67
69{
70 TIMPLEMENT();
71
75
76 // Initialise all classes
77 TGetClass( TObject ).RecurseTree(
78 TNULL,
79 TNULL,
80 []( TClass* a_pClass, void* ) {
81 if ( !a_pClass->IsInitialized() )
82 {
83 a_pClass->Initialize();
84 }
85
86 return TTRUE;
87 },
88 TNULL
89 );
90
91 AAssetLoader::Load( "data\\assets\\lib_startup.trb", AAssetType_Startup, TTRUE );
92
93 if ( m_pRenderer )
94 {
95 if ( !m_pRenderer->Create() )
96 {
97 m_pRenderer = TNULL;
98 }
99 }
100
101 if ( !m_pRenderer )
102 {
103 return TFALSE;
104 }
105
106 m_pInputHandler->Create();
107 m_pSoundManager->Create();
108
109 ARandom::CreateSingleton();
110
111 if ( m_pMoviePlayer )
112 {
113 m_pMoviePlayer->Create();
114 }
115
116 TGetClass( AInputMapManager ).CreateObject();
117 AInputMapManager::GetSingleton()->ReadControlsData();
118
120 m_pGameStateController->Create();
121
123 ARenderer::GetSingleton()->ForceUpdate30FPS();
124 ARenderer::GetSingleton()->ForceUpdate30FPS();
126
127 return TTRUE;
128}
129
131{
132 if ( !IsGameSystemCreated() )
133 {
134 if ( !AGameStateController::GetSingleton()->IsCurrentState( &TGetClass( ASlideshowState ) ) &&
135 !AGameStateController::GetSingleton()->IsCurrentState( &TGetClass( SaveLoadSKU ) ) &&
136 !AGameStateController::GetSingleton()->IsCurrentState( &TGetClass( AMovieState ) ) &&
137 !AGameStateController::GetSingleton()->IsCurrentState( &TGetClass( AMessagePopupState ) ) )
138 {
139 if ( !m_bStartedGame )
140 {
142 return TTRUE;
143 }
144 else
145 {
146 g_oLoadScreen.Create();
147 CreateGameSystem();
148 LoadFrontEnd();
149 return TTRUE;
150 }
151 }
152 }
153
154 TTODO( "FUN_00427e70" );
155 g_oLoadScreen.Update( 1.0f, TTRUE );
156
157 return TTRUE;
158}
159
160void ARootTask::OnChildDied( TClass* a_pClass, TTask* a_pDeletedTask )
161{
162 if ( a_pDeletedTask == m_pGUISystem ) m_pGUISystem = TNULL;
163 else if ( a_pDeletedTask == m_pGUI2 )
164 m_pGUI2 = TNULL;
165 else if ( a_pDeletedTask == m_pInputHandler )
166 m_pInputHandler = TNULL;
167 else if ( a_pDeletedTask == m_pRenderer )
168 m_pRenderer = TNULL;
169 else if ( a_pDeletedTask == m_pGameStateController )
170 m_pGameStateController = TNULL;
171 else if ( a_pDeletedTask == m_pMoviePlayer )
172 m_pMoviePlayer = TNULL;
173}
174
176{
177 if ( m_pGUISystem ) m_pGUISystem->Activate( TTRUE );
178 if ( m_pGUI2 ) m_pGUI2->Activate( TTRUE );
179 if ( m_pRenderer ) m_pRenderer->Activate( TTRUE );
180 if ( m_pInputHandler ) m_pInputHandler->Activate( TTRUE );
181 if ( m_pGameStateController ) m_pGameStateController->Activate( TTRUE );
182 if ( m_pMoviePlayer ) m_pMoviePlayer->Activate( TTRUE );
183
184 if ( m_bGameSystemCreated )
185 {
186 TTODO( "Activate three more tasks" );
187 }
188}
189
191{
192 if ( m_pGUISystem ) m_pGUISystem->Activate( TFALSE );
193 if ( m_pGUI2 ) m_pGUI2->Activate( TFALSE );
194 if ( m_pRenderer ) m_pRenderer->Activate( TFALSE );
195 if ( m_pInputHandler ) m_pInputHandler->Activate( TFALSE );
196 if ( m_pGameStateController ) m_pGameStateController->Activate( TFALSE );
197 if ( m_pMoviePlayer ) m_pMoviePlayer->Activate( TFALSE );
198
199 TTODO( "Deactivate two more tasks" );
200}
201
202TPSTRING8_DECLARE( bkg_by_legal1 );
203TPSTRING8_DECLARE( bkg_Bink_Big );
204TPSTRING8_DECLARE( bkg_bluetongue );
205TPSTRING8_DECLARE( bkg_fmod );
206
208{
209 TIMPLEMENT();
210
211 auto attractMovie = new AMovieState( "Attract", TFALSE, TNULL, TFALSE );
212 auto bluetongueMovie = new AMovieState( "BTE", TFALSE, attractMovie, TFALSE );
213 auto thqMovie = new AMovieState( "THQ", TFALSE, bluetongueMovie, TFALSE );
214 auto nickmovsMovie = new AMovieState( "NickMovs", TFALSE, thqMovie, TFALSE );
215
216 AGUISlideshow::Params slideshowSettings = {
217 .iUnk1 = 0,
218 .bSlideSkippable = TTRUE,
219 .bUnk2 = TFALSE,
220 .bInstaSkippable = TFALSE,
221 .bHasFadeIn = TTRUE,
222 .bHasFadeOut = TTRUE,
223 .bRepeat = TFALSE,
224 .bDelayAppear = TFALSE,
225 .fDuration = 2.0f,
226 .fFadeInTime = 1.0f,
227 .fFadeOutTime = 0.5f,
228 .fUnk5 = -1.0f,
229 };
230
231 auto fmodSlide = new ASlideshowState( slideshowSettings, nickmovsMovie, TFALSE );
232 fmodSlide->AddSlide( TPS8( bkg_fmod ) );
233
234 auto binkSlide = new ASlideshowState( slideshowSettings, fmodSlide, TFALSE );
235 binkSlide->AddSlide( TPS8( bkg_Bink_Big ) );
236
237 slideshowSettings.fDuration = 5.0f;
238 auto legalSlide = new ASlideshowState( slideshowSettings, binkSlide, TTRUE );
239 legalSlide->AddSlide( TPS8( bkg_by_legal1 ) );
240
241 AGameStateController::GetSingleton()->PushState( legalSlide );
242
243 m_bStartedGame = TTRUE;
244}
245
247{
248 TString8 startupLibPath;
249 startupLibPath.Format( "Data/%s.trb", "lib_startup" );
250
251 TTRB trb;
252 trb.Load( startupLibPath );
253
254 auto properties = PBProperties::LoadFromTRB( trb );
255 auto matlibProperty = properties->GetProperty( "matlib" );
256
257 if ( matlibProperty )
258 {
259 AMaterialLibraryManager::GetSingleton()->LoadLibrariesFromProperties(
260 matlibProperty,
262 TTRUE
263 );
264 }
265
266 trb.Close();
267
268 if ( m_pGUI2 && !m_pGUI2->Create() )
269 {
270 m_pGUI2 = TNULL;
271 }
272
273 if ( m_pGUISystem && !m_pGUISystem->Create() )
274 {
275 m_pGUISystem = TNULL;
276 }
277
281
282 g_oSystemManager.GetScheduler()->CreateTask<AFadeManager>( this )->Create();
283}
284
286{
287 return m_bPaused || g_oSystemManager.IsPaused();
288}
289
290void ARootTask::CreateGameSystem()
291{
292 TIMPLEMENT();
293
294 AFadeManager::GetSingleton()->StopAllFades();
295 g_oLoadScreen.StartLoading( 9, TTRUE );
296
297 ASoundManager::GetSingleton()->LoadWaveBanksInfo( "soundmetadata" );
298
299 // ...
300 m_pGameSystemManager = g_oSystemManager.GetScheduler()->CreateTask<AGameSystemManager>( this );
301 m_pGameSystemManager->Create();
302
303 g_oLoadScreen.Update( 1.0f, TTRUE );
304 g_oLoadScreen.Update( 1.0f, TTRUE );
305 g_oLoadScreen.Update( 1.0f, TTRUE );
306
307 // Reorder tasks?
308 if ( m_pInputHandler )
309 {
310 m_pInputHandler->SetParent( m_pInputHandler->Parent() );
311 }
312
313 if ( m_pMoviePlayer )
314 {
315 m_pMoviePlayer->SetParent( m_pMoviePlayer->Parent() );
316 }
317
318 if ( m_pGUISystem )
319 {
320 m_pGUISystem->SetParent( m_pGUISystem->Parent() );
321 }
322
323 if ( m_pGameStateController )
324 {
325 m_pGameStateController->SetParent( m_pGameStateController->Parent() );
326 }
327
328 // ...
329
330 if ( m_pRenderer )
331 {
332 m_pRenderer->SetParent( m_pRenderer->Parent() );
333 }
334
335 m_bGameSystemCreated = TTRUE;
336 OnActivate();
337}
338
340TPSTRING8_DECLARE( music );
341
342void ARootTask::LoadFrontEnd()
343{
344 TIMPLEMENT();
345 ASoundManager* pSoundManager = ASoundManager::GetSingleton();
346
347 // Load ui & music soundbanks
348 pSoundManager->LoadSoundBank( TPS8( ui ), TFALSE, TTRUE );
349 pSoundManager->LoadSoundBank( TPS8( music ), TFALSE, TFALSE );
350
352
356
357 // Load music wavebank samples
359 pSoundManager->LoadWaveBankSamples( TPS8( music ), AWaveBank::LOADFLAGS_NONE, -1 );
361
362 // Load music samples
363 pSoundManager->LoadSoundBankSamples( TPS8( music ) );
364
365 // Create front end state
366 AFrontEndMainMenuState2* pFrontEndState = new AFrontEndMainMenuState2();
368 pFrontEndState->SetupCamera();
369
371
372 GetSingleton()->SetRenderWorld( TTRUE );
373
374 // Push the state
375 AGameStateController::GetSingleton()->PushState( pFrontEndState );
376
377 // Hide loading screen
380
381 // Fade screen from black
382 AFadeManager::GetSingleton()->StartFade(
383 AFade::Color( 255, 0, 0, 0 ),
384 AFade::Color( 0, 0, 0, 0 ),
385 1.0f
386 );
387}
#define TIMPLEMENT()
Definition Defines.h:136
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TTODO(DESC)
Definition Defines.h:134
#define TGetClass(CLASS)
Definition TObject.h:13
#define TDEFINE_CLASS(...)
Definition TObject.h:120
#define TPSTRING8_DECLARE(STR)
Definition TPString8.h:15
#define TPS8(STR)
Definition TPString8.h:16
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
ALoadScreen g_oLoadScreen
@ AAssetType_Startup
Definition AAssetLoader.h:8
TSystemManager g_oSystemManager
Definition TSystem.cpp:15
Definition TTRB.h:253
ERROR Load(const TCHAR *a_szFilePath, TUINT32 a_uiUnknown=0)
Definition TTRB.cpp:38
void Close()
Definition TTRB.cpp:289
Definition TClass.h:8
TBOOL IsInitialized() const
Definition TClass.h:56
void Initialize()
Definition TClass.cpp:46
static TFORCEINLINE TRenderInterface * GetSingleton()
Definition TSingleton.h:49
TString8 & Format(const TCHAR *a_pcFormat,...)
Definition TString8.cpp:176
void SetLoadingState(TBOOL a_bIsLoading, TBOOL a_bUpdateUI)
static TBOOL CreateAssetsFromLibrary(const TCHAR *a_szLibraryName)
static TBOOL Load(const TCHAR *a_szFileName, AAssetType a_eAssetType, TBOOL a_bStream)
static Toshi::TTRB * GetAssetTRB(AAssetType a_eAssetType)
static TBOOL LoadAssetPackFromLibrary(const TCHAR *a_szLibraryName, TBOOL a_bStream)
Definition AGUI2.h:13
static void AllowBackgroundClear(TBOOL a_bAllow)
@ POOL_Viewport
Definition AMemory.h:40
@ POOL_Misc
Definition AMemory.h:35
@ POOL_Sound
Definition AMemory.h:37
@ POOL_Collision
Definition AMemory.h:36
static void CreatePool(POOL a_ePool)
Definition AMemory.cpp:12
TBOOL LoadWaveBankSamples(const Toshi::TPString8 &a_rcName, AWaveBank::LOADFLAGS a_eLoadFlags, TINT a_iBufferSize)
void LoadSoundBankSamples(const Toshi::TPString8 &a_rcName)
static TBOOL ms_bShouldUpdateLoadingScreen
TBOOL LoadSoundBank(const Toshi::TPString8 &a_rcName, TBOOL a_bSimpleSound, TBOOL a_bLoadImmediately)
@ LOADFLAGS_NONE
Definition AWaveBank.h:16
void LoadStartupData()
virtual TBOOL OnCreate() override
Definition ARootTask.cpp:68
TBOOL IsPaused() const
virtual void OnChildDied(Toshi::TClass *a_pClass, Toshi::TTask *a_pDeletedTask) override
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) override
virtual void OnDeactivate() override
TBOOL IsGameSystemCreated() const
Definition ARootTask.h:27
void CreateStartupGameStates()
virtual void OnActivate() override
static void SetTerrain(TINT a_eTerrain, TBOOL a_bLoadLater, TBOOL a_bStreamModels, TINT a_iUnused1, TINT a_iUnused2, TINT a_iPreloadTerrainBlockSize, TINT a_iStartVISGroup)