diff --git a/configure.py b/configure.py index 646221ea3..28f732dd1 100644 --- a/configure.py +++ b/configure.py @@ -710,7 +710,7 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JAIBasic.cpp"), Object(NonMatching, "JSystem/JAudio/JAIBankWave.cpp"), Object(NonMatching, "JSystem/JAudio/JAIConst.cpp"), - Object(NonMatching, "JSystem/JAudio/JAIDummyObject.cpp"), + Object(Matching, "JSystem/JAudio/JAIDummyObject.cpp"), Object(NonMatching, "JSystem/JAudio/JAIFx.cpp"), Object(Matching, "JSystem/JAudio/JAIGlobalParameter.cpp"), Object(NonMatching, "JSystem/JAudio/JAIInitData.cpp"), diff --git a/include/JSystem/JAudio/JAIDummyObject.h b/include/JSystem/JAudio/JAIDummyObject.h new file mode 100644 index 000000000..f83ce7294 --- /dev/null +++ b/include/JSystem/JAudio/JAIDummyObject.h @@ -0,0 +1,32 @@ +#ifndef JAIDUMMYOBJECT_H +#define JAIDUMMYOBJECT_H + +#include "dolphin/types.h" + +class JAISound; + +namespace JAInter { + struct DummyVec { + DummyVec* field_0x0; + DummyVec* field_0x4; + JAISound* field_0x8; + u32 field_0xc; + int field_0x10; + int field_0x14; + u32 field_0x18; + bool field_0x1c; + }; + + namespace DummyObjectMgr { + void init(); + DummyVec* getPointer(u32 param_1, bool param_2); + void releasePointer(DummyVec* param_1); + void check(); + + extern DummyVec* deadObjectFreePointer; + extern DummyVec* deadObjectUsedPointer; + extern DummyVec* deadObjectObject; + } +} + +#endif /* JAIDUMMYOBJECT_H */ diff --git a/src/JSystem/JAudio/JAIDummyObject.cpp b/src/JSystem/JAudio/JAIDummyObject.cpp index 59088649d..7312e9057 100644 --- a/src/JSystem/JAudio/JAIDummyObject.cpp +++ b/src/JSystem/JAudio/JAIDummyObject.cpp @@ -4,24 +4,93 @@ // #include "JSystem/JAudio/JAIDummyObject.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JAIBasic.h" +#include "JSystem/JAudio/JAIGlobalParameter.h" +#include "JSystem/JAudio/JAISound.h" +#include "JSystem/JKernel/JKRSolidHeap.h" + +JAInter::DummyVec* JAInter::DummyObjectMgr::deadObjectFreePointer; +JAInter::DummyVec* JAInter::DummyObjectMgr::deadObjectUsedPointer; +JAInter::DummyVec* JAInter::DummyObjectMgr::deadObjectObject; /* 802919A0-80291B40 .text init__Q27JAInter14DummyObjectMgrFv */ void JAInter::DummyObjectMgr::init() { - /* Nonmatching */ + deadObjectObject = new (JAIBasic::getCurrentJAIHeap(), 0x20) DummyVec[JAIGlobalParameter::getParamDummyObjectMax()]; + JUT_ASSERT_MSG(37, deadObjectObject, "JAIDummyObjectMgr::init Cannot Alloc Heap!!\n"); + deadObjectFreePointer = deadObjectObject; + deadObjectUsedPointer = NULL; + deadObjectObject[0].field_0x0 = NULL; + deadObjectObject[0].field_0x4 = deadObjectObject + 1; + int i; + for (i = 1; i < JAIGlobalParameter::getParamDummyObjectMax() - 1; i++) { + deadObjectObject[i].field_0x0 = deadObjectObject + (i - 1); + deadObjectObject[i].field_0x4 = deadObjectObject + (i + 1); + } + deadObjectObject[i].field_0x0 = deadObjectObject + (i - 1); + deadObjectObject[i].field_0x4 = NULL; } /* 80291B40-80291BAC .text getPointer__Q27JAInter14DummyObjectMgrFUlb */ -void JAInter::DummyObjectMgr::getPointer(unsigned long, bool) { - /* Nonmatching */ +JAInter::DummyVec* JAInter::DummyObjectMgr::getPointer(u32 param_1, bool param_2) { + DummyVec** r5 = &deadObjectFreePointer; + DummyVec** r6 = &deadObjectUsedPointer; + DummyVec* r7; + if (deadObjectFreePointer) { + r7 = *r5; + *r5 = r7->field_0x4; + if (*r6) { + r7->field_0x4 = *r6; + (*r6)->field_0x0 = r7; + } else { + r7->field_0x4 = NULL; + } + r7->field_0x0 = NULL; + *r6 = r7; + r7->field_0x18 = param_1; + r7->field_0x1c = param_2; + r7->field_0x8 = NULL; + } else { + r7 = NULL; + } + return r7; } /* 80291BAC-80291C20 .text releasePointer__Q27JAInter14DummyObjectMgrFPQ27JAInter8DummyVec */ -void JAInter::DummyObjectMgr::releasePointer(JAInter::DummyVec*) { - /* Nonmatching */ +void JAInter::DummyObjectMgr::releasePointer(DummyVec* param_1) { + DummyVec** r5 = &deadObjectFreePointer; + DummyVec** r4 = &deadObjectUsedPointer; + if (deadObjectUsedPointer != param_1) { + param_1->field_0x0->field_0x4 = param_1->field_0x4; + if (param_1->field_0x4) { + param_1->field_0x4->field_0x0 = param_1->field_0x0; + } + } else { + *r4 = param_1->field_0x4; + if (param_1->field_0x4) { + param_1->field_0x4->field_0x0 = NULL; + } + } + param_1->field_0x4 = *r5; + if (param_1->field_0x4) { + param_1->field_0x4->field_0x0 = param_1; + } + *r5 = param_1; } /* 80291C20-80291CCC .text check__Q27JAInter14DummyObjectMgrFv */ void JAInter::DummyObjectMgr::check() { - /* Nonmatching */ + DummyVec* r31 = deadObjectUsedPointer; + while (r31) { + DummyVec* r30 = r31->field_0x4; + r31->field_0x18--; + if (r31->field_0x18 == 0 || (!r31->field_0x1c && r31->field_0x8 == NULL)) { + if (r31->field_0x1c == true) { + JAIBasic::getInterface()->stopAllSound(&r31->field_0xc); + } else if (r31->field_0x8) { + r31->field_0x8->stop(0); + } + releasePointer(r31); + } + r31 = r30; + } }