Files
st/src/001_SceneInit/Item/ItemManager_001.cpp
T
Yanis f0dfb70749 Decompile overlay 1 (Part 4) (#97)
* UnkStruct_027e095c_001 OK

* UnkStruct_027e095c_001 OK (JP)

* SysNew_001 OK

* SaveManager_001 98%

* UnkStruct_027e09bc_001 OK

* MapObjectManager_001 OK

* ActorManager_001 OK

* remove useless thumb pragmas

* ItemManager_001 OK

* fix regressions

* fix build issues
2026-07-02 20:56:08 +02:00

142 lines
4.1 KiB
C++

#include "Actor/ActorManager.hpp"
#include "Item/ItemManager.hpp"
#include "Save/SaveManager.hpp"
#include "System/OverlayManager.hpp"
#include "Unknown/UnkStruct_027e09a0.hpp"
#include "Unknown/UnkStruct_027e09a4.hpp"
#include <nitro/mi.h>
extern unk32 data_ov000_020b3000;
Inventory::Inventory() {
this->mEquippedItem = ItemFlag_None;
this->mForcedItem = ItemFlag_None;
MI_CpuFill32(0, this->mFlags, sizeof(this->mFlags));
this->mNumRupees = 0;
this->mUnk_12 = 0;
this->mItemRestrictions = 0;
this->mTearsAmount = 0;
this->mKeyAmount = 0;
this->mQuiverCapacity = 0;
this->mBombBagCapacity = 0;
this->mArrowAmount = 0;
this->mBombAmount = 0;
for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) {
this->mPotions[i] = 0;
}
}
Inventory::~Inventory() {}
void Inventory::func_ov001_020bb8bc(const InvImportData *pSrc) {
this->mEquippedItem = pSrc->equippedItem;
MI_CpuCopy32((void *) &pSrc->flags, this->mFlags, sizeof(this->mFlags));
this->mNumRupees = pSrc->numRupees;
vu16 stack_unused = pSrc->unk_0E;
this->mUnk_12 = pSrc->unk_0E;
this->mQuiverCapacity = pSrc->quiverCapacity;
this->mBombBagCapacity = pSrc->bombBagCapacity;
this->mArrowAmount = pSrc->arrowAmount;
this->mBombAmount = pSrc->bombsAmount;
this->mPotions[0] = pSrc->potion1;
this->mPotions[1] = pSrc->potion2;
if ((s32) this->mEquippedItem < ItemFlag_None) {
this->mEquippedItem = ItemFlag_None;
}
if ((s32) this->mEquippedItem > ItemFlag_SandRod) {
this->mEquippedItem = ItemFlag_SandRod;
}
if ((s32) this->mEquippedItem != ItemFlag_None) {
if (!GET_FLAG(this->mFlags, this->mEquippedItem)) {
this->mEquippedItem = ItemFlag_None;
}
}
if (this->mEquippedItem == ItemFlag_None) {
for (u32 i = 0; i < ItemFlag_EQUIP_COUNT; i++) {
if (GET_FLAG(this->mFlags, i)) {
this->mEquippedItem = i;
break;
}
}
}
if (this->mNumRupees > MAX_RUPEES) {
this->mNumRupees = MAX_RUPEES;
}
if ((*(vu16 *) &this->mUnk_12 & 0x01) && !GET_FLAG(this->mFlags, ItemFlag_RecruitUniform)) {
this->mUnk_12 &= ~0x01;
}
if ((*(vu16 *) &this->mUnk_12 & 0x02) && !GET_FLAG(this->mFlags, ItemFlag_AncientShield)) {
this->mUnk_12 &= ~0x02;
}
if (this->mQuiverCapacity > UpgradeCapacity_Tier3) {
this->mQuiverCapacity = UpgradeCapacity_Tier3;
}
if (this->mBombBagCapacity > UpgradeCapacity_Tier3) {
this->mBombBagCapacity = UpgradeCapacity_Tier3;
}
if (this->mArrowAmount > this->GetQuiverCapacity()) {
this->mArrowAmount = this->GetQuiverCapacity();
}
if (this->mBombAmount > this->GetBombBagCapacity()) {
this->mBombAmount = this->GetBombBagCapacity();
}
}
void Inventory::func_ov001_020bb9f8() {
if (data_027e09a4->IsNotCutscene() && gOverlayManager.mLoadedOverlays[OverlaySlot_10] != OverlayIndex_PlayerPhantom) {
this->mTearsAmount = 0;
}
CourseListEntry *pEntry = data_027e09a0->GetCourseEntry(data_027e09a4->CurrentSceneIndex());
if (pEntry->saveCourseIndex < SaveCourseIndex_Max) {
this->mKeyAmount = gSaveManager.mUnk_000->unk_030[pEntry->saveCourseIndex].keyAmount;
} else {
this->mKeyAmount = 0;
}
if (this->mKeyAmount > MAX_KEYS) {
this->mKeyAmount = MAX_KEYS;
}
}
void Inventory::func_ov001_020bba54() {
this->mItemRestrictions = 0;
if (gOverlayManager.IsPlayerZelda()) {
this->func_ov096_02179b20();
}
}
void Inventory::func_ov001_020bba6c() {
struct {
void *ptr;
unk32 actorId;
} uStack_18;
uStack_18.ptr = &data_ov000_020b3000;
uStack_18.actorId = ActorId_SZKU;
Actor **ppActor = gpActorManager->func_01fff350(&uStack_18, gpActorManager->mActorTable);
while (ppActor != gpActorManager->mUnk_08) {
UNSET_FLAG((*ppActor)->mFlags, ActorFlag_Alive);
(*ppActor)->func_ov000_020984f0();
ppActor = gpActorManager->func_01fff350(&uStack_18, ppActor + 1);
}
}