mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-08 22:27:43 +00:00
CScriptMidi and work on CGameArea loading
This commit is contained in:
89
Runtime/World/CScriptMidi.cpp
Normal file
89
Runtime/World/CScriptMidi.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#include "CScriptMidi.hpp"
|
||||
#include "TCastTo.hpp"
|
||||
#include "CSimplePool.hpp"
|
||||
#include "GameGlobalObjects.hpp"
|
||||
#include "CStateManager.hpp"
|
||||
#include "MP1/CInGameGuiManager.hpp"
|
||||
#include "CInGameTweakManagerBase.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
CScriptMidi::CScriptMidi(TUniqueId id, const CEntityInfo& info, const std::string& name,
|
||||
bool active, ResId csng, float fadeIn, float fadeOut, s32 volume)
|
||||
: CEntity(id, info, active, name), x40_fadeInTime(fadeIn), x44_fadeOutTime(fadeOut),
|
||||
x48_volume(volume)
|
||||
{
|
||||
x34_song = g_SimplePool->GetObj(SObjectTag{FOURCC('CSNG'), csng});
|
||||
}
|
||||
|
||||
void CScriptMidi::StopInternal(float fadeTime)
|
||||
{
|
||||
if (x3c_handle)
|
||||
{
|
||||
CMidiManager::Stop(x3c_handle, fadeTime);
|
||||
x3c_handle.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptMidi::Stop(CStateManager& mgr, float fadeTime)
|
||||
{
|
||||
const CWorld* wld = mgr.GetWorld();
|
||||
const CGameArea* area = wld->GetAreaAlways(x4_areaId);
|
||||
std::string twkName = MP1::CInGameGuiManager::GetIdentifierForMidiEvent(wld->IGetWorldAssetId(),
|
||||
area->GetAreaAssetId(),
|
||||
x10_name);
|
||||
if (g_TweakManager->HasTweakValue(twkName))
|
||||
{
|
||||
const CTweakValue::Audio& audio = g_TweakManager->GetTweakValue(twkName)->GetAudio();
|
||||
fadeTime = audio.GetFadeOut();
|
||||
}
|
||||
|
||||
StopInternal(fadeTime);
|
||||
}
|
||||
|
||||
void CScriptMidi::Play(CStateManager& mgr, float fadeTime)
|
||||
{
|
||||
u32 volume = x48_volume;
|
||||
const CWorld* wld = mgr.GetWorld();
|
||||
const CGameArea* area = wld->GetAreaAlways(x4_areaId);
|
||||
std::string twkName = MP1::CInGameGuiManager::GetIdentifierForMidiEvent(wld->IGetWorldAssetId(),
|
||||
area->GetAreaAssetId(),
|
||||
x10_name);
|
||||
if (g_TweakManager->HasTweakValue(twkName))
|
||||
{
|
||||
const CTweakValue::Audio& audio = g_TweakManager->GetTweakValue(twkName)->GetAudio();
|
||||
x34_song = g_SimplePool->GetObj(SObjectTag{FOURCC('CSNG'), audio.GetResId()});
|
||||
fadeTime = audio.GetFadeIn();
|
||||
volume = audio.GetVolume() * 127.f;
|
||||
}
|
||||
|
||||
x3c_handle = CMidiManager::Play(*x34_song, fadeTime, false, volume / 127.f);
|
||||
}
|
||||
|
||||
void CScriptMidi::Accept(IVisitor& visitor)
|
||||
{
|
||||
visitor.Visit(this);
|
||||
}
|
||||
|
||||
void CScriptMidi::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr)
|
||||
{
|
||||
CEntity::AcceptScriptMsg(msg, objId, stateMgr);
|
||||
switch (msg)
|
||||
{
|
||||
case EScriptObjectMessage::Play:
|
||||
if (GetActive())
|
||||
Play(stateMgr, x40_fadeInTime);
|
||||
break;
|
||||
case EScriptObjectMessage::Stop:
|
||||
if (GetActive())
|
||||
Stop(stateMgr, x44_fadeOutTime);
|
||||
break;
|
||||
case EScriptObjectMessage::Deactivate:
|
||||
StopInternal(0.f);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user