More source

This commit is contained in:
robojumper
2025-06-17 00:13:47 +02:00
parent 454a4eb6c7
commit 741935bc61
10 changed files with 268 additions and 132 deletions
+22 -22
View File
@@ -21137,27 +21137,27 @@ shutdown__14dSoundSource_cFv = .text:0x80388CD0; // type:function size:0x9C
fn_80388D70 = .text:0x80388D70; // type:function size:0x80
getListenerPosition__14dSoundSource_cCFv = .text:0x80388DF0; // type:function size:0xC
calc__14dSoundSource_cFRCQ34nw4r4math4VEC3 = .text:0x80388E00; // type:function size:0x88
d_s_vt_0x184__14dSoundSource_cFv = .text:0x80388E90; // type:function size:0x84
d_s_vt_0x18C__14dSoundSource_cFv = .text:0x80388F20; // type:function size:0x4
preCalc__14dSoundSource_cFv = .text:0x80388E90; // type:function size:0x84
postCalc__14dSoundSource_cFv = .text:0x80388F20; // type:function size:0x4
hasPlayingSounds__14dSoundSource_cCFv = .text:0x80388F30; // type:function size:0x8
isPlayingSound__14dSoundSource_cFUl = .text:0x80388F40; // type:function size:0x8
isPlayingSound__14dSoundSource_cFPCc = .text:0x80388F50; // type:function size:0x48
initVolumeFade__14dSoundSource_cFv = .text:0x80388FA0; // type:function size:0x14
setVolumeFade__14dSoundSource_cFfUl = .text:0x80388FC0; // type:function size:0x84
calcVolumeFade__14dSoundSource_cFv = .text:0x80389050; // type:function size:0x68
setUnkSeWord__14dSoundSource_cFi = .text:0x803890C0; // type:function size:0x18
setUnkSeFloat__14dSoundSource_cFf = .text:0x803890E0; // type:function size:0x1C
setCtxInt__14dSoundSource_cFl = .text:0x803890C0; // type:function size:0x18
setCtxFloat__14dSoundSource_cFf = .text:0x803890E0; // type:function size:0x1C
isInaudible__14dSoundSource_cFv = .text:0x80389100; // type:function size:0x60
d_s_vt_0x190__14dSoundSource_cFv = .text:0x80389160; // type:function size:0x40
setPause__14dSoundSource_cFbi = .text:0x803891A0; // type:function size:0xB0
startSound__14dSoundSource_cFUl = .text:0x80389250; // type:function size:0x30
startSound__14dSoundSource_cFPCc = .text:0x80389280; // type:function size:0x48
startSoundWithUnkSeWord__14dSoundSource_cFUli = .text:0x803892D0; // type:function size:0x64
startSoundWithUnkSeWord__14dSoundSource_cFPCci = .text:0x80389340; // type:function size:0x58
startSoundWithUnkSeFloat__14dSoundSource_cFUlf = .text:0x803893A0; // type:function size:0x60
startSoundWithUnkSeFloat__14dSoundSource_cFPCcf = .text:0x80389400; // type:function size:0x58
startSoundWithUnkSe__14dSoundSource_cFUlfi = .text:0x80389460; // type:function size:0x88
startSoundWithUnkSe__14dSoundSource_cFPCcfi = .text:0x803894F0; // type:function size:0x68
startSoundWithIntParam__14dSoundSource_cFUll = .text:0x803892D0; // type:function size:0x64
startSoundWithIntParam__14dSoundSource_cFPCcl = .text:0x80389340; // type:function size:0x58
startSoundWithFloatParam__14dSoundSource_cFUlf = .text:0x803893A0; // type:function size:0x60
startSoundWithFloatParam__14dSoundSource_cFPCcf = .text:0x80389400; // type:function size:0x58
startSoundWithParams__14dSoundSource_cFUlfl = .text:0x80389460; // type:function size:0x88
startSoundWithParams__14dSoundSource_cFPCcfl = .text:0x803894F0; // type:function size:0x68
vt_0xA0__14dSoundSource_cFv = .text:0x80389560; // type:function size:0x94
startRemoConSound__14dSoundSource_cFUl = .text:0x80389600; // type:function size:0x74
startSound__14dSoundSource_cFUlPQ34nw4r3snd11SoundHandle = .text:0x80389680; // type:function size:0x40
@@ -21179,16 +21179,16 @@ stopSounds__14dSoundSource_cFUll = .text:0x8038A310; // type:function size:0xB8
stopSounds__14dSoundSource_cFPCcl = .text:0x8038A3D0; // type:function size:0x58
holdSound__14dSoundSource_cFUl = .text:0x8038A430; // type:function size:0x30
holdSound__14dSoundSource_cFPCc = .text:0x8038A460; // type:function size:0x48
vt_0xB0__14dSoundSource_cFv = .text:0x8038A4B0; // type:function size:0x64
vt_0xC0__14dSoundSource_cFv = .text:0x8038A520; // type:function size:0x58
vt_0xB4__14dSoundSource_cFv = .text:0x8038A580; // type:function size:0x60
vt_0xC4__14dSoundSource_cFv = .text:0x8038A5E0; // type:function size:0x58
vt_0xB8__14dSoundSource_cFv = .text:0x8038A640; // type:function size:0x88
vt_0xC8__14dSoundSource_cFv = .text:0x8038A6D0; // type:function size:0x68
holdSoundWithIntParam__14dSoundSource_cFUll = .text:0x8038A4B0; // type:function size:0x64
holdSoundWithIntParam__14dSoundSource_cFPCcl = .text:0x8038A520; // type:function size:0x58
holdSoundWithFloatParam__14dSoundSource_cFUlf = .text:0x8038A580; // type:function size:0x60
holdSoundWithFloatParam__14dSoundSource_cFPCcf = .text:0x8038A5E0; // type:function size:0x58
holdSoundWithParams__14dSoundSource_cFUlfl = .text:0x8038A640; // type:function size:0x88
holdSoundWithParams__14dSoundSource_cFPCcfl = .text:0x8038A6D0; // type:function size:0x68
holdSound__14dSoundSource_cFUlPQ34nw4r3snd11SoundHandle = .text:0x8038A740; // type:function size:0x1E8
continueHoldingSound__14dSoundSource_cFP14dSndSeSound2_cUlP23dSndDistantSoundActor_cPCQ34nw4r4math4VEC3 = .text:0x8038A930; // type:function size:0x1D0
vt_0xCC__14dSoundSource_cFv = .text:0x8038AB00; // type:function size:0x258
vt_0xD0__14dSoundSource_cFv = .text:0x8038AD60; // type:function size:0x58
holdSoundAtPosition__14dSoundSource_cFUlPCQ34nw4r4math4VEC3 = .text:0x8038AB00; // type:function size:0x258
holdSoundAtPosition__14dSoundSource_cFPCcPCQ34nw4r4math4VEC3 = .text:0x8038AD60; // type:function size:0x58
SetupSound__14dSoundSource_cFPQ34nw4r3snd11SoundHandleUlPCQ44nw4r3snd14SoundStartable9StartInfoPv = .text:0x8038ADC0; // type:function size:0xAC
d_s_vt_0x1AC__14dSoundSource_cFv = .text:0x8038AE70; // type:function size:0x98
setupSound__14dSoundSource_cFPQ34nw4r3snd11SoundHandleUlPCQ44nw4r3snd14SoundStartable9StartInfoPvb = .text:0x8038AF10; // type:function size:0x254
@@ -21476,14 +21476,14 @@ updateSome3DField__23dSndDistantSoundActor_cFv = .text:0x803941C0; // type:funct
d_vt_0x3C__23dSndDistantSoundActor_cFv = .text:0x803941D0; // type:function size:0x24
@84@__dt__23dSndDistantSoundActor_cFv = .text:0x80394200; // type:function size:0x8 scope:weak
__ct__13dSndSeSound_cFv = .text:0x80394210; // type:function size:0xA8
__ct__16UnkSeSoundStructFv = .text:0x803942C0; // type:function size:0x14 scope:weak
__dt__16UnkSeSoundStructFv = .text:0x803942E0; // type:function size:0x40 scope:weak
__ct__17dSndSoundCtxParamFv = .text:0x803942C0; // type:function size:0x14 scope:weak
__dt__17dSndSoundCtxParamFv = .text:0x803942E0; // type:function size:0x40 scope:weak
__dt__13dSndSeSound_cFv = .text:0x80394320; // type:function size:0x78
setSource__13dSndSeSound_cFP14dSoundSource_cUl = .text:0x803943A0; // type:function size:0x80
clear__13dSndSeSound_cFv = .text:0x80394420; // type:function size:0x40
calc__13dSndSeSound_cFP14dSoundSource_c = .text:0x80394460; // type:function size:0x9C
shiftPair__13dSndSeSound_cFPC16UnkSeSoundStruct = .text:0x80394500; // type:function size:0xA8
shiftValue__13dSndSeSound_cFf = .text:0x803945B0; // type:function size:0x78
shiftParam__13dSndSeSound_cFPC17dSndSoundCtxParam = .text:0x80394500; // type:function size:0xA8
shiftFloatParam__13dSndSeSound_cFf = .text:0x803945B0; // type:function size:0x78
onStart__13dSndSeSound_cFP14dSoundSource_c = .text:0x80394630; // type:function size:0x1C
onCalc__13dSndSeSound_cFP14dSoundSource_c = .text:0x80394650; // type:function size:0x1C
__ct__14dSndSeSound1_cFv = .text:0x80394670; // type:function size:0x44
+10 -2
View File
@@ -52,10 +52,18 @@ public:
// not sure if this combination makes sense
void resetHandle() {
field_0x0F4 = 0;
mpHoldSoundHandle = nullptr;
mpSoundHandle = &mSoundHandle;
}
dSndSeSound2_c *getHoldSoundHandle() const {
return mpHoldSoundHandle;
}
void setHoldSoundHandle(dSndSeSound2_c *handle) {
mpHoldSoundHandle = handle;
}
bool isActive() const {
return mIsActive;
}
@@ -73,7 +81,7 @@ public:
private:
/* 0x0E4 */ nw4r::ut::Node mPoolLink; // sound actor pool link
/* 0x0EC */ nw4r::ut::Node mSourceLink; // sound source link
/* 0x0F4 */ UNKWORD field_0x0F4;
/* 0x0F4 */ dSndSeSound2_c *mpHoldSoundHandle;
/* 0x0F8 */ dSoundSource_c *mpSoundSource;
/* 0x0FC */ nw4r::snd::SoundHandle mSoundHandle;
/* 0x100 */ nw4r::snd::SoundHandle *mpSoundHandle;
+25 -16
View File
@@ -8,23 +8,32 @@
#include "nw4r/ut/ut_list.h"
/**
* This seems to be a generic way of passing parameters from callers of dSoundSource_c
* startSound/holdSound to the callbacks that sound sources will register
* on those handlers. E.g. at 80397a40 the chandelier swing hold sound will
* occasionally create additional sounds based on historical params (swinging angle) passed
* to holdSound by the chandelier (see dAcOChandelier_c::executeState_Wait / 80ebc814 in Ghidra)
* In yet other cases the callback itself will keep pushing new values and the caller doesn't
* do anything, e.g. caller at 80228814 for SE_L_ROPE_WIND_LV does not push values, but
* handler at 80394fb0 will keep pushing values.
* Examples:
* * Chandelier hold sound. Game code (dAcOChandelier_c::executeState_Wait) will
* push the current swing angle, callback (80397a40) will play additional sounds
* when chandelier swing speed exceeds certain values.
* * SE_L_ROPE_WIND_LV: callback (80228814) will read and write values to create a feedback
* loop for certain parameters.
*/
struct UnkSeSoundStruct {
UnkSeSoundStruct() : field_0x00(0), field_0x04(0.0f) {}
~UnkSeSoundStruct() {}
struct dSndSoundCtxParam {
dSndSoundCtxParam() : intParam(0), floatParam(0.0f) {}
~dSndSoundCtxParam() {}
/* 0x00 */ UNKWORD field_0x00;
/* 0x04 */ f32 field_0x04;
/* 0x00 */ s32 intParam;
/* 0x04 */ f32 floatParam;
};
/**
* A sound effect handle. Typically acquired by sound sources from a pool.
* This allows sound sources to play sounds with no pre-determined limit
* on the number of sounds. It also allows the source to handle the statefulness
* of holdSound without requiring users to manage handles.
*
* Additionally, some sound sources will register callbacks to customize
* sound parameters (pitch, volume, ...). These callbacks can additionally
* write and read context parameters (see above). The game will shift these
* parameters with each call, so a lot of this is obviously frame-rate dependent.
*/
class dSndSeSound_c {
public:
dSndSeSound_c();
@@ -45,8 +54,8 @@ public:
void clear();
// not sure what this does
void shiftPair(const UnkSeSoundStruct *p);
void shiftValue(f32 value);
void shiftParam(const dSndSoundCtxParam *p);
void shiftFloatParam(f32 value);
typedef void Callback(dSndSeSound_c *sound, dSoundSource_c *source, nw4r::snd::SoundHandle &handle);
@@ -106,7 +115,7 @@ protected:
/* 0x10C */ Type_e mHandleType;
/* 0x110 */ u32 mSoundId;
/* 0x114 */ s32 field_0x114;
/* 0x118 */ UnkSeSoundStruct *mpUnk;
/* 0x118 */ dSndSoundCtxParam *mpUnk;
/* 0x11C */ u8 field_0x11C;
/* 0x11D */ u8 field_0x11D;
/* 0x11E */ u8 field_0x11E;
+28 -20
View File
@@ -30,10 +30,10 @@ public:
return mpName;
} // 0x17C
virtual void d_s_vt_0x180(); // 0x180
virtual void d_s_vt_0x184(); // 0x184
virtual void preCalc(); // 0x184
virtual void d_s_vt_0x188(); // 0x188
virtual void d_s_vt_0x18C(); // 0x18C
virtual void d_s_vt_0x190(); // 0x190
virtual void postCalc(); // 0x18C
virtual bool d_s_vt_0x190(); // 0x190
virtual u32 d_s_vt_0x194(u32 soundId); // 0x194
virtual void postStartSound(nw4r::snd::SoundHandle &handle, dSndSeSound_c *pSound, u32 id) override; // 0x198
@@ -105,23 +105,31 @@ public:
virtual bool hasPlayingSounds() const override; // 0x048
virtual bool isPlayingSound(u32 soundId) override; // 0x04C
virtual bool isPlayingSound(const char *soundId) override; // 0x050
virtual void setUnkSe(const UnkSeSoundStruct *arg) override {
mpUnkSe = arg;
virtual void setCtxParam(const dSndSoundCtxParam *arg) override {
mpCtxParam = arg;
} // 0x054
virtual void setUnkSeFloat(f32 value) override; // 0x058
virtual void setUnkSeWord(UNKWORD value) override; // 0x05C
virtual bool startSound(u32 soundId) override; // 0x060
virtual bool startSoundWithUnkSeWord(u32 soundId, UNKWORD value) override; // 0x064
virtual bool startSoundWithUnkSeFloat(u32 soundId, f32 value) override; // 0x068
virtual bool startSoundWithUnkSe(u32 soundId, f32 fValue, UNKWORD value) override; // 0x06C
virtual bool startSound(const char *label) override; // 0x070
virtual bool startSoundWithUnkSeWord(const char *label, UNKWORD value) override; // 0x074
virtual bool startSoundWithUnkSeFloat(const char *label, f32 value) override; // 0x078
virtual bool startSoundWithUnkSe(const char *label, f32 fValue, UNKWORD value) override; // 0x07C
virtual void stopSounds(u32 soundId, s32 fadeFrames) override; // 0x0A4
virtual void stopSounds(const char *label, s32 fadeFrames) override; // 0x0A8
virtual bool holdSound(u32 soundId) override; // 0x0AC
virtual bool holdSound(const char *label) override; // 0x0BC
virtual void setCtxFloat(f32 value) override; // 0x058
virtual void setCtxInt(s32 value) override; // 0x05C
virtual bool startSound(u32 soundId) override; // 0x060
virtual bool startSoundWithIntParam(u32 soundId, s32 value) override; // 0x064
virtual bool startSoundWithFloatParam(u32 soundId, f32 value) override; // 0x068
virtual bool startSoundWithParams(u32 soundId, f32 fValue, s32 value) override; // 0x06C
virtual bool startSound(const char *label) override; // 0x070
virtual bool startSoundWithIntParam(const char *label, s32 value) override; // 0x074
virtual bool startSoundWithFloatParam(const char *label, f32 value) override; // 0x078
virtual bool startSoundWithParams(const char *label, f32 fValue, s32 value) override; // 0x07C
virtual void stopSounds(u32 soundId, s32 fadeFrames) override; // 0x0A4
virtual void stopSounds(const char *label, s32 fadeFrames) override; // 0x0A8
virtual bool holdSound(u32 soundId) override; // 0x0AC
virtual bool holdSoundWithIntParam(u32 soundId, s32 value) override; // 0x0B0
virtual bool holdSoundWithFloatParam(u32 soundId, f32 value) override; // 0x0B4
virtual bool holdSoundWithParams(u32 soundId, f32 fValue, s32 value) override; // 0x0B8
virtual bool holdSound(const char *label) override; // 0x0BC
virtual bool holdSoundWithIntParam(const char *label, s32 value) override; // 0x0C0
virtual bool holdSoundWithFloatParam(const char *label, f32 value) override; // 0x0C4
virtual bool holdSoundWithParams(const char *label, f32 fValue, s32 value) override; // 0x0C8
virtual bool holdSoundAtPosition(u32 soundId, const nw4r::math::VEC3 *position) override; // 0x0CC
virtual bool holdSoundAtPosition(const char *label, const nw4r::math::VEC3 *position) override; // 0x0D0
virtual bool isReadyMaybe() override {
return false;
@@ -194,7 +202,7 @@ private:
/* 0x102 */ u8 field_0x102;
/* 0x104 */ UNKWORD field_0x104;
/* 0x108 */ UNKWORD field_0x108;
/* 0x10C */ const UnkSeSoundStruct *mpUnkSe;
/* 0x10C */ const dSndSoundCtxParam *mpCtxParam;
/* 0x110 */ nw4r::ut::List mDistantSoundList; // node offset 0xEC -> dSndDistantSoundActor_c
/* 0x11C */ UNKWORD field_0x11C;
/* 0x120 */ nw4r::ut::List mHandleType1List; // node offset 0x4 -> dSndSeSound_c
+34 -34
View File
@@ -20,28 +20,28 @@ public:
virtual bool isSourceType(s32 type) const = 0; // 0x01C
SOUNDSOURCE_VIRTUAL(0x20);
SOUNDSOURCE_VIRTUAL(0x24);
virtual const nw4r::math::VEC3 &getListenerPosition() const = 0; // 0x028
virtual void calc(const nw4r::math::VEC3 &) = 0; // 0x02C
virtual void onFlag1(u32 mask) = 0; // 0x030
virtual void offFlag1(u32 mask) = 0; // 0x034
virtual bool checkFlag(u32 mask) const = 0; // 0x038
virtual void onFlag2(u32 mask) = 0; // 0x03C
virtual void stopAllSound(s32 fadeFrames) = 0; // 0x040
virtual void shutdown() = 0; // 0x044
virtual bool hasPlayingSounds() const = 0; // 0x048
virtual bool isPlayingSound(u32 soundId) = 0; // 0x04C
virtual bool isPlayingSound(const char *soundId) = 0; // 0x050
virtual void setUnkSe(const UnkSeSoundStruct *) = 0; // 0x054
virtual void setUnkSeFloat(f32 value) = 0; // 0x058
virtual void setUnkSeWord(UNKWORD value) = 0; // 0x05C
virtual bool startSound(u32 soundId) = 0; // 0x060
virtual bool startSoundWithUnkSeWord(u32 soundId, UNKWORD value) = 0; // 0x064
virtual bool startSoundWithUnkSeFloat(u32 soundId, f32 value) = 0; // 0x068
virtual bool startSoundWithUnkSe(u32 soundId, f32 fValue, UNKWORD value) = 0; // 0x06C
virtual bool startSound(const char *label) = 0; // 0x070
virtual bool startSoundWithUnkSeWord(const char *label, UNKWORD value) = 0; // 0x074
virtual bool startSoundWithUnkSeFloat(const char *label, f32 value) = 0; // 0x078
virtual bool startSoundWithUnkSe(const char *label, f32 fValue, UNKWORD value) = 0; // 0x07C
virtual const nw4r::math::VEC3 &getListenerPosition() const = 0; // 0x028
virtual void calc(const nw4r::math::VEC3 &) = 0; // 0x02C
virtual void onFlag1(u32 mask) = 0; // 0x030
virtual void offFlag1(u32 mask) = 0; // 0x034
virtual bool checkFlag(u32 mask) const = 0; // 0x038
virtual void onFlag2(u32 mask) = 0; // 0x03C
virtual void stopAllSound(s32 fadeFrames) = 0; // 0x040
virtual void shutdown() = 0; // 0x044
virtual bool hasPlayingSounds() const = 0; // 0x048
virtual bool isPlayingSound(u32 soundId) = 0; // 0x04C
virtual bool isPlayingSound(const char *soundId) = 0; // 0x050
virtual void setCtxParam(const dSndSoundCtxParam *) = 0; // 0x054
virtual void setCtxFloat(f32 value) = 0; // 0x058
virtual void setCtxInt(s32 value) = 0; // 0x05C
virtual bool startSound(u32 soundId) = 0; // 0x060
virtual bool startSoundWithIntParam(u32 soundId, s32 value) = 0; // 0x064
virtual bool startSoundWithFloatParam(u32 soundId, f32 value) = 0; // 0x068
virtual bool startSoundWithParams(u32 soundId, f32 fValue, s32 value) = 0; // 0x06C
virtual bool startSound(const char *label) = 0; // 0x070
virtual bool startSoundWithIntParam(const char *label, s32 value) = 0; // 0x074
virtual bool startSoundWithFloatParam(const char *label, f32 value) = 0; // 0x078
virtual bool startSoundWithParams(const char *label, f32 fValue, s32 value) = 0; // 0x07C
SOUNDSOURCE_VIRTUAL(0x80);
SOUNDSOURCE_VIRTUAL(0x84);
SOUNDSOURCE_VIRTUAL(0x88);
@@ -51,18 +51,18 @@ public:
SOUNDSOURCE_VIRTUAL(0x98);
SOUNDSOURCE_VIRTUAL(0x9C);
SOUNDSOURCE_VIRTUAL(0xA0);
virtual void stopSounds(u32 soundId, s32 fadeFrames) = 0; // 0x0A4
virtual void stopSounds(const char *label, s32 fadeFrames) = 0; // 0x0A8
virtual bool holdSound(u32 soundId) = 0; // 0x0AC
SOUNDSOURCE_VIRTUAL(0xB0);
SOUNDSOURCE_VIRTUAL(0xB4);
SOUNDSOURCE_VIRTUAL(0xB8);
virtual bool holdSound(const char *label) = 0; // 0x0BC
SOUNDSOURCE_VIRTUAL(0xC0);
SOUNDSOURCE_VIRTUAL(0xC4);
SOUNDSOURCE_VIRTUAL(0xC8);
SOUNDSOURCE_VIRTUAL(0xCC);
SOUNDSOURCE_VIRTUAL(0xD0);
virtual void stopSounds(u32 soundId, s32 fadeFrames) = 0; // 0x0A4
virtual void stopSounds(const char *label, s32 fadeFrames) = 0; // 0x0A8
virtual bool holdSound(u32 soundId) = 0; // 0x0AC
virtual bool holdSoundWithIntParam(u32 soundId, s32 value) = 0; // 0x0B0
virtual bool holdSoundWithFloatParam(u32 soundId, f32 value) = 0; // 0x0B4
virtual bool holdSoundWithParams(u32 soundId, f32 fValue, s32 value) = 0; // 0x0B8
virtual bool holdSound(const char *label) = 0; // 0x0BC
virtual bool holdSoundWithIntParam(const char *label, s32 value) = 0; // 0x0C0
virtual bool holdSoundWithFloatParam(const char *label, f32 value) = 0; // 0x0C4
virtual bool holdSoundWithParams(const char *label, f32 fValue, s32 value) = 0; // 0x0C8
virtual bool holdSoundAtPosition(u32 soundId, const nw4r::math::VEC3 *position) = 0; // 0x0CC
virtual bool holdSoundAtPosition(const char *label, const nw4r::math::VEC3 *position) = 0; // 0x0D0
SOUNDSOURCE_VIRTUAL(0xD4);
SOUNDSOURCE_VIRTUAL(0xD8);
SOUNDSOURCE_VIRTUAL(0xDC);
+4
View File
@@ -28,6 +28,10 @@ public:
return GetInstance()->mpBoomerangSource;
}
u8 getField_0x0012() const {
return field_0x0012;
}
u8 getField_0x0013() const {
return field_0x0013;
}
+1 -1
View File
@@ -10,7 +10,7 @@ class dSndDistantSoundActor_c;
class dSndSound_c;
class UnkSeSoundStruct;
class dSndSoundCtxParam;
class dSndSeSound_c;
class dSndSeSound1_c;
+2 -2
View File
@@ -11,7 +11,7 @@
dSndDistantSoundActor_c::dSndDistantSoundActor_c()
: dSnd3DActor_c(&dSndDistantSoundActorPool_c::GetInstance()->getSourceParam(), SND_SOURCE_DISTANT),
field_0x0F4(0),
mpHoldSoundHandle(nullptr),
mpSoundSource(nullptr),
mpSoundHandle(&mSoundHandle),
mIsActive(false),
@@ -95,7 +95,7 @@ void dSndDistantSoundActor_c::detachFromSource() {
mpSoundSource->detachDistantSound(this);
}
mpSoundSource = nullptr;
field_0x0F4 = 0;
mpHoldSoundHandle = nullptr;
}
void dSndDistantSoundActor_c::setPause(bool flag, int fadeFrames) {
+8 -8
View File
@@ -14,7 +14,7 @@ dSndSeSound_c::dSndSeSound_c()
field_0x11E(0),
mpStartCallback(nullptr),
mpCalcCallback(nullptr) {
mpUnk = new UnkSeSoundStruct[10];
mpUnk = new dSndSoundCtxParam[10];
}
dSndSeSound_c::~dSndSeSound_c() {
@@ -25,10 +25,10 @@ void dSndSeSound_c::setSource(dSoundSource_c *source, u32 soundId) {
clear();
mSoundId = soundId;
field_0x114 = 0;
UnkSeSoundStruct* s = mpUnk;
dSndSoundCtxParam* s = mpUnk;
while (s < &mpUnk[10]) {
s->field_0x00 = 0;
s->field_0x04 = 0.0f;
s->intParam = 0;
s->floatParam = 0.0f;
s++;
}
@@ -57,7 +57,7 @@ void dSndSeSound_c::calc(dSoundSource_c *source) {
field_0x114++;
}
void dSndSeSound_c::shiftPair(const UnkSeSoundStruct *pUnk) {
void dSndSeSound_c::shiftParam(const dSndSoundCtxParam *pUnk) {
if (pUnk == nullptr) {
return;
}
@@ -68,11 +68,11 @@ void dSndSeSound_c::shiftPair(const UnkSeSoundStruct *pUnk) {
mpUnk[0] = *pUnk;
}
void dSndSeSound_c::shiftValue(f32 value) {
void dSndSeSound_c::shiftFloatParam(f32 value) {
for (int i = 9; i > 0; i--) {
mpUnk[i].field_0x04 = mpUnk[i - 1].field_0x04;
mpUnk[i].floatParam = mpUnk[i - 1].floatParam;
}
mpUnk[0].field_0x04 = value;
mpUnk[0].floatParam = value;
}
void dSndSeSound_c::onStart(dSoundSource_c *source) {
+134 -27
View File
@@ -11,6 +11,7 @@
#include "d/snd/d_snd_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
#include "d/snd/d_snd_se_sound.h"
#include "d/snd/d_snd_se_sound_2.h"
#include "d/snd/d_snd_se_sound_pool.h"
#include "d/snd/d_snd_source_enums.h"
#include "d/snd/d_snd_source_group.h"
@@ -24,7 +25,7 @@
#include "nw4r/ut/ut_list.h"
#include "sized_string.h"
static UnkSeSoundStruct sSeStruct;
static dSndSoundCtxParam sCtxParams;
bool dSoundSource_c::sIsStartingBaseSound;
const char *help_i_need_data() {
@@ -44,7 +45,7 @@ dSoundSource_c::dSoundSource_c(u8 sourceType, dAcBase_c *actor, const char *name
field_0x102(0),
field_0x104(0),
field_0x108(0),
mpUnkSe(nullptr),
mpCtxParam(nullptr),
field_0x11C(0),
mpOwnerGroup(pOwnerGroup),
field_0x154(0),
@@ -122,14 +123,34 @@ const nw4r::math::VEC3 &dSoundSource_c::getListenerPosition() const {
}
void dSoundSource_c::calc(const nw4r::math::VEC3 &pos) {
d_s_vt_0x184();
preCalc();
setPosition(pos);
calcHandles();
calcVolumeFade();
d_s_vt_0x18C();
postCalc();
field_0x108 = 0;
}
void dSoundSource_c::preCalc() {
if (field_0x100 != 0) {
return;
}
if (dSndSourceMgr_c::GetInstance()->getField_0x0012() != 0) {
return;
}
if (!mIsPaused && !mpActor->isBasePropertyFlag(dBase_c::BASE_PROP_0x4)) {
setPause(true, 3);
} else if (mIsPaused && mpActor->isBasePropertyFlag(dBase_c::BASE_PROP_0x4)) {
setPause(false, 3);
}
}
void dSoundSource_c::postCalc() {
// noop
}
bool dSoundSource_c::hasPlayingSounds() const {
return dSnd3DActor_c::hasPlayingSounds();
}
@@ -192,14 +213,14 @@ void dSoundSource_c::calcVolumeFade() {
SoundActor::SetVolume(nextVolume);
}
void dSoundSource_c::setUnkSeWord(UNKWORD value) {
sSeStruct.field_0x00 = value;
setUnkSe(&sSeStruct);
void dSoundSource_c::setCtxInt(s32 value) {
sCtxParams.intParam = value;
setCtxParam(&sCtxParams);
}
void dSoundSource_c::setUnkSeFloat(f32 value) {
sSeStruct.field_0x04 = value;
setUnkSe(&sSeStruct);
void dSoundSource_c::setCtxFloat(f32 value) {
sCtxParams.floatParam = value;
setCtxParam(&sCtxParams);
}
bool dSoundSource_c::isInaudible() {
@@ -230,35 +251,35 @@ bool dSoundSource_c::startSound(const char *label) {
return startSound(soundLabelToSoundId(label));
}
bool dSoundSource_c::startSoundWithUnkSeWord(u32 soundId, UNKWORD value) {
setUnkSeWord(value);
bool dSoundSource_c::startSoundWithIntParam(u32 soundId, s32 value) {
setCtxInt(value);
return startSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::startSoundWithUnkSeWord(const char *label, UNKWORD value) {
bool dSoundSource_c::startSoundWithIntParam(const char *label, s32 value) {
u32 soundId = soundLabelToSoundId(label);
return startSoundWithUnkSeWord(soundId, value);
return startSoundWithIntParam(soundId, value);
}
bool dSoundSource_c::startSoundWithUnkSeFloat(u32 soundId, f32 value) {
setUnkSeFloat(value);
bool dSoundSource_c::startSoundWithFloatParam(u32 soundId, f32 value) {
setCtxFloat(value);
return startSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::startSoundWithUnkSeFloat(const char *label, f32 value) {
bool dSoundSource_c::startSoundWithFloatParam(const char *label, f32 value) {
u32 soundId = soundLabelToSoundId(label);
return startSoundWithUnkSeFloat(soundId, value);
return startSoundWithFloatParam(soundId, value);
}
bool dSoundSource_c::startSoundWithUnkSe(u32 soundId, f32 fValue, UNKWORD value) {
setUnkSeWord(value);
setUnkSeFloat(fValue);
bool dSoundSource_c::startSoundWithParams(u32 soundId, f32 fValue, s32 value) {
setCtxInt(value);
setCtxFloat(fValue);
return startSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::startSoundWithUnkSe(const char *label, f32 fValue, UNKWORD value) {
bool dSoundSource_c::startSoundWithParams(const char *label, f32 fValue, s32 value) {
u32 soundId = soundLabelToSoundId(label);
return startSoundWithUnkSe(soundId, fValue, value);
return startSoundWithParams(soundId, fValue, value);
}
bool dSoundSource_c::startRemoConSound(u32 soundId) {
@@ -289,7 +310,7 @@ dSoundSource_c::startSound(u32 soundId, nw4r::snd::SoundHandle *handle, nw4r::sn
return START_ERR_USER;
}
seHandle->shiftPair(mpUnkSe);
seHandle->shiftParam(mpCtxParam);
if (handle != nullptr) {
seHandle->setHandle(handle);
} else {
@@ -339,7 +360,7 @@ dSoundSource_c::startSoundAtPosition(u32 soundId, const nw4r::math::VEC3 *positi
}
seHandle->setAcquiredMaybe(true);
seHandle->shiftPair(mpUnkSe);
seHandle->shiftParam(mpCtxParam);
if (handle != nullptr) {
seHandle->setHandle(handle);
} else {
@@ -382,6 +403,37 @@ bool dSoundSource_c::holdSound(const char *label) {
return holdSound(soundLabelToSoundId(label));
}
bool dSoundSource_c::holdSoundWithIntParam(u32 soundId, s32 value) {
setCtxInt(value);
return holdSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::holdSoundWithIntParam(const char *label, s32 value) {
u32 soundId = soundLabelToSoundId(label);
return holdSoundWithIntParam(soundId, value);
}
bool dSoundSource_c::holdSoundWithFloatParam(u32 soundId, f32 value) {
setCtxFloat(value);
return holdSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::holdSoundWithFloatParam(const char *label, f32 value) {
u32 soundId = soundLabelToSoundId(label);
return holdSoundWithFloatParam(soundId, value);
}
bool dSoundSource_c::holdSoundWithParams(u32 soundId, f32 fValue, s32 value) {
setCtxInt(value);
setCtxFloat(fValue);
return holdSound(soundId, nullptr) != nullptr;
}
bool dSoundSource_c::holdSoundWithParams(const char *label, f32 fValue, s32 value) {
u32 soundId = soundLabelToSoundId(label);
return holdSoundWithParams(soundId, fValue, value);
}
nw4r::snd::SoundHandle *dSoundSource_c::holdSound(u32 soundId, nw4r::snd::SoundHandle *handle) {
if (soundId == -1) {
return nullptr;
@@ -395,7 +447,7 @@ nw4r::snd::SoundHandle *dSoundSource_c::holdSound(u32 soundId, nw4r::snd::SoundH
return nullptr;
}
seHandle->shiftPair(mpUnkSe);
seHandle->shiftParam(mpCtxParam);
if (handle != nullptr) {
seHandle->setHandle(handle);
@@ -444,7 +496,7 @@ nw4r::snd::SoundHandle *dSoundSource_c::continueHoldingSound(
}
}
nw4r::snd::SoundHandle *handle = seHandle->getHandle();
seHandle->shiftPair(mpUnkSe);
seHandle->shiftParam(mpCtxParam);
field_0x11C |= 0x80000000;
bool ok;
if (distant != nullptr && position != nullptr) {
@@ -465,6 +517,61 @@ nw4r::snd::SoundHandle *dSoundSource_c::continueHoldingSound(
return handle;
}
bool dSoundSource_c::holdSoundAtPosition(u32 soundId, const nw4r::math::VEC3 *position) {
dSndSeSound2_c *seHandle;
nw4r::snd::SoundHandle *handle;
if (position != nullptr) {
dSndDistantSoundActor_c *actor = dSndDistantSoundActorPool_c::GetInstance()->findActiveActor(soundId, this);
if (actor != nullptr) {
seHandle = actor->getHoldSoundHandle();
seHandle->setAcquiredMaybe(1);
handle = continueHoldingSound(seHandle, soundId, actor, position);
} else {
if (d_s_vt_0x190()) {
d_s_vt_0x1C8();
return false;
}
if (isInaudible()) {
d_s_vt_0x1C8();
return false;
}
actor = dSndDistantSoundActorPool_c::GetInstance()->acquireActor(soundId, position, this);
if (actor == nullptr) {
d_s_vt_0x1C8();
return false;
}
seHandle = dSndSeSoundPool_c::GetInstance()->acquireSoundType2(this, soundId);
if (seHandle == nullptr) {
d_s_vt_0x1C8();
return false;
}
seHandle->shiftParam(mpCtxParam);
handle = seHandle->getHandle();
if (actor->holdSound(soundId, *position, handle)) {
addSeHandleType2(seHandle);
postHoldSound(*handle, seHandle, soundId, 0);
postSetupSound(handle->GetId(), soundId, seHandle);
seHandle->onStart(this);
seHandle->onCalc(this);
actor->setHoldSoundHandle(seHandle);
} else {
dSndSeSoundPool_c::GetInstance()->releaseSoundType2(seHandle);
handle = nullptr;
}
}
} else {
handle = holdSound(soundId, nullptr);
}
d_s_vt_0x1C8();
return handle != nullptr;
}
bool dSoundSource_c::holdSoundAtPosition(const char *label, const nw4r::math::VEC3 *position) {
return holdSoundAtPosition(soundLabelToSoundId(label), position);
}
nw4r::snd::SoundStartable::StartResult
dSoundSource_c::SetupSound(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg) {
bool holdFlag = *(bool *)arg;