mirror of
https://github.com/zeldaret/st
synced 2026-07-04 05:10:47 -04:00
f0dfb70749
* 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
142 lines
4.1 KiB
C++
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);
|
|
}
|
|
}
|