diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 95d61cf2..7715935f 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -338,12 +338,12 @@ _ZN7MapBase8vfunc_48Ev kind:function(arm,size=0x1c) addr:0x0207e46c _ZN7MapBase8vfunc_50Ev kind:function(arm,size=0x8) addr:0x0207e488 _ZN7MapBase8vfunc_54EP7TilePos kind:function(arm,size=0x8) addr:0x0207e490 _ZN7MapBase8vfunc_58EP7TilePosi kind:function(arm,size=0x8) addr:0x0207e498 -_ZN7MapBase8vfunc_5cEv kind:function(arm,size=0x8) addr:0x0207e4a0 +_ZN7MapBase8vfunc_5cEP7TilePos kind:function(arm,size=0x8) addr:0x0207e4a0 _ZN7MapBase8vfunc_60EP7TilePos kind:function(arm,size=0x8) addr:0x0207e4a8 _ZN7MapBase8vfunc_64Ev kind:function(arm,size=0x8) addr:0x0207e4b0 _ZN7MapBase8vfunc_68EP5Vec3pb kind:function(arm,size=0x488) addr:0x0207e4b8 -_ZN7MapBase18func_ov00_0207e940EPc kind:function(arm,size=0x28) addr:0x0207e940 -_ZN7MapBase18func_ov00_0207e968Ev kind:function(arm,size=0x4) addr:0x0207e968 +_ZN26MapBase_func_ov00_0207e940D1Ev kind:function(arm,size=0x28) addr:0x0207e940 +_ZN26MapBase_func_ov00_0207e968D1Ev kind:function(arm,size=0x4) addr:0x0207e968 _ZN7MapBase18func_ov00_0207e96cEv kind:function(arm,size=0x4) addr:0x0207e96c _ZN7MapBase8vfunc_6cEP5Vec3pPiS1_ kind:function(arm,size=0x4a4) addr:0x0207e970 _ZN7MapBase8vfunc_70EP5Vec3p kind:function(arm,size=0x1e0) addr:0x0207ee14 @@ -420,9 +420,9 @@ _ZN7MapBase18func_ov00_02080a78EP5Vec3p kind:function(arm,size=0x58) addr:0x0208 _ZN12MapBase_Unk218func_ov00_02080ad0EPP11TriggerBaseS2_S2_ kind:function(arm,size=0x54) addr:0x02080ad0 _ZN7MapBase18func_ov00_02080b24EP7TilePos kind:function(arm,size=0x1e4) addr:0x02080b24 _ZN7MapBase18func_ov00_02080d08EP7TilePos kind:function(arm,size=0x6c) addr:0x02080d08 -_ZN7MapBase8vfunc_bcEv kind:function(arm,size=0x4) addr:0x02080d74 +_ZN7MapBase8vfunc_bcEP7TilePosi kind:function(arm,size=0x4) addr:0x02080d74 _ZN7MapBase8vfunc_98EP7TilePosii kind:function(arm,size=0x4) addr:0x02080d78 -_ZN7MapBase8vfunc_c0Ev kind:function(arm,size=0x4) addr:0x02080d7c +_ZN7MapBase8vfunc_c0EP7TilePosi kind:function(arm,size=0x4) addr:0x02080d7c _ZN7MapBase22TriggerOfType_vfunc_10Ei kind:function(arm,size=0x5c) addr:0x02080d80 _ZN11TriggerBase8vfunc_10Ev kind:function(arm,size=0x8) addr:0x02080ddc _ZN7MapBase18func_ov00_02080de4Ev kind:function(arm,size=0x4) addr:0x02080de4 diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index 5f15907d..a9e23e6e 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -2297,7 +2297,7 @@ strlen kind:function(arm,size=0x1c) addr:0x02047008 strcpy kind:function(arm,size=0xc8) addr:0x02047024 strncpy kind:function(arm,size=0x50) addr:0x020470ec strcat kind:function(arm,size=0x30) addr:0x0204713c -strcmp kind:function(arm,size=0x114) addr:0x0204716c +_Z6strcmpPcS_ kind:function(arm,size=0x114) addr:0x0204716c strncmp kind:function(arm,size=0x34) addr:0x02047280 strchr kind:function(arm,size=0x3c) addr:0x020472b4 strstr kind:function(arm,size=0x6c) addr:0x020472f0 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index e8604eff..7a9ad839 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -338,12 +338,12 @@ _ZN7MapBase8vfunc_48Ev kind:function(arm,size=0x1c) addr:0x0207e40c _ZN7MapBase8vfunc_50Ev kind:function(arm,size=0x8) addr:0x0207e428 _ZN7MapBase8vfunc_54EP7TilePos kind:function(arm,size=0x8) addr:0x0207e430 _ZN7MapBase8vfunc_58EP7TilePosi kind:function(arm,size=0x8) addr:0x0207e438 -_ZN7MapBase8vfunc_5cEv kind:function(arm,size=0x8) addr:0x0207e440 +_ZN7MapBase8vfunc_5cEP7TilePos kind:function(arm,size=0x8) addr:0x0207e440 _ZN7MapBase8vfunc_60EP7TilePos kind:function(arm,size=0x8) addr:0x0207e448 _ZN7MapBase8vfunc_64Ev kind:function(arm,size=0x8) addr:0x0207e450 _ZN7MapBase8vfunc_68EP5Vec3pb kind:function(arm,size=0x488) addr:0x0207e458 -_ZN7MapBase18func_ov00_0207e940EPc kind:function(arm,size=0x28) addr:0x0207e8e0 -_ZN7MapBase18func_ov00_0207e968Ev kind:function(arm,size=0x4) addr:0x0207e908 +_ZN26MapBase_func_ov00_0207e940D1Ev kind:function(arm,size=0x28) addr:0x0207e8e0 +_ZN26MapBase_func_ov00_0207e968D1Ev kind:function(arm,size=0x4) addr:0x0207e908 _ZN7MapBase18func_ov00_0207e96cEv kind:function(arm,size=0x4) addr:0x0207e90c _ZN7MapBase8vfunc_6cEP5Vec3pPiS1_ kind:function(arm,size=0x4a4) addr:0x0207e910 _ZN7MapBase8vfunc_70EP5Vec3p kind:function(arm,size=0x1e0) addr:0x0207edb4 @@ -420,9 +420,9 @@ _ZN7MapBase18func_ov00_02080a78EP5Vec3p kind:function(arm,size=0x58) addr:0x0208 _ZN12MapBase_Unk218func_ov00_02080ad0EPP11TriggerBaseS2_S2_ kind:function(arm,size=0x54) addr:0x02080a70 _ZN7MapBase18func_ov00_02080b24EP7TilePos kind:function(arm,size=0x1e4) addr:0x02080ac4 _ZN7MapBase18func_ov00_02080d08EP7TilePos kind:function(arm,size=0x6c) addr:0x02080ca8 -_ZN7MapBase8vfunc_bcEv kind:function(arm,size=0x4) addr:0x02080d14 +_ZN7MapBase8vfunc_bcEP7TilePosi kind:function(arm,size=0x4) addr:0x02080d14 _ZN7MapBase8vfunc_98EP7TilePosii kind:function(arm,size=0x4) addr:0x02080d18 -_ZN7MapBase8vfunc_c0Ev kind:function(arm,size=0x4) addr:0x02080d1c +_ZN7MapBase8vfunc_c0EP7TilePosi kind:function(arm,size=0x4) addr:0x02080d1c _ZN7MapBase22TriggerOfType_vfunc_10Ei kind:function(arm,size=0x5c) addr:0x02080d20 _ZN11TriggerBase8vfunc_10Ev kind:function(arm,size=0x8) addr:0x02080d7c _ZN7MapBase18func_ov00_02080de4Ev kind:function(arm,size=0x4) addr:0x02080d84 @@ -682,7 +682,7 @@ _ZN10MapManager18func_ov00_02085594EP5Vec3p kind:function(arm,size=0x2a8) addr:0 _ZN10MapManager18func_ov00_0208583cEPS_P5Vec3pi kind:function(arm,size=0x74) addr:0x020857dc _ZN10MapManager18func_ov00_020858b0EPS_P5Vec3pi kind:function(arm,size=0x184) addr:0x02085850 _ZN10MapManager18func_ov00_02085a34EP5Vec3pi kind:function(arm,size=0x22c) addr:0x020859d4 -_ZN10MapManager18func_ov00_02085c60EP9UnkStructPiS2_j kind:function(arm,size=0x3e4) addr:0x02085c00 +_ZN10MapManager18func_ov00_02085c60EP5Vec3pPiS2_j kind:function(arm,size=0x3e4) addr:0x02085c00 _ZN10MapManager18func_ov00_02086044EP5Vec3pS1_i kind:function(arm,size=0x240) addr:0x02085fe4 _ZN10MapManager18func_ov00_02086284EPiP5Vec3pS2_itS2_S2_ kind:function(arm,size=0x800) addr:0x02086224 _ZN10MapManager18func_ov00_02086a84EPiP5Vec3pS2_iiiS2_S2_ kind:function(arm,size=0x24c) addr:0x02086a24 diff --git a/include/Map/MapBase.hpp b/include/Map/MapBase.hpp index 831775a2..2290cdf4 100644 --- a/include/Map/MapBase.hpp +++ b/include/Map/MapBase.hpp @@ -21,10 +21,10 @@ #define MAX_VIEWPOINTS 8 #define MAX_MAP_UNK_130 0x20 -struct MapBase_Unk_13c { - /* 00 */ unk32 mUnk_00; - /* 04 */ unk32 mUnk_04; - /* 08 */ unk32 mUnk_08; +struct MapBase_Unk_13c { // Related to map's ground texture + /* 00 */ unk32 mUnk_00; // ? + /* 04 */ unk32 mUnk_04; // Place map texture on ...? + /* 08 */ unk32 mUnk_08; // Offset to ground texture ? /* 0c */ }; @@ -89,6 +89,19 @@ struct UnkStruct_0207f38c { /* 14 */ TilePos mUnk_14; }; +class MapBase_func_ov00_0207e968 { +public: + unk8 mUnk_00[0x10]; + ~MapBase_func_ov00_0207e968(); +}; + +class MapBase_func_ov00_0207e940 { +public: + /* 00 */ unk8 mUnk_00[0x18]; + /* 18 */ MapBase_func_ov00_0207e968 mUnk_18[3]; + ~MapBase_func_ov00_0207e940(); +}; + class MapBase : public SysObject { public: /* 000 (vtable) */ @@ -146,7 +159,7 @@ class MapBase : public SysObject { /* 140 */ MapBase_Unk_140 *mUnk_140; /* 144 */ MapBase_Unk_144 *mUnk_144; /* 148 */ s32 mUnk_148; - /* 14c */ unk32 mUnk_14c; + /* 14c */ unk8 *mUnk_14c; // pointer to MFCB data /* 150 */ unk32 mUnk_150; /* 154 */ unk32 mUnk_154; /* 158 */ unk8 mUnk_158[8]; @@ -169,7 +182,7 @@ class MapBase : public SysObject { /* 20 */ virtual void vfunc_20(s32 param_2); /* 24 */ virtual void vfunc_24(); /* 28 */ virtual void vfunc_28(s32 param_2); - /* 2c */ virtual void vfunc_2c(); + /* 2c */ virtual void vfunc_2c(); // Runs when exiting Oshus's house /* 30 */ virtual void vfunc_30(s32 param_2); /* 34 */ virtual bool vfunc_34(char *param_2); /* 38 */ virtual void vfunc_38(); @@ -181,8 +194,8 @@ class MapBase : public SysObject { /* 50 */ virtual unk32 vfunc_50(); /* 54 */ virtual unk32 vfunc_54(TilePos *param_1); /* 58 */ virtual unk32 vfunc_58(TilePos *param_1, int param_2); - /* 5c */ virtual unk32 vfunc_5c(); - /* 60 */ virtual unk32 vfunc_60(TilePos *param_1); + /* 5c */ virtual unk32 vfunc_5c(TilePos *param_2); + /* 60 */ virtual unk32 vfunc_60(TilePos *param_2); /* 64 */ virtual unk32 vfunc_64(); /* 68 */ virtual unk32 vfunc_68(Vec3p *param_1, bool param_2); /* 6c */ virtual void vfunc_6c(Vec3p *param_2, unk32 *param_3, Vec3p *param_4); @@ -205,8 +218,8 @@ class MapBase : public SysObject { /* b0 */ virtual void vfunc_b0(unk32 param_2, unk32 param_3); /* b4 */ virtual unk32 *vfunc_b4(); /* b8 */ virtual unk32 vfunc_b8(unk32 param_2); - /* bc */ virtual void vfunc_bc(); - /* c0 */ virtual void vfunc_c0(); + /* bc */ virtual void vfunc_bc(TilePos *param_2, unk32 param_3); + /* c0 */ virtual void vfunc_c0(TilePos *param_2, unk32 param_3); /* c4 */ void SetBounds(unk32 map, Course *course); @@ -218,8 +231,8 @@ class MapBase : public SysObject { bool func_ov00_0207e08c(s32 *param_2, s32 param_3); s32 func_ov00_0207e0f0(s32 param_2); s32 func_ov00_0207e28c(s32 param_2); - static unk8 *func_ov00_0207e940(unk8 *param_1); - static void func_ov00_0207e968(); + // static unk8 *func_ov00_0207e940(unk8 *param_1); + // static void func_ov00_0207e968(); static void func_ov00_0207e96c(); static void func_ov00_0207f100(); bool func_ov00_0207f104(Vec3p *param_2, unk32 *param_3); diff --git a/include/Map/MapManager.hpp b/include/Map/MapManager.hpp index 39314640..ffbf1fd8 100644 --- a/include/Map/MapManager.hpp +++ b/include/Map/MapManager.hpp @@ -160,7 +160,7 @@ class MapManager : public SysObject { bool func_ov00_020823c4(unk32 *param_2, s32 param_3); s32 func_ov00_020823d4(s32 param_2); s32 func_ov00_020823e4(s32 param_2); - void MapData_vfunc_b4(); + unk32 *MapData_vfunc_b4(); void MapData_vfunc_9c(); s32 func_ov00_02082424(); bool func_ov00_02082454(Vec3p *param_2, Vec3p *param_3); @@ -244,13 +244,13 @@ class MapManager : public SysObject { s32 GetTriggerBoundingBoxes(s32 param_2, AABB *param_3, s32 param_4); bool func_ov00_020836dc(u32 param_2, u32 actorId); bool IsTriggerTypeOverlapped(u32 param_2, Vec3p *param_3); - unk8 GetOverlappingTrigger(Vec3p *param_2); + u8 GetOverlappingTrigger(Vec3p *param_2); bool func_ov00_02083790(s32 param_2); bool func_ov00_02083840(s32 param_2); bool AddTrigger(TriggerBase *param_2); bool func_ov00_020838d8(TriggerBase *param_2); bool FindExit(u32 param_2, Exit *param_3); - char func_ov00_020838f8(Exit *param_2); + u8 func_ov00_020838f8(Exit *param_2); bool func_ov00_02083908(char param_2, CameraViewpoint *param_3); void func_ov00_02083918(s32 param_2, CameraViewpoint *param_3); void GetCurrentViewpoint(CameraViewpoint *param_2, s32 param_3); diff --git a/libs/cpp/include/vector b/libs/cpp/include/vector index 2075b140..889f78d6 100644 --- a/libs/cpp/include/vector +++ b/libs/cpp/include/vector @@ -3,6 +3,7 @@ #include namespace std { + template class vector { public: T *mElements; diff --git a/ph_eur.ml1 b/ph_eur.ml1 new file mode 100644 index 00000000..8a207c5e Binary files /dev/null and b/ph_eur.ml1 differ diff --git a/src/00_Core/Map/MapBase.cpp b/src/00_Core/Map/MapBase.cpp index e0cdf264..4144870a 100644 --- a/src/00_Core/Map/MapBase.cpp +++ b/src/00_Core/Map/MapBase.cpp @@ -20,6 +20,7 @@ #include "cxxabi.h" #include "stdio.h" #include "stdlib.h" +#include "string.h" extern "C" void Fill32(unk32, u32 *, unk32); extern "C" void __cxa_vec_ctor(void *, unk32, unk32, void *, void *); @@ -41,7 +42,7 @@ extern unk32 data_ov000_020ecde4; struct UnkStruct_020ec81c_04 { /* 00 */ unk32 mUnk_00; /* 04 */ unk32 mUnk_04; - /* 08 */ unk32 *mUnk_08; + /* 08 */ unk32 *mUnk_08; // Address to nsbtx /* 0c */ }; @@ -66,18 +67,25 @@ MapBase::~MapBase() {} MapBase_Unk_180::~MapBase_Unk_180() {} +struct Test { + unk32 mUnk_00; + unk32 mUnk_04; +}; + // Non-matching ARM void MapBase::SetBounds(unk32 map, Course *course) { - Vec3p *pVVar5; Vec3p vec; + AABB mBounds; + Vec3p mCenter; + Vec3p mOffset; u16 uVar3 = this->mWidth; u16 uVar4 = this->mHeight; - int iVar1 = (unk32) ((u32) uVar3 << 0xc) >> 1; - int iVar2 = (unk32) ((u32) uVar4 << 0xc) >> 1; + u32 iVar1 = (uVar3 << 0xc) >> 1; + int iVar2 = (uVar4 << 0xc) >> 1; + + vec = *course->FindMapCenter(map); - pVVar5 = course->FindMapCenter(map); - vec = *pVVar5; this->mBounds.min.x = vec.x - iVar1; this->mBounds.min.y = vec.y; this->mBounds.min.z = vec.z - iVar2; @@ -191,18 +199,19 @@ ARM void MapBase::vfunc_b0(unk32 param_2, unk32 param_3) { // Non-matching ARM bool MapBase::func_ov00_0207e08c(s32 *param_2, s32 param_3) { - int iVar1; - int iVar2; - if (this->mUnk_13c == NULL) { return false; } - iVar1 = this->mUnk_13c->mUnk_00 + this->mUnk_13c->mUnk_08; + unk32 iVar1 = (unk32) this->mUnk_13c + this->mUnk_13c->mUnk_08; if (iVar1 == 0) { return false; } - iVar2 = iVar1 + *(s32 *) ((u32) * (u16 *) (iVar1 + 4 + (u32) * (u16 *) (iVar1 + 10)) * param_3 + iVar1 + 4 + - (u32) * (u16 *) (iVar1 + 10) + 4); + + unk32 r0 = *(u16 *) (iVar1 + 10); + unk32 r12 = iVar1 + 4; + unk32 a = *(u16 *) (r12 + r0) * param_3; + + unk32 iVar2 = iVar1 + *(unk32 *) (r12 + r0 + a + 4); if (iVar1 == 0) { return false; } @@ -211,84 +220,94 @@ ARM bool MapBase::func_ov00_0207e08c(s32 *param_2, s32 param_3) { return true; } +struct UnkStruct_func_b4 { + /* 00 */ unk8 pad[0x3c]; + /* 3c */ u8 mUnk_3c[4]; + /* 40 */ unk16 pad2; + /* 42 */ unk16 mUnk_42; + /* 44 */ +}; + +struct UnkStruct2 { + unk16 mUnk_00; + u16 mUnk_02; +}; + // Non-matching +// Get appropriate index in NSBTX texture names surrounding cave entrances ARM s32 MapBase::func_ov00_0207e0f0(s32 param_2) { - unk8 bVar1; + int *iVar9; + int *iVar10; + int *iVar11; + u8 bVar1; u16 uVar2; u16 uVar3; - u16 *puVar4; + int iVar12; + u32 i; + int j; int iVar6; - int *iVar5; - int *iVar12; - int *iVar11; - int *iVar8; - int iVar7; - u32 uVar8; - MapBase_Unk_13c *pMVar9; - int *iVar9; - int iVar13; - int *iVar10; - u32 uVar14; + UnkStruct_func_b4 *iVar8; + u16 uVar14; int iVar15; - u32 uStack_30; - pMVar9 = this->mUnk_13c; - if (pMVar9 == NULL) { + MapBase_Unk_13c *pMapUnk_13c = this->mUnk_13c; + if (pMapUnk_13c == NULL) { return -1; } - puVar4 = (u16 *) ((int) &pMVar9->mUnk_00 + pMVar9->mUnk_08); - if (puVar4 != (u16 *) 0x0) { - iVar6 = (int) puVar4 + (u32) *puVar4; - if (iVar6 == 0) { - return -1; - } - uStack_30 = 0; - if (*(char *) (iVar6 + 1) != '\0') { - iVar15 = 0; - do { - iVar13 = iVar6 + (u32) * (u16 *) (iVar6 + 6); - iVar10 = (int *) (iVar13 + (u32) * (u16 *) (iVar13 + 2)); - iVar5 = this->vfunc_b4(); - iVar12 = func_0201e24c((unk32 *) (iVar5 + 0xf), (char *) ((int) iVar10 + iVar15)); - if (iVar12 != (int *) 0x0) { - iVar13 = 0; - iVar9 = (int *) (iVar6 + (u32) * (u16 *) (iVar6 + 6) + 4); - iVar11 = (int *) (*(u16 *) (iVar6 + (u32) * (u16 *) (iVar6 + 6)) * uStack_30); - uVar2 = *(u16 *) ((int) iVar9 + (int) iVar11); - if (*(char *) ((int) iVar9 + (int) iVar11 + 2) != '\0') { - do { - if (param_2 == (u32) * (unk8 *) ((int) puVar4 + (u32) uVar2) + iVar13) { - iVar8 = this->vfunc_b4(); - bVar1 = *(unk8 *) ((int) iVar8 + 0x3d); - uVar14 = 0; - if (bVar1 != 0) { - uVar3 = *(u16 *) ((int) iVar8 + 0x42); - do { - iVar7 = strcmp((unk8 *) ((int) iVar8 + uVar14 * 0x10 + - (u32) * (u16 *) ((int) iVar8 + uVar3 + 0x3e) + uVar3 + 0x3c), - (unk8 *) ((int) iVar10 + iVar15)); - if (iVar7 == 0) { - return uVar14; - } - uVar8 = uVar14 + 1; - uVar14 = uVar8 & 0xffff; - } while ((uVar8 & 0xffff) < (u32) bVar1); - } + u16 *puVar4 = (u16 *) ((int) pMapUnk_13c + pMapUnk_13c->mUnk_08); + if (puVar4 == NULL) { + return -1; + } + iVar6 = (unk32) puVar4 + *puVar4; + if (iVar6 == 0) { + return -1; + } + i = 0; + if (i < *(u8 *) (iVar6 + 1)) { + iVar15 = 0; + do { + iVar12 = iVar6 + *(u16 *) (iVar6 + 6); + iVar10 = (int *) (iVar12 + *(u16 *) (iVar12 + 2)); + if (func_0201e24c((unk32 *) ((int) this->vfunc_b4() + 0x3c), (char *) ((int) iVar10 + iVar15)) != NULL) { + j = 0; + iVar9 = (int *) (iVar6 + (u32) * (u16 *) (iVar6 + 6) + 4); + iVar11 = (int *) (*(u16 *) (iVar6 + *(u16 *) (iVar6 + 6)) * i); + uVar2 = *(u16 *) ((int) iVar9 + (int) iVar11); + if (j < *(u8 *) ((int) iVar9 + (int) iVar11 + 2)) { + do { + if (param_2 == (u32) * (u8 *) ((int) puVar4 + (u32) uVar2) + j) { + iVar8 = (UnkStruct_func_b4 *) this->vfunc_b4(); + unk32 *a = (unk32 *) iVar8->mUnk_3c; + bVar1 = *(u8 *) ((int) a + 1); + uVar14 = 0; + if ((unk32) bVar1 > 0) { + uVar3 = *(u16 *) ((int) a + 6); + do { + // compare both texture names to match the two that are used (top and bottom) + // to surround cave entrance + UnkStruct2 *b = (UnkStruct2 *) ((int) a + uVar3); + if (strcmp((char *) ((unk32) b + b->mUnk_02 + uVar14 * 0x10), + (char *) ((int) iVar10 + iVar15)) == 0) { + return uVar14; + } + // iterate through the texture names + uVar14++; + } while (bVar1 > uVar14); } - iVar13++; - } while (iVar13 < (int) (u32) * (unk8 *) ((int) ((int) iVar9 + (int) iVar11) + 2)); - } + } + j++; + } while (j < *(u8 *) (((int) iVar9 + (int) iVar11) + 2)); } - iVar15 = iVar15 + 0x10; - uStack_30 = uStack_30 + 1; - } while (uStack_30 < *(unk8 *) (iVar6 + 1)); - } - return -1; + } + iVar15 += 0x10; // 0x10 size of nbstx texture name + i++; + } while (i < *(u8 *) (iVar6 + 1)); } return -1; } // Non-matching +// Get appropriate index in NSBTX texture palette names surrounding cave entrances ARM s32 MapBase::func_ov00_0207e28c(s32 param_2) { u16 uVar1; u16 uVar2; @@ -371,6 +390,7 @@ ARM s32 MapBase::func_ov00_0207e28c(s32 param_2) { return -1; } +// Get address to the course's TEX0 section in texture file (.NSBTX) ARM unk32 *MapBase::vfunc_b4() { if (data_ov000_020ec81c.mUnk_04 != NULL) { return func_0201e4cc(data_ov000_020ec81c.mUnk_04->mUnk_08); @@ -396,11 +416,11 @@ ARM unk32 MapBase::vfunc_58(TilePos *param_1, int param_2) { return 0; } -ARM unk32 MapBase::vfunc_5c() { +ARM unk32 MapBase::vfunc_5c(TilePos *param_2) { return 0; } -ARM unk32 MapBase::vfunc_60(TilePos *param_1) { +ARM unk32 MapBase::vfunc_60(TilePos *param_2) { return 0; } @@ -559,7 +579,7 @@ ARM unk32 MapBase::vfunc_68(Vec3p *param_2, bool param_3) { LAB_arm9_ov000__0207e724: // iVar1 = func_01fff084(data_027e0f6c, param_2, 2, data_ov000_020ec824); uVar5 = 0x2000; - __cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); + //__cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); uVar2 = 0; local_7c = 0; local_74 = 0; @@ -612,12 +632,9 @@ ARM unk32 MapBase::vfunc_68(Vec3p *param_2, bool param_3) { return iVar1; } -ARM unk8 *MapBase::func_ov00_0207e940(unk8 *param_1) { - //__cxa_vec_cleanup(param_1 + 0x18, 3, 0x10, func_ov00_0207e968); - return param_1; -} +ARM MapBase_func_ov00_0207e940::~MapBase_func_ov00_0207e940() {} -ARM void MapBase::func_ov00_0207e968() {} +ARM MapBase_func_ov00_0207e968::~MapBase_func_ov00_0207e968() {} ARM void MapBase::func_ov00_0207e96c() {} @@ -768,8 +785,8 @@ ARM void MapBase::vfunc_6c(Vec3p *param_2, unk32 *param_3, Vec3p *param_4) { LAB_arm9_ov000__0207eb04: iVar1 = func_01fff084(data_027e0f6c, param_2, 2, data_ov000_020ec864, 0x20, 0); uVar5 = 0x2000; - __cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); - __cxa_vec_ctor(&local_a4, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); + //__cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); + //__cxa_vec_ctor(&local_a4, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); uVar2 = 0; local_c8 = 0; local_c0 = 0; @@ -892,7 +909,7 @@ ARM u16 MapBase::vfunc_70(Vec3p *param_2) { iVar1 = func_01fff084(data_027e0f6c, param_2, 2, 0x20ec8a4, 0x20, 0); iVar4 = 0x2000; dVar5 = 0xffff; - __cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); + //__cxa_vec_ctor(&local_58, 3, 0x10, func_ov00_0207e96c, func_ov00_0207e968); uVar6 = 0; local_7c = 0; local_74 = 0; @@ -1118,28 +1135,49 @@ ARM bool MapBase::func_ov00_0207f38c(UnkStruct_0207f38c *param_2) { return false; } -// Non-matching +class UnkStruct_vfunc_90 { +public: + /* 00 */ virtual void vfunc_00(); + /* 04 */ virtual void vfunc_04(); + /* 08 */ virtual void vfunc_08(); + /* 0c */ virtual void vfunc_0c(); + /* 10 */ virtual void vfunc_10(); + /* 14 */ virtual void vfunc_14(); + /* 18 */ virtual void vfunc_18(); + /* 1c */ virtual void vfunc_1c(); + /* 20 */ virtual void vfunc_20(); + /* 24 */ virtual void vfunc_24(); + /* 28 */ virtual void vfunc_28(); + /* 2c */ virtual void vfunc_2c(); + /* 30 */ virtual void vfunc_30(); + /* 34 */ virtual bool vfunc_34(); + /* 38 */ virtual void vfunc_38(); + /* 3c */ virtual void vfunc_3c(); + /* 40 */ virtual void vfunc_40(); + /* 44 */ virtual void vfunc_44(unk32 param_2); +}; + ARM void MapBase::vfunc_90(TilePos *param_2, unk32 param_3) { int iVar1; int iVar2; - int *piVar3; + UnkStruct_vfunc_90 *piVar3; iVar1 = this->vfunc_54(param_2); if (iVar1 == param_3) { return; } - this->vfunc_bc(/*param_2,param_3,*(code **)(param_1->vtable + 0xbc),param_4*/); - iVar2 = this->vfunc_5c(/*param_2*/); + this->vfunc_bc(param_2, param_3); + iVar2 = this->vfunc_5c(param_2); if (param_3 == 0x14) { - this->vfunc_c0(/*param_2,(iVar2 + -3) * 0x1000000 >> 0x18*/); + this->vfunc_c0(param_2, (iVar2 - 3) * 0x1000000 >> 0x18); } else if (iVar1 == 0x14) { - this->vfunc_c0(/*param_2,(iVar2 + 3) * 0x1000000 >> 0x18*/); + this->vfunc_c0(param_2, (iVar2 + 3) * 0x1000000 >> 0x18); } - piVar3 = (int *) this->vfunc_78(param_2); + piVar3 = (UnkStruct_vfunc_90 *) this->vfunc_78(param_2); if (piVar3 == NULL) { return; } - //(**(code **)(*piVar3 + 0x44))(piVar3,param_3); + piVar3->vfunc_44(param_3); } ARM void MapBase::vfunc_94() {} @@ -1241,20 +1279,27 @@ ARM unk32 MapBase::GetTileEndZ(unk32 z) { // Non-matching ARM void MapBase::GetTileBounds(TilePos *tilePos, AABB *bounds) { - Vec3p start; - Vec3p end; + AABB newBounds; this->GetTileStartX(tilePos->x); // what's the purpose of this? - start.z = this->GetTileStartZ(tilePos->y); - start.x = this->GetTileStartX(tilePos->x); - start.y = FLOAT_TO_Q20(-1.2001); // why not just -1.2? - end.z = this->GetTileEndZ(tilePos->y); - end.y = this->vfunc_60(tilePos); - end.x = this->GetTileEndX(tilePos->x); + q20 z = this->GetTileStartZ(tilePos->y); + + q20 x = this->GetTileStartX(tilePos->x); - bounds->min = start; - bounds->max = end; + newBounds.max.z = z; + newBounds.max.x = x; + newBounds.max.y = -FLOAT_TO_Q20(1.2); + + q20 z2 = this->GetTileEndZ(tilePos->y); + q20 y2 = this->vfunc_60(tilePos); + q20 x2 = this->GetTileEndX(tilePos->x); + + *bounds = newBounds; + + bounds->max.x = x2; + bounds->max.y = y2; + bounds->max.z = z2; } ARM s32 MapBase::GetClampedTileX(s32 worldX) { @@ -1304,6 +1349,7 @@ ARM bool MapBase::IsInBounds(Vec3p *tileWorldPos) { return true; } +#pragma dont_inline on // Non-matching ARM unk32 MapBase::AddEntrance(Entrance *param_2) { int iVar1; @@ -1323,6 +1369,7 @@ ARM unk32 MapBase::AddEntrance(Entrance *param_2) { } return this->mEntrances.push_back(*param_2); } +#pragma dont_inline reset // Non-matching ARM Entrance *MapBase::FindEntrance(unk32 id) { @@ -1355,6 +1402,7 @@ ARM void MapBase::func_ov00_0207f948(unk32 *param_2) { } } +#pragma dont_inline on // Non-matching ARM void MapBase::AddTrigger(TriggerParams *param_2) { void *pTVar1; @@ -1382,6 +1430,7 @@ ARM void MapBase::AddTrigger(TriggerParams *param_2) { } this->mTriggers.push_back(local_14); } +#pragma dont_inline reset ARM void TriggerBase::vfunc_08() {} @@ -1524,6 +1573,7 @@ ARM void MapBase::Trigger_vfunc_08() { } } +#pragma dont_inline on ARM bool MapBase::AddTrigger(TriggerBase *param_2) { TriggerBase *pTVar1; TriggerBase **iter; @@ -1560,7 +1610,9 @@ ARM bool MapBase::AddTrigger(TriggerBase *param_2) { } return true; } +#pragma dont_inline reset +#pragma dont_inline on ARM bool MapBase::func_ov00_0207ff88(TriggerBase *param_2) { TriggerBase *pTVar1; TriggerBase **ppTVar2; @@ -1603,6 +1655,7 @@ ARM bool MapBase::func_ov00_0207ff88(TriggerBase *param_2) { this->mTriggers.erase(first, this->mTriggers.mElements + this->mTriggers.mSize); return true; } +#pragma dont_inline reset ARM void MapBase::func_ov00_0208005c(unk32 param_2, unk32 param_3, unk32 param_4) { this->mUnk_144->func_ov000_0209c1e4(param_2, param_3, param_4); @@ -1620,6 +1673,7 @@ ARM void MapBase::func_ov00_0208008c(u32 param_2) { this->mUnk_144->func_ov000_0209c8e4(param_2); } +#pragma dont_inline on // Non-matching ARM void MapBase::AddExit(Exit *param_2) { u32 uVar1; @@ -1643,7 +1697,9 @@ ARM void MapBase::AddExit(Exit *param_2) { } this->mExits.push_back(*param_2); } +#pragma dont_inline reset +#pragma dont_inline on // Non-matching ARM u8 MapBase::func_ov00_02080140(Exit *param_2) { Exit *pEVar1; @@ -1713,6 +1769,7 @@ ARM u8 MapBase::func_ov00_02080140(Exit *param_2) { } return MStack_54.mExit_1c.mUnk_14; } +#pragma dont_inline reset struct UnkStruct_02080324 { // Is this UnkStruct_027e0d38_UnkC? Members don't match, causes overlay checksum issues, but has // same method. Could it be Exit? @@ -1791,6 +1848,7 @@ ARM bool MapBase::FindExit(u32 param_2, Exit *param_3) { return false; } +#pragma dont_inline on // Non-matching ARM void MapBase::AddCameraViewpoint(CameraViewpoint *param_2) { unk16 uVar1; @@ -1815,6 +1873,7 @@ ARM void MapBase::AddCameraViewpoint(CameraViewpoint *param_2) { } this->mViewpoints.push_back(*param_2); } +#pragma dont_inline reset // Non-matching ARM bool MapBase::FindViewpoint_Unk_4(char id, CameraViewpoint *param_3) { @@ -1953,18 +2012,19 @@ ARM unk32 MapBase::vfunc_b8(unk32 param_2) { // Non-matching ARM bool MapBase::func_ov00_02080824(u32 param_2, unk8 *param_3) { - int iVar1; - int iVar2; + unk8 *iVar1; + unk8 *iVar2; int iVar3; iVar2 = this->mUnk_14c; - if (iVar2 == 0) { + if (iVar2 == NULL) { return false; } iVar3 = 0; // iVar1 = iVar2; - if (*(u16 *) (iVar2 + 4) > 0) { - do { + + if (*(u16 *) (iVar2 + 4) >= 0) { + for (; iVar3 < (unk32) * (u16 *) (iVar2 + 4); iVar3++) { if (param_2 == *(u8 *) (iVar1 + 8)) { iVar1 = iVar2 + 8 + iVar3 * 0x1c; *param_3 = *(u8 *) (iVar2 + 8 + iVar3 * 0x1c); @@ -1978,13 +2038,13 @@ ARM bool MapBase::func_ov00_02080824(u32 param_2, unk8 *param_3) { *(unk32 *) (param_3 + 0x18) = *(unk32 *) (iVar1 + 0x18); return true; } - iVar3++; iVar1 += 0x1c; - } while (iVar3 < (int) *(u16 *) (iVar2 + 4)); + } } return false; } +#pragma dont_inline on // Non-matching ARM bool MapBase::AddUnk_130(TriggerBase *param_2) { TriggerBase *pTVar1; @@ -2019,7 +2079,9 @@ ARM bool MapBase::AddUnk_130(TriggerBase *param_2) { } return true; } +#pragma dont_inline reset +#pragma dont_inline on // Not-matching ARM bool MapBase::func_ov00_020809b8(TriggerBase *param_2) { TriggerBase *pTVar1; @@ -2060,6 +2122,7 @@ ARM bool MapBase::func_ov00_020809b8(TriggerBase *param_2) { this->mUnk_130.erase(iter, this->mUnk_130.mElements + this->mUnk_130.mSize); return true; } +#pragma dont_inline reset // Non-matching ARM TriggerBase *MapBase::func_ov00_02080a78(Vec3p *param_2) { @@ -2162,11 +2225,7 @@ ARM void MapBase::func_ov00_02080b24(TilePos *param_2) { } ARM void MapBase::func_ov00_02080d08(TilePos *param_2) { - - int iVar1; - - iVar1 = this->vfunc_58(param_2, 4); - if (iVar1 == 0) { + if (this->vfunc_58(param_2, 4) == 0) { return; } this->vfunc_98(param_2, 4, 0); @@ -2174,20 +2233,20 @@ ARM void MapBase::func_ov00_02080d08(TilePos *param_2) { this->mUnk_030--; } -ARM void MapBase::vfunc_bc() {} +ARM void MapBase::vfunc_bc(TilePos *param_2, unk32 param_3) {} ARM void MapBase::vfunc_98(TilePos *param_2, unk32 param_3, unk32 param_4) {} -ARM void MapBase::vfunc_c0() {} +ARM void MapBase::vfunc_c0(TilePos *param_2, unk32 param_3) {} +// Non-matching: weird vfunc_10 offset ARM bool MapBase::TriggerOfType_vfunc_10(unk32 type) { - TriggerBase **p; - for (p = this->mTriggers.mElements; (s32) p != (s32) (this->mTriggers.mElements + this->mTriggers.mSize); p++) { + for (TriggerBase **p = this->mTriggers.mElements; (s32) p != (s32) (this->mTriggers.mElements + this->mTriggers.mSize); + p++) { if (type == (*p)->mId) { (*p)->vfunc_10(); } } - return true; } diff --git a/src/00_Core/Map/MapManager.cpp b/src/00_Core/Map/MapManager.cpp index 09357983..7bf185ec 100644 --- a/src/00_Core/Map/MapManager.cpp +++ b/src/00_Core/Map/MapManager.cpp @@ -302,8 +302,8 @@ ARM s32 MapManager::func_ov00_020823e4(s32 param_2) { return this->mMap->func_ov00_0207e28c(param_2); } -ARM void MapManager::MapData_vfunc_b4() { - this->mMap->vfunc_b4(); +ARM unk32 *MapManager::MapData_vfunc_b4() { + return this->mMap->vfunc_b4(); } ARM void MapManager::MapData_vfunc_9c() { @@ -1011,7 +1011,7 @@ ARM bool MapManager::IsTriggerTypeOverlapped(u32 type, Vec3p *pos) { return this->mMap->IsTriggerTypeOverlapped(type, pos); } -ARM unk8 MapManager::GetOverlappingTrigger(Vec3p *param_2) { +ARM u8 MapManager::GetOverlappingTrigger(Vec3p *param_2) { return this->mMap->GetOverlappingTrigger(param_2); } @@ -1062,7 +1062,7 @@ ARM bool MapManager::FindExit(u32 param_2, Exit *param_3) { return this->mMap->FindExit(param_2, param_3); } -ARM char MapManager::func_ov00_020838f8(Exit *param_2) { +ARM u8 MapManager::func_ov00_020838f8(Exit *param_2) { return this->mMap->func_ov00_02080140(param_2); } @@ -2626,8 +2626,8 @@ unk8 MapManager::func_ov00_02086044(Vec3p *param_2, Vec3p *param_3, unk32 param_ local_88.x = param_2->x; local_88.y = param_2->y; local_88.z = param_2->z; - func_ov000_0208ed74(&local_40, &local_88); - // AABB_Grow(&local_40, param_4); + local_40.GrowToPoint(&local_88); + local_40.GrowScalar(param_4); iVar3 = this->func_ov00_020839d4(local_40.min.x); iVar4 = this->func_ov00_020839f8(local_40.min.z); iVar5 = this->func_ov00_020839d4(local_40.max.x); @@ -2645,7 +2645,7 @@ unk8 MapManager::func_ov00_02086044(Vec3p *param_2, Vec3p *param_3, unk32 param_ Vec3p_Sub(&local_94, pVVar10, &VStack_58); uVar1 = this->func_ov00_020839d4(param_3->x); uVar2 = this->func_ov00_020839f8(param_3->z); - // iVar7 = this->func_ov00_02083e34(uVar1, uVar2, pVVar10); + iVar7 = this->func_ov00_02083e34(uVar1, uVar2, (unk32) pVVar10); do { if (iVar5 < iVar3) { return 0; @@ -2653,7 +2653,7 @@ unk8 MapManager::func_ov00_02086044(Vec3p *param_2, Vec3p *param_3, unk32 param_ if (iVar4 <= iVar6) { iVar11 = iVar4; do { - // iVar8 = this->func_ov00_02083e34((char) iVar3, (char) iVar11, pVVar10); + iVar8 = this->func_ov00_02083e34((char) iVar3, (char) iVar11, (unk32) pVVar10); if (iVar7 < iVar8) { local_c6.x = (char) iVar3; local_c6.y = (char) iVar11;