2016-03-04 05:28:20 +00:00
# include "MP1.hpp"
2016-07-21 05:21:45 +00:00
# include "Graphics/Shaders/CModelShaders.hpp"
2016-07-22 19:46:30 +00:00
# include "Graphics/Shaders/CThermalColdFilter.hpp"
2016-08-03 21:53:03 +00:00
# include "Graphics/Shaders/CThermalHotFilter.hpp"
2016-07-29 17:38:44 +00:00
# include "Graphics/Shaders/CSpaceWarpFilter.hpp"
2016-08-17 06:18:18 +00:00
# include "Graphics/Shaders/CColoredQuadFilter.hpp"
# include "Graphics/Shaders/CTexturedQuadFilter.hpp"
2016-08-20 18:18:44 +00:00
# include "Graphics/Shaders/CCameraBlurFilter.hpp"
2016-08-20 04:22:13 +00:00
# include "Graphics/Shaders/CXRayBlurFilter.hpp"
2017-01-29 03:58:16 +00:00
# include "Graphics/Shaders/CTextSupportShader.hpp"
2017-04-02 03:03:37 +00:00
# include "Graphics/Shaders/CEnergyBarShader.hpp"
2017-04-07 05:35:09 +00:00
# include "Graphics/Shaders/CRadarPaintShader.hpp"
2017-04-22 06:42:32 +00:00
# include "Graphics/Shaders/CMapSurfaceShader.hpp"
2017-05-06 05:21:42 +00:00
# include "Graphics/Shaders/CPhazonSuitFilter.hpp"
2017-06-01 05:34:24 +00:00
# include "Graphics/Shaders/CScanLinesFilter.hpp"
# include "Graphics/Shaders/CRandomStaticFilter.hpp"
2017-08-14 03:55:06 +00:00
# include "Graphics/Shaders/CFluidPlaneShader.hpp"
2017-09-03 05:53:38 +00:00
# include "Graphics/Shaders/CAABoxShader.hpp"
2017-10-01 04:26:46 +00:00
# include "Graphics/Shaders/CWorldShadowShader.hpp"
2017-10-17 05:51:53 +00:00
# include "Graphics/Shaders/CParticleSwooshShaders.hpp"
2018-11-02 08:16:16 +00:00
# include "Graphics/Shaders/CEnvFxShaders.hpp"
2018-02-01 23:19:34 +00:00
# include "NESEmulator/CNESShader.hpp"
2017-01-16 09:14:54 +00:00
# include "Audio/CStreamAudioManager.hpp"
2017-01-08 02:52:49 +00:00
# include "CGBASupport.hpp"
2017-10-26 05:37:46 +00:00
# include "CGameHintInfo.hpp"
# include "Particle/CParticleDataFactory.hpp"
# include "Particle/CGenDescription.hpp"
# include "Particle/CElectricDescription.hpp"
# include "Particle/CSwooshDescription.hpp"
# include "Particle/CParticleElectricDataFactory.hpp"
# include "Particle/CParticleSwooshDataFactory.hpp"
# include "Particle/CWeaponDescription.hpp"
# include "Particle/CProjectileWeaponDataFactory.hpp"
# include "Particle/CDecalDataFactory.hpp"
# include "GuiSys/CGuiFrame.hpp"
# include "GuiSys/CRasterFont.hpp"
# include "GuiSys/CStringTable.hpp"
# include "Graphics/CModel.hpp"
# include "Graphics/CTexture.hpp"
# include "Character/CCharLayoutInfo.hpp"
# include "Character/CSkinRules.hpp"
# include "Character/CAnimCharacterSet.hpp"
# include "Character/CAllFormatsAnimSource.hpp"
# include "Character/CAnimPOIData.hpp"
# include "Collision/CCollidableOBBTreeGroup.hpp"
# include "Collision/CCollisionResponseData.hpp"
# include "CSaveWorld.hpp"
# include "AutoMapper/CMapWorld.hpp"
# include "AutoMapper/CMapArea.hpp"
# include "AutoMapper/CMapUniverse.hpp"
2018-05-02 00:43:31 +00:00
# include "World/CStateMachine.hpp"
2017-10-26 05:37:46 +00:00
# include "CScannableObjectInfo.hpp"
2017-01-20 03:53:32 +00:00
# include "Audio/CAudioGroupSet.hpp"
2017-10-26 05:37:46 +00:00
# include "Audio/CSfxManager.hpp"
# include "Audio/CMidiManager.hpp"
# include "CDependencyGroup.hpp"
# include "MP1OriginalIDs.hpp"
2018-04-30 03:12:41 +00:00
# include "CStateManager.hpp"
# include "World/CPlayer.hpp"
2018-10-07 02:59:17 +00:00
# include "CStopwatch.hpp"
2018-05-25 06:39:38 +00:00
# include <discord_rpc.h>
2018-01-16 06:42:28 +00:00
2018-04-26 21:12:20 +00:00
namespace hecl
{
extern CVar * com_enableCheats ;
extern CVar * com_developer ;
} ;
2016-03-04 23:04:53 +00:00
namespace urde
2015-08-17 05:26:58 +00:00
{
2015-08-17 22:05:00 +00:00
namespace MP1
{
2017-02-09 09:23:17 +00:00
CGameArchitectureSupport : : CGameArchitectureSupport ( CMain & parent ,
boo : : IAudioVoiceEngine * voiceEngine ,
2016-12-14 22:56:59 +00:00
amuse : : IBackendVoiceAllocator & backend )
2016-09-30 22:43:19 +00:00
: m_parent ( parent ) ,
2016-12-29 21:38:59 +00:00
x0_audioSys ( voiceEngine , backend , 0 , 0 , 0 , 0 , 0 ) ,
x30_inputGenerator ( g_tweakPlayer - > GetLeftLogicalThreshold ( ) ,
2016-09-15 07:26:35 +00:00
g_tweakPlayer - > GetRightLogicalThreshold ( ) ) ,
2016-12-29 21:38:59 +00:00
x44_guiSys ( * g_ResFactory , * g_SimplePool , CGuiSys : : EUsageMode : : Zero )
2016-09-14 05:54:09 +00:00
{
2017-01-22 01:40:12 +00:00
CMain * m = static_cast < CMain * > ( g_Main ) ;
2016-12-29 21:38:59 +00:00
g_GuiSys = & x44_guiSys ;
x30_inputGenerator . startScanning ( ) ;
2017-02-18 02:19:50 +00:00
g_InputGenerator = & x30_inputGenerator ;
2017-01-23 07:22:17 +00:00
CAudioSys : : SysSetVolume ( 0x7f ) ;
CAudioSys : : SetDefaultVolumeScale ( 0x75 ) ;
CAudioSys : : SetVolumeScale ( CAudioSys : : GetDefaultVolumeScale ( ) ) ;
2017-01-16 09:14:54 +00:00
CStreamAudioManager : : Initialize ( ) ;
2017-02-06 03:21:58 +00:00
CStreamAudioManager : : SetMusicVolume ( 0x7f ) ;
2017-01-22 01:40:12 +00:00
m - > ResetGameState ( ) ;
2016-09-14 05:54:09 +00:00
2018-06-13 03:20:49 +00:00
//std::shared_ptr<CIOWin> splash = std::make_shared<CSplashScreen>(CSplashScreen::ESplashScreen::Nintendo);
//x58_ioWinManager.AddIOWin(splash, 1000, 10000);
2016-09-14 05:54:09 +00:00
std : : shared_ptr < CIOWin > mf = std : : make_shared < CMainFlow > ( ) ;
2016-12-29 21:38:59 +00:00
x58_ioWinManager . AddIOWin ( mf , 0 , 0 ) ;
2016-09-14 05:54:09 +00:00
std : : shared_ptr < CIOWin > console = std : : make_shared < CConsoleOutputWindow > ( 8 , 5.f , 0.75f ) ;
2016-12-29 21:38:59 +00:00
x58_ioWinManager . AddIOWin ( console , 100 , 0 ) ;
2016-09-14 05:54:09 +00:00
std : : shared_ptr < CIOWin > audState = std : : make_shared < CAudioStateWin > ( ) ;
2016-12-29 21:38:59 +00:00
x58_ioWinManager . AddIOWin ( audState , 100 , - 1 ) ;
2016-09-14 05:54:09 +00:00
std : : shared_ptr < CIOWin > errWin = std : : make_shared < CErrorOutputWindow > ( false ) ;
2016-12-29 21:38:59 +00:00
x58_ioWinManager . AddIOWin ( errWin , 10000 , 100000 ) ;
2016-09-14 05:54:09 +00:00
}
2017-01-20 03:53:32 +00:00
void CGameArchitectureSupport : : UpdateTicks ( )
2016-09-14 05:54:09 +00:00
{
2017-02-18 02:19:50 +00:00
x4_archQueue . Push ( MakeMsg : : CreateFrameBegin ( EArchMsgTarget : : Game , x78_gameFrameCount ) ) ;
2017-01-20 03:53:32 +00:00
x4_archQueue . Push ( MakeMsg : : CreateTimerTick ( EArchMsgTarget : : Game , 1.f / 60.f ) ) ;
}
2016-09-14 05:54:09 +00:00
2017-01-20 03:53:32 +00:00
void CGameArchitectureSupport : : Update ( )
{
2016-09-14 05:54:09 +00:00
g_GameState - > GetWorldTransitionManager ( ) - > TouchModels ( ) ;
2017-01-22 17:36:25 +00:00
x30_inputGenerator . Update ( 1 / 60.f , x4_archQueue ) ;
2017-02-18 02:19:50 +00:00
x4_archQueue . Push ( MakeMsg : : CreateFrameEnd ( EArchMsgTarget : : Game , x78_gameFrameCount ) ) ;
2016-12-29 21:38:59 +00:00
x58_ioWinManager . PumpMessages ( x4_archQueue ) ;
2017-01-20 03:53:32 +00:00
}
struct AudioGroupInfo
{
const char * name ;
u32 id ;
} ;
static const AudioGroupInfo StaticAudioGroups [ ] =
{
{ " Misc_AGSC " , 39 } ,
{ " MiscSamus_AGSC " , 41 } ,
{ " UI_AGSC " , 40 } ,
{ " Weapons_AGSC " , 43 } ,
{ " ZZZ_AGSC " , 65 }
} ;
bool CGameArchitectureSupport : : LoadAudio ( )
{
if ( x88_audioLoadStatus = = EAudioLoadStatus : : Loaded )
return true ;
for ( int i = 0 ; i < 5 ; + + i )
{
TToken < CAudioGroupSet > & tok = x8c_pendingAudioGroups [ i ] ;
if ( tok . IsLocked ( ) )
{
if ( tok . IsLoaded ( ) )
{
CAudioGroupSet * set = tok . GetObj ( ) ;
if ( ! CAudioSys : : SysIsGroupSetLoaded ( set - > GetName ( ) ) )
{
CAudioSys : : SysLoadGroupSet ( tok , set - > GetName ( ) , tok . GetObjectTag ( ) - > id ) ;
CAudioSys : : SysAddGroupIntoAmuse ( set - > GetName ( ) ) ;
}
}
else
{
return false ;
}
}
else
{
/* Lock next pending group */
tok . Lock ( ) ;
return false ;
}
}
CSfxManager : : LoadTranslationTable ( g_SimplePool , g_ResFactory - > GetResourceIdByName ( " sound_lookup " ) ) ;
x8c_pendingAudioGroups = std : : vector < TToken < CAudioGroupSet > > ( ) ;
x88_audioLoadStatus = EAudioLoadStatus : : Loaded ;
return true ;
}
void CGameArchitectureSupport : : PreloadAudio ( )
{
if ( x88_audioLoadStatus ! = EAudioLoadStatus : : Uninitialized )
return ;
x8c_pendingAudioGroups . clear ( ) ;
x8c_pendingAudioGroups . reserve ( 5 ) ;
for ( int i = 0 ; i < 5 ; + + i )
{
const AudioGroupInfo & info = StaticAudioGroups [ i ] ;
CToken grp = g_SimplePool - > GetObj ( info . name ) ;
if ( i = = 0 ) /* Lock first group in sequence */
grp . Lock ( ) ;
x8c_pendingAudioGroups . push_back ( std : : move ( grp ) ) ;
}
2016-12-29 21:38:59 +00:00
2017-01-20 03:53:32 +00:00
x88_audioLoadStatus = EAudioLoadStatus : : Loading ;
2016-09-14 05:54:09 +00:00
}
2017-01-22 01:40:12 +00:00
void CGameArchitectureSupport : : UnloadAudio ( )
{
for ( int i = 0 ; i < 5 ; + + i )
{
const AudioGroupInfo & info = StaticAudioGroups [ i ] ;
const SObjectTag * tag = g_ResFactory - > GetResourceIdByName ( info . name ) ;
2017-11-13 06:19:18 +00:00
auto name = CAudioSys : : SysGetGroupSetName ( tag - > id ) ;
2017-01-22 01:40:12 +00:00
CAudioSys : : SysRemoveGroupFromAmuse ( name ) ;
CAudioSys : : SysUnloadAudioGroupSet ( name ) ;
}
x8c_pendingAudioGroups = std : : vector < TToken < CAudioGroupSet > > ( ) ;
x88_audioLoadStatus = EAudioLoadStatus : : Uninitialized ;
}
2016-09-14 05:54:09 +00:00
void CGameArchitectureSupport : : Draw ( )
{
2016-12-29 21:38:59 +00:00
x58_ioWinManager . Draw ( ) ;
2017-02-18 02:19:50 +00:00
if ( m_parent . x161_24_gameFrameDrawn )
{
+ + x78_gameFrameCount ;
m_parent . x161_24_gameFrameDrawn = false ;
}
2016-09-14 05:54:09 +00:00
}
2017-01-22 01:40:12 +00:00
CGameArchitectureSupport : : ~ CGameArchitectureSupport ( )
{
x58_ioWinManager . RemoveAllIOWins ( ) ;
UnloadAudio ( ) ;
CSfxManager : : Shutdown ( ) ;
CStreamAudioManager : : Shutdown ( ) ;
}
2018-01-15 16:00:20 +00:00
void CGameArchitectureSupport : : charKeyDown ( unsigned long charCode , boo : : EModifierKey mods , bool isRepeat )
{
x30_inputGenerator . charKeyDown ( charCode , mods , isRepeat ) ;
m_parent . m_console - > handleCharCode ( charCode , mods , isRepeat ) ;
}
void CGameArchitectureSupport : : specialKeyDown ( boo : : ESpecialKey key , boo : : EModifierKey mods , bool isRepeat )
{
x30_inputGenerator . specialKeyDown ( key , mods , isRepeat ) ;
m_parent . m_console - > handleSpecialKeyDown ( key , mods , isRepeat ) ;
}
void CGameArchitectureSupport : : specialKeyUp ( boo : : ESpecialKey key , boo : : EModifierKey mods )
{
x30_inputGenerator . specialKeyUp ( key , mods ) ;
m_parent . m_console - > handleSpecialKeyUp ( key , mods ) ;
}
2017-10-26 10:09:51 +00:00
CMain : : CMain ( IFactory * resFactory , CSimplePool * resStore ,
2016-08-17 06:18:18 +00:00
boo : : IGraphicsDataFactory * gfxFactory ,
boo : : IGraphicsCommandQueue * cmdQ ,
2017-11-05 06:17:12 +00:00
const boo : : ObjToken < boo : : ITextureR > & spareTex )
2018-01-15 16:00:20 +00:00
: m_booSetter ( gfxFactory , cmdQ , spareTex ) ,
2016-09-15 07:26:35 +00:00
x128_globalObjects ( resFactory , resStore )
2015-08-17 05:26:58 +00:00
{
2015-11-21 01:16:07 +00:00
xe4_gameplayResult = EGameplayResult : : Playing ;
2016-08-15 20:58:07 +00:00
g_Main = this ;
2015-08-27 00:23:46 +00:00
}
2016-04-15 20:42:40 +00:00
2016-08-17 06:18:18 +00:00
CMain : : BooSetter : : BooSetter ( boo : : IGraphicsDataFactory * factory ,
boo : : IGraphicsCommandQueue * cmdQ ,
2017-11-05 06:17:12 +00:00
const boo : : ObjToken < boo : : ITextureR > & spareTex )
2016-08-17 06:18:18 +00:00
{
CGraphics : : InitializeBoo ( factory , cmdQ , spareTex ) ;
2018-10-07 02:59:17 +00:00
CParticleSwooshShaders : : Initialize ( ) ;
CThermalColdFilter : : Initialize ( ) ;
CThermalHotFilter : : Initialize ( ) ;
CSpaceWarpFilter : : Initialize ( ) ;
CCameraBlurFilter : : Initialize ( ) ;
CXRayBlurFilter : : Initialize ( ) ;
CFogVolumePlaneShader : : Initialize ( ) ;
CFogVolumeFilter : : Initialize ( ) ;
CEnergyBarShader : : Initialize ( ) ;
CRadarPaintShader : : Initialize ( ) ;
CMapSurfaceShader : : Initialize ( ) ;
CPhazonSuitFilter : : Initialize ( ) ;
CAABoxShader : : Initialize ( ) ;
CWorldShadowShader : : Initialize ( ) ;
CColoredQuadFilter : : Initialize ( ) ;
CTexturedQuadFilter : : Initialize ( ) ;
CTexturedQuadFilterAlpha : : Initialize ( ) ;
CTextSupportShader : : Initialize ( ) ;
CScanLinesFilter : : Initialize ( ) ;
CRandomStaticFilter : : Initialize ( ) ;
2018-11-02 08:16:16 +00:00
CEnvFxShaders : : Initialize ( ) ;
2018-02-01 23:19:34 +00:00
CNESShader : : Initialize ( ) ;
2016-08-17 06:18:18 +00:00
}
2015-08-27 00:23:46 +00:00
void CMain : : RegisterResourceTweaks ( )
{
}
2017-10-26 05:37:46 +00:00
void CGameGlobalObjects : : AddPaksAndFactories ( )
{
CGraphics : : SetViewPointMatrix ( zeus : : CTransform : : Identity ( ) ) ;
CGraphics : : SetModelMatrix ( zeus : : CTransform : : Identity ( ) ) ;
if ( CResLoader * loader = g_ResFactory - > GetResLoader ( ) )
{
loader - > AddPakFileAsync ( " Tweaks " , false , false ) ;
loader - > AddPakFileAsync ( " NoARAM " , false , false ) ;
loader - > AddPakFileAsync ( " AudioGrp " , false , false ) ;
loader - > AddPakFileAsync ( " MiscData " , false , false ) ;
loader - > AddPakFileAsync ( " SamusGun " , true , false ) ;
loader - > AddPakFileAsync ( " TestAnim " , true , false ) ;
loader - > AddPakFileAsync ( " SamGunFx " , true , false ) ;
loader - > AddPakFileAsync ( " MidiData " , false , false ) ;
loader - > AddPakFileAsync ( " GGuiSys " , false , false ) ;
2017-10-27 10:10:32 +00:00
loader - > AddPakFileAsync ( " !original_ids " , false , false ) ;
loader - > WaitForPakFileLoadingComplete ( ) ;
2017-10-26 05:37:46 +00:00
}
if ( CFactoryMgr * fmgr = g_ResFactory - > GetFactoryMgr ( ) )
{
fmgr - > AddFactory ( FOURCC ( ' TXTR ' ) , FMemFactoryFunc ( FTextureFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' PART ' ) , FFactoryFunc ( FParticleFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' FRME ' ) , FFactoryFunc ( RGuiFrameFactoryInGame ) ) ;
fmgr - > AddFactory ( FOURCC ( ' FONT ' ) , FFactoryFunc ( FRasterFontFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' CMDL ' ) , FMemFactoryFunc ( FModelFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' CINF ' ) , FFactoryFunc ( FCharLayoutInfo ) ) ;
fmgr - > AddFactory ( FOURCC ( ' CSKR ' ) , FFactoryFunc ( FSkinRulesFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' ANCS ' ) , FFactoryFunc ( FAnimCharacterSet ) ) ;
fmgr - > AddFactory ( FOURCC ( ' ANIM ' ) , FFactoryFunc ( AnimSourceFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' EVNT ' ) , FFactoryFunc ( AnimPOIDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' DCLN ' ) , FFactoryFunc ( FCollidableOBBTreeGroupFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' DGRP ' ) , FFactoryFunc ( FDependencyGroupFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' AGSC ' ) , FMemFactoryFunc ( FAudioGroupSetDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' CSNG ' ) , FFactoryFunc ( FMidiDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' ATBL ' ) , FFactoryFunc ( FAudioTranslationTableFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' STRG ' ) , FFactoryFunc ( FStringTableFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' HINT ' ) , FFactoryFunc ( FHintFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' SAVW ' ) , FFactoryFunc ( FSaveWorldFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' MAPW ' ) , FFactoryFunc ( FMapWorldFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' OIDS ' ) , FFactoryFunc ( FMP1OriginalIDsFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' SCAN ' ) , FFactoryFunc ( FScannableObjectInfoFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' CRSC ' ) , FFactoryFunc ( FCollisionResponseDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' SWHC ' ) , FFactoryFunc ( FParticleSwooshDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' ELSC ' ) , FFactoryFunc ( FParticleElectricDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' WPSC ' ) , FFactoryFunc ( FProjectileWeaponDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' DPSC ' ) , FFactoryFunc ( FDecalDataFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' MAPA ' ) , FFactoryFunc ( FMapAreaFactory ) ) ;
fmgr - > AddFactory ( FOURCC ( ' MAPU ' ) , FFactoryFunc ( FMapUniverseFactory ) ) ;
2018-05-02 00:43:31 +00:00
fmgr - > AddFactory ( FOURCC ( ' AFSM ' ) , FFactoryFunc ( FAiFiniteStateMachineFactory ) ) ;
2018-05-26 03:07:29 +00:00
fmgr - > AddFactory ( FOURCC ( ' PATH ' ) , FMemFactoryFunc ( FPathFindAreaFactory ) ) ;
2017-10-26 05:37:46 +00:00
}
}
2018-04-26 21:12:20 +00:00
CGameGlobalObjects : : ~ CGameGlobalObjects ( )
{
g_ResFactory = nullptr ;
g_SimplePool = nullptr ;
g_CharFactoryBuilder = nullptr ;
g_AiFuncMap = nullptr ;
g_GameState = nullptr ;
g_TweakManager = nullptr ;
}
2017-10-26 05:37:46 +00:00
void CMain : : AddWorldPaks ( )
{
2017-10-27 10:10:32 +00:00
CResLoader * loader = g_ResFactory - > GetResLoader ( ) ;
if ( ! loader )
return ;
2017-11-13 06:19:18 +00:00
auto pakPrefix = g_tweakGame - > GetWorldPrefix ( ) ;
2017-10-26 05:37:46 +00:00
for ( int i = 0 ; i < 9 ; + + i )
{
2017-11-13 06:19:18 +00:00
std : : string path ( pakPrefix ) ;
2018-09-21 03:41:57 +00:00
2017-10-26 05:37:46 +00:00
if ( i ! = 0 )
path + = ' 0 ' + i ;
2018-09-21 03:41:57 +00:00
std : : string lowerPath ( path ) ;
athena : : utility : : tolower ( lowerPath ) ;
2017-10-27 10:10:32 +00:00
if ( CDvdFile : : FileExists ( ( path + " .upak " ) . c_str ( ) ) )
loader - > AddPakFileAsync ( path , false , true ) ;
2018-09-21 03:41:57 +00:00
else if ( CDvdFile : : FileExists ( ( lowerPath + " .upak " ) . c_str ( ) ) )
loader - > AddPakFileAsync ( lowerPath , false , true ) ;
2017-10-26 05:37:46 +00:00
}
2017-10-27 10:10:32 +00:00
loader - > WaitForPakFileLoadingComplete ( ) ;
2017-10-26 05:37:46 +00:00
}
2015-08-27 00:23:46 +00:00
void CMain : : ResetGameState ( )
{
2016-12-29 21:38:59 +00:00
CPersistentOptions sysOpts = g_GameState - > SystemOptions ( ) ;
CGameOptions gameOpts = g_GameState - > GameOptions ( ) ;
x128_globalObjects . ResetGameState ( ) ;
g_GameState - > ImportPersistentOptions ( sysOpts ) ;
g_GameState - > SetGameOptions ( gameOpts ) ;
2017-01-01 06:46:52 +00:00
g_GameState - > GetPlayerState ( ) - > SetIsFusionEnabled ( g_GameState - > SystemOptions ( ) . GetPlayerFusionSuitActive ( ) ) ;
2015-08-27 00:23:46 +00:00
}
2015-11-02 18:45:39 +00:00
2018-10-07 02:59:17 +00:00
void CMain : : InitializeSubsystems ( )
2015-08-27 00:23:46 +00:00
{
2017-01-08 03:08:02 +00:00
CBasics : : Initialize ( ) ;
2018-10-07 02:59:17 +00:00
CModelShaders : : Initialize ( ) ;
2016-04-15 20:42:40 +00:00
CMoviePlayer : : Initialize ( ) ;
CLineRenderer : : Initialize ( ) ;
2015-08-27 00:23:46 +00:00
CElementGen : : Initialize ( ) ;
CAnimData : : InitializeCache ( ) ;
CDecalManager : : Initialize ( ) ;
2017-01-08 02:52:49 +00:00
CGBASupport : : Initialize ( ) ;
2015-08-27 00:23:46 +00:00
}
2015-11-02 18:45:39 +00:00
2017-10-22 06:11:22 +00:00
void CMain : : MemoryCardInitializePump ( )
{
if ( ! g_MemoryCardSys )
{
std : : unique_ptr < CMemoryCardSys > & memSys = x128_globalObjects . x0_memoryCardSys ;
if ( ! memSys )
memSys . reset ( new CMemoryCardSys ( ) ) ;
if ( memSys - > InitializePump ( ) )
{
g_MemoryCardSys = memSys . get ( ) ;
g_GameState - > InitializeMemoryStates ( ) ;
}
}
}
2015-08-27 00:23:46 +00:00
void CMain : : FillInAssetIDs ( )
{
}
2017-01-20 03:53:32 +00:00
bool CMain : : LoadAudio ( )
2015-08-27 00:23:46 +00:00
{
2017-01-20 03:53:32 +00:00
if ( x164_archSupport )
return x164_archSupport - > LoadAudio ( ) ;
return true ;
2015-08-27 00:23:46 +00:00
}
2015-11-02 18:45:39 +00:00
2017-04-15 05:32:25 +00:00
void CMain : : EnsureWorldPaksReady ( )
{
}
2017-08-13 05:26:14 +00:00
void CMain : : EnsureWorldPakReady ( CAssetId mlvl )
2017-04-15 05:32:25 +00:00
{
/* TODO: Schedule resource list load for World Pak containing mlvl */
}
2018-04-26 21:12:20 +00:00
void CMain : : Give ( hecl : : Console * console , const std : : vector < std : : string > & args )
{
if ( args . size ( ) < 1 | | ( ! g_GameState | | ! g_GameState - > GetPlayerState ( ) ) )
return ;
std : : string type = args [ 0 ] ;
athena : : utility : : tolower ( type ) ;
std : : shared_ptr < CPlayerState > pState = g_GameState - > GetPlayerState ( ) ;
if ( type = = " all " )
{
for ( u32 item = 0 ; item < u32 ( CPlayerState : : EItemType : : Max ) ; + + item )
{
pState - > ReInitalizePowerUp ( CPlayerState : : EItemType ( item ) ,
CPlayerState : : GetPowerUpMaxValue ( CPlayerState : : EItemType ( item ) ) ) ;
pState - > IncrPickup ( CPlayerState : : EItemType ( item ) ,
CPlayerState : : GetPowerUpMaxValue ( CPlayerState : : EItemType ( item ) ) ) ;
}
pState - > IncrPickup ( CPlayerState : : EItemType : : HealthRefill , 99999 ) ;
}
2018-06-04 19:15:35 +00:00
else
2018-04-26 21:12:20 +00:00
{
2018-06-04 19:15:35 +00:00
CPlayerState : : EItemType eType = CPlayerState : : ItemNameToType ( type ) ;
if ( eType = = CPlayerState : : EItemType : : Invalid )
{
console - > report ( hecl : : Console : : Level : : Info , " Invalid item %s " , type . c_str ( ) ) ;
return ;
}
if ( eType = = CPlayerState : : EItemType : : HealthRefill )
{
pState - > IncrPickup ( eType , 9999 ) ;
console - > report ( hecl : : Console : : Level : : Info , " Cheater....., Greatly increasing Metroid encounters, have fun! " ) ;
2018-10-11 22:57:05 +00:00
if ( g_StateManager )
g_StateManager - > Player ( ) - > AsyncLoadSuit ( * g_StateManager ) ;
2018-06-04 19:15:35 +00:00
return ;
}
s32 itemAmt = CPlayerState : : GetPowerUpMaxValue ( eType ) ;
2018-04-26 21:12:20 +00:00
if ( args . size ( ) = = 2 )
{
2018-06-04 19:15:35 +00:00
s32 itemMax = CPlayerState : : GetPowerUpMaxValue ( eType ) ;
itemAmt = s32 ( strtol ( args [ 1 ] . c_str ( ) , nullptr , 10 ) ) ;
itemAmt = zeus : : clamp ( - itemMax , itemAmt , itemMax ) ;
2018-04-26 21:12:20 +00:00
}
2018-06-04 19:15:35 +00:00
u32 curCap = pState - > GetItemCapacity ( eType ) ;
if ( itemAmt > 0 & & curCap < u32 ( itemAmt ) )
2018-04-26 21:12:20 +00:00
{
2018-06-04 19:15:35 +00:00
/* Handle special case with Missiles */
if ( eType = = CPlayerState : : EItemType : : Missiles )
{
u32 tmp = ( ( u32 ( itemAmt ) / 5 ) + ( itemAmt % 5 ) ) * 5 ;
pState - > ReInitalizePowerUp ( eType , tmp ) ;
}
else
pState - > ReInitalizePowerUp ( eType , itemAmt ) ;
2018-04-26 21:12:20 +00:00
}
2018-06-04 19:15:35 +00:00
if ( itemAmt > 0 )
pState - > IncrPickup ( eType , u32 ( itemAmt ) ) ;
2018-04-26 21:12:20 +00:00
else
2018-06-04 19:15:35 +00:00
pState - > DecrPickup ( eType , zeus : : clamp ( 0u , u32 ( abs ( itemAmt ) ) , pState - > GetItemAmount ( eType ) ) ) ;
2018-04-26 21:12:20 +00:00
}
2018-10-11 22:57:05 +00:00
if ( g_StateManager )
g_StateManager - > Player ( ) - > AsyncLoadSuit ( * g_StateManager ) ;
2018-06-04 19:15:35 +00:00
console - > report ( hecl : : Console : : Level : : Info , " Cheater....., Greatly increasing Metroid encounters, have fun! " ) ;
2018-04-26 21:12:20 +00:00
}
2018-06-13 19:36:11 +00:00
void CMain : : God ( hecl : : Console * con , const std : : vector < std : : string > & )
{
if ( g_GameState & & g_GameState - > GetPlayerState ( ) )
{
g_GameState - > GetPlayerState ( ) - > SetCanTakeDamage ( ! g_GameState - > GetPlayerState ( ) - > CanTakeDamage ( ) ) ;
if ( ! g_GameState - > GetPlayerState ( ) - > CanTakeDamage ( ) )
con - > report ( hecl : : Console : : Level : : Info , " God Mode Enabled " ) ;
else
con - > report ( hecl : : Console : : Level : : Info , " God Mode Disabled " ) ;
}
}
2018-04-30 03:12:41 +00:00
void CMain : : Teleport ( hecl : : Console * , const std : : vector < std : : string > & args )
{
if ( ! g_StateManager | | args . size ( ) < 3 )
return ;
zeus : : CVector3f loc ;
for ( u32 i = 0 ; i < 3 ; + + i )
loc [ i ] = strtof ( args [ i ] . c_str ( ) , nullptr ) ;
zeus : : CTransform xf = g_StateManager - > Player ( ) - > GetTransform ( ) ;
xf . origin = loc ;
if ( args . size ( ) = = 6 )
{
zeus : : CVector3f angle ;
for ( u32 i = 0 ; i < 3 ; + + i )
angle [ i ] = zeus : : degToRad ( strtof ( args [ i + 3 ] . c_str ( ) , nullptr ) ) ;
xf . setRotation ( zeus : : CMatrix3f ( zeus : : CQuaternion ( angle ) ) ) ;
}
g_StateManager - > Player ( ) - > Teleport ( xf , * g_StateManager , false ) ;
}
2018-06-13 02:07:13 +00:00
void CMain : : ListWorlds ( hecl : : Console * con , const std : : vector < std : : string > & )
{
2018-09-21 03:41:57 +00:00
2018-06-13 02:07:13 +00:00
if ( g_ResFactory & & g_ResFactory - > GetResLoader ( ) )
{
for ( const auto & pak : g_ResFactory - > GetResLoader ( ) - > GetPaks ( ) )
if ( pak - > IsWorldPak ( ) )
{
for ( const auto & named : pak - > GetNameList ( ) )
if ( named . second . type = = SBIG ( ' MLVL ' ) )
2018-09-21 03:41:57 +00:00
{
con - > report ( hecl : : Console : : Level : : Info , " %s '%08X' " , named . first . c_str ( ) ,
named . second . id . Value ( ) ) ;
}
2018-06-13 02:07:13 +00:00
}
}
}
2018-09-21 03:41:57 +00:00
void CMain : : WarpTo ( hecl : : Console * con , const std : : vector < std : : string > & args )
{
if ( ! g_StateManager )
return ;
if ( args . size ( ) < 1 )
return ;
TAreaId aId ;
std : : string worldName ;
if ( args . size ( ) = = 2 )
{
worldName = args [ 0 ] ;
athena : : utility : : tolower ( worldName ) ;
aId = strtol ( args [ 1 ] . c_str ( ) , nullptr , 10 ) ;
}
else
aId = strtol ( args [ 0 ] . c_str ( ) , nullptr , 10 ) ;
if ( ! worldName . empty ( ) & & g_ResFactory & & g_ResFactory - > GetResLoader ( ) )
{
bool found = false ;
for ( const auto & pak : g_ResFactory - > GetResLoader ( ) - > GetPaks ( ) )
{
if ( found )
break ;
if ( pak - > IsWorldPak ( ) )
{
for ( const auto & named : pak - > GetNameList ( ) )
if ( named . second . type = = SBIG ( ' MLVL ' ) )
{
std : : string name = named . first ;
athena : : utility : : tolower ( name ) ;
if ( name . find ( worldName ) ! = std : : string : : npos )
{
g_GameState - > SetCurrentWorldId ( named . second . id ) ;
found = true ;
break ;
}
}
}
}
}
g_GameState - > GetWorldTransitionManager ( ) - > DisableTransition ( ) ;
if ( aId > = g_GameState - > CurrentWorldState ( ) . GetLayerState ( ) - > GetAreaCount ( ) )
aId = 0 ;
g_GameState - > CurrentWorldState ( ) . SetAreaId ( aId ) ;
g_Main - > SetFlowState ( EFlowState : : None ) ;
g_StateManager - > SetWarping ( true ) ;
g_StateManager - > SetShouldQuitGame ( true ) ;
}
2016-12-30 06:37:01 +00:00
void CMain : : StreamNewGameState ( CBitStreamReader & r , u32 idx )
{
2017-01-01 06:46:52 +00:00
bool fusionBackup = g_GameState - > SystemOptions ( ) . GetPlayerFusionSuitActive ( ) ;
2016-12-30 06:43:29 +00:00
x128_globalObjects . x134_gameState = std : : make_unique < CGameState > ( r , idx ) ;
g_GameState = x128_globalObjects . x134_gameState . get ( ) ;
2017-01-01 06:46:52 +00:00
g_GameState - > SystemOptions ( ) . SetPlayerFusionSuitActive ( fusionBackup ) ;
2016-12-30 06:43:29 +00:00
g_GameState - > GetPlayerState ( ) - > SetIsFusionEnabled ( fusionBackup ) ;
2016-12-30 06:37:01 +00:00
g_GameState - > HintOptions ( ) . SetNextHintTime ( ) ;
}
2018-10-18 04:51:59 +00:00
void CMain : : RefreshGameState ( )
{
CPersistentOptions sysOpts = g_GameState - > SystemOptions ( ) ;
u64 cardSerial = g_GameState - > GetCardSerial ( ) ;
std : : vector < u8 > saveData = g_GameState - > BackupBuf ( ) ;
CGameOptions gameOpts = g_GameState - > GameOptions ( ) ;
CBitStreamReader r ( saveData . data ( ) , saveData . size ( ) ) ;
x128_globalObjects . StreamInGameState ( r , g_GameState - > GetFileIdx ( ) ) ;
g_GameState - > SetPersistentOptions ( sysOpts ) ;
g_GameState - > SetGameOptions ( gameOpts ) ;
g_GameState - > GameOptions ( ) . EnsureSettings ( ) ;
g_GameState - > SetCardSerial ( cardSerial ) ;
g_GameState - > GetPlayerState ( ) - > SetIsFusionEnabled (
g_GameState - > SystemOptions ( ) . GetPlayerFusionSuitActive ( ) ) ;
}
2018-01-16 06:42:28 +00:00
static logvisor : : Module DiscordLog ( " Discord " ) ;
static const char * DISCORD_APPLICATION_ID = " 402571593815031819 " ;
static int64_t DiscordStartTime ;
static CAssetId DiscordWorldSTRG ;
static TLockedToken < CStringTable > DiscordWorldSTRGObj ;
static std : : string DiscordWorldName ;
static u32 DiscordItemPercent = 0xffffffff ;
static std : : string DiscordState ;
void CMain : : InitializeDiscord ( )
{
DiscordStartTime = time ( 0 ) ;
DiscordEventHandlers handlers = { } ;
handlers . ready = HandleDiscordReady ;
handlers . disconnected = HandleDiscordDisconnected ;
handlers . errored = HandleDiscordErrored ;
Discord_Initialize ( DISCORD_APPLICATION_ID , & handlers , 1 , nullptr ) ;
}
void CMain : : ShutdownDiscord ( )
{
DiscordWorldSTRGObj = TLockedToken < CStringTable > ( ) ;
Discord_Shutdown ( ) ;
}
void CMain : : UpdateDiscordPresence ( CAssetId worldSTRG )
{
bool updated = false ;
if ( worldSTRG ! = DiscordWorldSTRG )
{
DiscordWorldSTRG = worldSTRG ;
DiscordWorldSTRGObj = g_SimplePool - > GetObj ( SObjectTag { FOURCC ( ' STRG ' ) , worldSTRG } ) ;
}
if ( DiscordWorldSTRGObj . IsLoaded ( ) )
{
DiscordWorldName = hecl : : Char16ToUTF8 ( DiscordWorldSTRGObj - > GetString ( 0 ) ) ;
DiscordWorldSTRGObj = TLockedToken < CStringTable > ( ) ;
updated = true ;
}
if ( g_GameState )
{
if ( CPlayerState * pState = g_GameState - > GetPlayerState ( ) . get ( ) )
{
2018-04-26 21:12:20 +00:00
u32 itemPercent = pState - > CalculateItemCollectionRate ( ) * 100 / pState - > GetPickupTotal ( ) ;
2018-01-16 06:42:28 +00:00
if ( DiscordItemPercent ! = itemPercent )
{
DiscordItemPercent = itemPercent ;
DiscordState = hecl : : Format ( " %d%% " , itemPercent ) ;
updated = true ;
}
}
}
if ( updated )
{
DiscordRichPresence discordPresence = { } ;
discordPresence . state = DiscordState . c_str ( ) ;
discordPresence . details = DiscordWorldName . c_str ( ) ;
2018-01-21 22:05:25 +00:00
discordPresence . largeImageKey = " default " ;
2018-01-16 06:42:28 +00:00
discordPresence . startTimestamp = DiscordStartTime ;
Discord_UpdatePresence ( & discordPresence ) ;
}
}
2018-05-25 06:39:38 +00:00
void CMain : : HandleDiscordReady ( const DiscordUser * request )
2018-01-16 06:42:28 +00:00
{
DiscordLog . report ( logvisor : : Info , " Discord Ready " ) ;
}
void CMain : : HandleDiscordDisconnected ( int errorCode , const char * message )
{
DiscordLog . report ( logvisor : : Warning , " Discord Disconnected: %s " , message ) ;
}
void CMain : : HandleDiscordErrored ( int errorCode , const char * message )
{
DiscordLog . report ( logvisor : : Error , " Discord Error: %s " , message ) ;
}
2016-08-17 06:18:18 +00:00
void CMain : : Init ( const hecl : : Runtime : : FileStoreManager & storeMgr ,
2018-01-15 16:00:20 +00:00
hecl : : CVarManager * cvarMgr ,
2017-02-09 09:23:17 +00:00
boo : : IWindow * window ,
2016-09-15 07:26:35 +00:00
boo : : IAudioVoiceEngine * voiceEngine ,
amuse : : IBackendVoiceAllocator & backend )
2016-04-15 20:42:40 +00:00
{
2018-01-16 06:42:28 +00:00
InitializeDiscord ( ) ;
2017-02-09 09:23:17 +00:00
m_mainWindow = window ;
2018-01-15 16:00:20 +00:00
m_cvarMgr = cvarMgr ;
m_console = std : : make_unique < hecl : : Console > ( m_cvarMgr ) ;
2018-09-21 03:41:57 +00:00
m_console - > registerCommand ( " Quit " sv , " Quits the game immediately " sv , " " sv , std : : bind ( & CMain : : quit , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) ) ;
2018-04-30 03:12:41 +00:00
m_console - > registerCommand ( " Give " sv , " Gives the player the specified item, maxing it out " sv , " " sv , std : : bind ( & CMain : : Give , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) , hecl : : SConsoleCommand : : ECommandFlags : : Cheat ) ;
m_console - > registerCommand ( " Teleport " sv , " Teleports the player to the specified coordinates in worldspace " sv , " x y z [dX dY dZ] " sv , std : : bind ( & CMain : : Teleport , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) , ( hecl : : SConsoleCommand : : ECommandFlags : : Cheat | hecl : : SConsoleCommand : : ECommandFlags : : Developer ) ) ;
2018-06-13 19:36:11 +00:00
m_console - > registerCommand ( " God " sv , " Disables damage given by enemies and objects " sv , " " sv , std : : bind ( & CMain : : God , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) , hecl : : SConsoleCommand : : ECommandFlags : : Cheat ) ;
2018-09-21 03:41:57 +00:00
m_console - > registerCommand ( " ListWorlds " sv , " Lists loaded worlds " sv , " " sv , std : : bind ( & CMain : : ListWorlds , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) , hecl : : SConsoleCommand : : ECommandFlags : : Normal ) ;
m_console - > registerCommand ( " WarpTo " sv , " Warps to a given area and world " sv , " [worldname] areaId " sv , std : : bind ( & CMain : : WarpTo , this , std : : placeholders : : _1 , std : : placeholders : : _2 ) , hecl : : SConsoleCommand : : ECommandFlags : : Normal ) ;
2018-04-26 21:12:20 +00:00
2018-10-28 00:20:30 +00:00
InitializeSubsystems ( ) ;
x128_globalObjects . PostInitialize ( ) ;
x70_tweaks . RegisterTweaks ( m_cvarMgr ) ;
x70_tweaks . RegisterResourceTweaks ( m_cvarMgr ) ;
AddWorldPaks ( ) ;
2018-10-18 04:51:59 +00:00
const auto & args = boo : : APP - > getArgs ( ) ;
for ( auto it = args . begin ( ) ; it ! = args . end ( ) ; + + it )
{
if ( * it = = _SYS_STR ( " --warp " ) & & args . end ( ) - it > = 3 )
{
const hecl : : SystemChar * worldIdxStr = ( * ( it + 1 ) ) . c_str ( ) ;
const hecl : : SystemChar * areaIdxStr = ( * ( it + 2 ) ) . c_str ( ) ;
hecl : : SystemChar * endptr ;
m_warpWorldIdx = hecl : : StrToUl ( worldIdxStr , & endptr , 0 ) ;
if ( endptr = = worldIdxStr )
m_warpWorldIdx = 0 ;
m_warpAreaId = hecl : : StrToUl ( areaIdxStr , & endptr , 0 ) ;
if ( endptr = = areaIdxStr )
m_warpAreaId = 0 ;
2018-10-28 00:20:30 +00:00
bool found = false ;
for ( const auto & pak : g_ResFactory - > GetResLoader ( ) - > GetPaks ( ) )
{
if ( * ( pak - > GetPath ( ) . end ( ) - 6 ) = = ' 0 ' + m_warpWorldIdx )
{
found = true ;
break ;
}
}
if ( ! found )
{
m_warpWorldIdx = - 1 ;
break ;
}
2018-10-18 04:51:59 +00:00
if ( args . end ( ) - it > = 4 )
{
const hecl : : SystemChar * layerStr = ( * ( it + 3 ) ) . c_str ( ) ;
if ( layerStr [ 0 ] = = _SYS_STR ( ' 0 ' ) | | layerStr [ 0 ] = = _SYS_STR ( ' 1 ' ) )
for ( const auto * cur = layerStr ; * cur ! = _SYS_STR ( ' \0 ' ) ; + + cur )
if ( * cur = = _SYS_STR ( ' 1 ' ) )
m_warpLayerBits | = 1 < < ( cur - layerStr ) ;
}
SetFlowState ( EFlowState : : StateSetter ) ;
}
}
2016-04-15 20:42:40 +00:00
FillInAssetIDs ( ) ;
2017-01-20 03:53:32 +00:00
x164_archSupport . reset ( new CGameArchitectureSupport ( * this , voiceEngine , backend ) ) ;
g_archSupport = x164_archSupport . get ( ) ;
x164_archSupport - > PreloadAudio ( ) ;
//g_TweakManager->ReadFromMemoryCard("AudioTweaks");
2016-04-15 20:42:40 +00:00
}
2017-11-02 09:35:07 +00:00
static logvisor : : Module WarmupLog ( " ShaderWarmup " ) ;
2017-10-17 05:51:53 +00:00
void CMain : : WarmupShaders ( )
{
if ( m_warmupTags . size ( ) )
return ;
2017-10-22 06:11:22 +00:00
m_needsWarmupClear = true ;
2017-10-17 05:51:53 +00:00
size_t modelCount = 0 ;
g_ResFactory - > EnumerateResources ( [ & ] ( const SObjectTag & tag )
{
if ( tag . type = = FOURCC ( ' CMDL ' ) | | tag . type = = FOURCC ( ' MREA ' ) )
+ + modelCount ;
return true ;
} ) ;
m_warmupTags . reserve ( modelCount ) ;
2017-10-27 10:10:32 +00:00
std : : unordered_set < SObjectTag > addedTags ;
addedTags . reserve ( modelCount ) ;
2017-10-17 05:51:53 +00:00
g_ResFactory - > EnumerateResources ( [ & ] ( const SObjectTag & tag )
{
if ( tag . type = = FOURCC ( ' CMDL ' ) | | tag . type = = FOURCC ( ' MREA ' ) )
2017-10-27 10:10:32 +00:00
{
if ( addedTags . find ( tag ) ! = addedTags . end ( ) )
return true ;
addedTags . insert ( tag ) ;
2017-10-17 05:51:53 +00:00
m_warmupTags . push_back ( tag ) ;
2017-10-27 10:10:32 +00:00
}
2017-10-17 05:51:53 +00:00
return true ;
} ) ;
m_warmupIt = m_warmupTags . begin ( ) ;
2017-10-27 10:10:32 +00:00
WarmupLog . report ( logvisor : : Info , " Began warmup of % " PRISize " objects " , m_warmupTags . size ( ) ) ;
2017-10-17 05:51:53 +00:00
}
2016-04-15 20:42:40 +00:00
bool CMain : : Proc ( )
{
2017-10-17 05:51:53 +00:00
// Warmup cycle overrides update
if ( m_warmupTags . size ( ) )
return false ;
2018-01-15 16:00:20 +00:00
m_console - > proc ( ) ;
if ( ! m_console - > isOpen ( ) )
{
CGBASupport : : GlobalPoll ( ) ;
x164_archSupport - > UpdateTicks ( ) ;
x164_archSupport - > Update ( ) ;
CSfxManager : : Update ( 1.f / 60.f ) ;
CStreamAudioManager : : Update ( 1.f / 60.f ) ;
}
2017-02-06 03:21:58 +00:00
if ( x164_archSupport - > GetIOWinManager ( ) . IsEmpty ( ) | | CheckReset ( ) )
{
CStreamAudioManager : : StopAll ( ) ;
/*
x164_archSupport . reset ( ) ;
g_archSupport = x164_archSupport . get ( ) ;
x164_archSupport - > PreloadAudio ( ) ;
*/
x160_24_finished = true ;
}
2018-01-16 06:42:28 +00:00
Discord_RunCallbacks ( ) ;
2017-01-20 03:53:32 +00:00
return x160_24_finished ;
2016-04-15 20:42:40 +00:00
}
2016-09-14 05:54:09 +00:00
void CMain : : Draw ( )
{
2017-10-17 05:51:53 +00:00
// Warmup cycle overrides draw
if ( m_warmupTags . size ( ) )
{
2017-10-22 06:11:22 +00:00
if ( m_needsWarmupClear )
{
CGraphics : : g_BooMainCommandQueue - > clearTarget ( true , true ) ;
m_needsWarmupClear = false ;
}
2017-10-17 05:51:53 +00:00
auto startTime = std : : chrono : : steady_clock : : now ( ) ;
while ( m_warmupIt ! = m_warmupTags . end ( ) )
{
2017-11-02 09:35:07 +00:00
WarmupLog . report ( logvisor : : Info , " [%d / %d] Warming %.4s %08X " ,
int ( m_warmupIt - m_warmupTags . begin ( ) + 1 ) , int ( m_warmupTags . size ( ) ) ,
m_warmupIt - > type . getChars ( ) , m_warmupIt - > id . Value ( ) ) ;
2017-10-17 05:51:53 +00:00
if ( m_warmupIt - > type = = FOURCC ( ' CMDL ' ) )
CModel : : WarmupShaders ( * m_warmupIt ) ;
else if ( m_warmupIt - > type = = FOURCC ( ' MREA ' ) )
CGameArea : : WarmupShaders ( * m_warmupIt ) ;
+ + m_warmupIt ;
// Approximately 3/4 frame of warmups
auto curTime = std : : chrono : : steady_clock : : now ( ) ;
if ( std : : chrono : : duration_cast < std : : chrono : : milliseconds > ( curTime - startTime ) . count ( ) > 12 )
break ;
}
if ( m_warmupIt = = m_warmupTags . end ( ) )
{
m_warmupTags = std : : vector < SObjectTag > ( ) ;
WarmupLog . report ( logvisor : : Info , " Finished warmup " ) ;
}
return ;
}
2017-10-22 06:11:22 +00:00
CGraphics : : g_BooMainCommandQueue - > clearTarget ( true , true ) ;
2017-01-20 03:53:32 +00:00
x164_archSupport - > Draw ( ) ;
2018-01-15 16:00:20 +00:00
m_console - > draw ( CGraphics : : g_BooMainCommandQueue ) ;
2016-09-14 05:54:09 +00:00
}
2017-01-22 01:40:12 +00:00
void CMain : : ShutdownSubsystems ( )
{
CMoviePlayer : : Shutdown ( ) ;
CLineRenderer : : Shutdown ( ) ;
CDecalManager : : Shutdown ( ) ;
CElementGen : : Shutdown ( ) ;
CAnimData : : FreeCache ( ) ;
2017-01-22 17:36:25 +00:00
CMemoryCardSys : : Shutdown ( ) ;
2017-03-14 07:03:58 +00:00
CModelShaders : : Shutdown ( ) ;
2017-04-22 06:42:32 +00:00
CMappableObject : : Shutdown ( ) ;
2017-01-22 01:40:12 +00:00
}
2016-04-15 20:42:40 +00:00
void CMain : : Shutdown ( )
{
2018-04-26 21:12:20 +00:00
m_console - > unregisterCommand ( " Give " ) ;
2017-01-22 01:40:12 +00:00
x164_archSupport . reset ( ) ;
ShutdownSubsystems ( ) ;
2018-10-07 02:59:17 +00:00
CParticleSwooshShaders : : Shutdown ( ) ;
CThermalColdFilter : : Shutdown ( ) ;
CThermalHotFilter : : Shutdown ( ) ;
CSpaceWarpFilter : : Shutdown ( ) ;
CCameraBlurFilter : : Shutdown ( ) ;
CXRayBlurFilter : : Shutdown ( ) ;
CFogVolumePlaneShader : : Shutdown ( ) ;
CFogVolumeFilter : : Shutdown ( ) ;
CEnergyBarShader : : Shutdown ( ) ;
CRadarPaintShader : : Shutdown ( ) ;
CMapSurfaceShader : : Shutdown ( ) ;
CPhazonSuitFilter : : Shutdown ( ) ;
CAABoxShader : : Shutdown ( ) ;
CWorldShadowShader : : Shutdown ( ) ;
CColoredQuadFilter : : Shutdown ( ) ;
CTexturedQuadFilter : : Shutdown ( ) ;
CTexturedQuadFilterAlpha : : Shutdown ( ) ;
CTextSupportShader : : Shutdown ( ) ;
CScanLinesFilter : : Shutdown ( ) ;
CRandomStaticFilter : : Shutdown ( ) ;
2018-11-02 08:16:16 +00:00
CEnvFxShaders : : Shutdown ( ) ;
2017-08-14 03:55:06 +00:00
CFluidPlaneShader : : Shutdown ( ) ;
2018-06-07 04:43:26 +00:00
CFluidPlaneManager : : RippleMapTex . reset ( ) ;
2018-02-01 23:19:34 +00:00
CNESShader : : Shutdown ( ) ;
2017-11-25 02:50:24 +00:00
CGraphics : : ShutdownBoo ( ) ;
2018-01-16 06:42:28 +00:00
ShutdownDiscord ( ) ;
2018-05-20 06:14:57 +00:00
CBooModel : : AssertAllFreed ( ) ;
2016-04-15 20:42:40 +00:00
}
2017-02-09 09:23:17 +00:00
boo : : IWindow * CMain : : GetMainWindow ( ) const
{
return m_mainWindow ;
}
2016-04-15 20:42:40 +00:00
# if MP1_USE_BOO
2015-11-02 18:45:39 +00:00
int CMain : : appMain ( boo : : IApplication * app )
2015-08-27 00:23:46 +00:00
{
2016-03-04 23:04:53 +00:00
zeus : : detectCPU ( ) ;
2018-10-14 20:16:21 +00:00
mainWindow = app - > newWindow ( _SYS_STR ( " Metroid Prime 1 Reimplementation vZygote " ) , 1 ) ;
2015-11-02 18:45:39 +00:00
mainWindow - > showWindow ( ) ;
2015-08-27 00:23:46 +00:00
TOneStatic < CGameGlobalObjects > globalObjs ;
InitializeSubsystems ( ) ;
2016-04-15 20:42:40 +00:00
globalObjs - > PostInitialize ( ) ;
2015-08-27 00:23:46 +00:00
x70_tweaks . RegisterTweaks ( ) ;
AddWorldPaks ( ) ;
g_TweakManager - > ReadFromMemoryCard ( " AudioTweaks " ) ;
FillInAssetIDs ( ) ;
2015-08-28 00:11:31 +00:00
TOneStatic < CGameArchitectureSupport > archSupport ;
2016-02-20 06:45:36 +00:00
mainWindow - > setCallback ( archSupport . GetAllocSpace ( ) ) ;
2015-11-02 18:45:39 +00:00
boo : : IGraphicsCommandQueue * gfxQ = mainWindow - > getCommandQueue ( ) ;
2016-02-20 10:26:43 +00:00
boo : : SWindowRect windowRect = mainWindow - > getWindowFrame ( ) ;
2016-03-30 19:16:01 +00:00
boo : : ITextureR * renderTex ;
boo : : GraphicsDataToken data = mainWindow - > getMainContextDataFactory ( ) - > commitTransaction (
[ & ] ( boo : : IGraphicsDataFactory : : Context & ctx ) - > bool
{
renderTex = ctx . newRenderTexture ( windowRect . size [ 0 ] , windowRect . size [ 1 ] , true , true ) ;
return true ;
} ) ;
2016-02-20 05:49:47 +00:00
float rgba [ 4 ] = { 0.2f , 0.2f , 0.2f , 1.0f } ;
2015-11-02 18:45:39 +00:00
gfxQ - > setClearColor ( rgba ) ;
2015-09-17 19:50:43 +00:00
while ( ! xe8_b24_finished )
2015-08-17 05:26:58 +00:00
{
2015-09-17 19:50:43 +00:00
xe8_b24_finished = archSupport - > Update ( ) ;
2015-11-02 18:45:39 +00:00
2016-02-20 10:26:43 +00:00
if ( archSupport - > isRectDirty ( ) )
{
const boo : : SWindowRect & windowRect = archSupport - > getWindowRect ( ) ;
gfxQ - > resizeRenderTexture ( renderTex ,
windowRect . size [ 0 ] ,
windowRect . size [ 1 ] ) ;
}
gfxQ - > setRenderTarget ( renderTex ) ;
gfxQ - > clearTarget ( ) ;
gfxQ - > resolveDisplay ( renderTex ) ;
2015-11-02 18:45:39 +00:00
gfxQ - > execute ( ) ;
2016-02-20 12:40:58 +00:00
mainWindow - > waitForRetrace ( ) ;
2015-08-17 05:26:58 +00:00
}
2015-08-27 00:23:46 +00:00
return 0 ;
}
2015-08-17 05:26:58 +00:00
2016-04-15 20:42:40 +00:00
# endif
2015-08-17 22:05:00 +00:00
}
}