summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-06-27 19:34:43 +0200
committerrobojumper <robojumper@gmail.com>2025-09-13 10:53:29 +0200
commitc73a1af0984dc1e30e30df233d2cc1049ca12479 (patch)
treece9c625133542137611d976c796ee81145a7e92d /include
parente1f7e2ac58585f09412a91f49c2694a780727745 (diff)
Order below sinit is now ok
Diffstat (limited to 'include')
-rw-r--r--include/d/snd/d_snd_source.h14
-rw-r--r--include/d/snd/d_snd_source_anim_sound.h2
-rw-r--r--include/d/snd/d_snd_source_e_spark.h2
-rw-r--r--include/d/snd/d_snd_source_enemy.h90
-rw-r--r--include/d/snd/d_snd_source_enums.h3
-rw-r--r--include/d/snd/d_snd_source_harp_related.h33
-rw-r--r--include/d/snd/d_snd_source_npc.h68
-rw-r--r--include/d/snd/d_snd_source_obj.h42
-rw-r--r--include/d/snd/d_snd_source_py_bird.h2
9 files changed, 242 insertions, 14 deletions
diff --git a/include/d/snd/d_snd_source.h b/include/d/snd/d_snd_source.h
index 2fa02f3d..5a85e8da 100644
--- a/include/d/snd/d_snd_source.h
+++ b/include/d/snd/d_snd_source.h
@@ -78,14 +78,14 @@ public:
/* 0x1D4 */ virtual dSndAnimSound_c *getAnimSound() {
return nullptr;
}
- /* 0x1D8 */ virtual void d_s_vt_0x1D8() {
+ /* 0x1D8 */ virtual void registerAdditionalSource(dSoundSource_c *other) {
return;
}
- /* 0x1DC */ virtual UNKWORD d_s_vt_0x1DC() {
+ /* 0x1DC */ virtual bool isMultiSource() const {
return 0;
}
- /* 0x1E0 */ virtual void onAnimSoundEvent(UNKWORD arg) {
- field_0x154 = arg;
+ /* 0x1E0 */ virtual void onAnimSoundEvent(s32 arg) {
+ mAnimEventValue = arg;
}
/* 0x1E4 */ virtual void d_s_vt_0x1E4_noop();
/* 0x1E8 */ virtual u32 d_s_vt_0x1E8(u32 soundId);
@@ -209,6 +209,7 @@ public:
protected:
StartResult setupSoundCommon(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg);
void setVolumeFade(f32 volume, u32 fadeFrames);
+ nw4r::snd::SoundStartable::StartResult onSetupError();
private:
/**
@@ -225,7 +226,6 @@ private:
dSndDistantSoundActor_c *startBaseSoundAtPosition(u32 baseSoundId, const nw4r::math::VEC3 *position, f32 volume);
nw4r::snd::SoundHandle *startBaseSound(u32 baseSoundId, f32 volume);
- nw4r::snd::SoundStartable::StartResult onSetupError();
nw4r::snd::SoundStartable::StartResult
startSound(u32 soundId, nw4r::snd::SoundHandle *handle, nw4r::snd::SoundHandle **pOutHandle);
@@ -283,8 +283,8 @@ protected:
/* 0x140 */ dSndSourceGroup_c *mpOwnerGroup;
/* 0x144 */ f32 mVolumeFadeTarget;
/* 0x148 */ f32 mVolumeFadeStepSize;
- /* 0x150 */ u8 _0x14C[0x154 - 0x14C];
- /* 0x154 */ UNKWORD field_0x154;
+ /* 0x14C */ nw4r::ut::Node mSubSourceLink; // node for list in dSndSourceEnemyMultiBase_c
+ /* 0x154 */ s32 mAnimEventValue;
/* 0x158 */ s16 mPolyAttr0;
/* 0x15A */ s16 mPolyAttr1;
};
diff --git a/include/d/snd/d_snd_source_anim_sound.h b/include/d/snd/d_snd_source_anim_sound.h
index 20f016e5..e890d5b2 100644
--- a/include/d/snd/d_snd_source_anim_sound.h
+++ b/include/d/snd/d_snd_source_anim_sound.h
@@ -9,8 +9,6 @@ public:
dSndSourceAnimSound_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
: dSoundSource_c(sourceType, ac, name, pOwnerGroup), mAnimSound(this) {}
- virtual ~dSndSourceAnimSound_c() {}
-
/* 0x1A8 */ virtual StartResult
SetupSound(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg) override {
return setupSoundCommon(pHandle, soundId, pStartInfo, arg);
diff --git a/include/d/snd/d_snd_source_e_spark.h b/include/d/snd/d_snd_source_e_spark.h
index f2f5255e..9012e949 100644
--- a/include/d/snd/d_snd_source_e_spark.h
+++ b/include/d/snd/d_snd_source_e_spark.h
@@ -8,8 +8,6 @@ public:
dSndSourceESpark_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
: dSoundSource_c(sourceType, ac, name, pOwnerGroup) {}
- virtual ~dSndSourceESpark_c() {}
-
// okay
virtual bool hasAnimSound() override {
return true;
diff --git a/include/d/snd/d_snd_source_enemy.h b/include/d/snd/d_snd_source_enemy.h
index 2fdf63d2..299ac98f 100644
--- a/include/d/snd/d_snd_source_enemy.h
+++ b/include/d/snd/d_snd_source_enemy.h
@@ -1,8 +1,10 @@
#ifndef D_SND_SOURCE_ENEMY_H
#define D_SND_SOURCE_ENEMY_H
+#include "common.h"
#include "d/snd/d_snd_anim_sound.h"
#include "d/snd/d_snd_source.h"
+#include "d/snd/d_snd_util.h"
#include "nw4r/ut/ut_list.h"
class dSndSourceEnemy_c : public dSoundSource_c {
@@ -74,8 +76,94 @@ public:
mAnimSound.setRate(frame);
}
-private:
+protected:
/* 0x16C */ dSndAnimSound_c mAnimSound;
};
+class dSndSourceEnemyAnim_c : public dSndSourceEnemyAnimBase_c {
+public:
+ dSndSourceEnemyAnim_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceEnemyAnimBase_c(sourceType, ac, name, pOwnerGroup) {}
+
+ /* 0x194 */ virtual u32 overrideStartSoundId(u32 soundId) override;
+ /* 0x1A0 */ virtual u32 overrideHoldSoundId(u32 soundId, bool initial) override;
+
+private:
+};
+
+class dSndSourceEnemyMultiBase_c : public dSndSourceEnemyAnimBase_c {
+public:
+ dSndSourceEnemyMultiBase_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceEnemyAnimBase_c(sourceType, ac, name, pOwnerGroup) {
+ nw4r::ut::List_Init(&mSubSourceList, 0x14C);
+ mAnimSound.setCallback(this);
+ }
+
+ /* 0x1A8 */ virtual StartResult
+ SetupSound(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg) override {
+ bool bHoldFlag = *(bool*)arg;
+ if (!bHoldFlag && (mAnimEventValue & 0xF) > 0) {
+ dSoundSource_c *otherSource;
+ s32 idx = (mAnimEventValue & 0xF) - 1;
+ if (idx < 0) {
+ otherSource = nullptr;
+ } else if (idx >= nw4r::ut::List_GetSize(&mSubSourceList)) {
+ otherSource = nullptr;
+ } else {
+ otherSource = getSubSourceFirst();
+ while (idx > 0) {
+ otherSource = getSubSourceNext(otherSource);
+ idx--;
+ }
+ }
+ if (otherSource != nullptr) {
+ otherSource->startSound(soundId, pHandle);
+ return onSetupError();
+ }
+ }
+
+ return setupSoundCommon(pHandle, soundId, pStartInfo, arg);
+ }
+
+ /* 0x1D8 */ virtual void registerAdditionalSource(dSoundSource_c *other) override {
+ if (other == this) {
+ return;
+ }
+
+ if (other == nullptr) {
+ return;
+ }
+ if (!hasSubSource(other)) {
+ appendSubSource(other);
+ }
+ }
+ /* 0x1DC */ virtual bool isMultiSource() const override {
+ return true;
+ }
+
+private:
+ // TODO: maybe created by the macro below
+ bool hasSubSource(dSoundSource_c *other) {
+ for (dSoundSource_c *it = getSubSourceFirst(); it != nullptr; it = getSubSourceNext(it)) {
+ if (it == other) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /* 0x210 */ LIST_MEMBER(dSoundSource_c, SubSource); // -> dSoundSource_c::mSubSourceLink
+};
+
+class dSndSourceEnemyMulti_c : public dSndSourceEnemyMultiBase_c {
+public:
+ dSndSourceEnemyMulti_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceEnemyMultiBase_c(sourceType, ac, name, pOwnerGroup) {}
+
+ /* 0x18C */ virtual void postCalc() override;
+
+private:
+
+};
+
#endif
diff --git a/include/d/snd/d_snd_source_enums.h b/include/d/snd/d_snd_source_enums.h
index 7cb7ad7a..d503f3af 100644
--- a/include/d/snd/d_snd_source_enums.h
+++ b/include/d/snd/d_snd_source_enums.h
@@ -19,10 +19,12 @@ enum SoundSourceType_e {
// 10-31: Enemy? (2)
SND_SOURCE_ENEMY_10 = 10,
+ SND_SOURCE_MAGUPPO = 12,
SND_SOURCE_LIZARUFOS = 13,
SND_SOURCE_BC_Z = 16,
SND_SOURCE_SPARK = 17,
SND_SOURCE_BIGBOSS = 20,
+ SND_SOURCE_BOSS_NUSI = 23,
SND_SOURCE_GIRAHUMU_3 = 24,
SND_SOURCE_ENEMY_28 = 28,
SND_SOURCE_BULLET = 29,
@@ -45,6 +47,7 @@ enum SoundSourceType_e {
SND_SOURCE_NPC_43 = 43,
SND_SOURCE_KENSEI = 44,
SND_SOURCE_PLAYER_BIRD = 45,
+ SND_SOURCE_NPC_NUSI = 46,
SND_SOURCE_NPC_HEAD = 48,
SND_SOURCE_INSECT = 49,
SND_SOURCE_NPC_NRM = 51,
diff --git a/include/d/snd/d_snd_source_harp_related.h b/include/d/snd/d_snd_source_harp_related.h
new file mode 100644
index 00000000..747c694b
--- /dev/null
+++ b/include/d/snd/d_snd_source_harp_related.h
@@ -0,0 +1,33 @@
+#ifndef D_SND_SOURCE_HARP_RELATED_H
+#define D_SND_SOURCE_HARP_RELATED_H
+
+#include "d/snd/d_snd_source.h"
+
+class dSndSourceHarpRelated_c : public dSoundSource_c {
+public:
+ dSndSourceHarpRelated_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup);
+ virtual ~dSndSourceHarpRelated_c();
+
+ /* 0x18C */ virtual void postCalc() override;
+ /* 0x1D0 */ virtual void setPause(bool flag, int fadeFrames) override;
+
+ /* 0x1EC */ virtual UNKWORD d_s_harp_vt_0x1EC() const {
+ return 0;
+ }
+
+ /* 0x1F0 */ virtual void d_s_harp_vt_0x1F0();
+ /* 0x1F4 */ virtual void d_s_harp_vt_0x1F4();
+ /* 0x1F8 */ virtual void d_s_harp_vt_0x1F8();
+
+private:
+};
+
+class dSndSourceHarpTg_c : public dSndSourceHarpRelated_c {
+public:
+ dSndSourceHarpTg_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceHarpRelated_c(sourceType, ac, name, pOwnerGroup) {}
+
+private:
+};
+
+#endif
diff --git a/include/d/snd/d_snd_source_npc.h b/include/d/snd/d_snd_source_npc.h
new file mode 100644
index 00000000..a9323774
--- /dev/null
+++ b/include/d/snd/d_snd_source_npc.h
@@ -0,0 +1,68 @@
+#ifndef D_SND_SOURCE_NPC_H
+#define D_SND_SOURCE_NPC_H
+
+#include "d/snd/d_snd_anim_sound.h"
+#include "d/snd/d_snd_source.h"
+
+// vtable at 8054d540 - placed by implementation of postSetupSound,
+// so this is the base class and also instantiated in createSource
+class dSndSourceNpc_c : public dSoundSource_c {
+public:
+ dSndSourceNpc_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSoundSource_c(sourceType, ac, name, pOwnerGroup) {}
+
+ /* 0x1CC */ virtual void postSetupSound(u32 playingId, u32 requestedId, dSndSeSound_c *seSound) override;
+
+ /* 0x1E8 */ virtual u32 d_s_vt_0x1E8(u32 soundId) override {
+ return specializeBgHitSoundId(soundId, mPolyAttr0, mPolyAttr1);
+ }
+ // at 80032af0, explicitly called by dAcNpc_c
+ /* 0x1EC */ virtual void d_s_npc_vt_0x1EC(dSndSourceNpc_c *source) {}
+
+private:
+};
+
+class dSndSourceNpcAnimBase_c : public dSndSourceNpc_c {
+public:
+ dSndSourceNpcAnimBase_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceNpc_c(sourceType, ac, name, pOwnerGroup), mAnimSound(this) {}
+
+ /* 0x1A8 */ virtual StartResult
+ SetupSound(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg) override {
+ return setupSoundCommon(pHandle, soundId, pStartInfo, arg);
+ }
+
+ /* 0x1D4 */ virtual dSndAnimSound_c *getAnimSound() override {
+ return &mAnimSound;
+ }
+
+ /* 0x100 */ virtual bool hasAnimSound() override {
+ return true;
+ }
+ /* 0x104 */ virtual void load(void *data, const char *name) override {
+ mAnimSound.setData(data, name);
+ }
+ /* 0x108 */ virtual void setFrame(f32 frame) override {
+ if (isInaudibleInternal()) {
+ mAnimSound.resetFrame(frame);
+ } else {
+ mAnimSound.setFrame(frame);
+ }
+ }
+ /* 0x10C */ virtual void setRate(f32 frame) override {
+ mAnimSound.setRate(frame);
+ }
+
+private:
+ /* 0x15C */ dSndAnimSound_c mAnimSound;
+};
+
+class dSndSourceNpcAnim_c : public dSndSourceNpcAnimBase_c {
+public:
+ dSndSourceNpcAnim_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceNpcAnimBase_c(sourceType, ac, name, pOwnerGroup) {}
+
+private:
+};
+
+#endif
diff --git a/include/d/snd/d_snd_source_obj.h b/include/d/snd/d_snd_source_obj.h
index bb0bff7f..0f79d93d 100644
--- a/include/d/snd/d_snd_source_obj.h
+++ b/include/d/snd/d_snd_source_obj.h
@@ -1,6 +1,7 @@
#ifndef D_SND_SOURCE_OBJ_H
#define D_SND_SOURCE_OBJ_H
+#include "d/snd/d_snd_anim_sound.h"
#include "d/snd/d_snd_source.h"
#include "d/snd/d_snd_util.h"
#include "nw4r/math/math_types.h"
@@ -34,4 +35,45 @@ public:
/* 0x1EC */ virtual void setPosition(const nw4r::math::VEC3 &position) override;
};
+class dSndSourceObjAnimBase_c : public dSndSourceObj_c {
+public:
+ dSndSourceObjAnimBase_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceObj_c(sourceType, ac, name, pOwnerGroup), mAnimSound(this) {}
+
+ /* 0x1A8 */ virtual StartResult
+ SetupSound(nw4r::snd::SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *arg) override {
+ return setupSoundCommon(pHandle, soundId, pStartInfo, arg);
+ }
+
+ /* 0x1D4 */ virtual dSndAnimSound_c *getAnimSound() override {
+ return &mAnimSound;
+ }
+
+ /* 0x100 */ virtual bool hasAnimSound() override {
+ return true;
+ }
+ /* 0x104 */ virtual void load(void *data, const char *name) override {
+ mAnimSound.setData(data, name);
+ }
+ /* 0x108 */ virtual void setFrame(f32 frame) override {
+ if (isInaudibleInternal()) {
+ mAnimSound.resetFrame(frame);
+ } else {
+ mAnimSound.setFrame(frame);
+ }
+ }
+ /* 0x10C */ virtual void setRate(f32 frame) override {
+ mAnimSound.setRate(frame);
+ }
+
+protected:
+ /* 0x15C */ dSndAnimSound_c mAnimSound;
+};
+
+class dSndSourceObjAnim_c : public dSndSourceObjAnimBase_c {
+public:
+ dSndSourceObjAnim_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
+ : dSndSourceObjAnimBase_c(sourceType, ac, name, pOwnerGroup) {}
+};
+
#endif
diff --git a/include/d/snd/d_snd_source_py_bird.h b/include/d/snd/d_snd_source_py_bird.h
index 7a3c9405..fb134e50 100644
--- a/include/d/snd/d_snd_source_py_bird.h
+++ b/include/d/snd/d_snd_source_py_bird.h
@@ -8,8 +8,6 @@ public:
dSndSourcePyBird_c(u8 sourceType, dAcBase_c *ac, const char *name, dSndSourceGroup_c *pOwnerGroup)
: dSndSourceAnimSound_c(sourceType, ac, name, pOwnerGroup), mSeqVarValue(0) {}
- virtual ~dSndSourcePyBird_c() {}
-
/* 0x104 */ virtual void load(void *data, const char *name) override;
/* 0x1CC */ virtual void postSetupSound(u32 playingId, u32 requestedId, dSndSeSound_c *seSound) override;