From a9de8ab2ddd7024fa22c337fe5501e205f20a231 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Fri, 7 Feb 2025 23:39:39 +0100 Subject: [PATCH] match `EquipHammer::IsUsable` --- config/eur/arm9/overlays/ov000/symbols.txt | 4 +- config/usa/arm9/overlays/ov000/symbols.txt | 4 +- include/Actor/Navi/ActorNavi.hpp | 6 ++- include/Actor/Navi/ActorNaviBase.hpp | 5 ++- include/DTCM/UnkStruct_027e0d38.hpp | 8 +++- include/DTCM/UnkStruct_027e0fd4.hpp | 2 + include/Item/ItemManager.hpp | 5 +++ include/Player/EquipHammer.hpp | 2 + include/Player/EquipItem.hpp | 2 +- include/Player/LinkStateBase.hpp | 1 + include/Player/LinkStateItem.hpp | 2 +- src/00_Core/Player/EquipItem.cpp | 2 +- src/59_Hammer/Player/EquipHammer.cpp | 47 +++++++++++++++++++++- 13 files changed, 78 insertions(+), 12 deletions(-) diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 5dca6757..4279427d 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -1783,7 +1783,7 @@ func_ov000_020a5d50 kind:function(arm,size=0xc) addr:0x20a5d50 func_ov000_020a5d5c kind:function(arm,size=0x18) addr:0x20a5d5c func_ov000_020a5d74 kind:function(arm,size=0x94) addr:0x20a5d74 func_ov000_020a5e08 kind:function(arm,size=0x94) addr:0x20a5e08 -func_ov000_020a5e9c kind:function(arm,size=0x5c) addr:0x20a5e9c +_ZN23UnkStruct_027e0d38_UnkC19func_ov000_020a5e9cEv kind:function(arm,size=0x5c) addr:0x20a5e9c func_ov000_020a5ef8 kind:function(arm,size=0x30) addr:0x20a5ef8 func_ov000_020a5f28 kind:function(arm,size=0x30) addr:0x20a5f28 func_ov000_020a5f58 kind:function(arm,size=0x14) addr:0x20a5f58 @@ -2743,7 +2743,7 @@ _ZNK9EquipItem8vfunc_4cEv kind:function(arm,size=0x8) addr:0x20be988 _ZN9EquipItem12GetPlayerPosEv kind:function(arm,size=0xc) addr:0x20be990 _ZN9EquipItem19func_ov000_020be99cEP5Vec3p kind:function(arm,size=0x48) addr:0x20be99c _ZN9EquipItem19func_ov000_020be9e4Eiiis kind:function(arm,size=0x14c) addr:0x20be9e4 -_ZN9EquipItem7GetAmmoEv kind:function(arm,size=0x2c) addr:0x20beb30 +_ZNK9EquipItem7GetAmmoEv kind:function(arm,size=0x2c) addr:0x20beb30 _ZN9EquipItem8GiveAmmoEj kind:function(arm,size=0x34) addr:0x20beb5c _ZNK9EquipItem9GetHitboxEP8Cylinder kind:function(arm,size=0x18) addr:0x20beb90 _ZN24UnkStruct_ov000_020beba8C1Ei kind:function(arm,size=0x18) addr:0x20beba8 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index a8665dd1..bee557ee 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -1783,7 +1783,7 @@ func_ov000_020a5d50 kind:function(arm,size=0xc) addr:0x20a5cf0 func_ov000_020a5d5c kind:function(arm,size=0x18) addr:0x20a5cfc func_ov000_020a5d74 kind:function(arm,size=0x94) addr:0x20a5d14 func_ov000_020a5e08 kind:function(arm,size=0x94) addr:0x20a5da8 -func_ov000_020a5e9c kind:function(arm,size=0x5c) addr:0x20a5e3c +_ZN23UnkStruct_027e0d38_UnkC19func_ov000_020a5e9cEv kind:function(arm,size=0x5c) addr:0x20a5e3c func_ov000_020a5ef8 kind:function(arm,size=0x30) addr:0x20a5e98 func_ov000_020a5f28 kind:function(arm,size=0x30) addr:0x20a5ec8 func_ov000_020a5f58 kind:function(arm,size=0x14) addr:0x20a5ef8 @@ -2645,7 +2645,7 @@ _ZNK9EquipItem8vfunc_4cEv kind:function(arm,size=0x8) addr:0x20be928 _ZN9EquipItem12GetPlayerPosEv kind:function(arm,size=0xc) addr:0x20be930 _ZN9EquipItem19func_ov000_020be99cEP5Vec3p kind:function(arm,size=0x48) addr:0x20be93c _ZN9EquipItem19func_ov000_020be9e4Eiiis kind:function(arm,size=0x14c) addr:0x20be984 -_ZN9EquipItem7GetAmmoEv kind:function(arm,size=0x2c) addr:0x20bead0 +_ZNK9EquipItem7GetAmmoEv kind:function(arm,size=0x2c) addr:0x20bead0 _ZN9EquipItem8GiveAmmoEj kind:function(arm,size=0x34) addr:0x20beafc _ZNK9EquipItem9GetHitboxEP8Cylinder kind:function(arm,size=0x18) addr:0x20beb30 _ZN24UnkStruct_ov000_020beba8C1Ei kind:function(arm,size=0x18) addr:0x20beb48 diff --git a/include/Actor/Navi/ActorNavi.hpp b/include/Actor/Navi/ActorNavi.hpp index 98ebcf51..dab24701 100644 --- a/include/Actor/Navi/ActorNavi.hpp +++ b/include/Actor/Navi/ActorNavi.hpp @@ -1,3 +1,7 @@ #pragma once -class ActorNavi; +#include "Actor/Navi/ActorNaviBase.hpp" + +class ActorNavi : public ActorNaviBase { + +}; diff --git a/include/Actor/Navi/ActorNaviBase.hpp b/include/Actor/Navi/ActorNaviBase.hpp index f3a45e8a..d42a82b3 100644 --- a/include/Actor/Navi/ActorNaviBase.hpp +++ b/include/Actor/Navi/ActorNaviBase.hpp @@ -10,17 +10,18 @@ class ActorNaviBase_Unk1 {}; class ActorNaviBase : public Actor { +public: /* 000 (base) */ /* 158 */ Vec3p mUnk_158; /* 164 */ unk32 mUnk_164; /* 168 */ ModelRender mUnk_168; /* 1c4 */ unk8 mUnk_1c4[0xc]; /* 1d0 */ void *mUnk_1d0; - /* 1d4 */ unk8 mUnk_1d4[0x30]; + /* 1d4 */ unk8 mUnk_1d4[0x40]; /* 214 */ unk16 mUnk_214; /* 216 */ unk8 mUnk_216[0xc]; /* 222 */ unk16 mUnk_222; - /* 224 */ unk8 mUnk_224[0x18]; + /* 224 */ unk8 mUnk_224[0x28]; /* 24c */ unk32 mUnk_24c; /* 250 */ unk32 mUnk_250; /* 254 */ unk32 mUnk_254; diff --git a/include/DTCM/UnkStruct_027e0d38.hpp b/include/DTCM/UnkStruct_027e0d38.hpp index a36af0fe..a462a6e8 100644 --- a/include/DTCM/UnkStruct_027e0d38.hpp +++ b/include/DTCM/UnkStruct_027e0d38.hpp @@ -3,12 +3,18 @@ #include "global.h" #include "types.h" +struct UnkStruct_027e0d38_UnkC { + /* 00 */ unk32 mUnk_00; + + unk32 func_ov000_020a5e9c(void); +}; + struct UnkStruct_027e0d38 { /* 00 */ unk8 mUnk_00; /* 01 */ unk8 mUnk_01[3]; // padding? /* 04 */ unk32 mUnk_04; /* 08 */ unk32 mUnk_08; - /* 0c */ unk32 mUnk_0c; + /* 0c */ UnkStruct_027e0d38_UnkC mUnk_0c; /* 10 */ unk32 mUnk_10; /* 14 */ unk32 mUnk_14; /* 18 */ unk32 mUnk_18; diff --git a/include/DTCM/UnkStruct_027e0fd4.hpp b/include/DTCM/UnkStruct_027e0fd4.hpp index 4d931bd5..42e254ea 100644 --- a/include/DTCM/UnkStruct_027e0fd4.hpp +++ b/include/DTCM/UnkStruct_027e0fd4.hpp @@ -128,3 +128,5 @@ public: void func_ov000_020b6ba4(s32 param1, s32 param2); bool func_ov000_020b6e70(); }; + +extern UnkStruct_027e0fd4* data_027e0fd4; diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index c0a84aa7..3d5340ce 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -108,6 +108,11 @@ public: ~ItemManager(); void Init(); + // Access to members + inline u8 GetUnk_14d(void) { + return mUnk_14d; + } + // Save/load void Save(SaveItemManager *save); void Load(const SaveItemManager *save); diff --git a/include/Player/EquipHammer.hpp b/include/Player/EquipHammer.hpp index 0ac23473..a367090d 100644 --- a/include/Player/EquipHammer.hpp +++ b/include/Player/EquipHammer.hpp @@ -43,3 +43,5 @@ public: void func_ov059_02198fa8(unk32 param1); bool func_ov059_02198fe0(); }; + +extern LinkStateItem *GetLinkStateItem(); diff --git a/include/Player/EquipItem.hpp b/include/Player/EquipItem.hpp index 6702bc48..79165634 100644 --- a/include/Player/EquipItem.hpp +++ b/include/Player/EquipItem.hpp @@ -41,5 +41,5 @@ public: Vec3p *GetPlayerPos(); void func_ov000_020be99c(Vec3p *param1); void func_ov000_020be9e4(s32 param1, s32 param2, s32 param3, s16 param4); - u16 GetAmmo(); + s16 GetAmmo() const; }; diff --git a/include/Player/LinkStateBase.hpp b/include/Player/LinkStateBase.hpp index e099c021..470f6096 100644 --- a/include/Player/LinkStateBase.hpp +++ b/include/Player/LinkStateBase.hpp @@ -154,4 +154,5 @@ public: LinkStateBase *GetLinkState(s32 index); +extern LinkStateBase *gLinkState; extern LinkStateBase **gLinkStates; diff --git a/include/Player/LinkStateItem.hpp b/include/Player/LinkStateItem.hpp index 9a5d4585..c96f75d1 100644 --- a/include/Player/LinkStateItem.hpp +++ b/include/Player/LinkStateItem.hpp @@ -19,7 +19,7 @@ public: /* 20 */ unk16 mUnk_20; /* 22 */ unk8 mUnk_22[2]; /* 24 */ s8 mUnk_24; - /* 25 */ unk8 mUnk_25[7]; + /* 25 */ u8 mUnk_25[7]; /* 2c */ unk16 mUnk_2c; /* 2e */ unk8 mUnk_2e[2]; /* 30 */ void *mUnk_30; diff --git a/src/00_Core/Player/EquipItem.cpp b/src/00_Core/Player/EquipItem.cpp index 9256b13a..8751b91d 100644 --- a/src/00_Core/Player/EquipItem.cpp +++ b/src/00_Core/Player/EquipItem.cpp @@ -14,6 +14,6 @@ s32 EquipItem::vfunc_4c() const {} Vec3p *EquipItem::GetPlayerPos() {} void EquipItem::func_ov000_020be99c(Vec3p *param1) {} void EquipItem::func_ov000_020be9e4(s32 param1, s32 param2, s32 param3, s16 param4) {} -u16 EquipItem::GetAmmo() {} +s16 EquipItem::GetAmmo() const {} void EquipItem::GiveAmmo(u32 amount) {} bool EquipItem::GetHitbox(Cylinder *hitbox) const {} diff --git a/src/59_Hammer/Player/EquipHammer.cpp b/src/59_Hammer/Player/EquipHammer.cpp index 85a024a3..947f3132 100644 --- a/src/59_Hammer/Player/EquipHammer.cpp +++ b/src/59_Hammer/Player/EquipHammer.cpp @@ -1,13 +1,58 @@ #include "Player/EquipHammer.hpp" #include "Player/LinkStateItem.hpp" +#include "Player/PlayerLink.hpp" #include "Map/MapManager.hpp" #include "Item/ItemManager.hpp" +#include "DTCM/UnkStruct_027e0fd4.hpp" +#include "DTCM/UnkStruct_027e0d38.hpp" extern "C" void ApproachAngle_thunk(s16* src, s16* dst, u32 param3); extern "C" void func_ov000_020b853c(void); extern unk32 data_ov059_0219b180; -ARM bool EquipHammer::IsUsable(unk32 param1) const {} +ARM bool EquipHammer::IsUsable(unk32 param1) const { + ActorNavi *pAVar3; + + if (this->GetAmmo() <= 0) { + return false; + } + + if (data_027e0fd4->mUnk_0f0 != 0 || data_027e0fd4->mUnk_0f8 != 0) { + return false; + } + + pAVar3 = gItemManager->GetFairy(FairyId_Courage); + + if (pAVar3 == NULL || pAVar3->mUnk_3b8 != 0) { + return false; + } + + if (gItemManager->GetUnk_14d() != 0) { + return false; + } + + if (param1 != 0) { + LinkStateItem* pLVar4 = GetLinkStateItem(); + + if (pLVar4->mUnk_25[2] != 0 && pLVar4->mUnk_25[3] == 0) { + return false; + } + + if (data_027e0fd4->mUnk_0c6 < 0 && data_027e0d38->mUnk_0c.func_ov000_020a5e9c() != 0x2f) { + bool bVar5 = false; + + if (gPlayerLink->GetStateId() == 4 && gLinkState != NULL && gLinkState->mSubState == 0) { + bVar5 = true; + } + + if (!bVar5) { + return false; + } + } + } + + return true; +} ARM LinkStateItem *GetLinkStateItem() { return (LinkStateItem*)GetLinkState(1);