Skip to content

Commit eb1dc22

Browse files
authored
Merge pull request #56 from sourcehold/experiment/reimplement-two-sound-functions
[EXPERIMENT/MSS] Attempt func 0x00467810 and 0x004799A0
2 parents c2e2e93 + 189878e commit eb1dc22

4 files changed

Lines changed: 228 additions & 59 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "../SoundSystem.func.hpp"
2+
3+
#include "OpenSHC/OS.func.hpp"
4+
5+
#include "OpenSHC/Globals/DAT_SoundEffectsHelperData1.hpp"
6+
7+
namespace OpenSHC {
8+
namespace Audio {
9+
namespace MSS {
10+
11+
// FUNCTION: STRONGHOLDCRUSADER 0x004799A0
12+
void SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex)
13+
{
14+
if (!this->waveOutOpenUnk_0x8) {
15+
return;
16+
}
17+
18+
if (sndStreamIndex == enums::SND_STR_MUSIC) {
19+
this->streamActiveUnk_0x20[0] = 0;
20+
DAT_SoundEffectsHelperData1::ptr->field14_0x54 = true;
21+
if (this->musicSampleFileHandleUnk_0x174 != -1) {
22+
AIL_end_sample(this->musicSampleUnk_0x170);
23+
MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174);
24+
}
25+
if (this->musicFileHandle_0x178 != -1) {
26+
MACRO_CALL(OS_Func::_ucrt_close)(this->musicFileHandle_0x178);
27+
}
28+
this->musicFileHandle_0x178 = -1;
29+
this->musicSampleFileHandleUnk_0x174 = -1;
30+
this->mbr_0x188 = 1;
31+
DAT_SoundEffectsHelperData1::ptr->field14_0x54 = false;
32+
this->sec_Section1055_0x3274 = 0;
33+
return;
34+
}
35+
36+
if (!this->streamActiveUnk_0x20[sndStreamIndex]) {
37+
return;
38+
}
39+
40+
if (this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex].uninterruptable
41+
&& AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING) {
42+
return;
43+
}
44+
AIL_close_stream(this->stream_0xc[sndStreamIndex]);
45+
this->streamActiveUnk_0x20[sndStreamIndex] = 0;
46+
this->stream_0xc[sndStreamIndex] = 0x0;
47+
}
48+
49+
}
50+
}
51+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include "../SoundSystem.func.hpp"
2+
namespace OpenSHC {
3+
namespace Audio {
4+
namespace MSS {
5+
6+
// FUNCTION: STRONGHOLDCRUSADER 0x00467810
7+
void SoundSystem::stopMusicPlayback()
8+
{
9+
MACRO_CALL_MEMBER(OpenSHC::Audio::MSS::SoundSystem_Func::endSoundStream, this)(enums::SND_STR_MUSIC);
10+
this->mbr_0x154 = 0;
11+
this->sec_Section1055_0x3274 = 0;
12+
}
13+
14+
}
15+
}
16+
}

src/OpenSHC/OS/OS.cpp

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// disable deprecation warnings, since we use the old calls on purpose
2+
#pragma warning(disable : 4996)
3+
4+
#include "../OS.func.hpp"
5+
6+
#include "float.h"
7+
#include "io.h"
8+
9+
// NOTE: Activating them in DLL mode currently results in heap corruption
10+
11+
namespace OpenSHC {
12+
namespace OS {
13+
14+
// STUB: STRONGHOLDCRUSADER 0x0047C5D0
15+
BOOLEnum isEqualGUID(GUID* param_1, GUID* param_2)
16+
{
17+
return static_cast<BOOLEnum>(IsEqualGUID(*param_1, *param_2));
18+
}
19+
20+
// Very likely just default function call, using time64_t and localtime64 behind
21+
// STUB: STRONGHOLDCRUSADER 0x0057F5FE
22+
tm* _localtime(time_t* _Time) { return localtime(_Time); }
23+
24+
// STUB: STRONGHOLDCRUSADER 0x0057F622
25+
__time64_t __time64(__time64_t* _Time) { return _time64(_Time); }
26+
27+
// STUB: STRONGHOLDCRUSADER 0x0057F660
28+
void* _memset(void* _Dst, int _Val, size_t _Size) { return memset(_Dst, _Val, _Size); }
29+
30+
// STUB: STRONGHOLDCRUSADER 0x0057F6DA
31+
int _sprintf(char* _Dest, char* _Format, ...)
32+
{
33+
// needed for proxy
34+
va_list args;
35+
va_start(args, _Format);
36+
int result = vsprintf(_Dest, _Format, args);
37+
va_end(args);
38+
return result;
39+
}
40+
41+
// STUB: STRONGHOLDCRUSADER 0x0057F8EE
42+
int __stricmp(char* _Str1, char* _Str2) { return _stricmp(_Str1, _Str2); }
43+
44+
// STUB: STRONGHOLDCRUSADER 0x0057FA62
45+
int _atexit(void* param_1) { return atexit(reinterpret_cast<void(__cdecl*)()>(param_1)); }
46+
47+
// This seems to be the games main free function
48+
// STUB: STRONGHOLDCRUSADER 0x0057FA74
49+
void __cdecl _free_base(void* _Memory) { free(_Memory); }
50+
51+
// STUB: STRONGHOLDCRUSADER 0x0057FC19
52+
int __cdecl __tolower(int _C) { return tolower(_C); };
53+
54+
// STUB: STRONGHOLDCRUSADER 0x0057FCB2
55+
int _fclose(FILE* _File) { return fclose(_File); }
56+
57+
// STUB: STRONGHOLDCRUSADER 0x0057FFCA
58+
void _fread(void* dstBuffer, size_t elSize, size_t count, FILE* file) { fread(dstBuffer, elSize, count, file); }
59+
60+
// STUB: STRONGHOLDCRUSADER 0x00580034
61+
void* _malloc(size_t _Size) { return malloc(_Size); }
62+
63+
// STUB: STRONGHOLDCRUSADER 0x0058028F
64+
long _ftell(FILE* _File) { return ftell(_File); }
65+
66+
// STUB: STRONGHOLDCRUSADER 0x00580384
67+
int __cdecl _fseek(FILE* _File, long _Offset, DWORD _Origin) { return fseek(_File, _Offset, _Origin); }
68+
69+
// STUB: STRONGHOLDCRUSADER 0x005804CD
70+
FILE* _fopen(char* _Filename, char* _Mode) { return fopen(_Filename, _Mode); }
71+
72+
// STUB: STRONGHOLDCRUSADER 0x00580577
73+
int __vswprintf(wchar_t* _Dest, wchar_t* _Format, va_list _Args) { return _vswprintf(_Dest, _Format, _Args); }
74+
75+
// STUB: STRONGHOLDCRUSADER 0x00580735
76+
wint_t _fgetwc(FILE* _File) { return fgetwc(_File); }
77+
78+
// STUB: STRONGHOLDCRUSADER 0x0058099B
79+
size_t _fwrite(void* _Str, size_t _Size, size_t _Count, FILE* _File) { return fwrite(_Str, _Size, _Count, _File); }
80+
81+
// STUB: STRONGHOLDCRUSADER 0x00580A1D
82+
wchar_t* _wcsncpy(wchar_t* _Dest, wchar_t* _Source, size_t _Count) { return wcsncpy(_Dest, _Source, _Count); }
83+
84+
// STUB: STRONGHOLDCRUSADER 0x00580B69
85+
int __wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); }
86+
87+
// Only jumps to _free in game version
88+
// STUB: STRONGHOLDCRUSADER 0x00580DC1
89+
void __cdecl _free(void* _Memory) { free(_Memory); }
90+
91+
// STUB: STRONGHOLDCRUSADER 0x00580DC6
92+
errno_t _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount)
93+
{
94+
return memcpy_s(_Dst, _DstSize, _Src, _MaxCount);
95+
}
96+
97+
// Only jumps to _free
98+
// STUB: STRONGHOLDCRUSADER 0x00580E9C
99+
void __cdecl _free_cpp(void* _Memory) { free(_Memory); }
100+
101+
// STUB: STRONGHOLDCRUSADER 0x00580F38
102+
int _ucrt_close(int fileDescriptor) { return _close(fileDescriptor); }
103+
104+
// STUB: STRONGHOLDCRUSADER 0x005815C6
105+
int _ucrt_read(int fileDescriptor, void* destination, size_t size)
106+
{
107+
return _read(fileDescriptor, destination, size);
108+
}
109+
110+
// STUB: STRONGHOLDCRUSADER 0x005816C3
111+
int _ucrt_open(char* _Filename, OpenFlagInt _OpenFlag, int _PMode) { return _open(_Filename, _OpenFlag, _PMode); }
112+
113+
// STUB: STRONGHOLDCRUSADER 0x005816FB
114+
int _rand() { return rand(); }
115+
116+
// STUB: STRONGHOLDCRUSADER 0x005818EB
117+
char* __strlwr(char* string) { return _strlwr(string); }
118+
119+
// STUB: STRONGHOLDCRUSADER 0x00581F6F
120+
undefined4 _ucrt_write(int fileDescriptor, void* src, uint size) { return _write(fileDescriptor, src, size); }
121+
122+
// STUB: STRONGHOLDCRUSADER 0x00582050
123+
void* _memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); }
124+
125+
// STUB: STRONGHOLDCRUSADER 0x005824CD
126+
int __cdecl __toupper(int _C) { return toupper(_C); }
127+
128+
// STUB: STRONGHOLDCRUSADER 0x0058277E
129+
int _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod)
130+
{
131+
return _lseek(fileDescriptor, lDistanceToMove, moveMethod);
132+
}
133+
134+
// STUB: STRONGHOLDCRUSADER 0x005835BB
135+
int __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount) { return _strnicmp(_Str1, _Str2, _MaxCount); }
136+
137+
// STUB: STRONGHOLDCRUSADER 0x00583D55
138+
void _exit(int _Code) { exit(_Code); }
139+
140+
}
141+
}

status/addresses-SHC-3BB0A8C1.txt

Lines changed: 20 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9831,7 +9831,7 @@ SHC_3BB0A8C1_0x00467780 | 0.0% | Pending
98319831
SHC_3BB0A8C1_0x00467790 | 0.0% | Pending
98329832
SHC_3BB0A8C1_0x004677A0 | 0.0% | Pending
98339833
SHC_3BB0A8C1_0x004677E0 | 0.0% | Pending
9834-
SHC_3BB0A8C1_0x00467810 | 0.0% | Pending
9834+
SHC_3BB0A8C1_0x00467810 | 100.0% | Reimplemented
98359835
SHC_3BB0A8C1_0x00467830 | 100.0% | Reimplemented
98369836
SHC_3BB0A8C1_0x00467850 | 0.0% | Pending
98379837
SHC_3BB0A8C1_0x00467890 | 0.0% | Pending
@@ -10880,7 +10880,7 @@ SHC_3BB0A8C1_0x00479369 | 0.0% | Pending
1088010880
SHC_3BB0A8C1_0x00479400 | 0.0% | Pending
1088110881
SHC_3BB0A8C1_0x00479540 | 0.0% | Pending
1088210882
SHC_3BB0A8C1_0x00479790 | 0.0% | Pending
10883-
SHC_3BB0A8C1_0x004799A0 | 0.0% | Pending
10883+
SHC_3BB0A8C1_0x004799A0 | 100.0% | Reimplemented
1088410884
SHC_3BB0A8C1_0x00479A60 | 100.0% | Reimplemented
1088510885
SHC_3BB0A8C1_0x00479AB0 | 100.0% | Reimplemented
1088610886
SHC_3BB0A8C1_0x00479AF0 | 100.0% | Reimplemented
@@ -34649,9 +34649,19 @@ SHC_3BB0A8C1_0x0059E80C | 0.0% | Pending
3464934649
SHC_3BB0A8C1_0x0059E818 | 0.0% | Pending
3465034650
SHC_3BB0A8C1_0x0059E81C | 0.0% | Pending
3465134651
SHC_3BB0A8C1_0x0059E830 | 0.0% | Pending
34652+
SHC_3BB0A8C1_0x0059E840 | 0.0% | Pending
34653+
SHC_3BB0A8C1_0x0059E848 | 0.0% | Pending
34654+
SHC_3BB0A8C1_0x0059E850 | 0.0% | Pending
34655+
SHC_3BB0A8C1_0x0059E858 | 0.0% | Pending
34656+
SHC_3BB0A8C1_0x0059E860 | 0.0% | Pending
3465234657
SHC_3BB0A8C1_0x0059E868 | 0.0% | Pending
34658+
SHC_3BB0A8C1_0x0059E870 | 0.0% | Pending
34659+
SHC_3BB0A8C1_0x0059E878 | 0.0% | Pending
34660+
SHC_3BB0A8C1_0x0059E880 | 0.0% | Pending
34661+
SHC_3BB0A8C1_0x0059E888 | 0.0% | Pending
34662+
SHC_3BB0A8C1_0x0059E890 | 0.0% | Pending
3465334663
SHC_3BB0A8C1_0x0059E898 | 0.0% | Pending
34654-
SHC_3BB0A8C1_0x0059E89F | 0.0% | Pending
34664+
SHC_3BB0A8C1_0x0059E8A0 | 0.0% | Pending
3465534665
SHC_3BB0A8C1_0x0059E8B8 | 0.0% | Pending
3465634666
SHC_3BB0A8C1_0x0059E8D0 | 0.0% | Pending
3465734667
SHC_3BB0A8C1_0x0059E8E4 | 0.0% | Pending
@@ -37892,6 +37902,7 @@ SHC_3BB0A8C1_0x005ACE38 | 0.0% | Pending
3789237902
SHC_3BB0A8C1_0x005ACE40 | 0.0% | Pending
3789337903
SHC_3BB0A8C1_0x005ACE48 | 0.0% | Pending
3789437904
SHC_3BB0A8C1_0x005ACE50 | 0.0% | Pending
37905+
SHC_3BB0A8C1_0x005ACE5A | 0.0% | Pending
3789537906
SHC_3BB0A8C1_0x005AE4A0 | 0.0% | Pending
3789637907
SHC_3BB0A8C1_0x005AE4A8 | 0.0% | Pending
3789737908
SHC_3BB0A8C1_0x005AE4B0 | 0.0% | Pending
@@ -39969,76 +39980,23 @@ SHC_3BB0A8C1_0x005B3F68 | 0.0% | Pending
3996939980
SHC_3BB0A8C1_0x005B3F88 | 0.0% | Pending
3997039981
SHC_3BB0A8C1_0x005B3FA8 | 0.0% | Pending
3997139982
SHC_3BB0A8C1_0x005B3FC8 | 0.0% | Pending
39983+
SHC_3BB0A8C1_0x005B41AC | 0.0% | Pending
39984+
SHC_3BB0A8C1_0x005B41B0 | 0.0% | Pending
39985+
SHC_3BB0A8C1_0x005B41D0 | 0.0% | Pending
3997239986
SHC_3BB0A8C1_0x005B41D4 | 0.0% | Pending
39973-
SHC_3BB0A8C1_0x005B41D8 | 0.0% | Pending
39974-
SHC_3BB0A8C1_0x005B41DC | 0.0% | Pending
39975-
SHC_3BB0A8C1_0x005B41E0 | 0.0% | Pending
39976-
SHC_3BB0A8C1_0x005B41E4 | 0.0% | Pending
3997739987
SHC_3BB0A8C1_0x005B41E8 | 0.0% | Pending
39978-
SHC_3BB0A8C1_0x005B41EC | 0.0% | Pending
39979-
SHC_3BB0A8C1_0x005B41F0 | 0.0% | Pending
39980-
SHC_3BB0A8C1_0x005B41F4 | 0.0% | Pending
39981-
SHC_3BB0A8C1_0x005B41F8 | 0.0% | Pending
3998239988
SHC_3BB0A8C1_0x005B41FC | 0.0% | Pending
39983-
SHC_3BB0A8C1_0x005B4200 | 0.0% | Pending
39984-
SHC_3BB0A8C1_0x005B4204 | 0.0% | Pending
39985-
SHC_3BB0A8C1_0x005B4208 | 0.0% | Pending
39986-
SHC_3BB0A8C1_0x005B420C | 0.0% | Pending
3998739989
SHC_3BB0A8C1_0x005B4210 | 0.0% | Pending
39988-
SHC_3BB0A8C1_0x005B4214 | 0.0% | Pending
39989-
SHC_3BB0A8C1_0x005B4218 | 0.0% | Pending
39990-
SHC_3BB0A8C1_0x005B421C | 0.0% | Pending
39991-
SHC_3BB0A8C1_0x005B4220 | 0.0% | Pending
3999239990
SHC_3BB0A8C1_0x005B4224 | 0.0% | Pending
39993-
SHC_3BB0A8C1_0x005B4228 | 0.0% | Pending
39994-
SHC_3BB0A8C1_0x005B422C | 0.0% | Pending
39995-
SHC_3BB0A8C1_0x005B4230 | 0.0% | Pending
39996-
SHC_3BB0A8C1_0x005B4234 | 0.0% | Pending
3999739991
SHC_3BB0A8C1_0x005B4238 | 0.0% | Pending
39998-
SHC_3BB0A8C1_0x005B423C | 0.0% | Pending
39999-
SHC_3BB0A8C1_0x005B4240 | 0.0% | Pending
40000-
SHC_3BB0A8C1_0x005B4244 | 0.0% | Pending
40001-
SHC_3BB0A8C1_0x005B4248 | 0.0% | Pending
4000239992
SHC_3BB0A8C1_0x005B424C | 0.0% | Pending
40003-
SHC_3BB0A8C1_0x005B4250 | 0.0% | Pending
40004-
SHC_3BB0A8C1_0x005B4254 | 0.0% | Pending
40005-
SHC_3BB0A8C1_0x005B4258 | 0.0% | Pending
40006-
SHC_3BB0A8C1_0x005B425C | 0.0% | Pending
4000739993
SHC_3BB0A8C1_0x005B4260 | 0.0% | Pending
40008-
SHC_3BB0A8C1_0x005B4264 | 0.0% | Pending
40009-
SHC_3BB0A8C1_0x005B4268 | 0.0% | Pending
40010-
SHC_3BB0A8C1_0x005B426C | 0.0% | Pending
40011-
SHC_3BB0A8C1_0x005B4270 | 0.0% | Pending
4001239994
SHC_3BB0A8C1_0x005B4274 | 0.0% | Pending
40013-
SHC_3BB0A8C1_0x005B4278 | 0.0% | Pending
40014-
SHC_3BB0A8C1_0x005B427C | 0.0% | Pending
40015-
SHC_3BB0A8C1_0x005B4280 | 0.0% | Pending
40016-
SHC_3BB0A8C1_0x005B4284 | 0.0% | Pending
4001739995
SHC_3BB0A8C1_0x005B4288 | 0.0% | Pending
40018-
SHC_3BB0A8C1_0x005B428C | 0.0% | Pending
40019-
SHC_3BB0A8C1_0x005B4290 | 0.0% | Pending
40020-
SHC_3BB0A8C1_0x005B4294 | 0.0% | Pending
40021-
SHC_3BB0A8C1_0x005B4298 | 0.0% | Pending
4002239996
SHC_3BB0A8C1_0x005B429C | 0.0% | Pending
40023-
SHC_3BB0A8C1_0x005B42A0 | 0.0% | Pending
40024-
SHC_3BB0A8C1_0x005B42A4 | 0.0% | Pending
40025-
SHC_3BB0A8C1_0x005B42A8 | 0.0% | Pending
40026-
SHC_3BB0A8C1_0x005B42AC | 0.0% | Pending
4002739997
SHC_3BB0A8C1_0x005B42B0 | 0.0% | Pending
40028-
SHC_3BB0A8C1_0x005B42B4 | 0.0% | Pending
40029-
SHC_3BB0A8C1_0x005B42B8 | 0.0% | Pending
40030-
SHC_3BB0A8C1_0x005B42BC | 0.0% | Pending
40031-
SHC_3BB0A8C1_0x005B42C0 | 0.0% | Pending
4003239998
SHC_3BB0A8C1_0x005B42C4 | 0.0% | Pending
40033-
SHC_3BB0A8C1_0x005B42C8 | 0.0% | Pending
40034-
SHC_3BB0A8C1_0x005B42CC | 0.0% | Pending
40035-
SHC_3BB0A8C1_0x005B42D0 | 0.0% | Pending
40036-
SHC_3BB0A8C1_0x005B42D4 | 0.0% | Pending
4003739999
SHC_3BB0A8C1_0x005B42D8 | 0.0% | Pending
40038-
SHC_3BB0A8C1_0x005B42DC | 0.0% | Pending
40039-
SHC_3BB0A8C1_0x005B42E0 | 0.0% | Pending
40040-
SHC_3BB0A8C1_0x005B42E4 | 0.0% | Pending
40041-
SHC_3BB0A8C1_0x005B42E8 | 0.0% | Pending
4004240000
SHC_3BB0A8C1_0x005B4300 | 0.0% | Pending
4004340001
SHC_3BB0A8C1_0x005B4304 | 0.0% | Pending
4004440002
SHC_3BB0A8C1_0x005B4308 | 0.0% | Pending
@@ -41921,6 +41879,9 @@ SHC_3BB0A8C1_0x00ED311C | 0.0% | Pending
4192141879
SHC_3BB0A8C1_0x00ED3120 | 0.0% | Pending
4192241880
SHC_3BB0A8C1_0x00ED3124 | 0.0% | Pending
4192341881
SHC_3BB0A8C1_0x00ED3128 | 0.0% | Pending
41882+
SHC_3BB0A8C1_0x00ED312C | 0.0% | Pending
41883+
SHC_3BB0A8C1_0x00ED3138 | 0.0% | Pending
41884+
SHC_3BB0A8C1_0x00ED313C | 0.0% | Pending
4192441885
SHC_3BB0A8C1_0x00ED3144 | 0.0% | Pending
4192541886
SHC_3BB0A8C1_0x00ED3148 | 0.0% | Pending
4192641887
SHC_3BB0A8C1_0x00ED314C | 0.0% | Pending

0 commit comments

Comments
 (0)