Decompile MapObjectProfile (#52)

* delink mapobj profile

* match base mapobjectprofile classes

* match other sections (+ accidental mapobject ctor match)
This commit is contained in:
Yanis
2026-04-16 20:57:17 +02:00
committed by GitHub
parent 754eb10308
commit 34ef65d030
28 changed files with 716 additions and 346 deletions
+2 -2
View File
@@ -21,7 +21,7 @@ ARM Actor::Actor() {
this->mUnk_5c.func_ov000_020975f8();
this->mRef.Reset();
this->mType = NULL;
_MI_CpuCopy(&data_ov000_020b539c.mUnk_00, &this->mUnk_5c, sizeof(data_ov000_020b539c.mUnk_00));
_MI_CpuCopy(&data_ov000_020b539c_eur.mUnk_00, &this->mUnk_5c, sizeof(data_ov000_020b539c_eur.mUnk_00));
this->mPos = this->mUnk_5c.mUnk_00;
this->mPrevPos = this->mUnk_5c.mUnk_00;
this->mAngle = this->mUnk_5c.mUnk_0c;
@@ -29,7 +29,7 @@ ARM Actor::Actor() {
this->mUnk_44 = 0xFF;
this->mUnk_46 = 0;
this->func_ov000_0209862c(0);
this->func_ov000_0209848c(data_ov000_020b539c.mUnk_30);
this->func_ov000_0209848c(data_ov000_020b539c_eur.mUnk_30);
}
ARM Actor::~Actor() {}
+4 -12
View File
@@ -10,7 +10,6 @@
#include "Unknown/UnkStruct_027e0ce0.hpp"
#include "Unknown/UnkStruct_ov000_020b5d34.hpp"
extern "C" void func_ov000_0209c7c8(void *);
extern "C" void func_01ffb714(Vec3p *, Vec3p *, void *);
extern "C" void func_01ffb9cc(Vec3p *, Vec3p *);
extern "C" u16 func_01ffbbe0(q20 x, q20 z);
@@ -19,24 +18,17 @@ extern "C" bool func_01ffd768(unk32, void *, void *, unk8);
extern "C" void func_ov000_020973f4(void *, void *, u32, void *, int); //! TODO: solve oddity
struct UnkStruct {
u32 *mUnk_00;
MapObject_20 *mUnk_04;
Vec3p *mUnk_08;
};
// https://decomp.me/scratch/4do9S
ARM MapObject::MapObject() {
this->mUnk_10 = NULL;
this->mUnk_16 = -1;
this->mFlags[0] = 0;
func_ov000_0209c7c8(&this->mUnk_20);
this->mUnk_20.func_ov000_0209c7c8();
*(u32 *) &this->mUnk_38 = 0;
UnkStruct_ov000_020b5d34 *ptr1 = &data_ov000_020b5d34;
this->mpProfile = ptr1->mpProfile;
UnkStruct *ptr2 = (UnkStruct *) ptr1->mUnk_00;
UnkStruct_ov000_020b5d34_00 *ptr2 = ptr1->mUnk_00;
*(u32 *) &this->mUnk_38 = *ptr2->mUnk_00;
@@ -45,7 +37,7 @@ ARM MapObject::MapObject() {
this->mPos.y = ptr->y;
this->mPos.z = ptr->z;
this->mUnk_14 = ptr1->mUnk_0C->mUnk_00;
this->mUnk_14 = *ptr2->mUnk_0C;
_MI_CpuCopy(ptr2->mUnk_04, &this->mUnk_20, sizeof(MapObject_20));
for (int i = 0; i < ARRAY_LEN(this->mUnk_18); i++) {
@@ -257,7 +249,7 @@ ARM void MapObject::func_ov000_0209d54c(unk32 param1, u16 param2, Vec3p *param3,
local_4c.param_r2 = param2;
local_4c.extra_s16 = param4;
local_4c.extra_u16 = param5;
func_ov000_020973f4(this, &data_ov000_020b539c, ActorId_EventIcon, &local_4c, 0);
func_ov000_020973f4(this, &data_ov000_020b539c_eur, ActorId_EventIcon, &local_4c, 0);
}
ARM void MapObject::func_ov000_0209d5c8(ActorRef ref) {
@@ -38,11 +38,11 @@ ARM MapObjectMiniBlocks::MapObjectMiniBlocks() :
ARM bool MapObjectMiniBlocks::vfunc_00(void) {
GET_PROFILE(MapObjectProfileMiniBlocks)
->func_ov000_0209ccd8(this->mUnk_20.mUnk_02, data_ov000_020af574[this->mUnk_20.mUnk_02]);
->func_ov000_0209ccd8(this->mUnk_20.mUnk_00[1], data_ov000_020af574[this->mUnk_20.mUnk_00[1]]);
UnkStruct_027e0cd8_0c *pUnkStruct_027e0cd8_0c = data_027e0cd8->mUnk_0c;
u8 uVar6;
if (this->mUnk_20.mUnk_02 != MiniBlocksVariant_BLKF) {
if (this->mUnk_20.mUnk_00[1] != MiniBlocksVariant_BLKF) {
Vec2b vec(this->mUnk_3A.x, this->mUnk_3A.y);
this->mPos.y = pUnkStruct_027e0cd8_0c->func_01ffedf4(&vec);
}
@@ -50,7 +50,7 @@ ARM bool MapObjectMiniBlocks::vfunc_00(void) {
Vec3p vec(FLOAT_TO_Q20(0.0f), FLOAT_TO_Q20(0.0f), FLOAT_TO_Q20(0.0f));
uVar6 = 0;
switch (this->mUnk_20.mUnk_00) {
switch (this->mUnk_20.mUnk_00[0]) {
case 4:
case 5:
case 6:
@@ -64,7 +64,7 @@ ARM bool MapObjectMiniBlocks::vfunc_00(void) {
uVar6 = 2;
break;
default:
if (this->mUnk_20.mUnk_02 == MiniBlocksVariant_BLKF) {
if (this->mUnk_20.mUnk_00[1] == MiniBlocksVariant_BLKF) {
vec.x = FLOAT_TO_Q20(0.0f);
vec.y = FLOAT_TO_Q20(0.0f);
vec.z = -FLOAT_TO_Q20(0.375f);
@@ -77,7 +77,7 @@ ARM bool MapObjectMiniBlocks::vfunc_00(void) {
}
MapObjectProfile_Derived2_20_Base_50 *ptr =
GET_PROFILE(MapObjectProfileMiniBlocks)->vfunc_1C(this->mUnk_20.mUnk_02)->mUnk_50;
GET_PROFILE(MapObjectProfileMiniBlocks)->vfunc_1C(this->mUnk_20.mUnk_00[1])->mUnk_50;
void *var_r1;
if (ptr != NULL) {
u16 *temp_r1 = (u16 *) ((u8 *) ptr + 8);
@@ -104,7 +104,7 @@ next:
unk32 var_r0_2;
unk32 var_r0;
switch (this->mUnk_20.mUnk_00) {
switch (this->mUnk_20.mUnk_00[0]) {
case 1:
case 6:
case 8:
@@ -0,0 +1,218 @@
#include "MapObject/MapObjectProfile.hpp"
#include "Actor/Actor.hpp"
#include "MapObject/MapObject.hpp"
#include "Unknown/UnkMemFuncs.h"
#include "Unknown/UnkStruct_ov000_020b5d34.hpp"
extern unk8 data_ov000_020af4d4[];
MapObjectProfile *data_ov000_020b5d3c[MapObjectIndex_Max];
UnkStruct_ov000_020b5d34 data_ov000_020b5d34;
ARM void MapObject_20::func_ov000_0209c790(MapObjectId mapObjId, MapObjectProfile *pProfile) {
data_ov000_020b5d3c[UnkStruct_ov000_020b5d34::func_ov000_0209c718(mapObjId)] = pProfile;
}
ARM void MapObject_20::func_ov000_0209c7ac(MapObjectId mapObjId) {
data_ov000_020b5d3c[UnkStruct_ov000_020b5d34::func_ov000_0209c718(mapObjId)] = NULL;
}
ARM void MapObject_20::func_ov000_0209c7c8() {
this->mUnk_16 = 0;
this->mUnk_10 = 0;
MI_CpuFill32(0, this->mUnk_00, sizeof(this->mUnk_00));
MI_CpuFill16(0, this->mUnk_08, sizeof(this->mUnk_08));
MI_CpuFill16(0, this->mUnk_0A, sizeof(this->mUnk_0A));
this->mUnk_14 = -1;
this->mUnk_17 = 0;
}
ARM unk32 MapObjectProfile::func_ov000_0209c820() {
return MapObjectIndex_Max;
}
ARM MapObjectProfile::MapObjectProfile(MapObjectId mapObjId) {
this->mUnk_06 = 1;
this->mUnk_08 = 0x800;
this->mUnk_0C = 0x1333;
this->mUnk_0E = -1;
this->mUnk_0F = 0;
this->mMapObjId = mapObjId;
this->mUnk_14 = 0;
this->mUnk_18 = 0;
this->mUnk_1C = 0;
this->mUnk_1D = 0;
this->mUnk_1E = 1;
for (int i = 0; i < ARRAY_LEN(this->mUnk_04); i++) {
this->mUnk_04[i] = data_ov000_020af4d4[i];
}
MapObject_20::func_ov000_0209c790(this->mMapObjId, this);
}
ARM MapObjectProfile::~MapObjectProfile() {
this->func_ov000_0209c970();
MapObject_20::func_ov000_0209c7ac(this->mMapObjId);
}
ARM MapObjectProfile_Derived2_20 *MapObjectProfile::vfunc_04() {
return NULL;
}
ARM unk32 MapObjectProfile::func_ov000_0209c8e4(MapObject_20 *param1) {
return this->mUnk_0E;
}
ARM void MapObjectProfile::func_ov000_0209c8ec(MapObjectProfile *thisx) {
if (thisx->mUnk_0F == 0) {
if (thisx->mUnk_14 != 0) {
thisx->func_ov000_0209c8ec(data_ov000_020b5d34.func_ov000_0209c6b8(thisx->mUnk_14));
}
if (thisx->mUnk_18 != 0) {
data_ov000_020b539c_eur.func_ov000_020974dc(thisx->mUnk_18)->vfunc_08();
}
thisx->vfunc_08();
thisx->mUnk_0F = 2;
}
}
ARM void MapObjectProfile::func_ov000_0209c95c() {
this->vfunc_0C();
}
ARM void MapObjectProfile::func_ov000_0209c970() {
if (this->mUnk_0F == 2) {
this->vfunc_10();
this->mUnk_0F = 0;
}
}
ARM void MapObjectProfile::vfunc_08() {}
ARM void MapObjectProfile::vfunc_0C() {}
ARM void MapObjectProfile::vfunc_10() {}
ARM MapObjectProfile_Derived2::MapObjectProfile_Derived2(MapObjectId mapObjId1, MapObjectId mapObjId2) :
MapObjectProfile(mapObjId1),
mUnk_20(mapObjId2) {}
ARM MapObjectProfile_Derived2::~MapObjectProfile_Derived2() {
this->vfunc_10();
}
ARM MapObjectProfile_Derived2_20 *MapObjectProfile_Derived2::vfunc_04() {
return &this->mUnk_20;
}
ARM void MapObjectProfile_Derived2::vfunc_08() {
this->mUnk_20.func_ov000_0209cfdc(0, 0);
this->mUnk_20.func_ov000_020586b4(0, 0, 0, 0);
this->mUnk_20.func_ov000_02058ab0();
}
ARM void MapObjectProfile_Derived2::vfunc_0C() {
if (this->mUnk_20.mUnk_20.mUnk_04 != 0) {
this->mUnk_20.func_ov000_02058914(0);
}
}
ARM void MapObjectProfile_Derived2::vfunc_10() {
this->mUnk_20.func_ov000_020589e4();
}
ARM MapObjectProfile_Derived3::MapObjectProfile_Derived3(MapObjectId mapObjId1, MapObjectId mapObjId2) :
MapObjectProfile(mapObjId1) {
this->mUnk_20 = NULL;
this->mUnk_14 = mapObjId2;
}
ARM MapObjectProfile_Derived2_20 *MapObjectProfile_Derived3::vfunc_04() {
return this->mUnk_20;
}
ARM void MapObjectProfile_Derived3::vfunc_08() {
this->mUnk_20 = data_ov000_020b5d34.func_ov000_0209c6b8(this->mUnk_14)->vfunc_04();
}
ARM MapObjectProfile_Derived4::MapObjectProfile_Derived4(MapObjectId mapObjId1, MapObjectId mapObjId2) :
MapObjectProfile_Derived2(mapObjId1, mapObjId2) {}
ARM MapObjectProfile_Derived4::~MapObjectProfile_Derived4() {
if (this->mUnk_20.mUnk_20.mUnk_04 != 0) {
this->mUnk_20.func_ov000_020589e4();
}
}
ARM void MapObjectProfile_Derived4::vfunc_08() {}
ARM void MapObjectProfile_Derived4::vfunc_0C() {}
ARM MapObjectProfile_Derived1::MapObjectProfile_Derived1(MapObjectId mapObjId, unk32 param2, unk32 param3) :
MapObjectProfile(mapObjId),
mUnk_60(param3),
mUnk_64(param2) {
for (MapObjectProfile_Derived2_20 **ptr = this->mUnk_20; ptr != &this->mUnk_20[ARRAY_LEN(this->mUnk_20)]; ptr++) {
*ptr = NULL;
}
}
ARM MapObjectProfile_Derived2_20 *MapObjectProfile_Derived1::vfunc_04() {
if (this->mUnk_64 >= 0) {
return this->mUnk_20[this->mUnk_64];
}
return NULL;
}
ARM MapObjectProfile_Derived2_20 *MapObjectProfile_Derived1::vfunc_1C(unk32 param1) {
if (param1 >= 0) {
return this->mUnk_20[param1];
}
return NULL;
}
ARM MapObjectProfile_Derived1::~MapObjectProfile_Derived1() {
for (MapObjectProfile_Derived2_20 **ptr = this->mUnk_20; ptr != &this->mUnk_20[ARRAY_LEN(this->mUnk_20)]; ptr++) {
delete *ptr;
}
}
ARM void MapObjectProfile_Derived1::func_ov000_0209ccd8(unk32 param1, u32 param2) {
if (this->mUnk_20[param1] == NULL) {
MapObjectProfile_Derived2_20 *ptr = new(HeapIndex_1) MapObjectProfile_Derived2_20(param2);
MapObjectProfile_Derived2_20 **ppUnk_20 = this->mUnk_20;
ppUnk_20[param1] = ptr;
ppUnk_20[param1]->func_ov000_0209cfdc(0, 0);
ppUnk_20[param1]->func_ov000_020586b4(0, 0, 0, 0);
ppUnk_20[param1]->func_ov000_02058ab0();
}
}
ARM void MapObjectProfile_Derived1::vfunc_08() {
if (this->mUnk_64 >= 0) {
this->func_ov000_0209ccd8(this->mUnk_64, this->mUnk_60);
}
}
ARM void MapObjectProfile_Derived1::vfunc_0C() {
for (MapObjectProfile_Derived2_20 **ptr = this->mUnk_20; ptr != &this->mUnk_20[ARRAY_LEN(this->mUnk_20)]; ptr++) {
if (*ptr != NULL && (*ptr)->mUnk_20.mUnk_04 != NULL) {
(*ptr)->func_ov000_02058914(0);
}
}
}
ARM void MapObjectProfile_Derived1::vfunc_10() {
for (MapObjectProfile_Derived2_20 **ptr = this->mUnk_20; ptr != &this->mUnk_20[ARRAY_LEN(this->mUnk_20)]; ptr++) {
if (*ptr != NULL) {
delete *ptr;
*ptr = NULL;
}
}
}
@@ -0,0 +1,58 @@
#include "MapObject/MapObjectProfile_Derived2_20.hpp"
#include <string.h>
extern "C" {
void func_02015ea8(u32 resourceId, void *);
unk32 func_02012fa8(const char *);
}
ARM MapObjectProfile_Derived2_20::MapObjectProfile_Derived2_20(MapObjectId mapObjId2) :
MapObjectProfile_Derived2_20_Base("MapObj", &mUnk_94, &mUnk_94, &mUnk_94, 0, 0),
mUnk_94(0),
mUnk_98(0),
mUnk_B0(false),
mUnk_B1(0) {
func_02015ea8(mapObjId2, &this->mUnk_94);
}
ARM MapObjectProfile_Derived2_20::~MapObjectProfile_Derived2_20() {
this->func_ov000_020589e4();
this->func_ov000_0209cfac();
}
ARM void MapObjectProfile_Derived2_20::func_ov000_0209cef0() {
char path[32 + 1];
size_t curLength;
((wchar_t *) &path)[(sizeof(path) - 1) / 2] = L'\0';
// path = "MapObj/RESID/filename.zcb"
strncpy(&path[0], "MapObj/", sizeof(path) - 1);
curLength = strlen(path);
strncpy(&path[curLength], this->mUnk_08, sizeof(path) - 1 - curLength);
const char *ext = ".zcb";
curLength = strlen(path);
strncpy(&path[curLength], ext, sizeof(path) - 1 - curLength);
this->mUnk_9C.vfunc_0C();
this->mUnk_9C.mUnk_04 = path;
if (func_02012fa8(path) != 0) {
this->mUnk_9C.vfunc_08(0x10);
this->mUnk_B0 = true;
} else {
this->mUnk_B0 = false;
}
}
ARM void MapObjectProfile_Derived2_20::func_ov000_0209cfac() {
if (this->mUnk_B0) {
this->mUnk_9C.vfunc_0C();
this->mUnk_B0 = false;
}
}
ARM void MapObjectProfile_Derived2_20::func_ov000_0209cfdc(unk32 param1, unk32 param2) {}
@@ -121,7 +121,7 @@ end:
}
ARM MapObjectSwitchStep::~MapObjectSwitchStep() {
if (this->mUnk_20.mUnk_00 == 2) {
if (this->mUnk_20.mUnk_00[0] == 2) {
this->func_ov000_0209e11c(0, 1);
this->func_ov000_0209d2c4(0, 0);
}
@@ -182,8 +182,8 @@ ARM void MapObjectSwitchStep::func_ov000_0209e11c(unk32 param1, unk32 param2) {
this->mUnk_EA = 1;
}
if (this->mUnk_20.mUnk_00 == 2) {
this->mUnk_E6 = this->mUnk_20.mUnk_02;
if (this->mUnk_20.mUnk_00[0] == 2) {
this->mUnk_E6 = this->mUnk_20.mUnk_00[1];
this->mUnk_E4 = 0;
}