mirror of
				https://github.com/AxioDL/metaforce.git
				synced 2025-10-27 05:30:25 +00:00 
			
		
		
		
	Bitstream fixes
This commit is contained in:
		
							parent
							
								
									1c86d0ac93
								
							
						
					
					
						commit
						6a7fc0145f
					
				| @ -183,7 +183,13 @@ bool ProjectManager::saveProject() | |||||||
| void ProjectManager::mainUpdate() | void ProjectManager::mainUpdate() | ||||||
| { | { | ||||||
|     if (m_mainMP1) |     if (m_mainMP1) | ||||||
|         m_mainMP1->Proc(); |     { | ||||||
|  |         if (m_mainMP1->Proc()) | ||||||
|  |         { | ||||||
|  |             m_mainMP1->Shutdown(); | ||||||
|  |             m_mainMP1 = std::experimental::nullopt; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ProjectManager::mainDraw() | void ProjectManager::mainDraw() | ||||||
|  | |||||||
| @ -82,9 +82,23 @@ void CAudioSys::SysRemoveGroupFromAmuse(const std::string& name) | |||||||
|         RemoveAudioGroup(set->GetAudioGroupData()); |         RemoveAudioGroup(set->GetAudioGroupData()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static float s_MasterVol = 1.f; | ||||||
|  | static float s_SfxVol = 1.f; | ||||||
|  | void CAudioSys::_UpdateVolume() | ||||||
|  | { | ||||||
|  |     GetAmuseEngine().setVolume(s_MasterVol * s_SfxVol); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void CAudioSys::SysSetVolume(u8 volume) | void CAudioSys::SysSetVolume(u8 volume) | ||||||
| { | { | ||||||
|     GetAmuseEngine().setVolume(volume / 127.f); |     s_MasterVol = volume / 127.f; | ||||||
|  |     _UpdateVolume(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CAudioSys::SysSetSfxVolume(u8 volume, u16 time, bool music, bool fx) | ||||||
|  | { | ||||||
|  |     s_SfxVol = volume / 127.f; | ||||||
|  |     _UpdateVolume(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static s16 s_VolumeScale = 0x7f; | static s16 s_VolumeScale = 0x7f; | ||||||
|  | |||||||
| @ -31,6 +31,7 @@ private: | |||||||
|     static CAudioSys* g_SharedSys; |     static CAudioSys* g_SharedSys; | ||||||
|     boo::IAudioVoiceEngine* m_voiceEngine; |     boo::IAudioVoiceEngine* m_voiceEngine; | ||||||
|     amuse::Engine m_engine; |     amuse::Engine m_engine; | ||||||
|  |     static void _UpdateVolume(); | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     struct C3DEmitterParmData |     struct C3DEmitterParmData | ||||||
| @ -86,6 +87,7 @@ public: | |||||||
|     static void SysAddGroupIntoAmuse(const std::string& name); |     static void SysAddGroupIntoAmuse(const std::string& name); | ||||||
|     static void SysRemoveGroupFromAmuse(const std::string& name); |     static void SysRemoveGroupFromAmuse(const std::string& name); | ||||||
|     static void SysSetVolume(u8 volume); |     static void SysSetVolume(u8 volume); | ||||||
|  |     static void SysSetSfxVolume(u8 volume, u16 time, bool music, bool fx); | ||||||
| 
 | 
 | ||||||
|     static s16 GetDefaultVolumeScale(); |     static s16 GetDefaultVolumeScale(); | ||||||
|     static void SetDefaultVolumeScale(s16 scale); |     static void SetDefaultVolumeScale(s16 scale); | ||||||
|  | |||||||
| @ -66,10 +66,10 @@ void CStaticAudioPlayer::DecodeMonoAndMix(s16* bufOut, u32 numSamples, | |||||||
|             if (!loopState && cur + i == loopStartCur) |             if (!loopState && cur + i == loopStartCur) | ||||||
|                 loopState.emplace(state); |                 loopState.emplace(state); | ||||||
| 
 | 
 | ||||||
|             *bufOut = SampClamp((g721_decoder(*byte & 0xf, &state) * vol) >> 15); |             *bufOut = SampClamp(((g721_decoder(*byte & 0xf, &state) * vol) >> 15) * 0.7f); | ||||||
|             bufOut += 2; |             bufOut += 2; | ||||||
| 
 | 
 | ||||||
|             *bufOut = SampClamp((g721_decoder(*byte >> 4 & 0xf, &state) * vol) >> 15); |             *bufOut = SampClamp(((g721_decoder(*byte >> 4 & 0xf, &state) * vol) >> 15) * 0.7f); | ||||||
|             bufOut += 2; |             bufOut += 2; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -328,8 +328,8 @@ struct SDSPStream : boo::IAudioVoiceCallback | |||||||
|         if (!x0_active || xe8_silent) |         if (!x0_active || xe8_silent) | ||||||
|             return; |             return; | ||||||
|         float coefs[8] = {}; |         float coefs[8] = {}; | ||||||
|         coefs[int(boo::AudioChannel::FrontLeft)] = m_leftgain * vol; |         coefs[int(boo::AudioChannel::FrontLeft)] = m_leftgain * vol * 0.7f; | ||||||
|         coefs[int(boo::AudioChannel::FrontRight)] = m_rightgain * vol; |         coefs[int(boo::AudioChannel::FrontRight)] = m_rightgain * vol * 0.7f; | ||||||
|         m_booVoice->setMonoChannelLevels(nullptr, coefs, true); |         m_booVoice->setMonoChannelLevels(nullptr, coefs, true); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1153,12 +1153,44 @@ void CStreamAudioManager::UpdateDSPStreamers(float dt) | |||||||
|     UpdateDSP(true, dt); |     UpdateDSP(true, dt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CStreamAudioManager::StopAllStreams() | ||||||
|  | { | ||||||
|  |     for (int i=0 ; i<2 ; ++i) | ||||||
|  |     { | ||||||
|  |         StopStreaming(i); | ||||||
|  |         SDSPPlayer& p = s_Players[i]; | ||||||
|  |         SDSPPlayer& qp = s_QueuedPlayers[i]; | ||||||
|  |         p = SDSPPlayer(); | ||||||
|  |         qp = SDSPPlayer(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void CStreamAudioManager::Update(float dt) | void CStreamAudioManager::Update(float dt) | ||||||
| { | { | ||||||
|     CDSPStreamManager::PollHeaderReadCompletions(); |     CDSPStreamManager::PollHeaderReadCompletions(); | ||||||
|     UpdateDSPStreamers(dt); |     UpdateDSPStreamers(dt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CStreamAudioManager::StopAll() | ||||||
|  | { | ||||||
|  |     StopAllStreams(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CStreamAudioManager::SetMusicUnmute(bool unmute) | ||||||
|  | { | ||||||
|  |     g_MusicUnmute = unmute; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CStreamAudioManager::SetSfxVolume(u8 volume) | ||||||
|  | { | ||||||
|  |     g_SfxVolume = std::min(volume, u8(127)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CStreamAudioManager::SetMusicVolume(u8 volume) | ||||||
|  | { | ||||||
|  |     g_MusicVolume = std::min(volume, u8(127)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void CStreamAudioManager::Initialize() | void CStreamAudioManager::Initialize() | ||||||
| { | { | ||||||
|     CDSPStreamManager::Initialize(); |     CDSPStreamManager::Initialize(); | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ class CStreamAudioManager | |||||||
|     static void StopStreaming(bool oneshot); |     static void StopStreaming(bool oneshot); | ||||||
|     static void UpdateDSP(bool oneshot, float dt); |     static void UpdateDSP(bool oneshot, float dt); | ||||||
|     static void UpdateDSPStreamers(float dt); |     static void UpdateDSPStreamers(float dt); | ||||||
|  |     static void StopAllStreams(); | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     static void Start(bool oneshot, const std::string& fileName, u8 volume, |     static void Start(bool oneshot, const std::string& fileName, u8 volume, | ||||||
| @ -25,6 +26,11 @@ public: | |||||||
|     static void FadeBackIn(bool oneshot, float fadeTime); |     static void FadeBackIn(bool oneshot, float fadeTime); | ||||||
|     static void TemporaryFadeOut(bool oneshot, float fadeTime); |     static void TemporaryFadeOut(bool oneshot, float fadeTime); | ||||||
|     static void Update(float dt); |     static void Update(float dt); | ||||||
|  |     static void StopAll(); | ||||||
|  |     static void SetMusicUnmute(bool unmute); | ||||||
|  |     static void SetSfxVolume(u8 volume); | ||||||
|  |     static void SetMusicVolume(u8 volume); | ||||||
|  | 
 | ||||||
|     static void Initialize(); |     static void Initialize(); | ||||||
|     static void Shutdown(); |     static void Shutdown(); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -8,7 +8,8 @@ | |||||||
| #include "CGameState.hpp" | #include "CGameState.hpp" | ||||||
| #include "Input/CFinalInput.hpp" | #include "Input/CFinalInput.hpp" | ||||||
| #include "Audio/CSfxManager.hpp" | #include "Audio/CSfxManager.hpp" | ||||||
| //#include "Audio/CStreamedAudioManager.hpp"
 | #include "Audio/CStreamAudioManager.hpp" | ||||||
|  | #include "Graphics/CMoviePlayer.hpp" | ||||||
| 
 | 
 | ||||||
| namespace urde | namespace urde | ||||||
| { | { | ||||||
| @ -283,23 +284,19 @@ void CGameOptions::SetSfxVolume(s32 vol, bool apply) | |||||||
| { | { | ||||||
|     x58_sfxVol = zeus::clamp(0, vol, 0x7f); |     x58_sfxVol = zeus::clamp(0, vol, 0x7f); | ||||||
| 
 | 
 | ||||||
| #if 0 |  | ||||||
|     if (apply) |     if (apply) | ||||||
|     { |     { | ||||||
|         CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, 1, 1); |         CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, 1, 1); | ||||||
|         CStreamedAudioManager::SetSfxVolume(x58_sfxVol); |         CStreamAudioManager::SetSfxVolume(x58_sfxVol); | ||||||
|         CMoviePlayer::SetSfxVolume(x58_sfxVol); |         CMoviePlayer::SetSfxVolume(x58_sfxVol); | ||||||
|     } |     } | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CGameOptions::SetMusicVolume(s32 vol, bool apply) | void CGameOptions::SetMusicVolume(s32 vol, bool apply) | ||||||
| { | { | ||||||
|     x5c_musicVol = zeus::clamp(0, vol, 0x7f); |     x5c_musicVol = zeus::clamp(0, vol, 0x7f); | ||||||
| # if 0 |  | ||||||
|     if (apply) |     if (apply) | ||||||
|         CStreamedAudioManager::SetGlobalVolume(x5c_musicVol); |         CStreamAudioManager::SetMusicVolume(x5c_musicVol); | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CGameOptions::SetHUDAlpha(u32 alpha) | void CGameOptions::SetHUDAlpha(u32 alpha) | ||||||
| @ -570,4 +567,10 @@ void CHintOptions::SetNextHintTime() | |||||||
|             g_MemoryCardSys->GetHints()[x10_nextHintIdx].GetTime() + 5.f; |             g_MemoryCardSys->GetHints()[x10_nextHintIdx].GetTime() + 5.f; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CHintOptions::InitializeMemoryState() | ||||||
|  | { | ||||||
|  |     const auto& hints = g_MemoryCardSys->GetHints(); | ||||||
|  |     x0_hintStates.resize(hints.size()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -205,6 +205,7 @@ public: | |||||||
|     CHintOptions(CBitStreamReader& stream); |     CHintOptions(CBitStreamReader& stream); | ||||||
|     void PutTo(CBitStreamWriter& writer) const; |     void PutTo(CBitStreamWriter& writer) const; | ||||||
|     void SetNextHintTime(); |     void SetNextHintTime(); | ||||||
|  |     void InitializeMemoryState(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -113,7 +113,8 @@ CGameState::GameFileStateInfo CGameState::LoadGameFileState(const u8* data) | |||||||
| 
 | 
 | ||||||
|     ret.x20_hardMode = stream.ReadEncoded(1); |     ret.x20_hardMode = stream.ReadEncoded(1); | ||||||
|     stream.ReadEncoded(1); |     stream.ReadEncoded(1); | ||||||
|     ret.x8_mlvlId = g_ResFactory->TranslateOriginalToNew(stream.ReadEncoded(32)); |     ResId origMLVL = stream.ReadEncoded(32); | ||||||
|  |     ret.x8_mlvlId = g_ResFactory->TranslateOriginalToNew(origMLVL); | ||||||
| 
 | 
 | ||||||
|     BitsToDouble conv; |     BitsToDouble conv; | ||||||
|     conv.low = stream.ReadEncoded(32); |     conv.low = stream.ReadEncoded(32); | ||||||
| @ -124,7 +125,7 @@ CGameState::GameFileStateInfo CGameState::LoadGameFileState(const u8* data) | |||||||
|     ret.x10_energyTanks = playerState.GetItemCapacity(CPlayerState::EItemType::EnergyTanks); |     ret.x10_energyTanks = playerState.GetItemCapacity(CPlayerState::EItemType::EnergyTanks); | ||||||
| 
 | 
 | ||||||
|     u32 itemPercent; |     u32 itemPercent; | ||||||
|     if (ret.x8_mlvlId == 0x158EFE17) |     if (origMLVL == 0x158EFE17) | ||||||
|         itemPercent = 0; |         itemPercent = 0; | ||||||
|     else |     else | ||||||
|         itemPercent = playerState.CalculateItemCollectionRate() * 100 / playerState.GetPickupTotal(); |         itemPercent = playerState.CalculateItemCollectionRate() * 100 / playerState.GetPickupTotal(); | ||||||
| @ -142,14 +143,17 @@ CGameState::GameFileStateInfo CGameState::LoadGameFileState(const u8* data) | |||||||
| 
 | 
 | ||||||
| CGameState::CGameState() | CGameState::CGameState() | ||||||
| { | { | ||||||
|     x98_playerState.reset(new CPlayerState()); |     x98_playerState = std::make_shared<CPlayerState>(); | ||||||
|     x9c_transManager.reset(new CWorldTransManager()); |     x9c_transManager = std::make_shared<CWorldTransManager>(); | ||||||
|     x228_25_deferPowerupInit = true; |     x228_25_deferPowerupInit = true; | ||||||
|  |     if (g_MemoryCardSys) | ||||||
|  |         InitializeMemoryStates(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) | CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) | ||||||
| : x20c_saveFileIdx(saveIdx) | : x20c_saveFileIdx(saveIdx) | ||||||
| { | { | ||||||
|  |     x9c_transManager = std::make_shared<CWorldTransManager>(); | ||||||
|     x228_25_deferPowerupInit = true; |     x228_25_deferPowerupInit = true; | ||||||
| 
 | 
 | ||||||
|     for (u32 i = 0; i < 128; i++) |     for (u32 i = 0; i < 128; i++) | ||||||
| @ -180,6 +184,9 @@ CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) | |||||||
|             g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), memWorld.second.GetSaveWorldAssetId()}); |             g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), memWorld.second.GetSaveWorldAssetId()}); | ||||||
|         x88_worldStates.emplace_back(stream, memWorld.first, *saveWorld); |         x88_worldStates.emplace_back(stream, memWorld.first, *saveWorld); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     InitializeMemoryWorlds(); | ||||||
|  |     WriteBackupBuf(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CGameState::ReadPersistentOptions(CBitStreamReader& r) | void CGameState::ReadPersistentOptions(CBitStreamReader& r) | ||||||
| @ -292,4 +299,22 @@ float CGameState::GetHardModeWeaponMultiplier() const | |||||||
|     return g_tweakGame->GetHardModeWeaponMultiplier(); |     return g_tweakGame->GetHardModeWeaponMultiplier(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CGameState::InitializeMemoryWorlds() | ||||||
|  | { | ||||||
|  |     const auto& memoryWorlds = g_MemoryCardSys->GetMemoryWorlds(); | ||||||
|  |     for (const auto& wld : memoryWorlds) | ||||||
|  |     { | ||||||
|  |         const auto& layerState = StateForWorld(wld.first).GetLayerState(); | ||||||
|  |         layerState->InitializeWorldLayers(wld.second.GetDefaultLayerStates()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void CGameState::InitializeMemoryStates() | ||||||
|  | { | ||||||
|  |     x98_playerState->InitializeScanTimes(); | ||||||
|  |     x1f8_hintOptions.InitializeMemoryState(); | ||||||
|  |     InitializeMemoryWorlds(); | ||||||
|  |     WriteBackupBuf(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -120,6 +120,8 @@ public: | |||||||
|     void PutTo(CBitStreamWriter& writer) const; |     void PutTo(CBitStreamWriter& writer) const; | ||||||
|     float GetHardModeDamageMultiplier() const; |     float GetHardModeDamageMultiplier() const; | ||||||
|     float GetHardModeWeaponMultiplier() const; |     float GetHardModeWeaponMultiplier() const; | ||||||
|  |     void InitializeMemoryWorlds(); | ||||||
|  |     void InitializeMemoryStates(); | ||||||
| 
 | 
 | ||||||
|     struct GameFileStateInfo |     struct GameFileStateInfo | ||||||
|     { |     { | ||||||
|  | |||||||
| @ -63,8 +63,9 @@ bool CIOWinManager::DistributeOneMessage(const CArchitectureMessage& msg, | |||||||
|                                          CArchitectureQueue& queue) |                                          CArchitectureQueue& queue) | ||||||
| { | { | ||||||
|     CArchitectureMessage tmpMsg = msg; |     CArchitectureMessage tmpMsg = msg; | ||||||
|     for (IOWinPQNode* node = x4_pumpRoot ; node ; node = node->x8_next) |     for (IOWinPQNode* node = x4_pumpRoot ; node ;) | ||||||
|     { |     { | ||||||
|  |         IOWinPQNode* next = node->x8_next; | ||||||
|         CIOWin* iow = node->GetIOWin(); |         CIOWin* iow = node->GetIOWin(); | ||||||
|         CIOWin::EMessageReturn mret = iow->OnMessage(tmpMsg, x8_localGatherQueue); |         CIOWin::EMessageReturn mret = iow->OnMessage(tmpMsg, x8_localGatherQueue); | ||||||
| 
 | 
 | ||||||
| @ -99,6 +100,8 @@ bool CIOWinManager::DistributeOneMessage(const CArchitectureMessage& msg, | |||||||
|             return false; |             return false; | ||||||
|         default: break; |         default: break; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         node = next; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return false; |     return false; | ||||||
|  | |||||||
| @ -37,6 +37,7 @@ public: | |||||||
|     void RemoveAllIOWins(); |     void RemoveAllIOWins(); | ||||||
|     void RemoveIOWin(CIOWin* toRemove); |     void RemoveIOWin(CIOWin* toRemove); | ||||||
|     void AddIOWin(std::weak_ptr<CIOWin> toAdd, int pumpPrio, int drawPrio); |     void AddIOWin(std::weak_ptr<CIOWin> toAdd, int pumpPrio, int drawPrio); | ||||||
|  |     bool IsEmpty() const { return x0_drawRoot == nullptr && x4_pumpRoot == nullptr; } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -138,7 +138,13 @@ bool CMemoryCardSys::InitializePump() | |||||||
| 
 | 
 | ||||||
|             x20_scanStates.reserve(x20_scanStates.size() + savw.GetScans().size()); |             x20_scanStates.reserve(x20_scanStates.size() + savw.GetScans().size()); | ||||||
|             for (const CSaveWorld::SScanState& scan : savw.GetScans()) |             for (const CSaveWorld::SScanState& scan : savw.GetScans()) | ||||||
|  |             { | ||||||
|  |                 auto existingSearch = | ||||||
|  |                     std::find_if(x20_scanStates.begin(), x20_scanStates.end(), [&](const auto& test) | ||||||
|  |                     { return test.first == scan.x0_id && test.second == scan.x4_category; }); | ||||||
|  |                 if (existingSearch == x20_scanStates.end()) | ||||||
|                     x20_scanStates.emplace_back(scan.x0_id, scan.x4_category); |                     x20_scanStates.emplace_back(scan.x0_id, scan.x4_category); | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             wldMemOut.x3c_saveWorld = std::move(world.x34_saveWorld); |             wldMemOut.x3c_saveWorld = std::move(world.x34_saveWorld); | ||||||
|             wldMemOut.x2c_worldName = g_SimplePool->GetObj(SObjectTag{FOURCC('STRG'), wldMemOut.x0_strgId}); |             wldMemOut.x2c_worldName = g_SimplePool->GetObj(SObjectTag{FOURCC('STRG'), wldMemOut.x0_strgId}); | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ class CSaveWorldMemory | |||||||
| public: | public: | ||||||
|     ResId GetSaveWorldAssetId() const { return x4_savwId; } |     ResId GetSaveWorldAssetId() const { return x4_savwId; } | ||||||
|     u32 GetAreaCount() const { return x8_areaCount; } |     u32 GetAreaCount() const { return x8_areaCount; } | ||||||
| 
 |     const std::vector<CWorldLayers::Area>& GetDefaultLayerStates() const { return x1c_defaultLayerStates; } | ||||||
|     const TLockedToken<CStringTable>& GetWorldName() const { return x2c_worldName; } |     const TLockedToken<CStringTable>& GetWorldName() const { return x2c_worldName; } | ||||||
|     const TLockedToken<CSaveWorld>& GetSaveWorld() const { return x3c_saveWorld; } |     const TLockedToken<CSaveWorld>& GetSaveWorld() const { return x3c_saveWorld; } | ||||||
|     const char16_t* GetFrontEndName() const |     const char16_t* GetFrontEndName() const | ||||||
|  | |||||||
| @ -4,6 +4,8 @@ | |||||||
| #include "CStateManager.hpp" | #include "CStateManager.hpp" | ||||||
| #include "Camera/CCameraManager.hpp" | #include "Camera/CCameraManager.hpp" | ||||||
| #include "Camera/CFirstPersonCamera.hpp" | #include "Camera/CFirstPersonCamera.hpp" | ||||||
|  | #include "CMemoryCardSys.hpp" | ||||||
|  | #include "GameGlobalObjects.hpp" | ||||||
| 
 | 
 | ||||||
| namespace urde | namespace urde | ||||||
| { | { | ||||||
| @ -57,8 +59,15 @@ const char* PowerUpNames[41]= | |||||||
|     "Artifact of Newborn", |     "Artifact of Newborn", | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | CPlayerState::CPlayerState() | ||||||
|  | : x188_staticIntf(5) | ||||||
|  | { | ||||||
|  |     x0_24_ = true; | ||||||
|  |     x24_powerups.resize(41); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| CPlayerState::CPlayerState(CBitStreamReader& stream) | CPlayerState::CPlayerState(CBitStreamReader& stream) | ||||||
|     : CPlayerState() | : x188_staticIntf(5) | ||||||
| { | { | ||||||
|     x4_ = stream.ReadEncoded(0x20); |     x4_ = stream.ReadEncoded(0x20); | ||||||
|     u32 tmp = stream.ReadEncoded(0x20); |     u32 tmp = stream.ReadEncoded(0x20); | ||||||
| @ -76,14 +85,12 @@ CPlayerState::CPlayerState(CBitStreamReader& stream) | |||||||
|         x24_powerups[i] = CPowerUp(a, b); |         x24_powerups[i] = CPowerUp(a, b); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     x170_scanTimes.resize(846); |     const auto& scanStates = g_MemoryCardSys->GetScanStates(); | ||||||
|     for (u32 i = 0; i < x170_scanTimes.size(); i++) |     x170_scanTimes.reserve(scanStates.size()); | ||||||
|  |     for (const auto& state : scanStates) | ||||||
|     { |     { | ||||||
|         x170_scanTimes[i].first = stream.ReadEncoded(1); |         float time = stream.ReadEncoded(1) ? 1.f : 0.f; | ||||||
|         if (x170_scanTimes[i].first) |         x170_scanTimes.emplace_back(state.first, time); | ||||||
|             x170_scanTimes[i].second = 1.f; |  | ||||||
|         else |  | ||||||
|             x170_scanTimes[i].second = 0.f; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     x180_logScans = stream.ReadEncoded(CBitStreamReader::GetBitCount(0x100)); |     x180_logScans = stream.ReadEncoded(CBitStreamReader::GetBitCount(0x100)); | ||||||
| @ -394,4 +401,15 @@ void CPlayerState::ReInitalizePowerUp(CPlayerState::EItemType type, u32 capacity | |||||||
|     InitializePowerUp(type, capacity); |     InitializePowerUp(type, capacity); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CPlayerState::InitializeScanTimes() | ||||||
|  | { | ||||||
|  |     if (x170_scanTimes.size()) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     const auto& scanStates = g_MemoryCardSys->GetScanStates(); | ||||||
|  |     x170_scanTimes.reserve(scanStates.size()); | ||||||
|  |     for (const auto& state : scanStates) | ||||||
|  |         x170_scanTimes.emplace_back(state.first, 0.f); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -123,7 +123,7 @@ private: | |||||||
|     float x1c_visorTransitionFactor = 0.2f; |     float x1c_visorTransitionFactor = 0.2f; | ||||||
|     EPlayerSuit x20_currentSuit = EPlayerSuit::Power; |     EPlayerSuit x20_currentSuit = EPlayerSuit::Power; | ||||||
|     rstl::reserved_vector<CPowerUp, 41> x24_powerups; |     rstl::reserved_vector<CPowerUp, 41> x24_powerups; | ||||||
|     rstl::reserved_vector<std::pair<u32, float>, 846> x170_scanTimes; |     rstl::reserved_vector<std::pair<ResId, float>, 846> x170_scanTimes; | ||||||
|     u32 x180_logScans = 0; |     u32 x180_logScans = 0; | ||||||
|     u32 x184_totalLogScans = 0; |     u32 x184_totalLogScans = 0; | ||||||
|     CStaticInterference x188_staticIntf; |     CStaticInterference x188_staticIntf; | ||||||
| @ -168,8 +168,9 @@ public: | |||||||
|     void InitializePowerUp(EItemType type, u32 capacity); |     void InitializePowerUp(EItemType type, u32 capacity); | ||||||
|     u32 GetLogScans() const { return x180_logScans; } |     u32 GetLogScans() const { return x180_logScans; } | ||||||
|     u32 GetTotalLogScans() const { return x184_totalLogScans; } |     u32 GetTotalLogScans() const { return x184_totalLogScans; } | ||||||
|     const rstl::reserved_vector<std::pair<u32, float>, 846>& GetScanTimes() const { return x170_scanTimes; } |     void InitializeScanTimes(); | ||||||
|     CPlayerState() : x188_staticIntf(5) { x0_24_ = true; } |     const rstl::reserved_vector<std::pair<ResId, float>, 846>& GetScanTimes() const { return x170_scanTimes; } | ||||||
|  |     CPlayerState(); | ||||||
|     CPlayerState(CBitStreamReader& stream); |     CPlayerState(CBitStreamReader& stream); | ||||||
|     void PutTo(CBitStreamWriter& stream); |     void PutTo(CBitStreamWriter& stream); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -191,6 +191,9 @@ static u32 StaticLoopEnd = 0; | |||||||
| static g72x_state StaticStateLeft = {}; | static g72x_state StaticStateLeft = {}; | ||||||
| static g72x_state StaticStateRight = {}; | static g72x_state StaticStateRight = {}; | ||||||
| 
 | 
 | ||||||
|  | /* THP SFX audio */ | ||||||
|  | static float SfxVolume = 1.f; | ||||||
|  | 
 | ||||||
| static const char* BlockNames[] = {"SpecterViewBlock"}; | static const char* BlockNames[] = {"SpecterViewBlock"}; | ||||||
| static const char* TexNames[] = {"texY", "texU", "texV"}; | static const char* TexNames[] = {"texY", "texU", "texV"}; | ||||||
| 
 | 
 | ||||||
| @ -523,6 +526,11 @@ void CMoviePlayer::SetStaticAudio(const void* data, u32 size, u32 loopBegin, u32 | |||||||
|     g72x_init_state(&StaticStateRight); |     g72x_init_state(&StaticStateRight); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CMoviePlayer::SetSfxVolume(u8 volume) | ||||||
|  | { | ||||||
|  |     SfxVolume = std::min(volume, u8(127)) / 127.f; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void CMoviePlayer::MixAudio(s16* out, const s16* in, u32 samples) | void CMoviePlayer::MixAudio(s16* out, const s16* in, u32 samples) | ||||||
| { | { | ||||||
|     /* No audio frames ready */ |     /* No audio frames ready */ | ||||||
| @ -557,9 +565,9 @@ void CMoviePlayer::MixAudio(s16* out, const s16* in, u32 samples) | |||||||
|                 for (u32 i=0 ; i<thisSamples ; ++i, out += 2, in += 2) |                 for (u32 i=0 ; i<thisSamples ; ++i, out += 2, in += 2) | ||||||
|                 { |                 { | ||||||
|                     out[0] = DSPSampClamp(in[0] + |                     out[0] = DSPSampClamp(in[0] + | ||||||
|                         s32(tex->audioBuf[(i+tex->playedSamples)*2]) * 0x50F4 / 0x8000); |                         s32(tex->audioBuf[(i+tex->playedSamples)*2]) * 0x50F4 / 0x8000 * SfxVolume); | ||||||
|                     out[1] = DSPSampClamp(in[1] + |                     out[1] = DSPSampClamp(in[1] + | ||||||
|                         s32(tex->audioBuf[(i+tex->playedSamples)*2+1]) * 0x50F4 / 0x8000); |                         s32(tex->audioBuf[(i+tex->playedSamples)*2+1]) * 0x50F4 / 0x8000 * SfxVolume); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
| @ -567,9 +575,9 @@ void CMoviePlayer::MixAudio(s16* out, const s16* in, u32 samples) | |||||||
|                 for (u32 i=0 ; i<thisSamples ; ++i, out += 2) |                 for (u32 i=0 ; i<thisSamples ; ++i, out += 2) | ||||||
|                 { |                 { | ||||||
|                     out[0] = DSPSampClamp( |                     out[0] = DSPSampClamp( | ||||||
|                         s32(tex->audioBuf[(i+tex->playedSamples)*2]) * 0x50F4 / 0x8000); |                         s32(tex->audioBuf[(i+tex->playedSamples)*2]) * 0x50F4 / 0x8000 * SfxVolume); | ||||||
|                     out[1] = DSPSampClamp( |                     out[1] = DSPSampClamp( | ||||||
|                         s32(tex->audioBuf[(i+tex->playedSamples)*2+1]) * 0x50F4 / 0x8000); |                         s32(tex->audioBuf[(i+tex->playedSamples)*2+1]) * 0x50F4 / 0x8000 * SfxVolume); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             tex->playedSamples += thisSamples; |             tex->playedSamples += thisSamples; | ||||||
|  | |||||||
| @ -146,6 +146,7 @@ public: | |||||||
|     static void DisableStaticAudio() {SetStaticAudio(nullptr, 0, 0, 0);} |     static void DisableStaticAudio() {SetStaticAudio(nullptr, 0, 0, 0);} | ||||||
|     static void SetStaticAudioVolume(int vol); |     static void SetStaticAudioVolume(int vol); | ||||||
|     static void SetStaticAudio(const void* data, u32 size, u32 loopBegin, u32 loopEnd); |     static void SetStaticAudio(const void* data, u32 size, u32 loopBegin, u32 loopEnd); | ||||||
|  |     static void SetSfxVolume(u8 volume); | ||||||
|     static void MixStaticAudio(s16* out, const s16* in, u32 samples); |     static void MixStaticAudio(s16* out, const s16* in, u32 samples); | ||||||
|     void MixAudio(s16* out, const s16* in, u32 samples); |     void MixAudio(s16* out, const s16* in, u32 samples); | ||||||
|     void Rewind(); |     void Rewind(); | ||||||
|  | |||||||
| @ -1,7 +1,21 @@ | |||||||
| #include "IOStreams.hpp" | #include "IOStreams.hpp" | ||||||
|  | #include "hecl/hecl.hpp" | ||||||
| 
 | 
 | ||||||
| namespace urde | namespace urde | ||||||
| { | { | ||||||
|  | 
 | ||||||
|  | #define DUMP_BITS 0 | ||||||
|  | 
 | ||||||
|  | #if DUMP_BITS | ||||||
|  | static void PrintBinary(u32 val, u32 count) | ||||||
|  | { | ||||||
|  |     for (int i=0 ; i<count ; ++i) | ||||||
|  |     { | ||||||
|  |         printf("%d", (val >> (count-i-1)) & 0x1); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*!
 | /*!
 | ||||||
|  * \brief CBitStreamReader::ReadBit |  * \brief CBitStreamReader::ReadBit | ||||||
|  * Reads and decodes an encoded value from a bitstream. |  * Reads and decodes an encoded value from a bitstream. | ||||||
| @ -10,91 +24,95 @@ namespace urde | |||||||
|  */ |  */ | ||||||
| s32 CBitStreamReader::ReadEncoded(u32 bitCount) | s32 CBitStreamReader::ReadEncoded(u32 bitCount) | ||||||
| { | { | ||||||
|     s32 ret = 0; | #if DUMP_BITS | ||||||
|     if (bitCount < x20_bitOffset) |     auto pos = position(); | ||||||
|  |     auto boff = x20_bitOffset; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     u32 ret = 0; | ||||||
|  |     s32 shiftAmt = x20_bitOffset - s32(bitCount); | ||||||
|  |     if (shiftAmt < 0) | ||||||
|     { |     { | ||||||
|         u32 diff = 0x20 - bitCount; |         /* OR in remaining bits of cached value */ | ||||||
|         u32 baseVal = -1; |         u32 mask = (1 << bitCount) - 1; | ||||||
|         if (x20_bitOffset != 0x20) |         ret |= (x1c_val << -shiftAmt) & mask; | ||||||
|             baseVal = (1 << bitCount) - 1; | 
 | ||||||
|         x20_bitOffset -= bitCount; |         /* Load in exact number of bytes remaining */ | ||||||
|         ret = baseVal & (x1c_val >> diff); |         auto loadDiv = std::div(-shiftAmt, 8); | ||||||
|         x1c_val <<= bitCount; |         if (loadDiv.rem) ++loadDiv.quot; | ||||||
|  |         readUBytesToBuf(reinterpret_cast<u8*>(&x1c_val) + 4 - loadDiv.quot, loadDiv.quot); | ||||||
|  |         x1c_val = hecl::SBig(x1c_val); | ||||||
|  | 
 | ||||||
|  |         /* New bit offset */ | ||||||
|  |         x20_bitOffset = loadDiv.quot * 8 + shiftAmt; | ||||||
|  | 
 | ||||||
|  |         /* OR in next bits */ | ||||||
|  |         mask = (1 << -shiftAmt) - 1; | ||||||
|  |         ret |= (x1c_val >> x20_bitOffset) & mask; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         u32 diff = bitCount - x20_bitOffset; |         /* OR in bits of cached value */ | ||||||
|         u32 baseVal = -1; |         u32 mask = (1 << bitCount) - 1; | ||||||
|         if (x20_bitOffset != 32) |         ret |= (x1c_val >> shiftAmt) & mask; | ||||||
|             baseVal = (1 << x20_bitOffset) - 1; |  | ||||||
| 
 | 
 | ||||||
|         baseVal = (baseVal & (x1c_val >> (32 - x20_bitOffset))) << diff; |         /* New bit offset */ | ||||||
|         x20_bitOffset = 0; |         x20_bitOffset -= bitCount; | ||||||
|         auto pos = std::div(diff, 8); |  | ||||||
|         if (pos.rem) ++pos.quot; |  | ||||||
|         readUBytesToBuf(&x1c_val, pos.quot); |  | ||||||
|         /* The game uses Big Endian, which doesn't work for us */ |  | ||||||
|         /* Little Endian sucks */ |  | ||||||
|         athena::utility::BigUint32(x1c_val); |  | ||||||
| 
 |  | ||||||
|         u32 baseVal2 = -1; |  | ||||||
|         if (diff != 32) |  | ||||||
|             baseVal2 = (1 << diff) - 1; |  | ||||||
| 
 |  | ||||||
|         ret = baseVal | (baseVal2 & (x1c_val >> (32 - diff))) << x20_bitOffset; |  | ||||||
|         x20_bitOffset = (pos.quot << 3) - diff; |  | ||||||
|         x1c_val <<= diff; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if DUMP_BITS | ||||||
|  |     printf("READ "); | ||||||
|  |     PrintBinary(ret, bitCount); | ||||||
|  |     printf(" %d %d\n", int(pos), int(boff)); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void CBitStreamWriter::WriteEncoded(u32 val, u32 bitCount) | void CBitStreamWriter::WriteEncoded(u32 val, u32 bitCount) | ||||||
| { | { | ||||||
|     if (x18_bitOffset >= bitCount) | #if DUMP_BITS | ||||||
|  |     printf("WRITE "); | ||||||
|  |     PrintBinary(val, bitCount); | ||||||
|  |     printf(" %d %d\n", int(position()), int(x18_bitOffset)); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     s32 shiftAmt = x18_bitOffset - s32(bitCount); | ||||||
|  |     if (shiftAmt < 0) | ||||||
|     { |     { | ||||||
|         int baseVal = -1; |         /* OR remaining bits to cached value */ | ||||||
|         if (bitCount != 32) |         u32 mask = (1 << x18_bitOffset) - 1; | ||||||
|             baseVal = (1 << bitCount) - 1; |         x14_val |= (val >> -shiftAmt) & mask; | ||||||
|         x14_val |= (val & baseVal) << (x18_bitOffset - bitCount); | 
 | ||||||
|         x18_bitOffset -= bitCount; |         /* Write out 32-bits */ | ||||||
|  |         x14_val = hecl::SBig(x14_val); | ||||||
|  |         writeUBytes(reinterpret_cast<u8*>(&x14_val), 4); | ||||||
|  | 
 | ||||||
|  |         /* Cache remaining bits */ | ||||||
|  |         x18_bitOffset = 0x20 + shiftAmt; | ||||||
|  |         x14_val = val << x18_bitOffset; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         u32 diff = bitCount - x18_bitOffset; |         /* OR bits to cached value */ | ||||||
|         u32 baseVal = -1; |         u32 mask = (1 << bitCount) - 1; | ||||||
|         if (x18_bitOffset != 32) |         x14_val |= (val & mask) << shiftAmt; | ||||||
|             baseVal = (1 << x18_bitOffset) - 1; |  | ||||||
| 
 | 
 | ||||||
|         x14_val |= (val >> diff) & baseVal; |         /* New bit offset */ | ||||||
|         x18_bitOffset = 0; |         x18_bitOffset -= bitCount; | ||||||
|         u32 tmp = x14_val; |  | ||||||
|         athena::utility::BigUint32(tmp); |  | ||||||
|         auto pos = std::div(32 - x18_bitOffset, 8); |  | ||||||
|         if (pos.rem) ++pos.quot; |  | ||||||
|         writeBytes(&tmp, pos.quot); |  | ||||||
| 
 |  | ||||||
|         u32 rem = 32 - diff; |  | ||||||
|         baseVal = -1; |  | ||||||
|         if (diff != 32) |  | ||||||
|             baseVal = (1 << diff) - 1; |  | ||||||
| 
 |  | ||||||
|         x14_val = (val & baseVal) << rem; |  | ||||||
|         x18_bitOffset -= diff; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CBitStreamWriter::Flush() | void CBitStreamWriter::Flush() | ||||||
| { | { | ||||||
|     if (x18_bitOffset && x18_bitOffset < 0x20) |     if (x18_bitOffset < 0x20) | ||||||
|     { |     { | ||||||
|         u32 tmp = x14_val; |         auto pos = std::div(0x20 - x18_bitOffset, 8); | ||||||
|         athena::utility::BigUint32(tmp); |  | ||||||
|         auto pos = std::div(32 - x18_bitOffset, 8); |  | ||||||
|         if (pos.rem) ++pos.quot; |         if (pos.rem) ++pos.quot; | ||||||
|         writeBytes(&tmp, pos.quot); |         x14_val = hecl::SBig(x14_val); | ||||||
|         x18_bitOffset = 32; |         writeUBytes(reinterpret_cast<u8*>(&x14_val), pos.quot); | ||||||
|  |         x18_bitOffset = 0x20; | ||||||
|         x14_val = 0; |         x14_val = 0; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -31,38 +31,20 @@ public: | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     CBitStreamReader(const void* data, atUint64 length) |     CBitStreamReader(const void* data, atUint64 length) | ||||||
|         : MemoryReader(data, length) |     : MemoryReader(data, length) {} | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     atUint64 readUBytesToBuf(void *buf, atUint64 len) |  | ||||||
|     { |  | ||||||
|         x20_bitOffset = 0; |  | ||||||
|         atUint64 tmp = MemoryReader::readUBytesToBuf(buf, len); |  | ||||||
|         return tmp; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     s32 ReadEncoded(u32 key); |     s32 ReadEncoded(u32 key); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class CBitStreamWriter : public athena::io::MemoryWriter | class CBitStreamWriter : public athena::io::MemoryWriter | ||||||
| { | { | ||||||
| private: |  | ||||||
|     u32 x14_val = 0; |     u32 x14_val = 0; | ||||||
|     u32 x18_bitOffset = 32; |     u32 x18_bitOffset = 0x20; | ||||||
| public: | public: | ||||||
|     static inline u32 GetBitCount(u32 maxVal) { return CBitStreamReader::GetBitCount(maxVal); } |     static inline u32 GetBitCount(u32 maxVal) { return CBitStreamReader::GetBitCount(maxVal); } | ||||||
| 
 | 
 | ||||||
|     CBitStreamWriter(atUint8* data = nullptr, atUint64 length=0x10) |     CBitStreamWriter(atUint8* data = nullptr, atUint64 length=0x10) | ||||||
|         : MemoryWriter(data, length) |     : MemoryWriter(data, length) {} | ||||||
|     {} |  | ||||||
| 
 |  | ||||||
|     void writeUBytes(const atUint8 *data, atUint64 len) |  | ||||||
|     { |  | ||||||
|         x14_val = 0; |  | ||||||
|         x18_bitOffset = 0x20; |  | ||||||
|         MemoryWriter::writeUBytes(data, len); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     void WriteEncoded(u32 val, u32 bitCount); |     void WriteEncoded(u32 val, u32 bitCount); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1754,7 +1754,9 @@ CFrontEndUI::CFrontEndUI() | |||||||
|     xdc_saveUI = std::make_unique<CSaveUI>(ESaveContext::FrontEnd, g_GameState->GetCardSerial()); |     xdc_saveUI = std::make_unique<CSaveUI>(ESaveContext::FrontEnd, g_GameState->GetCardSerial()); | ||||||
| 
 | 
 | ||||||
|     m->ResetGameState(); |     m->ResetGameState(); | ||||||
|     g_GameState->SetCurrentWorldId(g_DefaultWorldTag.id); |     g_GameState->SetCurrentWorldId(g_ResFactory->TranslateOriginalToNew(g_DefaultWorldTag.id)); | ||||||
|  |     g_GameState->GameOptions().ResetToDefaults(); | ||||||
|  |     g_GameState->WriteBackupBuf(); | ||||||
| 
 | 
 | ||||||
|     for (int i=0 ; CDvdFile::FileExists(GetAttractMovieFileName(i).c_str()) ; ++i) |     for (int i=0 ; CDvdFile::FileExists(GetAttractMovieFileName(i).c_str()) ; ++i) | ||||||
|         ++xc0_attractCount; |         ++xc0_attractCount; | ||||||
|  | |||||||
| @ -135,6 +135,7 @@ void CMemoryCardDriver::SGameFileSlot::InitializeFromGameState() | |||||||
| { | { | ||||||
|     CBitStreamWriter w(x0_saveBuffer, 940); |     CBitStreamWriter w(x0_saveBuffer, 940); | ||||||
|     g_GameState->PutTo(w); |     g_GameState->PutTo(w); | ||||||
|  |     w.Flush(); | ||||||
|     x944_fileInfo = CGameState::LoadGameFileState(x0_saveBuffer); |     x944_fileInfo = CGameState::LoadGameFileState(x0_saveBuffer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -46,6 +46,7 @@ CGameArchitectureSupport::CGameArchitectureSupport(CMain& parent, boo::IAudioVoi | |||||||
|     CAudioSys::SetDefaultVolumeScale(0x75); |     CAudioSys::SetDefaultVolumeScale(0x75); | ||||||
|     CAudioSys::SetVolumeScale(CAudioSys::GetDefaultVolumeScale()); |     CAudioSys::SetVolumeScale(CAudioSys::GetDefaultVolumeScale()); | ||||||
|     CStreamAudioManager::Initialize(); |     CStreamAudioManager::Initialize(); | ||||||
|  |     CStreamAudioManager::SetMusicVolume(0x7f); | ||||||
|     m->ResetGameState(); |     m->ResetGameState(); | ||||||
| 
 | 
 | ||||||
|     //std::shared_ptr<CIOWin> splash = std::make_shared<CSplashScreen>(CSplashScreen::ESplashScreen::Nintendo);
 |     //std::shared_ptr<CIOWin> splash = std::make_shared<CSplashScreen>(CSplashScreen::ESplashScreen::Nintendo);
 | ||||||
| @ -276,6 +277,16 @@ bool CMain::Proc() | |||||||
|     x164_archSupport->Update(); |     x164_archSupport->Update(); | ||||||
|     CSfxManager::Update(1.f / 60.f); |     CSfxManager::Update(1.f / 60.f); | ||||||
|     CStreamAudioManager::Update(1.f / 60.f); |     CStreamAudioManager::Update(1.f / 60.f); | ||||||
|  |     if (x164_archSupport->GetIOWinManager().IsEmpty() || CheckReset()) | ||||||
|  |     { | ||||||
|  |         CStreamAudioManager::StopAll(); | ||||||
|  |         /*
 | ||||||
|  |         x164_archSupport.reset(); | ||||||
|  |         g_archSupport = x164_archSupport.get(); | ||||||
|  |         x164_archSupport->PreloadAudio(); | ||||||
|  |         */ | ||||||
|  |         x160_24_finished = true; | ||||||
|  |     } | ||||||
|     return x160_24_finished; |     return x160_24_finished; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -172,6 +172,8 @@ public: | |||||||
|         m_rectIsDirty = false; |         m_rectIsDirty = false; | ||||||
|         return m_windowRect; |         return m_windowRect; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     CIOWinManager& GetIOWinManager() { return x58_ioWinManager; } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #if MP1_USE_BOO | #if MP1_USE_BOO | ||||||
| @ -261,7 +263,10 @@ public: | |||||||
|             if (!memSys) |             if (!memSys) | ||||||
|                 memSys.reset(new CMemoryCardSys()); |                 memSys.reset(new CMemoryCardSys()); | ||||||
|             if (memSys->InitializePump()) |             if (memSys->InitializePump()) | ||||||
|  |             { | ||||||
|                 g_MemoryCardSys = memSys.get(); |                 g_MemoryCardSys = memSys.get(); | ||||||
|  |                 g_GameState->InitializeMemoryStates(); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								amuse
									
									
									
									
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								amuse
									
									
									
									
									
								
							| @ -1 +1 @@ | |||||||
| Subproject commit 2e7345f11d73219d77d345f3c7a039ab68be0e57 | Subproject commit aff8880595b8a30130695f8a09428347d1f75939 | ||||||
							
								
								
									
										2
									
								
								nod
									
									
									
									
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								nod
									
									
									
									
									
								
							| @ -1 +1 @@ | |||||||
| Subproject commit e86971c9e082b58bb04ee794a106874b3ceae1c7 | Subproject commit dc474ad1560e93f95d99d7577703387a859d7d26 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user