From aef4ef49d3bca9b729c9228012419533adefef4c Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 6 Nov 2020 12:36:14 -0500 Subject: add GShierMemObject.h, and implement constructors for GSanimationObject and GSblendObject --- asm/code_801DDF78.s | 11 ++++++++++- asm/code_801E6BF8.s | 2 +- asm/code_801F1AE8.s | 4 ++-- include/GShierMemObject.h | 32 +++++++++++++++++++++++++++++++ include/code_801DD5C8.h | 7 ++++++- obj_files.mk | 1 - src/code_801DD8C0.cpp | 48 ++++++++++++++++++++++++++++++++++++++++------- 7 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 include/GShierMemObject.h diff --git a/asm/code_801DDF78.s b/asm/code_801DDF78.s index 4a2901f..f5f52b9 100644 --- a/asm/code_801DDF78.s +++ b/asm/code_801DDF78.s @@ -2,6 +2,7 @@ .section .text, "ax" # 0x80006980 - 0x803E1E60 +# GScamera constructor .global func_801DDF78 func_801DDF78: /* 801DDF78 001D9BD8 94 21 FF F0 */ stwu r1, -0x10(r1) @@ -72,6 +73,7 @@ func_801DDF78: /* 801DE07C 001D9CDC 38 21 00 10 */ addi r1, r1, 0x10 /* 801DE080 001D9CE0 4E 80 00 20 */ blr +# GScamera constructor .global func_801DE084 func_801DE084: /* 801DE084 001D9CE4 94 21 FF F0 */ stwu r1, -0x10(r1) @@ -145,6 +147,7 @@ func_801DE084: /* 801DE194 001D9DF4 38 21 00 10 */ addi r1, r1, 0x10 /* 801DE198 001D9DF8 4E 80 00 20 */ blr +# GScamera virtual .global func_801DE19C func_801DE19C: /* 801DE19C 001D9DFC 94 21 FF F0 */ stwu r1, -0x10(r1) @@ -450,6 +453,9 @@ lbl_801DE5E4: /* 801DE5EC 001DA24C 7C 08 03 A6 */ mtlr r0 /* 801DE5F0 001DA250 38 21 00 50 */ addi r1, r1, 0x50 /* 801DE5F4 001DA254 4E 80 00 20 */ blr + +# GScamera virtual +func_801DE5F8: /* 801DE5F8 001DA258 94 21 FE B0 */ stwu r1, -0x150(r1) /* 801DE5FC 001DA25C 7C 08 02 A6 */ mflr r0 /* 801DE600 001DA260 90 01 01 54 */ stw r0, 0x154(r1) @@ -922,7 +928,7 @@ lbl_801DEC9C: /* 801DECB4 001DA914 38 21 00 B0 */ addi r1, r1, 0xb0 /* 801DECB8 001DA918 4E 80 00 20 */ blr -# virtual +# GScamera virtual func_801DECBC: /* 801DECBC 001DA91C 94 21 FF E0 */ stwu r1, -0x20(r1) /* 801DECC0 001DA920 7C 08 02 A6 */ mflr r0 @@ -957,6 +963,9 @@ lbl_801DECEC: /* 801DED30 001DA990 7C 08 03 A6 */ mtlr r0 /* 801DED34 001DA994 38 21 00 20 */ addi r1, r1, 0x20 /* 801DED38 001DA998 4E 80 00 20 */ blr + +# GScamera virtual +func_801DED3C: /* 801DED3C 001DA99C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 801DED40 001DA9A0 7C 08 02 A6 */ mflr r0 /* 801DED44 001DA9A4 90 01 00 14 */ stw r0, 0x14(r1) diff --git a/asm/code_801E6BF8.s b/asm/code_801E6BF8.s index ad6ef55..5992778 100644 --- a/asm/code_801E6BF8.s +++ b/asm/code_801E6BF8.s @@ -13,7 +13,7 @@ func_801E6BF8: /* 801E6C10 001E2870 80 84 00 84 */ lwz r4, 0x84(r4) /* 801E6C14 001E2874 7C 7A 1B 78 */ mr r26, r3 /* 801E6C18 001E2878 7C B8 2B 78 */ mr r24, r5 -/* 801E6C1C 001E287C 4B FF 6C A5 */ bl func_801DD8C0 +/* 801E6C1C 001E287C 4B FF 6C A5 */ bl __ct__17GSanimationObjectFP10gUnkClass8 /* 801E6C20 001E2880 3C C0 80 42 */ lis r6, lbl_80423620@ha /* 801E6C24 001E2884 38 A0 00 00 */ li r5, 0 /* 801E6C28 001E2888 38 80 00 FF */ li r4, 0xff diff --git a/asm/code_801F1AE8.s b/asm/code_801F1AE8.s index eeb8f21..48a130e 100644 --- a/asm/code_801F1AE8.s +++ b/asm/code_801F1AE8.s @@ -12,7 +12,7 @@ func_801F1AE8: /* 801F1AFC 001ED75C 38 80 00 00 */ li r4, 0 /* 801F1B00 001ED760 93 C1 00 08 */ stw r30, 8(r1) /* 801F1B04 001ED764 7C 7E 1B 78 */ mr r30, r3 -/* 801F1B08 001ED768 4B FE C0 5D */ bl func_801DDB64 +/* 801F1B08 001ED768 4B FE C0 5D */ bl __ct__13GSblendObjectFP10gUnkClass8 /* 801F1B0C 001ED76C C0 22 97 F0 */ lfs f1, lbl_80641DF0-_SDA2_BASE_(r2) /* 801F1B10 001ED770 3C 60 80 42 */ lis r3, lbl_804236C8@ha /* 801F1B14 001ED774 38 80 00 00 */ li r4, 0 @@ -74,7 +74,7 @@ func_801F1BC8: /* 801F1BE8 001ED848 93 81 00 10 */ stw r28, 0x10(r1) /* 801F1BEC 001ED84C 7C BC 2B 78 */ mr r28, r5 /* 801F1BF0 001ED850 80 85 00 20 */ lwz r4, 0x20(r5) -/* 801F1BF4 001ED854 4B FE BF 71 */ bl func_801DDB64 +/* 801F1BF4 001ED854 4B FE BF 71 */ bl __ct__13GSblendObjectFP10gUnkClass8 /* 801F1BF8 001ED858 80 1E 00 08 */ lwz r0, 8(r30) /* 801F1BFC 001ED85C 38 80 00 00 */ li r4, 0 /* 801F1C00 001ED860 C0 22 97 F0 */ lfs f1, lbl_80641DF0-_SDA2_BASE_(r2) diff --git a/include/GShierMemObject.h b/include/GShierMemObject.h new file mode 100644 index 0000000..60af7b7 --- /dev/null +++ b/include/GShierMemObject.h @@ -0,0 +1,32 @@ +#ifndef POKEREVO_GSHIERMEMOBJECT_H +#define POKEREVO_GSHIERMEMOBJECT_H + +#include "code_801DAAE0.h" + +// TODO: determine file that defines this +extern MEMHeapHandle lbl_8063E8F8; + +// Note: This is the root base class for various classes such as GScamera, +// GSlight, GSmodel, etc. These classes are all new/deleted using an alternative set of +// routines than the global new and delete, which we infer is defined inline here. + +// TODO: abstract class? + +class GShierMemObject +{ +public: + void* operator new(size_t sz) + { + if (func_801DAB28()) + return func_801DAC94(lbl_8063E8F8, sz); + else + return NULL; + } + + void operator delete(void* ptr) + { + func_801DAD48(lbl_8063E8F8, ptr); + } +}; + +#endif //POKEREVO_GSHIERMEMOBJECT_H diff --git a/include/code_801DD5C8.h b/include/code_801DD5C8.h index 2b0dc47..1b528ae 100644 --- a/include/code_801DD5C8.h +++ b/include/code_801DD5C8.h @@ -5,6 +5,8 @@ extern "C" { #endif +#include "GShierMemObject.h" + // TODO: identify data structures // size == 0x10 @@ -25,13 +27,16 @@ struct gUnkClass8 gUnkClass8* next; }; -struct gUnkClass7 +struct gUnkClass7 : public GShierMemObject { gUnkClass8* unk0; // linked list head u16 unk4; u16 unk6; float unk8; float unkC; + + gUnkClass7() : unk0(NULL), unk4(0), unk6(0xC), unk8(1.0f), unkC(0.0f) { } + }; void func_801DD5C8(gUnkClass7* p1, float p2); diff --git a/obj_files.mk b/obj_files.mk index d667ec7..a5cfb9f 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -229,7 +229,6 @@ SPLIT_O_FILES := \ $(BUILD_DIR)/src/code_801DCE6C.o \ $(BUILD_DIR)/src/code_801DD5C8.o \ $(BUILD_DIR)/src/code_801DD8C0.o \ - $(BUILD_DIR)/asm/code_801DD8C0_asm.o \ $(BUILD_DIR)/asm/code_801DDF78.o \ $(BUILD_DIR)/asm/code_801DF040.o \ $(BUILD_DIR)/asm/code_801E07E8.o \ diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index f27222e..f0a428d 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -1,6 +1,6 @@ #include "ctorStruct.h" #include -#include "code_801DAAE0.h" +#include "GShierMemObject.h" #include "code_801DD5C8.h" // TODO: C++ @@ -9,24 +9,46 @@ static ctorStruct gUnk8063F350(1, 4, 0); extern "C" { -// TODO: determine file that defines this -extern MEMHeapHandle lbl_8063E8F8; +// GSanimationObject +class GSanimationObject : public GShierMemObject +{ +protected: + gUnkClass8* unk0; + gUnkClass7* unk4; +public: + GSanimationObject(gUnkClass8* list); +}; + +class GSblendObject : public GSanimationObject +{ + gUnkClass7* unk8; + float unkC; +public: + GSblendObject(gUnkClass8* list); +}; +// TODO: replace this struct gUnkClass10 { - gUnkClass8* unk0; // TODO: check type + gUnkClass8* unk0; gUnkClass7* unk4; - - // TODO: begin derived class? gUnkClass7* unk8; float unkC; }; - #if 1 +// func_801DD8C0 +GSanimationObject::GSanimationObject(gUnkClass8* list) : unk0(list), unk4(NULL) +{ + if (list) + unk4 = new gUnkClass7; +} + +#if 0 // caller provides a linked list of gUnkClass8 // TODO: gUnkClass10 constructor? +// GSanimationObject? gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) { p1->unk0 = p2; @@ -51,6 +73,7 @@ gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) } return p1; } +#endif // TODO: gUnkClass10 destructor? Get mwcc to generate parts of this function implicitly gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) @@ -221,7 +244,17 @@ void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) } } + // TODO: derived class constructor? +// GSblendObject? + +GSblendObject::GSblendObject(gUnkClass8* list) : GSanimationObject(list), unk8(NULL), unkC(0.0f) +{ + if (unk4) + unk8 = new gUnkClass7; +} + +#if 0 gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) { func_801DD8C0(p1, p2); @@ -245,6 +278,7 @@ gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) } return p1; } +#endif // TODO: derived class destructor? gUnkClass10* func_801DDC08(gUnkClass10* p1, s32 p2) -- cgit v1.2.3