From ab4ba9fc4f73fca3ff865bab9e5b5020bbebbe7f Mon Sep 17 00:00:00 2001
From: Christian Semmler <mail@csemmler.com>
Date: Thu, 30 May 2024 10:27:18 -0400
Subject: [PATCH] Implement/match Lego3DWavePresenter::StartingTickle (#972)

* Implement/match Lego3DWavePresenter::StartingTickle

* Fix annotation

* Add StreamingTickle

* Rename
---
 CMakeLists.txt                                |  2 +-
 .../{legounknown100d5778.h => lego3dsound.h}  | 20 ++++++-------
 .../legoomni/include/lego3dwavepresenter.h    |  6 ++--
 LEGO1/lego/legoomni/include/legocachsound.h   |  4 +--
 ...egounknown100d5778.cpp => lego3dsound.cpp} | 28 ++++++++++---------
 .../src/audio/lego3dwavepresenter.cpp         | 26 ++++++++++++++---
 LEGO1/omni/include/mxaudiopresenter.h         |  2 +-
 7 files changed, 54 insertions(+), 34 deletions(-)
 rename LEGO1/lego/legoomni/include/{legounknown100d5778.h => lego3dsound.h} (59%)
 rename LEGO1/lego/legoomni/src/audio/{legounknown100d5778.cpp => lego3dsound.cpp} (58%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 259ec560..58d2b662 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -306,12 +306,12 @@ add_library(lego1 SHARED
   LEGO1/lego/legoomni/src/actors/radio.cpp
   LEGO1/lego/legoomni/src/actors/skateboard.cpp
   LEGO1/lego/legoomni/src/actors/towtrack.cpp
+  LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
   LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
   LEGO1/lego/legoomni/src/audio/legocachsound.cpp
   LEGO1/lego/legoomni/src/audio/legocachesoundmanager.cpp
   LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
   LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp
-  LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp
   LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp
   LEGO1/lego/legoomni/src/build/buildingentity.cpp
   LEGO1/lego/legoomni/src/build/helicopterstate.cpp
diff --git a/LEGO1/lego/legoomni/include/legounknown100d5778.h b/LEGO1/lego/legoomni/include/lego3dsound.h
similarity index 59%
rename from LEGO1/lego/legoomni/include/legounknown100d5778.h
rename to LEGO1/lego/legoomni/include/lego3dsound.h
index 5ae43070..a6f4bb02 100644
--- a/LEGO1/lego/legoomni/include/legounknown100d5778.h
+++ b/LEGO1/lego/legoomni/include/lego3dsound.h
@@ -1,5 +1,5 @@
-#ifndef LEGOUNKNOWN100D5778_H
-#define LEGOUNKNOWN100D5778_H
+#ifndef LEGO3DSOUND_H
+#define LEGO3DSOUND_H
 
 #include "decomp.h"
 #include "mxtypes.h"
@@ -10,20 +10,20 @@ class LegoROI;
 
 // VTABLE: LEGO1 0x100d5778
 // SIZE 0x30
-class LegoUnknown100d5778 {
+class Lego3DSound {
 public:
-	LegoUnknown100d5778();
-	virtual ~LegoUnknown100d5778();
+	Lego3DSound();
+	virtual ~Lego3DSound();
 
 	void Init();
-	MxResult FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, undefined4 p_unk0x2c);
+	MxResult Create(LPDIRECTSOUNDBUFFER p_directSoundBuffer, const char*, MxS32 p_volume);
 	void Destroy();
-	undefined4 FUN_100118e0(LPDIRECTSOUNDBUFFER p_dsBuffer);
+	undefined4 FUN_100118e0(LPDIRECTSOUNDBUFFER p_directSoundBuffer);
 	void FUN_10011ca0();
 	MxS32 FUN_10011cf0(undefined4, undefined4);
 
 	// SYNTHETIC: LEGO1 0x10011650
-	// LegoUnknown100d5778::`scalar deleting destructor'
+	// Lego3DSound::`scalar deleting destructor'
 
 private:
 	undefined m_unk0x04[4];         // 0x04
@@ -34,7 +34,7 @@ private:
 	MxBool m_unk0x15;               // 0x15
 	undefined4 m_unk0x18;           // 0x18
 	undefined m_unk0x1c[0x10];      // 0x1c
-	undefined4 m_unk0x2c;           // 0x2c
+	MxS32 m_volume;                 // 0x2c
 };
 
-#endif // LEGOUNKNOWN100D5778_H
+#endif // LEGO3DSOUND_H
diff --git a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h
index 79be1834..775f6a09 100644
--- a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h
+++ b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h
@@ -2,7 +2,7 @@
 #define LEGO3DWAVEPRESENTER_H
 
 #include "decomp.h"
-#include "legounknown100d5778.h"
+#include "lego3dsound.h"
 #include "mxwavepresenter.h"
 
 // VTABLE: LEGO1 0x100d52b0
@@ -31,8 +31,8 @@ public:
 	// Lego3DWavePresenter::`scalar deleting destructor'
 
 private:
-	undefined m_unk0x6c[4];        // 0x6c
-	LegoUnknown100d5778 m_unk0x70; // 0x70
+	undefined m_unk0x6c[4]; // 0x6c
+	Lego3DSound m_sound;    // 0x70
 };
 
 #endif // LEGO3DWAVEPRESENTER_H
diff --git a/LEGO1/lego/legoomni/include/legocachsound.h b/LEGO1/lego/legoomni/include/legocachsound.h
index 178430ff..f424a465 100644
--- a/LEGO1/lego/legoomni/include/legocachsound.h
+++ b/LEGO1/lego/legoomni/include/legocachsound.h
@@ -2,7 +2,7 @@
 #define LEGOCACHSOUND_H
 
 #include "decomp.h"
-#include "legounknown100d5778.h"
+#include "lego3dsound.h"
 #include "mxcore.h"
 #include "mxstring.h"
 
@@ -47,7 +47,7 @@ private:
 
 	LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x08
 	undefined m_unk0xc[4];          // 0x0c
-	LegoUnknown100d5778 m_unk0x10;  // 0x10
+	Lego3DSound m_unk0x10;          // 0x10
 	undefined* m_unk0x40;           // 0x40
 	undefined4 m_unk0x44;           // 0x44
 	MxString m_string0x48;          // 0x48
diff --git a/LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp b/LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
similarity index 58%
rename from LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp
rename to LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
index 3ff57585..23b7a8c5 100644
--- a/LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp
+++ b/LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
@@ -1,25 +1,25 @@
-#include "legounknown100d5778.h"
+#include "lego3dsound.h"
 
 #include "legocharactermanager.h"
 #include "misc.h"
 #include "mxomni.h"
 
-DECOMP_SIZE_ASSERT(LegoUnknown100d5778, 0x30)
+DECOMP_SIZE_ASSERT(Lego3DSound, 0x30)
 
 // FUNCTION: LEGO1 0x10011630
-LegoUnknown100d5778::LegoUnknown100d5778()
+Lego3DSound::Lego3DSound()
 {
 	Init();
 }
 
 // FUNCTION: LEGO1 0x10011670
-LegoUnknown100d5778::~LegoUnknown100d5778()
+Lego3DSound::~Lego3DSound()
 {
 	Destroy();
 }
 
 // FUNCTION: LEGO1 0x10011680
-void LegoUnknown100d5778::Init()
+void Lego3DSound::Init()
 {
 	m_dsBuffer = NULL;
 	m_unk0x0c = NULL;
@@ -27,16 +27,17 @@ void LegoUnknown100d5778::Init()
 	m_unk0x18 = 0;
 	m_unk0x14 = FALSE;
 	m_unk0x15 = FALSE;
-	m_unk0x2c = 79;
+	m_volume = 79;
 }
 
 // STUB: LEGO1 0x100116a0
-MxResult LegoUnknown100d5778::FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, undefined4 p_unk0x2c)
+// FUNCTION: BETA10 0x10039647
+MxResult Lego3DSound::Create(LPDIRECTSOUNDBUFFER p_directSoundBuffer, const char*, MxS32 p_volume)
 {
-	m_unk0x2c = p_unk0x2c;
+	m_volume = p_volume;
 
 	if (MxOmni::IsSound3D()) {
-		p_dsound->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*) &m_dsBuffer);
+		p_directSoundBuffer->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*) &m_dsBuffer);
 		if (m_dsBuffer == NULL) {
 			return FAILURE;
 		}
@@ -50,7 +51,7 @@ MxResult LegoUnknown100d5778::FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, u
 }
 
 // FUNCTION: LEGO1 0x10011880
-void LegoUnknown100d5778::Destroy()
+void Lego3DSound::Destroy()
 {
 	if (m_dsBuffer) {
 		m_dsBuffer->Release();
@@ -70,20 +71,21 @@ void LegoUnknown100d5778::Destroy()
 }
 
 // STUB: LEGO1 0x100118e0
-undefined4 LegoUnknown100d5778::FUN_100118e0(LPDIRECTSOUNDBUFFER p_dsBuffer)
+// FUNCTION: BETA10 0x10039a2a
+undefined4 Lego3DSound::FUN_100118e0(LPDIRECTSOUNDBUFFER p_directSoundBuffer)
 {
 	// TODO
 	return 0;
 }
 
 // STUB: LEGO1 0x10011ca0
-void LegoUnknown100d5778::FUN_10011ca0()
+void Lego3DSound::FUN_10011ca0()
 {
 	// TODO
 }
 
 // STUB: LEGO1 0x10011cf0
-MxS32 LegoUnknown100d5778::FUN_10011cf0(undefined4, undefined4)
+MxS32 Lego3DSound::FUN_10011cf0(undefined4, undefined4)
 {
 	// TODO
 	return 0;
diff --git a/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
index b60f3ded..10b79146 100644
--- a/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
+++ b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp
@@ -1,5 +1,7 @@
 #include "lego3dwavepresenter.h"
 
+#include "mxcompositepresenter.h"
+#include "mxdsaction.h"
 #include "mxomni.h"
 
 DECOMP_SIZE_ASSERT(Lego3DWavePresenter, 0xa0)
@@ -28,7 +30,8 @@ void Lego3DWavePresenter::Destroy()
 	}
 }
 
-// STUB: LEGO1 0x1004a810
+// FUNCTION: LEGO1 0x1004a810
+// FUNCTION: BETA10 0x1003a3b0
 void Lego3DWavePresenter::StartingTickle()
 {
 	if (MxOmni::IsSound3D()) {
@@ -37,12 +40,27 @@ void Lego3DWavePresenter::StartingTickle()
 
 	MxWavePresenter::StartingTickle();
 
-	// TODO
+	if (m_dsBuffer != NULL) {
+		MxU16 extraLength;
+		char* buff;
+		m_action->GetExtra(extraLength, buff);
+
+		if (!strcmp(buff, "FROM_PARENT") && m_compositePresenter != NULL) {
+			m_compositePresenter->GetAction()->GetExtra(extraLength, buff);
+		}
+
+		if (m_sound.Create(m_dsBuffer, buff, m_volume) != SUCCESS) {
+			m_dsBuffer->Release();
+			m_dsBuffer = NULL;
+			EndAction();
+		}
+	}
 }
 
-// STUB: LEGO1 0x1004a8b0
+// FUNCTION: LEGO1 0x1004a8b0
+// FUNCTION: BETA10 0x1003a4cc
 void Lego3DWavePresenter::StreamingTickle()
 {
 	MxWavePresenter::StreamingTickle();
-	// TODO
+	m_sound.FUN_100118e0(m_dsBuffer);
 }
diff --git a/LEGO1/omni/include/mxaudiopresenter.h b/LEGO1/omni/include/mxaudiopresenter.h
index 873871ec..dd4369ea 100644
--- a/LEGO1/omni/include/mxaudiopresenter.h
+++ b/LEGO1/omni/include/mxaudiopresenter.h
@@ -30,7 +30,7 @@ public:
 	virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60
 
 protected:
-	MxS32 m_volume;
+	MxS32 m_volume; // 0x50
 };
 
 // SYNTHETIC: LEGO1 0x1000d370