1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-14 13:30:47 +00:00
oot/src/code/code_80097A00.c
2020-03-17 00:31:30 -04:00

279 lines
6 KiB
C

#include <ultra64.h>
#include <global.h>
// Bit Flag array in which gBitFlags[n] is literally (1 << n)
u32 gBitFlags[] =
{
(1 << 0), (1 << 1), (1 << 2), (1 << 3),
(1 << 4), (1 << 5), (1 << 6), (1 << 7),
(1 << 8), (1 << 9), (1 << 10), (1 << 11),
(1 << 12), (1 << 13), (1 << 14), (1 << 15),
(1 << 16), (1 << 17), (1 << 18), (1 << 19),
(1 << 20), (1 << 21), (1 << 22), (1 << 23),
(1 << 24), (1 << 25), (1 << 26), (1 << 27),
(1 << 28), (1 << 29), (1 << 30), (1 << 31),
};
u16 gEquipMasks[] = { 0x000F, 0x00F0, 0x0F00, 0xF000 };
u16 gEquipNegMasks[] = { 0xFFF0, 0xFF0F, 0xF0FF, 0x0FFF };
u32 gUpgradeMasks[] = { 0x00000007, 0x00000038, 0x000001C0, 0x00000E00, 0x00003000, 0x0001C000, 0x000E0000, 0x00700000 };
u32 gUpgradeNegMasks[] = { 0xFFFFFFF8, 0xFFFFFFC7, 0xFFFFFE3F, 0xFFFFF1FF, 0xFFFFCFFF, 0xFFFE3FFF, 0xFFF1FFFF, 0xFF8FFFFF };
u8 gEquipShifts[] = { 0, 4, 8, 12 };
u8 gUpgradeShifts[] = { 0, 3, 6, 9, 12, 14, 17, 20 };
u16 gUpgradeCapacities[][4] =
{
{ 0, 30, 40, 50 }, // Quivers
{ 0, 20, 30, 40 }, // Bomb Bags
{ 0, 0, 0, 0 }, // Unused (Scale)
{ 0, 0, 0, 0 }, // Unused (Strength)
{ 99, 200, 500, 500 }, // Wallets
{ 0, 30, 40, 50 }, // Deku Seed Bullet Bags
{ 0, 10, 20, 30 }, // Deku Stick Upgrades
{ 0, 20, 30, 40 }, // Deku Nut Upgrades
};
u32 D_8012723C[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 }; // Unused
u32 D_8012724C[] = { 0, 8, 16, 24 }; // Unused
// TODO: use symbols for these icon textures once textures are properly in C
u32 gItemIcons[] =
{
0x08000000,
0x08001000,
0x08002000,
0x08003000,
0x08004000,
0x08005000,
0x08006000,
0x08007000,
0x08008000,
0x08009000,
0x0800A000,
0x0800B000,
0x0800C000,
0x0800D000,
0x0800E000,
0x0800F000,
0x08010000,
0x08011000,
0x08012000,
0x08013000,
0x08014000,
0x08015000,
0x08016000,
0x08017000,
0x08018000,
0x08019000,
0x0801A000,
0x0801B000,
0x0801C000,
0x0801D000,
0x0801E000,
0x0801F000,
0x08020000,
0x08021000,
0x08022000,
0x08023000,
0x08024000,
0x08025000,
0x08026000,
0x08027000,
0x08028000,
0x08029000,
0x0802A000,
0x0802B000,
0x0802C000,
0x0802D000,
0x0802E000,
0x0802F000,
0x08030000,
0x08031000,
0x08032000,
0x08033000,
0x08034000,
0x08035000,
0x08036000,
0x08037000,
0x08038000,
0x08039000,
0x0803A000,
0x0803B000,
0x0803C000,
0x0803D000,
0x0803E000,
0x0803F000,
0x08040000,
0x08041000,
0x08042000,
0x08043000,
0x08044000,
0x08045000,
0x08046000,
0x08047000,
0x08048000,
0x08049000,
0x0804A000,
0x0804B000,
0x0804C000,
0x0804D000,
0x0804E000,
0x0804F000,
0x08050000,
0x08051000,
0x08052000,
0x08053000,
0x08054000,
0x08055000,
0x08056000,
0x08057000,
0x08058000,
0x08059000,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x08089440,
0x09000000,
0x09000900,
0x09001200,
0x09001B00,
0x09002400,
0x09002D00,
0x09003600,
0x09003F00,
0x09004800,
0x09005100,
0x09005A00,
0x09006300,
0x09006C00,
0x09007500,
0x09007E00,
0x09009000,
0x09008700,
0x09007E00,
0x0900A200,
0x0900AB00,
0x0805A000,
0x0805A900,
0x0805B200,
0x02002D40,
0x02002A40,
0x02002C40,
0x02002B40,
0x02002940,
};
// Used to map item IDs to inventory slots
u8 gItemSlots[] =
{
SLOT_STICK,
SLOT_NUT,
SLOT_BOMB,
SLOT_BOW,
SLOT_ARROW_FIRE,
SLOT_DINS_FIRE,
SLOT_SLINGSHOT,
SLOT_OCARINA,
SLOT_OCARINA,
SLOT_BOMBCHU,
SLOT_HOOKSHOT,
SLOT_HOOKSHOT,
SLOT_ARROW_ICE,
SLOT_FARORES_WIND,
SLOT_BOOMERANG,
SLOT_LENS,
SLOT_BEAN,
SLOT_HAMMER,
SLOT_ARROW_LIGHT,
SLOT_NAYRUS_LOVE,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_BOTTLE_1,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT
};
void Inventory_ChangeEquipment(s16 equipment, u16 value)
{
gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.equips.equipment |= value << gEquipShifts[equipment];
}
u8 Inventory_DeleteEquipment(GlobalContext* globalCtx, s16 equipment)
{
Player* player = PLAYER;
s32 pad;
u16 sp26;
sp26 = gSaveContext.equips.equipment & gEquipMasks[equipment];
// Translates to: "Erasing equipment item = %d zzz=%d"
osSyncPrintf("装備アイテム抹消 = %d zzz=%d\n", equipment, sp26);
if (sp26)
{
sp26 >>= gEquipShifts[equipment];
gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.equipment ^= gBitFlags[sp26 - 1] << gEquipShifts[equipment];
if (equipment == EQUIP_TUNIC)
gSaveContext.equips.equipment |= 0x0100;
if (equipment == EQUIP_SWORD)
{
gSaveContext.equips.button_items[0] = ITEM_NONE;
gSaveContext.inf_table[29] = 1;
}
func_8008ECAC(globalCtx, player);
globalCtx->pauseCtx.unk_238 = 10;
}
return sp26;
}
void Inventory_ChangeUpgrade(s16 upgrade, s16 value)
{
gSaveContext.upgrades &= gUpgradeNegMasks[upgrade];
gSaveContext.upgrades |= value << gUpgradeShifts[upgrade];
}