mirror of
https://github.com/zeldaret/ss
synced 2026-06-03 18:36:16 -04:00
81 lines
2.5 KiB
C++
81 lines
2.5 KiB
C++
#include "d/snd/d_snd_source_npc_head.h"
|
|
|
|
#include "common.h"
|
|
#include "d/a/d_a_base.h"
|
|
#include "d/snd/d_snd_mgr.h"
|
|
#include "d/snd/d_snd_player_mgr.h"
|
|
#include "d/snd/d_snd_rng_mgr.h"
|
|
#include "d/snd/d_snd_source.h"
|
|
#include "d/snd/d_snd_source_group.h"
|
|
#include "d/snd/d_snd_state_mgr.h"
|
|
#include "d/snd/d_snd_util.h"
|
|
#include "d/snd/d_snd_wzsound.h"
|
|
#include "sized_string.h"
|
|
|
|
dSndSourceNpcHead_c::dSndSourceNpcHead_c(
|
|
s32 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup
|
|
)
|
|
: dSoundSource_c(sourceType, ac, name, pOwnerGroup), field_0x15C(0) {
|
|
if (dSndStateMgr_c::isInStage("F001r") && streq(name, "NpcCbFdHead") && ac->roomid == 1) {
|
|
// Fledge in Knight's Academy
|
|
pOwnerGroup->getAmbientParam()->field_0x00 = 100.0f;
|
|
pOwnerGroup->getAmbientParam()->field_0x04 = 300.0f;
|
|
}
|
|
}
|
|
|
|
bool dSndSourceNpcHead_c::npcSpeak(u32 id) {
|
|
if (id == -1) {
|
|
return false;
|
|
}
|
|
|
|
if (id < (LABEL_NV_END - LABEL_NV_START)) {
|
|
// turn SE_NV_123 into SE_NV_123_NpcZld
|
|
SizedString<64> nvVariantLabel;
|
|
const char *baseLabel = dSndMgr_c::getSoundLabelString(id + LABEL_NV_START);
|
|
nvVariantLabel.sprintf("%s_%s", baseLabel, mpMainName);
|
|
id = dSndPlayerMgr_c::GetInstance()->convertLabelStringToSoundId(nvVariantLabel);
|
|
if (id == -1) {
|
|
return false;
|
|
}
|
|
} else if (id < LABEL_NV_START || id >= LABEL_SE_AMBIENT_START) {
|
|
// This condition allows all the SE_TgSound sounds...
|
|
return false;
|
|
}
|
|
|
|
// if there are _R1, _R2 variants, pick a random one
|
|
SizedString<64> label;
|
|
if (checkUserParamMask(id, 0x20)) {
|
|
label.sprintf("%s_%s", dSndMgr_c::getSoundLabelString(id), "R1");
|
|
|
|
if (label == dSndMgr_c::getSoundLabelString(id + 1)) {
|
|
// _R1 variant directly follows base variant
|
|
u32 randRange = 2;
|
|
|
|
label.sprintf("%s_%s", dSndMgr_c::getSoundLabelString(id), "R2");
|
|
if (label == dSndMgr_c::getSoundLabelString(id + 2)) {
|
|
// base, base_R1, base_R2
|
|
randRange = 3;
|
|
}
|
|
id += dSndRngMgr_c::GetInstance()->rndInt(randRange);
|
|
}
|
|
}
|
|
|
|
return startSound(id, nullptr);
|
|
}
|
|
|
|
bool dSndSourceNpcHead_c::startVoiceLine(u32 id) {
|
|
a_field_0x7D = false;
|
|
return npcSpeak(id);
|
|
}
|
|
|
|
bool dSndSourceNpcHead_c::vt_0xDC(u32 id) {
|
|
a_field_0x7D = true;
|
|
return npcSpeak(id);
|
|
}
|
|
|
|
|
|
void dSndSourceNpcHead_c::setOrigName(const char *arg) {
|
|
mpOrigName = arg;
|
|
mpMainName = arg;
|
|
}
|