diff --git a/asm/Kyoto/CDependencyGroup.s b/asm/Kyoto/CDependencyGroup.s index 310c1d38..e76c9aea 100644 --- a/asm/Kyoto/CDependencyGroup.s +++ b/asm/Kyoto/CDependencyGroup.s @@ -3,12 +3,12 @@ .section .data .balign 8 -.global lbl_803EF830 -lbl_803EF830: +.global "__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>" +"__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>": # ROM: 0x3EC830 .4byte 0 .4byte 0 - .4byte sub_8036505c + .4byte "__dt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>Fv" .4byte 0 .section .text, "ax" @@ -34,7 +34,7 @@ FDependencyGroupFactory__FRC10SObjectTagR12CInputStreamRC15CVParamTransfer: /* 80364F94 00361EF4 7C 64 1B 78 */ mr r4, r3 lbl_80364F98: /* 80364F98 00361EF8 7F C3 F3 78 */ mr r3, r30 -/* 80364F9C 00361EFC 48 00 00 1D */ bl sub_80364fb8 +/* 80364F9C 00361EFC 48 00 00 1D */ bl "__ct<16CDependencyGroup>__16CFactoryFnReturnFP16CDependencyGroup" /* 80364FA0 00361F00 80 01 00 14 */ lwz r0, 0x14(r1) /* 80364FA4 00361F04 83 E1 00 0C */ lwz r31, 0xc(r1) /* 80364FA8 00361F08 83 C1 00 08 */ lwz r30, 8(r1) @@ -42,8 +42,8 @@ lbl_80364F98: /* 80364FB0 00361F10 38 21 00 10 */ addi r1, r1, 0x10 /* 80364FB4 00361F14 4E 80 00 20 */ blr -.global sub_80364fb8 -sub_80364fb8: +.global "__ct<16CDependencyGroup>__16CFactoryFnReturnFP16CDependencyGroup" +"__ct<16CDependencyGroup>__16CFactoryFnReturnFP16CDependencyGroup": /* 80364FB8 00361F18 94 21 FF E0 */ stwu r1, -0x20(r1) /* 80364FBC 00361F1C 7C 08 02 A6 */ mflr r0 /* 80364FC0 00361F20 90 01 00 24 */ stw r0, 0x24(r1) @@ -56,7 +56,7 @@ sub_80364fb8: /* 80364FDC 00361F3C 90 81 00 14 */ stw r4, 0x14(r1) /* 80364FE0 00361F40 38 81 00 10 */ addi r4, r1, 0x10 /* 80364FE4 00361F44 98 01 00 10 */ stb r0, 0x10(r1) -/* 80364FE8 00361F48 48 00 01 55 */ bl sub_8036513c +/* 80364FE8 00361F48 48 00 01 55 */ bl "GetIObjObjectFor__26TToken<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>" /* 80364FEC 00361F4C 80 61 00 0C */ lwz r3, 0xc(r1) /* 80364FF0 00361F50 38 00 00 00 */ li r0, 0 /* 80364FF4 00361F54 98 01 00 08 */ stb r0, 8(r1) @@ -79,7 +79,7 @@ sub_80364fb8: lbl_80365038: /* 80365038 00361F98 38 61 00 10 */ addi r3, r1, 0x10 /* 8036503C 00361F9C 38 80 FF FF */ li r4, -1 -/* 80365040 00361FA0 48 00 01 C5 */ bl sub_80365204 +/* 80365040 00361FA0 48 00 01 C5 */ bl "__dt__Q24rstl28auto_ptr<16CDependencyGroup>Fv" /* 80365044 00361FA4 80 01 00 24 */ lwz r0, 0x24(r1) /* 80365048 00361FA8 7F E3 FB 78 */ mr r3, r31 /* 8036504C 00361FAC 83 E1 00 1C */ lwz r31, 0x1c(r1) @@ -87,8 +87,8 @@ lbl_80365038: /* 80365054 00361FB4 38 21 00 20 */ addi r1, r1, 0x20 /* 80365058 00361FB8 4E 80 00 20 */ blr -.global sub_8036505c -sub_8036505c: +.global "__dt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>Fv" +"__dt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>Fv": /* 8036505C 00361FBC 94 21 FF D0 */ stwu r1, -0x30(r1) /* 80365060 00361FC0 7C 08 02 A6 */ mflr r0 /* 80365064 00361FC4 90 01 00 34 */ stw r0, 0x34(r1) @@ -98,8 +98,8 @@ sub_8036505c: /* 80365074 00361FD4 93 A1 00 24 */ stw r29, 0x24(r1) /* 80365078 00361FD8 7C 7D 1B 79 */ or. r29, r3, r3 /* 8036507C 00361FDC 41 82 00 A0 */ beq lbl_8036511C -/* 80365080 00361FE0 3C 60 80 3F */ lis r3, lbl_803EF830@ha -/* 80365084 00361FE4 38 03 F8 30 */ addi r0, r3, lbl_803EF830@l +/* 80365080 00361FE0 3C 60 80 3F */ lis r3, "__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>"@ha +/* 80365084 00361FE4 38 03 F8 30 */ addi r0, r3, "__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>"@l /* 80365088 00361FE8 90 1D 00 00 */ stw r0, 0(r29) /* 8036508C 00361FEC 83 FD 00 04 */ lwz r31, 4(r29) /* 80365090 00361FF0 28 1F 00 00 */ cmplwi r31, 0 @@ -152,22 +152,22 @@ lbl_8036511C: /* 80365134 00362094 38 21 00 30 */ addi r1, r1, 0x30 /* 80365138 00362098 4E 80 00 20 */ blr -.global sub_8036513c -sub_8036513c: +.global "GetIObjObjectFor__26TToken<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>" +"GetIObjObjectFor__26TToken<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>": /* 8036513C 0036209C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80365140 003620A0 7C 08 02 A6 */ mflr r0 /* 80365144 003620A4 90 01 00 14 */ stw r0, 0x14(r1) /* 80365148 003620A8 93 E1 00 0C */ stw r31, 0xc(r1) /* 8036514C 003620AC 7C 7F 1B 78 */ mr r31, r3 -/* 80365150 003620B0 48 00 00 19 */ bl sub_80365168 +/* 80365150 003620B0 48 00 00 19 */ bl "GetNewDerivedObject__44TObjOwnerDerivedFromIObj<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>" /* 80365154 003620B4 80 01 00 14 */ lwz r0, 0x14(r1) /* 80365158 003620B8 83 E1 00 0C */ lwz r31, 0xc(r1) /* 8036515C 003620BC 7C 08 03 A6 */ mtlr r0 /* 80365160 003620C0 38 21 00 10 */ addi r1, r1, 0x10 /* 80365164 003620C4 4E 80 00 20 */ blr -.global sub_80365168 -sub_80365168: +.global "GetNewDerivedObject__44TObjOwnerDerivedFromIObj<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>" +"GetNewDerivedObject__44TObjOwnerDerivedFromIObj<16CDependencyGroup>FRCQ24rstl28auto_ptr<16CDependencyGroup>": /* 80365168 003620C8 94 21 FF F0 */ stwu r1, -0x10(r1) /* 8036516C 003620CC 7C 08 02 A6 */ mflr r0 /* 80365170 003620D0 3C A0 80 3E */ lis r5, lbl_803D8408@ha @@ -186,11 +186,11 @@ sub_80365168: /* 803651A4 00362104 3C 80 80 3E */ lis r4, __vt__4IObj@ha /* 803651A8 00362108 3C A0 80 3E */ lis r5, __vt__31CObjOwnerDerivedFromIObjUntyped@ha /* 803651AC 0036210C 38 04 8D 6C */ addi r0, r4, __vt__4IObj@l -/* 803651B0 00362110 3C 80 80 3F */ lis r4, lbl_803EF830@ha +/* 803651B0 00362110 3C 80 80 3F */ lis r4, "__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>"@ha /* 803651B4 00362114 90 03 00 00 */ stw r0, 0(r3) /* 803651B8 00362118 38 C5 8D 78 */ addi r6, r5, __vt__31CObjOwnerDerivedFromIObjUntyped@l /* 803651BC 0036211C 38 A0 00 00 */ li r5, 0 -/* 803651C0 00362120 38 04 F8 30 */ addi r0, r4, lbl_803EF830@l +/* 803651C0 00362120 38 04 F8 30 */ addi r0, r4, "__vt__44TObjOwnerDerivedFromIObj<16CDependencyGroup>"@l /* 803651C4 00362124 90 C3 00 00 */ stw r6, 0(r3) /* 803651C8 00362128 98 BF 00 00 */ stb r5, 0(r31) /* 803651CC 0036212C 80 9F 00 04 */ lwz r4, 4(r31) @@ -209,8 +209,8 @@ lbl_803651D8: /* 803651FC 0036215C 38 21 00 10 */ addi r1, r1, 0x10 /* 80365200 00362160 4E 80 00 20 */ blr -.global sub_80365204 -sub_80365204: +.global "__dt__Q24rstl28auto_ptr<16CDependencyGroup>Fv" +"__dt__Q24rstl28auto_ptr<16CDependencyGroup>Fv": /* 80365204 00362164 94 21 FF D0 */ stwu r1, -0x30(r1) /* 80365208 00362168 7C 08 02 A6 */ mflr r0 /* 8036520C 0036216C 90 01 00 34 */ stw r0, 0x34(r1) @@ -263,8 +263,8 @@ lbl_8036529C: /* 803652B4 00362214 38 21 00 30 */ addi r1, r1, 0x30 /* 803652B8 00362218 4E 80 00 20 */ blr -.global sub_803652bc -sub_803652bc: +.global GetCountForResType__16CDependencyGroupCFUi +GetCountForResType__16CDependencyGroupCFUi: /* 803652BC 0036221C 80 03 00 04 */ lwz r0, 4(r3) /* 803652C0 00362220 38 C0 00 00 */ li r6, 0 /* 803652C4 00362224 80 A3 00 0C */ lwz r5, 0xc(r3) @@ -366,4 +366,3 @@ lbl_803D8408: # ROM: 0x3D5408 .asciz "??(??)" .balign 4 - diff --git a/asm/MetroidPrime/CInGameGuiManager.s b/asm/MetroidPrime/CInGameGuiManager.s index edec828c..238ae245 100644 --- a/asm/MetroidPrime/CInGameGuiManager.s +++ b/asm/MetroidPrime/CInGameGuiManager.s @@ -3383,7 +3383,7 @@ lbl_801098F0: /* 801098F4 00106854 48 23 75 19 */ bl GetObj__6CTokenFv /* 801098F8 00106858 80 63 00 04 */ lwz r3, 4(r3) /* 801098FC 0010685C 38 9D 54 52 */ addi r4, r29, 0x5452 -/* 80109900 00106860 48 25 B9 BD */ bl sub_803652bc +/* 80109900 00106860 48 25 B9 BD */ bl GetCountForResType__16CDependencyGroupCFUi /* 80109904 00106864 7F FF 1A 14 */ add r31, r31, r3 /* 80109908 00106868 3B DE 00 08 */ addi r30, r30, 8 lbl_8010990C: diff --git a/configure.py b/configure.py index 2c0e07cc..302fcc9f 100755 --- a/configure.py +++ b/configure.py @@ -680,7 +680,7 @@ LIBS = [ "Kyoto/Particles/CParticleElectric", ["Kyoto/Graphics/DolphinCColor", True], "Kyoto/Audio/CDSPStreamManager", - "Kyoto/CDependencyGroup", + ["Kyoto/CDependencyGroup", True], "Kyoto/Audio/CStreamAudioManager", ["Kyoto/Animation/CHalfTransition", True], "Kyoto/Particles/CElectricDescription", diff --git a/include/Kyoto/CDependencyGroup.hpp b/include/Kyoto/CDependencyGroup.hpp index c391a7c6..cfe69815 100644 --- a/include/Kyoto/CDependencyGroup.hpp +++ b/include/Kyoto/CDependencyGroup.hpp @@ -10,7 +10,9 @@ class CInputStream; class CDependencyGroup { public: explicit CDependencyGroup(CInputStream& in); + ~CDependencyGroup() {} void ReadFromStream(CInputStream& in); + int GetCountForResType(FourCC type) const; const rstl::vector< SObjectTag >& GetObjectTagVector() const { return x0_objectTags; } diff --git a/include/Kyoto/IObj.hpp b/include/Kyoto/IObj.hpp index cd028776..8209e97d 100644 --- a/include/Kyoto/IObj.hpp +++ b/include/Kyoto/IObj.hpp @@ -15,6 +15,7 @@ public: class CObjOwnerDerivedFromIObjUntyped : public IObj { public: + ~CObjOwnerDerivedFromIObjUntyped() {} template < typename T > CObjOwnerDerivedFromIObjUntyped(T* obj) : m_objPtr(obj) {} template < typename T > @@ -29,13 +30,17 @@ protected: template < typename T > class TObjOwnerDerivedFromIObj : public CObjOwnerDerivedFromIObjUntyped { public: - ~TObjOwnerDerivedFromIObj() override { delete Owned(); } + ~TObjOwnerDerivedFromIObj() { + if (Owned()) { + delete Owned(); + } + } T* Owned() { return static_cast< T* >(m_objPtr); } - static inline rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > GetNewDerivedObject(T* obj) { + static rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > GetNewDerivedObject(T* obj) { return new TObjOwnerDerivedFromIObj< T >(obj); } - static inline rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > + static rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > GetNewDerivedObject(const rstl::auto_ptr< T >& obj) { return new TObjOwnerDerivedFromIObj< T >(obj); } diff --git a/include/Kyoto/TToken.hpp b/include/Kyoto/TToken.hpp index e1766255..f0a556fa 100644 --- a/include/Kyoto/TToken.hpp +++ b/include/Kyoto/TToken.hpp @@ -21,7 +21,7 @@ public: T* operator*() { return GetT(); } T* operator->() { return GetT(); } - static inline rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > + static rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > > GetIObjObjectFor(const rstl::auto_ptr< T >& obj) { return TObjOwnerDerivedFromIObj< T >::GetNewDerivedObject(obj); } diff --git a/src/Kyoto/CDependencyGroup.cpp b/src/Kyoto/CDependencyGroup.cpp new file mode 100644 index 00000000..4ff9624c --- /dev/null +++ b/src/Kyoto/CDependencyGroup.cpp @@ -0,0 +1,40 @@ +#include "Kyoto/CDependencyGroup.hpp" +#include "Kyoto/CResFactory.hpp" +#include "Kyoto/Streams/CInputStream.hpp" + +CDependencyGroup::CDependencyGroup(CInputStream& in) { ReadFromStream(in); } + +void CDependencyGroup::ReadFromStream(CInputStream& in) { + int numTags = in.ReadInt32(); + x0_objectTags.reserve(numTags); + + for (int i = 0; i < numTags; ++i) { + FourCC type = in.ReadInt32(); + CAssetId id = in.ReadInt32(); + x0_objectTags.push_back(SObjectTag(type, id)); + } +} + +int CDependencyGroup::GetCountForResType(FourCC type) const { + int ret = 0; + for (rstl::vector< SObjectTag >::const_iterator it = x0_objectTags.begin(); + it != x0_objectTags.end(); ++it) { + if (it->type == type) { + ++ret; + } + } + + return ret; +} + +/* this is such a hack... */ +#pragma inline_max_size(250) +template <> +CFactoryFnReturn::CFactoryFnReturn(CDependencyGroup* ptr) +: obj(TToken< CDependencyGroup >::GetIObjObjectFor(rstl::auto_ptr< CDependencyGroup >(ptr)) + .release()) {} + +CFactoryFnReturn FDependencyGroupFactory(const SObjectTag& tag, CInputStream& in, + const CVParamTransfer& xfer) { + return new CDependencyGroup(in); +}