metaforce/Runtime/World/CScriptMidi.cpp

75 lines
2.5 KiB
C++
Raw Normal View History

#include "CScriptMidi.hpp"
#include "TCastTo.hpp"
#include "CSimplePool.hpp"
#include "GameGlobalObjects.hpp"
#include "CStateManager.hpp"
#include "MP1/CInGameGuiManager.hpp"
#include "CInGameTweakManagerBase.hpp"
2018-12-08 05:30:43 +00:00
namespace urde {
2018-12-08 05:30:43 +00:00
CScriptMidi::CScriptMidi(TUniqueId id, const CEntityInfo& info, std::string_view name, bool active, CAssetId 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});
}
2018-12-08 05:30:43 +00:00
void CScriptMidi::StopInternal(float fadeTime) {
if (x3c_handle) {
CMidiManager::Stop(x3c_handle, fadeTime);
x3c_handle.reset();
}
}
2018-12-08 05:30:43 +00:00
void CScriptMidi::Stop(CStateManager& mgr, float fadeTime) {
const CWorld* wld = mgr.GetWorld();
const CGameArea* area = wld->GetAreaAlways(x4_areaId);
std::string twkName =
CInGameTweakManagerBase::GetIdentifierForMidiEvent(wld->IGetWorldAssetId(), area->GetAreaAssetId(), x10_name);
if (g_TweakManager->HasTweakValue(twkName)) {
const CTweakValue::Audio& audio = g_TweakManager->GetTweakValue(twkName)->GetAudio();
fadeTime = audio.GetFadeOut();
}
2018-12-08 05:30:43 +00:00
StopInternal(fadeTime);
}
2018-12-08 05:30:43 +00:00
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 =
CInGameTweakManagerBase::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;
}
2018-12-08 05:30:43 +00:00
x3c_handle = CMidiManager::Play(*x34_song, fadeTime, false, volume / 127.f);
}
2018-12-08 05:30:43 +00:00
void CScriptMidi::Accept(IVisitor& visitor) { visitor.Visit(this); }
2018-12-08 05:30:43 +00:00
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;
}
}
2018-12-08 05:30:43 +00:00
} // namespace urde