From 514887962c31df98b4d934af61a4d43fd60b2458 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:17:42 +0100 Subject: [PATCH] "progress" --- config/eur/arm9/delinks.txt | 2 + config/eur/arm9/symbols.txt | 4 +- config/usa/arm9/symbols.txt | 4 +- include/Item/ItemManager.hpp | 3 + include/Unknown/UnkStruct_02035064.hpp | 4 +- include/Unknown/UnkStruct_02037750.hpp | 7 +- src/Main/Unknown/UnkStruct_02035064.cpp | 16 ++- src/Main/Unknown/UnkStruct_02037750.cpp | 145 +++++++++++++++++++++++- 8 files changed, 171 insertions(+), 14 deletions(-) diff --git a/config/eur/arm9/delinks.txt b/config/eur/arm9/delinks.txt index 374e855a..4dcb343a 100644 --- a/config/eur/arm9/delinks.txt +++ b/config/eur/arm9/delinks.txt @@ -23,6 +23,7 @@ src/Main/Unknown/UnkStruct_02032f0c.cpp: src/Main/Unknown/UnkStruct_02035064.cpp: .text start:0x02035064 end:0x02035370 + .data start:0x02057b28 end:0x02057b30 src/Main/Message/MessageManager.cpp: .text start:0x0203643c end:0x020371b4 @@ -34,6 +35,7 @@ src/Main/Message/BMG.cpp: src/Main/Unknown/UnkStruct_02037750.cpp: .text start:0x02037750 end:0x020387e0 + .data start:0x02057d00 end:0x02057d70 src/Main/Unknown/UnkStruct_02038aa0.cpp: .text start:0x0203881c end:0x02039578 diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index 03d95b82..7736304d 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -1738,8 +1738,8 @@ _ZN18UnkStruct_02035064D1Ev kind:function(arm,size=0x4) addr:0x20350ac _ZN18UnkStruct_0203506413func_020350b0Ev kind:function(arm,size=0x4) addr:0x20350b0 _ZN18UnkStruct_0203506413func_020350b4Eiicss kind:function(arm,size=0xb8) addr:0x20350b4 _ZN18UnkStruct_0203506413func_0203516cEv kind:function(arm,size=0x3c) addr:0x203516c -_ZN18UnkStruct_020350647vfunc_0Ev kind:function(arm,size=0x8) addr:0x20351a8 -_ZN18UnkStruct_020350647vfunc_4Ev kind:function(arm,size=0x8) addr:0x20351b0 +_ZN18UnkStruct_020350648vfunc_00Ev kind:function(arm,size=0x8) addr:0x20351a8 +_ZN18UnkStruct_020350648vfunc_04Ev kind:function(arm,size=0x8) addr:0x20351b0 _ZN18UnkStruct_0203506413func_020351b8Ebbbb kind:function(arm,size=0x120) addr:0x20351b8 _ZN18UnkStruct_0203506413func_020352d8Ev kind:function(arm,size=0x98) addr:0x20352d8 func_02035370 kind:function(arm,size=0x18) addr:0x2035370 diff --git a/config/usa/arm9/symbols.txt b/config/usa/arm9/symbols.txt index 6d96c0ba..667b34f9 100644 --- a/config/usa/arm9/symbols.txt +++ b/config/usa/arm9/symbols.txt @@ -1738,8 +1738,8 @@ _ZN18UnkStruct_02035064D1Ev kind:function(arm,size=0x4) addr:0x2035068 _ZN18UnkStruct_0203506413func_020350b0Ev kind:function(arm,size=0x4) addr:0x203506c _ZN18UnkStruct_0203506413func_020350b4Eiicss kind:function(arm,size=0xb8) addr:0x2035070 _ZN18UnkStruct_0203506413func_0203516cEv kind:function(arm,size=0x3c) addr:0x2035128 -_ZN18UnkStruct_020350647vfunc_0Ev kind:function(arm,size=0x8) addr:0x2035164 -_ZN18UnkStruct_020350647vfunc_4Ev kind:function(arm,size=0x8) addr:0x203516c +_ZN18UnkStruct_020350648vfunc_00Ev kind:function(arm,size=0x8) addr:0x2035164 +_ZN18UnkStruct_020350648vfunc_04Ev kind:function(arm,size=0x8) addr:0x203516c _ZN18UnkStruct_0203506413func_020351b8Ebbbb kind:function(arm,size=0x120) addr:0x2035174 _ZN18UnkStruct_0203506413func_020352d8Ev kind:function(arm,size=0x98) addr:0x2035294 func_02035370 kind:function(arm,size=0x18) addr:0x203532c diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index e0dbbaf2..87259d74 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -197,6 +197,9 @@ public: // Rupees s32 GetMaxRupees() const; void GiveRupees(s32 amount, bool param2); + inline u16 GetNumRupees(void) { + return this->mNumRupees; + } // Potion void SetPotion(u32 index, Potion potion); diff --git a/include/Unknown/UnkStruct_02035064.hpp b/include/Unknown/UnkStruct_02035064.hpp index b2443949..36f831de 100644 --- a/include/Unknown/UnkStruct_02035064.hpp +++ b/include/Unknown/UnkStruct_02035064.hpp @@ -43,8 +43,8 @@ public: /* 87 */ unk8 mUnk_87; /* 88 */ - /* 0 */ virtual s32 vfunc_0(); // func_020351a8 - /* 4 */ virtual s32 vfunc_4(); // func_020351b0 + /* 0 */ virtual s32 vfunc_00(); // func_020351a8 + /* 4 */ virtual s32 vfunc_04(); // func_020351b0 /* 8 */ UnkStruct_02035064(); diff --git a/include/Unknown/UnkStruct_02037750.hpp b/include/Unknown/UnkStruct_02037750.hpp index bb3d2662..89877998 100644 --- a/include/Unknown/UnkStruct_02037750.hpp +++ b/include/Unknown/UnkStruct_02037750.hpp @@ -7,12 +7,13 @@ #include "System/SysNew.hpp" class UnkStruct_020397f8; +typedef unk32 (*UnkStruct_02037750_Callback1)(unk32); // astruct_14 class UnkStruct_02037750 : public SysObject { public: /* 00 (vtable) */ - /* 04 */ unk32 mUnk_04[0x4]; + /* 04 */ UnkStruct_02037750_Callback1 mUnk_04[0x4]; /* 14 */ unk32 mUnk_14; /* 18 */ u32 mUnk_18; /* 1c */ u8 mUnk_1c; @@ -29,7 +30,7 @@ public: /* 1c */ virtual bool vfunc_1c(); /* 20 */ virtual void vfunc_20(); /* 24 */ virtual bool vfunc_24(unk32 param1); - /* 28 */ virtual unk8 vfunc_28(s32 param1); + /* 28 */ virtual unk32 vfunc_28(s32 param1); /* 2c */ virtual unk32 vfunc_2c(s32 param1); /* 30 */ virtual bool vfunc_30(); /* 34 */ @@ -73,7 +74,7 @@ public: /* 00 */ virtual ~UnkStruct_020386d8(); /* 08 */ virtual void vfunc_08(u32 param1); /* 24 */ virtual bool vfunc_24(unk32 param1); - /* 28 */ virtual unk8 vfunc_28(s32 param1); + /* 28 */ virtual unk32 vfunc_28(s32 param1); /* 30 */ virtual bool vfunc_30(); /* 34 */ }; diff --git a/src/Main/Unknown/UnkStruct_02035064.cpp b/src/Main/Unknown/UnkStruct_02035064.cpp index 6841fdc0..151cdf8c 100644 --- a/src/Main/Unknown/UnkStruct_02035064.cpp +++ b/src/Main/Unknown/UnkStruct_02035064.cpp @@ -18,13 +18,23 @@ ARM void UnkStruct_02035064::func_020350b0() { } ARM void UnkStruct_02035064::func_020350b4(s32 param1, unk32 param2, unk8 param3, unk16 param4, unk16 param5) {} -ARM void UnkStruct_02035064::func_0203516c() {} -ARM s32 UnkStruct_02035064::vfunc_0() { +ARM void UnkStruct_02035064::func_0203516c() { + if (this->mUnk_78 != 0x0) { + if (this->mUnk_86 == false) { + this->mUnk_5c.func_0202e1e8(); + this->func_020352d8(); + } else { + this->mUnk_86 = false; + } + } +} + +ARM s32 UnkStruct_02035064::vfunc_00() { return this->mUnk_4c; } -ARM s32 UnkStruct_02035064::vfunc_4() { +ARM s32 UnkStruct_02035064::vfunc_04() { return this->mUnk_4e; } diff --git a/src/Main/Unknown/UnkStruct_02037750.cpp b/src/Main/Unknown/UnkStruct_02037750.cpp index b7342c49..9abe3745 100644 --- a/src/Main/Unknown/UnkStruct_02037750.cpp +++ b/src/Main/Unknown/UnkStruct_02037750.cpp @@ -1,7 +1,13 @@ #include "Unknown/UnkStruct_02037750.hpp" #include "Message/MessageManager.hpp" +#include "System/Random.hpp" +#include "Save/AdventureFlags.hpp" +#include "Actor/ActorManager.hpp" +#include "Item/ItemManager.hpp" extern "C" ARM unk32 func_02037628(u8*); +extern u8* data_027e0d54; +extern unk32* data_027e0cb4; ARM UnkStruct_02037750::UnkStruct_02037750(unk32 param1, unk32 param2) { s32 i; @@ -38,7 +44,142 @@ ARM bool UnkStruct_02037750::vfunc_24(unk32 param1) { return this->func_020385d0(param1, auStack_28) != 0; } -ARM unk8 UnkStruct_02037750::vfunc_28(s32 param1) {} +// non-matching +ARM unk32 UnkStruct_02037750::vfunc_28(s32 param1) { + u16 uVar1; + s64 lVar2; + Random *pRVar3; + char cVar4; + u16 uVar5; + int iVar6; + u32 uVar7; + UnkStruct_02037750_Callback1 pcVar8; + int iVar9; + u32 uVar10; + u32 uVar11; + bool bVar12; + + pRVar3 = gRandom; + uVar7 = (u32)*(u16 *)(param1 + 0x2); + + if (uVar7 >= 0xF && uVar7 <= 0x2E) { + pcVar8 = this->mUnk_04[((uVar7 - 0xF) << 0x1E) >> 0x1C]; + iVar9 = 0; + + if (pcVar8 != NULL) { + iVar9 = pcVar8(this->mUnk_14); + } + + return iVar9; + } + + if ((s32)uVar7 <= 0) { + switch(uVar7) { + case 0x0: + case 0x2f: + break; + case 0x7: + if (data_027e0d54[0xd] != 0) { + return -0x1; + } + + return (data_027e0d54[0xf] != 0); + case 0x1: + case 0x2: + case 0x3: + UnkStruct_020397f8* ret_3 = data_027e0c68.func_020366c4(); + + if (0x0 < ret_3->mUnk_15c) { + return -0x1; + } + + uVar7 = (param1 + 0x1); + + if (ret_3->mUnk_576 < uVar7) { + return ret_3->mUnk_576; + } + + if (uVar7 == 0x0) { + uVar10 = 0x0; + } else { + lVar2 = gRandom->mRandomValue * gRandom->mFactor; + uVar10 = gRandom->Next(lVar2); + // uVar10 = *(int *)((int)&gRandom->mAddend + 0x4) + + // *(int *)((int)&gRandom->mFactor + 0x4) * + // *(uint *)&gRandom->mRandomValue + *(uint *)&gRandom->mFactor * + // *(int *)((int)&gRandom->mRandomValue + 0x4) + + // (lVar2 >> 0x20) + (gRandom->mAddend << uVar11); // CARRY4 + + // part of the inline? + // *(uint *)&gRandom->mRandomValue = *(uint *)&gRandom->mAddend + uVar11; + // *(uint *)((int)&gRandom->mRandomValue + 0x4) = uVar10; + + if (uVar7 != 0x0) { + uVar10 = (uVar7 * uVar10 >> 0x20); + } + } + + return uVar10; + case 0x4: + return gAdventureFlags->Get(param1 + 0x4) != false; + case 0x5: + return gActorManager->func_ov00_020c3b2c(NULL) != 0; + case 0x6: + break; + case 0x8: + return (((data_027e0cb4[(param1 + 0x4) >> 5]) & 1) << ((param1 + 0x4) & 0x1f)) == 0x0; + case 0x9: + break; + case 0xa: + break; + case 0xb: + lVar2 = gRandom->mRandomValue * gRandom->mFactor; + uVar7 = lVar2; + uVar10 = gRandom->Next(uVar7); + + return (int)(uVar10 * 0x64 >> 0x20) < (param1 + 0x4); + case 0xc: + uVar7 = (param1 + 0x1); + if (uVar7 == 0x0) { + uVar10 = 0x0; + } else { + lVar2 = gRandom->mRandomValue * gRandom->mFactor; + uVar11 = lVar2; + uVar10 = gRandom->Next(uVar11); + + if (uVar7 != 0x0) { + uVar10 = (uVar7 * uVar10 >> 0x20); + } + } + return (int)(char)uVar10; + case 0xd: + return gItemManager->GetNumRupees() != 0; + case 0xe: + return gItemManager->HasItem(param1 + 0x4) != 0; + default: + if (uVar7 == 0x2f) { + return gItemManager->HasItem((param1 + 0x4) + 0x60) != 0; + } + break; + } + } + + uVar7 = (param1 + 0x1); + if (uVar7 == 0x0) { + uVar10 = 0x0; + } else { + lVar2 = gRandom->mRandomValue * gRandom->mFactor; + uVar11 = lVar2; + uVar10 = gRandom->Next(uVar11); + + if (uVar7 != 0x0) { + uVar10 = (uVar7 * uVar10 >> 0x20); + } + } + + return (int)(char)uVar10; +} + ARM unk32 UnkStruct_02037750::vfunc_2c(s32 param1) {} ARM LinkStateInteract *UnkStruct_02037750::GetLinkStateInteract() { @@ -83,7 +224,7 @@ ARM bool UnkStruct_020386d8::vfunc_24(unk32 param1) { return this->func_020385d0(param1, &this->mUnk_24.mUnk_00) != 0; } -ARM unk8 UnkStruct_020386d8::vfunc_28(s32 param1) { +ARM unk32 UnkStruct_020386d8::vfunc_28(s32 param1) { this->mUnk_20 = this->UnkStruct_02037750::vfunc_28(param1); return this->mUnk_20; }