mirror of
https://github.com/zeldaret/st
synced 2026-05-27 16:13:13 -04:00
merge and improve nepe's work
Co-authored-by: NEPETAISCUTE <58563578+NEPETAISCUTE@users.noreply.github.com>
This commit is contained in:
@@ -5,6 +5,7 @@ ph_*/
|
||||
*bios.bin
|
||||
/m2ctx
|
||||
*.sav
|
||||
*.ml*
|
||||
*.xMAP
|
||||
objdiff.json
|
||||
/objdiff-cli
|
||||
|
||||
@@ -8,3 +8,6 @@
|
||||
src/000_Second/Actor/Actor.cpp:
|
||||
.text start:0x02098388 end:0x02098654
|
||||
.data start:0x020b30e4 end:0x020b3148
|
||||
|
||||
src/000_Second/Item/ItemManager.cpp:
|
||||
.text start:0x020a865c end:0x020aa224
|
||||
|
||||
@@ -2993,22 +2993,22 @@ func_ov000_020a8524 kind:function(arm,size=0x48) addr:0x020a8524
|
||||
func_ov000_020a856c kind:function(arm,size=0x50) addr:0x020a856c
|
||||
func_ov000_020a85bc kind:function(thumb,size=0x80) addr:0x020a85bc
|
||||
func_ov000_020a863c kind:function(arm,size=0x20) addr:0x020a863c
|
||||
func_ov000_020a865c kind:function(arm,size=0x24) addr:0x020a865c
|
||||
_ZN11ItemManager19func_ov000_020a865cEj kind:function(arm,size=0x24) addr:0x020a865c
|
||||
func_ov000_020a8680 kind:function(arm,size=0x24) addr:0x020a8680
|
||||
func_ov000_020a86a4 kind:function(arm,size=0x2c) addr:0x020a86a4
|
||||
func_ov000_020a86d0 kind:function(arm,size=0x58) addr:0x020a86d0
|
||||
func_ov000_020a8728 kind:function(arm,size=0x20) addr:0x020a8728
|
||||
func_ov000_020a8748 kind:function(arm,size=0x20) addr:0x020a8748
|
||||
_ZN11ItemManager19func_ov000_020a86d0Ej kind:function(arm,size=0x58) addr:0x020a86d0
|
||||
_ZN11ItemManager19func_ov000_020a8728Ev kind:function(arm,size=0x20) addr:0x020a8728
|
||||
_ZN11ItemManager19func_ov000_020a8748Ev kind:function(arm,size=0x20) addr:0x020a8748
|
||||
func_ov000_020a8768 kind:function(arm,size=0x60) addr:0x020a8768
|
||||
func_ov000_020a87c8 kind:function(arm,size=0x24) addr:0x020a87c8
|
||||
func_ov000_020a87ec kind:function(arm,size=0x34) addr:0x020a87ec
|
||||
func_ov000_020a8820 kind:function(arm,size=0x34) addr:0x020a8820
|
||||
_ZN11ItemManager19func_ov000_020a87c8Ei kind:function(arm,size=0x24) addr:0x020a87c8
|
||||
_ZN11ItemManager19func_ov000_020a87ecEi kind:function(arm,size=0x34) addr:0x020a87ec
|
||||
_ZN11ItemManager19func_ov000_020a8820Ei kind:function(arm,size=0x34) addr:0x020a8820
|
||||
func_ov000_020a8854 kind:function(arm,size=0x38) addr:0x020a8854
|
||||
func_ov000_020a888c kind:function(arm,size=0x3c) addr:0x020a888c
|
||||
func_ov000_020a88c8 kind:function(arm,size=0x2c) addr:0x020a88c8
|
||||
func_ov000_020a88f4 kind:function(arm,size=0x2c) addr:0x020a88f4
|
||||
func_ov000_020a8920 kind:function(arm,size=0x28) addr:0x020a8920
|
||||
func_ov000_020a8948 kind:function(arm,size=0x2c) addr:0x020a8948
|
||||
_ZN11ItemManager19func_ov000_020a888cEj kind:function(arm,size=0x3c) addr:0x020a888c
|
||||
_ZN11ItemManager19func_ov000_020a88c8Ev kind:function(arm,size=0x2c) addr:0x020a88c8
|
||||
_ZN11ItemManager19func_ov000_020a88f4Ev kind:function(arm,size=0x2c) addr:0x020a88f4
|
||||
_ZN11ItemManager19func_ov000_020a8920Ev kind:function(arm,size=0x28) addr:0x020a8920
|
||||
_ZN11ItemManager19func_ov000_020a8948Ev kind:function(arm,size=0x2c) addr:0x020a8948
|
||||
func_ov000_020a8974 kind:function(arm,size=0x10) addr:0x020a8974
|
||||
func_ov000_020a8984 kind:function(arm,size=0x38) addr:0x020a8984
|
||||
func_ov000_020a89bc kind:function(thumb,size=0x18) addr:0x020a89bc
|
||||
@@ -3082,17 +3082,17 @@ func_ov000_020a9b2c kind:function(arm,size=0x10) addr:0x020a9b2c
|
||||
func_ov000_020a9b3c kind:function(arm,size=0x10) addr:0x020a9b3c
|
||||
func_ov000_020a9b4c kind:function(arm,size=0x100) addr:0x020a9b4c
|
||||
func_ov000_020a9c4c kind:function(arm,size=0x18) addr:0x020a9c4c
|
||||
func_ov000_020a9c64 kind:function(arm,size=0x2c) addr:0x020a9c64
|
||||
func_ov000_020a9c90 kind:function(arm,size=0x14) addr:0x020a9c90
|
||||
func_ov000_020a9ca4 kind:function(arm,size=0x18) addr:0x020a9ca4
|
||||
func_ov000_020a9cbc kind:function(arm,size=0x40) addr:0x020a9cbc
|
||||
_ZN11ItemManager19func_ov000_020a9c64Ev kind:function(arm,size=0x2c) addr:0x020a9c64
|
||||
_ZN11ItemManager19func_ov000_020a9c90Es kind:function(arm,size=0x14) addr:0x020a9c90
|
||||
_ZN11ItemManager19func_ov000_020a9ca4Es kind:function(arm,size=0x18) addr:0x020a9ca4
|
||||
_ZN11ItemManager19func_ov000_020a9cbcEsi kind:function(arm,size=0x40) addr:0x020a9cbc
|
||||
func_ov000_020a9cfc kind:function(arm,size=0x7c) addr:0x020a9cfc
|
||||
func_ov000_020a9d78 kind:function(arm,size=0x9c) addr:0x020a9d78
|
||||
func_ov000_020a9e14 kind:function(arm,size=0x9c) addr:0x020a9e14
|
||||
func_ov000_020a9eb0 kind:function(arm,size=0x9c) addr:0x020a9eb0
|
||||
func_ov000_020a9f4c kind:function(arm,size=0xe0) addr:0x020a9f4c
|
||||
func_ov000_020aa02c kind:function(arm,size=0x80) addr:0x020aa02c
|
||||
func_ov000_020aa0ac kind:function(arm,size=0x154) addr:0x020aa0ac
|
||||
_ZN11ItemManager19func_ov000_020aa0acEj kind:function(arm,size=0x154) addr:0x020aa0ac
|
||||
func_ov000_020aa200 kind:function(arm,size=0x10) addr:0x020aa200
|
||||
func_ov000_020aa210 kind:function(arm,size=0x14) addr:0x020aa210
|
||||
func_ov000_020aa224 kind:function(arm,size=0x14) addr:0x020aa224
|
||||
|
||||
@@ -1,5 +1,171 @@
|
||||
#pragma once
|
||||
|
||||
#include "flags.h"
|
||||
#include "types.h"
|
||||
|
||||
#define MAX_KEYS 8
|
||||
|
||||
typedef u32 ItemFlag;
|
||||
enum ItemFlag_ {
|
||||
ItemFlag_Whirlwind = FLAG(0, 0),
|
||||
ItemFlag_Boomerang = FLAG(0, 1),
|
||||
ItemFlag_Whip = FLAG(0, 2),
|
||||
ItemFlag_Bow = FLAG(0, 3),
|
||||
ItemFlag_Bombs = FLAG(0, 4),
|
||||
ItemFlag_SandRod = FLAG(0, 5),
|
||||
ItemFlag_EQUIP_START = ItemFlag_Whirlwind,
|
||||
ItemFlag_EQUIP_END = ItemFlag_SandRod + 1,
|
||||
ItemFlag_EQUIP_COUNT = ItemFlag_EQUIP_END - ItemFlag_EQUIP_START,
|
||||
|
||||
ItemFlag_Shield = FLAG(0, 6),
|
||||
ItemFlag_Sword = FLAG(0, 7),
|
||||
ItemFlag_LokomoSword = FLAG(0, 8),
|
||||
ItemFlag_Soldier = FLAG(0, 9),
|
||||
ItemFlag_Scroll1 = FLAG(0, 10),
|
||||
ItemFlag_Scroll2 = FLAG(0, 11),
|
||||
ItemFlag_AncientShield = FLAG(0, 12),
|
||||
ItemFlag_PanFlute = FLAG(0, 13),
|
||||
};
|
||||
|
||||
typedef u32 ItemId;
|
||||
enum ItemId_ {
|
||||
ItemId_None = -1,
|
||||
ItemId_Nothing = 0,
|
||||
ItemId_NormalShield = 1,
|
||||
ItemId_NormalSword = 2,
|
||||
ItemId_Whirlwind = 3,
|
||||
ItemId_BombBag = 4,
|
||||
ItemId_NormalBow = 5,
|
||||
ItemId_Boomerang = 6,
|
||||
ItemId_Whip = 7,
|
||||
ItemId_SandRod = 8,
|
||||
ItemId_NormalKey = 10,
|
||||
ItemId_BossKey = 11,
|
||||
ItemId_GreenRupee = 12,
|
||||
ItemId_BlueRupee = 13,
|
||||
ItemId_RedRupee = 14,
|
||||
ItemId_BigGreenRupee = 15,
|
||||
ItemId_BigRedRupee = 16,
|
||||
ItemId_BigGoldRupee = 17,
|
||||
ItemId_ForceGem13 = 18, // kidnapped papuchia man
|
||||
ItemId_ForceGem14 = 19, // ice for fish seller
|
||||
ItemId_ForceGem8 = 20, // goron lava house ice
|
||||
ItemId_ForestGlyph = 21,
|
||||
ItemId_SnowGlyph = 22,
|
||||
ItemId_OceanGlyph = 23,
|
||||
ItemId_FireGlyph = 24,
|
||||
ItemId_FinalTrack = 30, // unlocks the endgame portal
|
||||
ItemId_ForceGemX = 35, // rightmost fire gem
|
||||
ItemId_ForceGemXx = 36, // right snow gem
|
||||
ItemId_ForceGemXxx = 37, // top fire gem
|
||||
ItemId_RecruitUniform = 38,
|
||||
ItemId_PostmasterLetter = 39,
|
||||
ItemId_HeartContainer = 40,
|
||||
ItemId_QuiverMedium = 41,
|
||||
ItemId_BombBagMedium = 42,
|
||||
ItemId_ForceGem_43 = 43, // one of rightmost forest
|
||||
ItemId_ForceGem_44 = 44, // the other rightmost forest, but more middle than top
|
||||
ItemId_ForceGem_45 = 45, // the bottom-rightmost forest
|
||||
ItemId_ForceGem_46 = 46, // the top-rightmost fire
|
||||
ItemId_ForceGem_47 = 47, // the center forest
|
||||
ItemId_ForceGem_48 = 48, // the middle-left forest
|
||||
ItemId_ForceGem_49 = 49, // the below middle-left forest
|
||||
ItemId_ForceGem_50 = 50,
|
||||
ItemId_ForceGem_51 = 51,
|
||||
ItemId_ForceGem_52 = 52,
|
||||
ItemId_ForceGem_53 = 53,
|
||||
ItemId_ForceGem_54 = 54,
|
||||
ItemId_ForceGem_55 = 55,
|
||||
ItemId_ForceGem_56 = 56,
|
||||
ItemId_ForceGem_57 = 57,
|
||||
ItemId_ForceGem_58 = 58,
|
||||
ItemId_ForceGem_59 = 59,
|
||||
ItemId_ForceGem_60 = 60,
|
||||
ItemId_ForceGem_61 = 61,
|
||||
ItemId_PanFlute = 62,
|
||||
ItemId_StampBook = 63,
|
||||
ItemId_LightBow = 64,
|
||||
ItemId_LocomoSword = 65,
|
||||
ItemId_TenPriceCard = 66,
|
||||
ItemId_RedPotion = 67,
|
||||
ItemId_PurplePotion = 68,
|
||||
ItemId_YellowPotion = 69,
|
||||
ItemId_DemonFossil = 70,
|
||||
ItemId_StalfosSkull = 71,
|
||||
ItemId_StarFragment = 72,
|
||||
ItemId_BeeLarvae = 73,
|
||||
ItemId_WoodHeart = 74,
|
||||
ItemId_DarkPearlLoop = 75,
|
||||
ItemId_WhitePearlLoop = 76,
|
||||
ItemId_RutoCrown = 77,
|
||||
ItemId_DragonScale = 78,
|
||||
ItemId_PirateNecklace = 79,
|
||||
ItemId_PalaceDish = 80,
|
||||
ItemId_GoronAmber = 81,
|
||||
ItemId_MysticJade = 82,
|
||||
ItemId_AncientCoin = 83,
|
||||
ItemId_PricelessStone = 84,
|
||||
ItemId_RegalRing = 85,
|
||||
ItemId_ArrowsRefill = 86,
|
||||
ItemId_BombsRefill = 87,
|
||||
ItemId_SoldOutSign = 88,
|
||||
ItemId_AncientShield = 89,
|
||||
ItemId_QuiverLarge = 90,
|
||||
ItemId_BombBagLarge = 91,
|
||||
ItemId_RandCommonTreasure = 92,
|
||||
ItemId_RandUncommonTreasure = 93,
|
||||
ItemId_RandRareTreasure = 94,
|
||||
ItemId_RandLegendaryTreasure = 95,
|
||||
ItemId_TearLight = 96,
|
||||
ItemId_LightCompass = 97,
|
||||
ItemId_SuperSpinScroll = 98,
|
||||
ItemId_BeamScroll = 99,
|
||||
ItemId_LinebeckLetter = 100,
|
||||
ItemId_PanFluteSong_101 = 101,
|
||||
ItemId_PanFluteSong_102 = 102,
|
||||
ItemId_PanFluteSong_103 = 103,
|
||||
ItemId_PanFluteSong_104 = 104,
|
||||
ItemId_PanFluteSong_105 = 105,
|
||||
ItemId_RabbitNet = 106,
|
||||
ItemId_BeedleCard = 107,
|
||||
ItemId_SilverCard = 108,
|
||||
ItemId_GoldCard = 109,
|
||||
ItemId_PlatinumCard = 110,
|
||||
ItemId_DiamondCard = 111,
|
||||
ItemId_FreebieCard = 112,
|
||||
ItemId_QuintupleCard = 113,
|
||||
ItemId_CarbenLetter = 114,
|
||||
ItemId_RecruitUniform2 = 115,
|
||||
ItemId_EngineerUniform = 116,
|
||||
};
|
||||
|
||||
#define MAX_TREASURE 99
|
||||
typedef s16 TreasureType;
|
||||
enum TreasureType_ {
|
||||
TreasureType_None = -1,
|
||||
TreasureType_DemonFossil = 0,
|
||||
TreasureType_StalfosSkull = 1,
|
||||
TreasureType_StarFragment = 2,
|
||||
TreasureType_BeeLarvae = 3,
|
||||
TreasureType_WoodHeart = 4,
|
||||
TreasureType_DarkPearlLoop = 5,
|
||||
TreasureType_WhitePearlLoop = 6,
|
||||
TreasureType_RutoCrown = 7,
|
||||
TreasureType_DragonScale = 8,
|
||||
TreasureType_PirateNecklace = 9,
|
||||
TreasureType_PalaceDish = 10,
|
||||
TreasureType_GoronAmber = 11,
|
||||
TreasureType_MysticJade = 12,
|
||||
TreasureType_AncientCoin = 13,
|
||||
TreasureType_PricelessStone = 14,
|
||||
TreasureType_RegalRing = 15
|
||||
};
|
||||
|
||||
#define MAX_POTIONS 2
|
||||
typedef u32 PotionType;
|
||||
enum PotionType_ {
|
||||
PotionType_None = 0,
|
||||
PotionType_Red = 1,
|
||||
PotionType_Purple = 2, // auto revives when you die
|
||||
PotionType_Yellow = 3,
|
||||
};
|
||||
|
||||
@@ -8,24 +8,42 @@ class ItemManager : public SysObject {
|
||||
public:
|
||||
/* 00 */ unk32 mEquippedItem;
|
||||
/* 04 */ unk32 mForcedItem;
|
||||
/* 08 */ unk16 mUnk_08; // inventory items bitfield
|
||||
/* 0a */ unk16 mUnk_0a; // collection/equipment bitfield
|
||||
/* 0c */ unk32 mUnk_0c;
|
||||
/* 08 */ u32 mUnk_08[2]; // inventory items bitfield & collection/equipment bitfield
|
||||
/* 10 */ unk16 mNumRupees;
|
||||
/* 12 */ unk16 mUnk_12; // "toggle bitfield"
|
||||
/* 14 */ unk16 mItemRestrictions; // bitfield
|
||||
/* 16 */ unk8 mTearsAmount; // number of tears of light
|
||||
/* 17 */ unk8 mKeyAmount; // number of small keys
|
||||
/* 18 */ unk8 mQuiverCapacity;
|
||||
/* 19 */ unk8 mBombBagCapacity;
|
||||
/* 1a */ unk8 mArrowAmount;
|
||||
/* 1b */ unk8 mBombAmount;
|
||||
/* 1c */ unk8 mPotions[MAX_POTIONS];
|
||||
/* 17 */ u8 mKeyAmount; // number of small keys
|
||||
/* 18 */ u8 mQuiverCapacity;
|
||||
/* 19 */ u8 mBombBagCapacity;
|
||||
/* 1a */ u8 mArrowAmount;
|
||||
/* 1b */ u8 mBombAmount;
|
||||
/* 1c */ u8 mPotions[MAX_POTIONS];
|
||||
/* 1e */ unk16 mUnk_1e;
|
||||
/* 20 */ unk32 *mUnk_20;
|
||||
/* 24 */ unk32 mUnk_24;
|
||||
/* 28 */
|
||||
/* 28 */ unk8 mUnk_28[0x3C - 0x28];
|
||||
/* 3c */ TreasureType mUnk_3c[16]; // treasures
|
||||
/* 5c */
|
||||
|
||||
ItemManager();
|
||||
~ItemManager();
|
||||
|
||||
void func_ov000_020a865c(u32 bitIdx);
|
||||
u32 func_ov000_020a86d0(ItemFlag itemFlag);
|
||||
u8 func_ov000_020a8728();
|
||||
u8 func_ov000_020a8748();
|
||||
void func_ov000_020a87c8(s32 amount);
|
||||
void func_ov000_020a87ec(s32 amount);
|
||||
void func_ov000_020a8820(s32 amount);
|
||||
void func_ov000_020a888c(PotionType type);
|
||||
bool func_ov000_020a88c8();
|
||||
bool func_ov000_020a88f4();
|
||||
void func_ov000_020a8920();
|
||||
bool func_ov000_020a8948();
|
||||
bool func_ov000_020a9c64();
|
||||
unk32 func_ov000_020a9c90(TreasureType type);
|
||||
bool func_ov000_020a9ca4(TreasureType type);
|
||||
void func_ov000_020a9cbc(TreasureType type, s32 amount);
|
||||
void func_ov000_020aa0ac(ItemId itemId);
|
||||
};
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
|
||||
/**
|
||||
* Flags value format:
|
||||
* - 0x001F: 0000 0000 0001 1111 -> the shift value to read or write the flag's bit
|
||||
* - 0xFFE0: 1111 1111 1110 0000 -> index of the value in the array
|
||||
*
|
||||
* `FLAG` is a macro that allows you to get the final value from the index and the slot number.
|
||||
*/
|
||||
|
||||
#define GET_FLAG(arr, pos) (((arr)[((u32) (pos)) >> 5] & (1 << ((pos) & 0x1F))) != 0)
|
||||
#define SET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] |= 1 << ((pos) & 0x1F))
|
||||
#define UNSET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] &= ~(1 << ((pos) & 0x1F)))
|
||||
#define FLAG(index, pos) (((index) << 5) | ((pos) & 0x1F))
|
||||
@@ -1,10 +1,6 @@
|
||||
#ifndef GLOBAL_H
|
||||
#define GLOBAL_H
|
||||
|
||||
#define GET_FLAG(arr, pos) (((1 << ((pos) & 0x1f)) & (arr)[((u32) (pos)) >> 5]) != 0)
|
||||
#define SET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] |= 1 << ((pos) & 0x1f))
|
||||
#define RESET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] &= ~(1 << ((pos) & 0x1f)))
|
||||
|
||||
#define ARRAY_LEN_U(arr) (u32)((sizeof(arr) / sizeof(*arr)))
|
||||
#define ARRAY_LEN(arr) (s32)((sizeof(arr) / sizeof(*arr)))
|
||||
|
||||
@@ -22,8 +18,4 @@
|
||||
#pragma define_section sbss ".data" \
|
||||
".sbss"
|
||||
|
||||
// Force variables to be in .data by using #pragma section force_data begin|end
|
||||
#pragma define_section force_data ".data" \
|
||||
".data"
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
#include "Item/ItemManager.hpp"
|
||||
#include "global.h"
|
||||
|
||||
// quiver and bomb bag tiers
|
||||
extern u8 data_ov000_020afc40[3];
|
||||
extern u8 data_ov000_020afc43[3];
|
||||
|
||||
// removeEquipmentItem
|
||||
ARM void ItemManager::func_ov000_020a865c(u32 bitIdx) {
|
||||
UNSET_FLAG(this->mUnk_08, bitIdx);
|
||||
}
|
||||
|
||||
// getItemAmmo
|
||||
ARM u32 ItemManager::func_ov000_020a86d0(ItemFlag itemFlag) {
|
||||
bool canUse = GET_FLAG(this->mUnk_08, itemFlag);
|
||||
|
||||
switch (itemFlag) {
|
||||
case ItemFlag_Bow:
|
||||
return canUse ? this->mArrowAmount : 0;
|
||||
case ItemFlag_Bombs:
|
||||
return canUse ? this->mBombAmount : 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return canUse;
|
||||
}
|
||||
|
||||
// getMaxArrows
|
||||
ARM u8 ItemManager::func_ov000_020a8728() {
|
||||
if (GET_FLAG(this->mUnk_08, ItemFlag_Bow) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return data_ov000_020afc40[this->mQuiverCapacity];
|
||||
}
|
||||
|
||||
// getMaxBombs
|
||||
ARM u8 ItemManager::func_ov000_020a8748() {
|
||||
if (GET_FLAG(this->mUnk_08, ItemFlag_Bombs) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return data_ov000_020afc43[this->mBombBagCapacity];
|
||||
}
|
||||
|
||||
// addKeys
|
||||
ARM void ItemManager::func_ov000_020a87c8(s32 amount) {
|
||||
s32 newAmount = this->mKeyAmount + amount;
|
||||
|
||||
if (newAmount > MAX_KEYS) {
|
||||
newAmount = MAX_KEYS;
|
||||
} else if (newAmount < 0) {
|
||||
newAmount = 0;
|
||||
}
|
||||
|
||||
this->mKeyAmount = newAmount;
|
||||
}
|
||||
|
||||
// gainArrows
|
||||
ARM void ItemManager::func_ov000_020a87ec(s32 amount) {
|
||||
s32 maxArrows = this->func_ov000_020a8728();
|
||||
s32 newAmount = this->mArrowAmount + amount;
|
||||
|
||||
if (newAmount > maxArrows) {
|
||||
newAmount = maxArrows;
|
||||
} else if (newAmount < 0) {
|
||||
newAmount = 0;
|
||||
}
|
||||
|
||||
this->mArrowAmount = newAmount;
|
||||
}
|
||||
|
||||
// gainBombs
|
||||
ARM void ItemManager::func_ov000_020a8820(s32 amount) {
|
||||
s32 maxBombs = this->func_ov000_020a8748();
|
||||
s32 newAmount = this->mBombAmount + amount;
|
||||
|
||||
if (newAmount > maxBombs) {
|
||||
newAmount = maxBombs;
|
||||
} else if (newAmount < 0) {
|
||||
newAmount = 0;
|
||||
}
|
||||
|
||||
this->mBombAmount = newAmount;
|
||||
}
|
||||
|
||||
// gainPotion
|
||||
ARM void ItemManager::func_ov000_020a888c(PotionType type) {
|
||||
switch (type) {
|
||||
case PotionType_Red:
|
||||
case PotionType_Purple:
|
||||
case PotionType_Yellow:
|
||||
for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) {
|
||||
if (this->mPotions[i] == PotionType_None) {
|
||||
this->mPotions[i] = type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// hasPotion
|
||||
ARM bool ItemManager::func_ov000_020a88c8() {
|
||||
for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) {
|
||||
if (this->mPotions[i] != PotionType_None) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// hasPurplePotion
|
||||
ARM bool ItemManager::func_ov000_020a88f4() {
|
||||
for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) {
|
||||
if (this->mPotions[i] == PotionType_Purple) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// removePurplePotion
|
||||
ARM void ItemManager::func_ov000_020a8920() {
|
||||
for (s32 i = ARRAY_LEN(this->mPotions) - 1; i >= 0; i--) {
|
||||
if (this->mPotions[i] == PotionType_Purple) {
|
||||
this->mPotions[i] = PotionType_None;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// potionInventoryFull
|
||||
ARM bool ItemManager::func_ov000_020a8948() {
|
||||
for (u32 i = 0; i < ARRAY_LEN(this->mPotions); i++) {
|
||||
if (this->mPotions[i] == PotionType_None) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// hasAnyTreasure
|
||||
ARM bool ItemManager::func_ov000_020a9c64() {
|
||||
for (s32 i = 0; i < ARRAY_LEN(this->mUnk_3c); i++) {
|
||||
if (this->mUnk_3c[i] >= 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// getTreasureAmount
|
||||
ARM unk32 ItemManager::func_ov000_020a9c90(TreasureType type) {
|
||||
if (this->mUnk_3c[type] >= 0) {
|
||||
return this->mUnk_3c[type];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// isTreasureAmountMaxed
|
||||
ARM bool ItemManager::func_ov000_020a9ca4(TreasureType type) {
|
||||
return this->func_ov000_020a9c90(type) >= MAX_TREASURE;
|
||||
}
|
||||
|
||||
// gainTreasure
|
||||
ARM void ItemManager::func_ov000_020a9cbc(TreasureType type, s32 amount) {
|
||||
s32 newAmount;
|
||||
|
||||
if (this->mUnk_3c[type] < 0) {
|
||||
this->mUnk_3c[type] = 0;
|
||||
}
|
||||
|
||||
newAmount = this->mUnk_3c[type] + amount;
|
||||
|
||||
if (newAmount > MAX_TREASURE) {
|
||||
newAmount = MAX_TREASURE;
|
||||
} else if (newAmount < 0) {
|
||||
newAmount = 0;
|
||||
}
|
||||
|
||||
this->mUnk_3c[type] = newAmount;
|
||||
}
|
||||
|
||||
// gainTreasureFromItem
|
||||
ARM void ItemManager::func_ov000_020aa0ac(ItemId itemId) {
|
||||
switch (itemId) {
|
||||
case ItemId_DemonFossil:
|
||||
this->func_ov000_020a9cbc(TreasureType_DemonFossil, 1);
|
||||
break;
|
||||
case ItemId_StalfosSkull:
|
||||
this->func_ov000_020a9cbc(TreasureType_StalfosSkull, 1);
|
||||
break;
|
||||
case ItemId_StarFragment:
|
||||
this->func_ov000_020a9cbc(TreasureType_StarFragment, 1);
|
||||
break;
|
||||
case ItemId_BeeLarvae:
|
||||
this->func_ov000_020a9cbc(TreasureType_BeeLarvae, 1);
|
||||
break;
|
||||
case ItemId_WoodHeart:
|
||||
this->func_ov000_020a9cbc(TreasureType_WoodHeart, 1);
|
||||
break;
|
||||
case ItemId_DarkPearlLoop:
|
||||
this->func_ov000_020a9cbc(TreasureType_DarkPearlLoop, 1);
|
||||
break;
|
||||
case ItemId_WhitePearlLoop:
|
||||
this->func_ov000_020a9cbc(TreasureType_WhitePearlLoop, 1);
|
||||
break;
|
||||
case ItemId_RutoCrown:
|
||||
this->func_ov000_020a9cbc(TreasureType_RutoCrown, 1);
|
||||
break;
|
||||
case ItemId_DragonScale:
|
||||
this->func_ov000_020a9cbc(TreasureType_DragonScale, 1);
|
||||
break;
|
||||
case ItemId_PirateNecklace:
|
||||
this->func_ov000_020a9cbc(TreasureType_PirateNecklace, 1);
|
||||
break;
|
||||
case ItemId_PalaceDish:
|
||||
this->func_ov000_020a9cbc(TreasureType_PalaceDish, 1);
|
||||
break;
|
||||
case ItemId_GoronAmber:
|
||||
this->func_ov000_020a9cbc(TreasureType_GoronAmber, 1);
|
||||
break;
|
||||
case ItemId_MysticJade:
|
||||
this->func_ov000_020a9cbc(TreasureType_MysticJade, 1);
|
||||
break;
|
||||
case ItemId_AncientCoin:
|
||||
this->func_ov000_020a9cbc(TreasureType_AncientCoin, 1);
|
||||
break;
|
||||
case ItemId_PricelessStone:
|
||||
this->func_ov000_020a9cbc(TreasureType_PricelessStone, 1);
|
||||
break;
|
||||
case ItemId_RegalRing:
|
||||
this->func_ov000_020a9cbc(TreasureType_RegalRing, 1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user