Document upgrades

This commit is contained in:
Pablo 2025-08-01 17:37:50 +02:00
parent 4c2a451b9c
commit 1acc53cfc6
21 changed files with 300 additions and 121 deletions

View File

@ -3,6 +3,7 @@
#include "ultra64.h" #include "ultra64.h"
#include "item.h" #include "item.h"
#include "upgrade.h"
struct PlayState; struct PlayState;

View File

@ -76,18 +76,6 @@ typedef enum EquipValueBoots {
/* 4 */ EQUIP_VALUE_BOOTS_MAX /* 4 */ EQUIP_VALUE_BOOTS_MAX
} EquipValueBoots; } EquipValueBoots;
typedef enum UpgradeType {
/* 0x00 */ UPG_QUIVER,
/* 0x01 */ UPG_BOMB_BAG,
/* 0x02 */ UPG_STRENGTH,
/* 0x03 */ UPG_SCALE,
/* 0x04 */ UPG_WALLET,
/* 0x05 */ UPG_BULLET_BAG,
/* 0x06 */ UPG_DEKU_STICKS,
/* 0x07 */ UPG_DEKU_NUTS,
/* 0x08 */ UPG_MAX
} UpgradeType;
typedef enum QuestItem { typedef enum QuestItem {
/* 0x00 */ QUEST_MEDALLION_FOREST, /* 0x00 */ QUEST_MEDALLION_FOREST,
/* 0x01 */ QUEST_MEDALLION_FIRE, /* 0x01 */ QUEST_MEDALLION_FIRE,

View File

@ -485,10 +485,6 @@ typedef enum LinkAge {
#define TUNIC_EQUIP_TO_PLAYER(tunicEquip) ((tunicEquip) - 1) #define TUNIC_EQUIP_TO_PLAYER(tunicEquip) ((tunicEquip) - 1)
#define BOOTS_EQUIP_TO_PLAYER(bootsEquip) ((bootsEquip) - 1) #define BOOTS_EQUIP_TO_PLAYER(bootsEquip) ((bootsEquip) - 1)
#define CUR_UPG_VALUE(upg) ((s32)(gSaveContext.save.info.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
#define CHECK_QUEST_ITEM(item) (gSaveContext.save.info.inventory.questItems & gBitFlags[item]) #define CHECK_QUEST_ITEM(item) (gSaveContext.save.info.inventory.questItems & gBitFlags[item])
#define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.info.inventory.dungeonItems[dungeonIndex] & gBitFlags[item]) #define CHECK_DUNGEON_ITEM(item, dungeonIndex) (gSaveContext.save.info.inventory.dungeonItems[dungeonIndex] & gBitFlags[item])

163
include/upgrade.h Normal file
View File

@ -0,0 +1,163 @@
#ifndef UPGRADE_H
#define UPGRADE_H
#include "assert.h"
#include "ultra64/ultratypes.h"
typedef enum UpgradeType {
/* 0x00 */ UPG_QUIVER,
/* 0x01 */ UPG_BOMB_BAG,
/* 0x02 */ UPG_STRENGTH,
/* 0x03 */ UPG_SCALE,
/* 0x04 */ UPG_WALLET,
/* 0x05 */ UPG_BULLET_BAG,
/* 0x06 */ UPG_DEKU_STICKS,
/* 0x07 */ UPG_DEKU_NUTS,
/* 0x08 */ UPG_MAX
} UpgradeType;
#define BIT_WIDTH_UPG_QUIVER 3
typedef enum QuiverUpgrades {
/* 0 */ UPG_QUIVER_NONE,
/* 1 */ UPG_QUIVER_NORMAL,
/* 2 */ UPG_QUIVER_BIG,
/* 3 */ UPG_QUIVER_BIGGEST,
/* 4 */ UPG_QUIVER_MAX
} QuiverUpgrades;
static_assert(UPG_QUIVER_MAX <= 1 << BIT_WIDTH_UPG_QUIVER, "All quiver upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_BOMB_BAG 3
typedef enum BombBagUpgrades {
/* 0 */ UPG_BOMB_BAG_NONE,
/* 1 */ UPG_BOMB_BAG_NORMAL,
/* 2 */ UPG_BOMB_BAG_BIG,
/* 3 */ UPG_BOMB_BAG_BIGGEST,
/* 4 */ UPG_BOMB_BAG_MAX
} BombBagUpgrades;
static_assert(UPG_BOMB_BAG_MAX <= 1 << BIT_WIDTH_UPG_BOMB_BAG, "All bomb bag upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_STRENGTH 3
typedef enum StrengthUpgrades {
/* 0 */ UPG_STRENGTH_NONE,
/* 1 */ UPG_STRENGTH_GORON_BRACELET,
/* 2 */ UPG_STRENGTH_SILVER_GAUNTLETS,
/* 3 */ UPG_STRENGTH_GOLD_GAUNTLETS,
/* 4 */ UPG_STRENGTH_MAX
} StrengthUpgrades;
static_assert(UPG_STRENGTH_MAX <= 1 << BIT_WIDTH_UPG_STRENGTH, "All strength upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_SCALE 3
typedef enum ScaleUpgrades {
/* 0 */ UPG_SCALE_NONE,
/* 1 */ UPG_SCALE_SILVER,
/* 2 */ UPG_SCALE_GOLD,
/* 3 */ UPG_SCALE_MAX
} ScaleUpgrades;
static_assert(UPG_SCALE_MAX <= 1 << BIT_WIDTH_UPG_SCALE, "All scale upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_WALLET 2
typedef enum WalletUpgrades {
/* 0 */ UPG_WALLET_CHILD,
/* 1 */ UPG_WALLET_ADULT,
/* 2 */ UPG_WALLET_GIANT,
/* 3 */ UPG_WALLET_MAX
} WalletUpgrades;
static_assert(UPG_WALLET_MAX <= 1 << BIT_WIDTH_UPG_WALLET, "All wallet upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_BULLET_BAG 3
typedef enum BulletBagUpgrades {
/* 0 */ UPG_BULLET_BAG_NONE,
/* 1 */ UPG_BULLET_BAG_NORMAL,
/* 2 */ UPG_BULLET_BAG_BIG,
/* 3 */ UPG_BULLET_BAG_BIGGEST,
/* 4 */ UPG_BULLET_BAG_MAX
} BulletBagUpgrades;
static_assert(UPG_BULLET_BAG_MAX <= 1 << BIT_WIDTH_UPG_BULLET_BAG, "All bullet bag upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_DEKU_STICKS 3
typedef enum DekuStickUpgrades {
/* 0 */ UPG_DEKU_STICKS_NONE,
/* 1 */ UPG_DEKU_STICKS_10,
/* 2 */ UPG_DEKU_STICKS_20,
/* 3 */ UPG_DEKU_STICKS_30,
/* 4 */ UPG_DEKU_STICKS_MAX
} DekuStickUpgrades;
static_assert(UPG_DEKU_STICKS_MAX <= 1 << BIT_WIDTH_UPG_DEKU_STICKS, "All deku stick upgrade values should fit in its assigned bitwidth");
#define BIT_WIDTH_UPG_DEKU_NUTS 3
typedef enum DekuNutUpgrades {
/* 0 */ UPG_DEKU_NUTS_NONE,
/* 1 */ UPG_DEKU_NUTS_20,
/* 2 */ UPG_DEKU_NUTS_30,
/* 3 */ UPG_DEKU_NUTS_40,
/* 4 */ UPG_DEKU_NUTS_MAX
} DekuNutUpgrades;
static_assert(UPG_DEKU_NUTS_MAX <= 1 << BIT_WIDTH_UPG_DEKU_NUTS, "All deku nut upgrade values should fit in its assigned bitwidth");
#define BITS_PER_BYTE 8
static_assert(
BIT_WIDTH_UPG_QUIVER +
BIT_WIDTH_UPG_BOMB_BAG +
BIT_WIDTH_UPG_STRENGTH +
BIT_WIDTH_UPG_SCALE +
BIT_WIDTH_UPG_WALLET +
BIT_WIDTH_UPG_BULLET_BAG +
BIT_WIDTH_UPG_DEKU_STICKS +
BIT_WIDTH_UPG_DEKU_NUTS < sizeof(u32) * BITS_PER_BYTE,
"Upgrades must fit in a u32"
);
#define SHIFT_UPG_QUIVER 0
#define SHIFT_UPG_BOMB_BAG (SHIFT_UPG_QUIVER + BIT_WIDTH_UPG_QUIVER)
#define SHIFT_UPG_STRENGTH (SHIFT_UPG_BOMB_BAG + BIT_WIDTH_UPG_BOMB_BAG)
#define SHIFT_UPG_SCALE (SHIFT_UPG_STRENGTH + BIT_WIDTH_UPG_STRENGTH)
#define SHIFT_UPG_WALLET (SHIFT_UPG_SCALE + BIT_WIDTH_UPG_SCALE)
#define SHIFT_UPG_BULLET_BAG (SHIFT_UPG_WALLET + BIT_WIDTH_UPG_WALLET)
#define SHIFT_UPG_DEKU_STICKS (SHIFT_UPG_BULLET_BAG + BIT_WIDTH_UPG_BULLET_BAG)
#define SHIFT_UPG_DEKU_NUTS (SHIFT_UPG_DEKU_STICKS + BIT_WIDTH_UPG_DEKU_STICKS)
#ifndef GLUE
# define GLUE(a, b) a##b
#endif
#ifndef GLUE2
# define GLUE2(a, b) GLUE(a, b)
#endif
#define GET_UPGRADE_BITMASK(upg) (((1 << GLUE2(BIT_WIDTH_, upg)) - 1) << GLUE2(SHIFT_, upg))
#define GET_PACKED_UPGRADE_VALUE(upgValue, upg) ((upgValue & ((1 << GLUE2(BIT_WIDTH_, upg)) - 1)) << GLUE2(SHIFT_, upg))
#define GET_PACKED_UPGRADES_VALUE(quiver, bombBag, strength, scale, wallet, bulletBag, dekuSticks, dekuNuts) \
( \
GET_PACKED_UPGRADE_VALUE(quiver, UPG_QUIVER) | \
GET_PACKED_UPGRADE_VALUE(bombBag, UPG_BOMB_BAG) | \
GET_PACKED_UPGRADE_VALUE(strength, UPG_STRENGTH) | \
GET_PACKED_UPGRADE_VALUE(scale, UPG_SCALE) | \
GET_PACKED_UPGRADE_VALUE(wallet, UPG_WALLET) | \
GET_PACKED_UPGRADE_VALUE(bulletBag, UPG_BULLET_BAG) | \
GET_PACKED_UPGRADE_VALUE(dekuSticks, UPG_DEKU_STICKS) | \
GET_PACKED_UPGRADE_VALUE(dekuNuts, UPG_DEKU_NUTS) \
)
#define CUR_UPG_VALUE(upg) ((s32)(gSaveContext.save.info.inventory.upgrades & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
#endif

View File

@ -31,24 +31,25 @@ u16 gEquipNegMasks[EQUIP_TYPE_MAX] = {
}; };
u32 gUpgradeMasks[UPG_MAX] = { u32 gUpgradeMasks[UPG_MAX] = {
0x00000007, // UPG_QUIVER GET_UPGRADE_BITMASK(UPG_QUIVER),
0x00000038, // UPG_BOMB_BAG GET_UPGRADE_BITMASK(UPG_BOMB_BAG),
0x000001C0, // UPG_STRENGTH GET_UPGRADE_BITMASK(UPG_STRENGTH),
0x00000E00, // UPG_SCALE GET_UPGRADE_BITMASK(UPG_SCALE),
0x00003000, // UPG_WALLET GET_UPGRADE_BITMASK(UPG_WALLET),
0x0001C000, // UPG_BULLET_BAG GET_UPGRADE_BITMASK(UPG_BULLET_BAG),
0x000E0000, // UPG_DEKU_STICKS GET_UPGRADE_BITMASK(UPG_DEKU_STICKS),
0x00700000, // UPG_DEKU_NUTS GET_UPGRADE_BITMASK(UPG_DEKU_NUTS),
}; };
u32 gUpgradeNegMasks[UPG_MAX] = { u32 gUpgradeNegMasks[UPG_MAX] = {
~0x00000007, // UPG_QUIVER ~GET_UPGRADE_BITMASK(UPG_QUIVER),
~0x00000038, // UPG_BOMB_BAG ~GET_UPGRADE_BITMASK(UPG_BOMB_BAG),
~0x000001C0, // UPG_STRENGTH ~GET_UPGRADE_BITMASK(UPG_STRENGTH),
~0x00000E00, // UPG_SCALE ~GET_UPGRADE_BITMASK(UPG_SCALE),
~0x00003000, // UPG_WALLET ~GET_UPGRADE_BITMASK(UPG_WALLET),
~0x0001C000, // UPG_BULLET_BAG ~GET_UPGRADE_BITMASK(UPG_BULLET_BAG),
~0x000E0000, // UPG_DEKU_STICKS ~GET_UPGRADE_BITMASK(UPG_DEKU_STICKS),
~0x00700000, // UPG_DEKU_NUTS ~GET_UPGRADE_BITMASK(UPG_DEKU_NUTS),
}; };
u8 gEquipShifts[EQUIP_TYPE_MAX] = { u8 gEquipShifts[EQUIP_TYPE_MAX] = {
@ -59,14 +60,14 @@ u8 gEquipShifts[EQUIP_TYPE_MAX] = {
}; };
u8 gUpgradeShifts[UPG_MAX] = { u8 gUpgradeShifts[UPG_MAX] = {
0, // UPG_QUIVER SHIFT_UPG_QUIVER,
3, // UPG_BOMB_BAG SHIFT_UPG_BOMB_BAG,
6, // UPG_STRENGTH SHIFT_UPG_STRENGTH,
9, // UPG_SCALE SHIFT_UPG_SCALE,
12, // UPG_WALLET SHIFT_UPG_WALLET,
14, // UPG_BULLET_BAG SHIFT_UPG_BULLET_BAG,
17, // UPG_DEKU_STICKS SHIFT_UPG_DEKU_STICKS,
20, // UPG_DEKU_NUTS SHIFT_UPG_DEKU_NUTS,
}; };
u16 gUpgradeCapacities[UPG_MAX][4] = { u16 gUpgradeCapacities[UPG_MAX][4] = {

View File

@ -1503,10 +1503,10 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE; return ITEM_NONE;
} }
} else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) { } else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) {
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) { if (CUR_UPG_VALUE(UPG_QUIVER) == UPG_QUIVER_NONE) {
Inventory_ChangeUpgrade(UPG_QUIVER, 1); Inventory_ChangeUpgrade(UPG_QUIVER, UPG_QUIVER_NORMAL);
INV_CONTENT(ITEM_BOW) = ITEM_BOW; INV_CONTENT(ITEM_BOW) = ITEM_BOW;
AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, 1); AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, UPG_QUIVER_NORMAL);
return ITEM_NONE; return ITEM_NONE;
} else { } else {
AMMO(ITEM_BOW)++; AMMO(ITEM_BOW)++;
@ -1515,26 +1515,26 @@ u8 Item_Give(PlayState* play, u8 item) {
} }
} }
} else if (item == ITEM_QUIVER_40) { } else if (item == ITEM_QUIVER_40) {
Inventory_ChangeUpgrade(UPG_QUIVER, 2); Inventory_ChangeUpgrade(UPG_QUIVER, UPG_QUIVER_BIG);
AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, 2); AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, UPG_QUIVER_BIG);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_QUIVER_50) { } else if (item == ITEM_QUIVER_50) {
Inventory_ChangeUpgrade(UPG_QUIVER, 3); Inventory_ChangeUpgrade(UPG_QUIVER, UPG_QUIVER_BIGGEST);
AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, 3); AMMO(ITEM_BOW) = CAPACITY(UPG_QUIVER, UPG_QUIVER_BIGGEST);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_BULLET_BAG_40) { } else if (item == ITEM_BULLET_BAG_40) {
Inventory_ChangeUpgrade(UPG_BULLET_BAG, 2); Inventory_ChangeUpgrade(UPG_BULLET_BAG, UPG_BULLET_BAG_BIG);
AMMO(ITEM_SLINGSHOT) = CAPACITY(UPG_BULLET_BAG, 2); AMMO(ITEM_SLINGSHOT) = CAPACITY(UPG_BULLET_BAG, UPG_BULLET_BAG_BIG);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_BULLET_BAG_50) { } else if (item == ITEM_BULLET_BAG_50) {
Inventory_ChangeUpgrade(UPG_BULLET_BAG, 3); Inventory_ChangeUpgrade(UPG_BULLET_BAG, UPG_BULLET_BAG_BIGGEST);
AMMO(ITEM_SLINGSHOT) = CAPACITY(UPG_BULLET_BAG, 3); AMMO(ITEM_SLINGSHOT) = CAPACITY(UPG_BULLET_BAG, UPG_BULLET_BAG_BIGGEST);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_BOMB_BAG_20) { } else if (item == ITEM_BOMB_BAG_20) {
if (CUR_UPG_VALUE(UPG_BOMB_BAG) == 0) { if (CUR_UPG_VALUE(UPG_BOMB_BAG) == UPG_BOMB_BAG_NONE) {
Inventory_ChangeUpgrade(UPG_BOMB_BAG, 1); Inventory_ChangeUpgrade(UPG_BOMB_BAG, UPG_BOMB_BAG_NORMAL);
INV_CONTENT(ITEM_BOMB) = ITEM_BOMB; INV_CONTENT(ITEM_BOMB) = ITEM_BOMB;
AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, 1); AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, UPG_BOMB_BAG_NORMAL);
return ITEM_NONE; return ITEM_NONE;
} else { } else {
AMMO(ITEM_BOMB)++; AMMO(ITEM_BOMB)++;
@ -1543,61 +1543,61 @@ u8 Item_Give(PlayState* play, u8 item) {
} }
} }
} else if (item == ITEM_BOMB_BAG_30) { } else if (item == ITEM_BOMB_BAG_30) {
Inventory_ChangeUpgrade(UPG_BOMB_BAG, 2); Inventory_ChangeUpgrade(UPG_BOMB_BAG, UPG_BOMB_BAG_BIG);
AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, 2); AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, UPG_BOMB_BAG_BIG);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_BOMB_BAG_40) { } else if (item == ITEM_BOMB_BAG_40) {
Inventory_ChangeUpgrade(UPG_BOMB_BAG, 3); Inventory_ChangeUpgrade(UPG_BOMB_BAG, UPG_BOMB_BAG_BIGGEST);
AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, 3); AMMO(ITEM_BOMB) = CAPACITY(UPG_BOMB_BAG, UPG_BOMB_BAG_BIGGEST);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_STRENGTH_GORONS_BRACELET) { } else if (item == ITEM_STRENGTH_GORONS_BRACELET) {
Inventory_ChangeUpgrade(UPG_STRENGTH, 1); Inventory_ChangeUpgrade(UPG_STRENGTH, UPG_STRENGTH_GORON_BRACELET);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_STRENGTH_SILVER_GAUNTLETS) { } else if (item == ITEM_STRENGTH_SILVER_GAUNTLETS) {
Inventory_ChangeUpgrade(UPG_STRENGTH, 2); Inventory_ChangeUpgrade(UPG_STRENGTH, UPG_STRENGTH_SILVER_GAUNTLETS);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_STRENGTH_GOLD_GAUNTLETS) { } else if (item == ITEM_STRENGTH_GOLD_GAUNTLETS) {
Inventory_ChangeUpgrade(UPG_STRENGTH, 3); Inventory_ChangeUpgrade(UPG_STRENGTH, UPG_STRENGTH_GOLD_GAUNTLETS);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_SCALE_SILVER) { } else if (item == ITEM_SCALE_SILVER) {
Inventory_ChangeUpgrade(UPG_SCALE, 1); Inventory_ChangeUpgrade(UPG_SCALE, UPG_SCALE_SILVER);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_SCALE_GOLDEN) { } else if (item == ITEM_SCALE_GOLDEN) {
Inventory_ChangeUpgrade(UPG_SCALE, 2); Inventory_ChangeUpgrade(UPG_SCALE, UPG_SCALE_GOLD);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_ADULTS_WALLET) { } else if (item == ITEM_ADULTS_WALLET) {
Inventory_ChangeUpgrade(UPG_WALLET, 1); Inventory_ChangeUpgrade(UPG_WALLET, UPG_WALLET_ADULT);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_GIANTS_WALLET) { } else if (item == ITEM_GIANTS_WALLET) {
Inventory_ChangeUpgrade(UPG_WALLET, 2); Inventory_ChangeUpgrade(UPG_WALLET, UPG_WALLET_GIANT);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_DEKU_STICK_UPGRADE_20) { } else if (item == ITEM_DEKU_STICK_UPGRADE_20) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK; INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK;
} }
Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 2); Inventory_ChangeUpgrade(UPG_DEKU_STICKS, UPG_DEKU_STICKS_20);
AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, 2); AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, UPG_DEKU_STICKS_20);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_DEKU_STICK_UPGRADE_30) { } else if (item == ITEM_DEKU_STICK_UPGRADE_30) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK; INV_CONTENT(ITEM_DEKU_STICK) = ITEM_DEKU_STICK;
} }
Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 3); Inventory_ChangeUpgrade(UPG_DEKU_STICKS, UPG_DEKU_STICKS_30);
AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, 3); AMMO(ITEM_DEKU_STICK) = CAPACITY(UPG_DEKU_STICKS, UPG_DEKU_STICKS_30);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_DEKU_NUT_UPGRADE_30) { } else if (item == ITEM_DEKU_NUT_UPGRADE_30) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT; INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT;
} }
Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 2); Inventory_ChangeUpgrade(UPG_DEKU_NUTS, UPG_DEKU_NUTS_30);
AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, 2); AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, UPG_DEKU_NUTS_30);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_DEKU_NUT_UPGRADE_40) { } else if (item == ITEM_DEKU_NUT_UPGRADE_40) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT; INV_CONTENT(ITEM_DEKU_NUT) = ITEM_DEKU_NUT;
} }
Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 3); Inventory_ChangeUpgrade(UPG_DEKU_NUTS, UPG_DEKU_NUTS_40);
AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, 3); AMMO(ITEM_DEKU_NUT) = CAPACITY(UPG_DEKU_NUTS, UPG_DEKU_NUTS_40);
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_LONGSHOT) { } else if (item == ITEM_LONGSHOT) {
INV_CONTENT(item) = item; INV_CONTENT(item) = item;
@ -1610,7 +1610,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_NONE; return ITEM_NONE;
} else if (item == ITEM_DEKU_STICK) { } else if (item == ITEM_DEKU_STICK) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 1); Inventory_ChangeUpgrade(UPG_DEKU_STICKS, UPG_DEKU_STICKS_10);
AMMO(ITEM_DEKU_STICK) = 1; AMMO(ITEM_DEKU_STICK) = 1;
} else { } else {
AMMO(ITEM_DEKU_STICK)++; AMMO(ITEM_DEKU_STICK)++;
@ -1620,7 +1620,7 @@ u8 Item_Give(PlayState* play, u8 item) {
} }
} else if ((item == ITEM_DEKU_STICKS_5) || (item == ITEM_DEKU_STICKS_10)) { } else if ((item == ITEM_DEKU_STICKS_5) || (item == ITEM_DEKU_STICKS_10)) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
Inventory_ChangeUpgrade(UPG_DEKU_STICKS, 1); Inventory_ChangeUpgrade(UPG_DEKU_STICKS, UPG_DEKU_STICKS_10);
AMMO(ITEM_DEKU_STICK) = sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5]; AMMO(ITEM_DEKU_STICK) = sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5];
} else { } else {
AMMO(ITEM_DEKU_STICK) += sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5]; AMMO(ITEM_DEKU_STICK) += sAmmoRefillCounts[item - ITEM_DEKU_STICKS_5];
@ -1631,7 +1631,7 @@ u8 Item_Give(PlayState* play, u8 item) {
item = ITEM_DEKU_STICK; item = ITEM_DEKU_STICK;
} else if (item == ITEM_DEKU_NUT) { } else if (item == ITEM_DEKU_NUT) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 1); Inventory_ChangeUpgrade(UPG_DEKU_NUTS, UPG_DEKU_NUTS_20);
AMMO(ITEM_DEKU_NUT) = ITEM_DEKU_NUT; AMMO(ITEM_DEKU_NUT) = ITEM_DEKU_NUT;
} else { } else {
AMMO(ITEM_DEKU_NUT)++; AMMO(ITEM_DEKU_NUT)++;
@ -1641,7 +1641,7 @@ u8 Item_Give(PlayState* play, u8 item) {
} }
} else if ((item == ITEM_DEKU_NUTS_5) || (item == ITEM_DEKU_NUTS_10)) { } else if ((item == ITEM_DEKU_NUTS_5) || (item == ITEM_DEKU_NUTS_10)) {
if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) { if (gSaveContext.save.info.inventory.items[slot] == ITEM_NONE) {
Inventory_ChangeUpgrade(UPG_DEKU_NUTS, 1); Inventory_ChangeUpgrade(UPG_DEKU_NUTS, UPG_DEKU_NUTS_20);
AMMO(ITEM_DEKU_NUT) += sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5]; AMMO(ITEM_DEKU_NUT) += sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5];
PRINTF(T("デクの実 %d(%d)=%d BS_count=%d\n", "Deku Nuts %d(%d)=%d BS_count=%d\n"), item, ITEM_DEKU_NUTS_5, PRINTF(T("デクの実 %d(%d)=%d BS_count=%d\n", "Deku Nuts %d(%d)=%d BS_count=%d\n"), item, ITEM_DEKU_NUTS_5,
item - ITEM_DEKU_NUTS_5, sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5]); item - ITEM_DEKU_NUTS_5, sAmmoRefillCounts[item - ITEM_DEKU_NUTS_5]);
@ -1696,7 +1696,7 @@ u8 Item_Give(PlayState* play, u8 item) {
return ITEM_BOW; return ITEM_BOW;
} else if (item == ITEM_SLINGSHOT) { } else if (item == ITEM_SLINGSHOT) {
Inventory_ChangeUpgrade(UPG_BULLET_BAG, 1); Inventory_ChangeUpgrade(UPG_BULLET_BAG, UPG_BULLET_BAG_NORMAL);
INV_CONTENT(ITEM_SLINGSHOT) = ITEM_SLINGSHOT; INV_CONTENT(ITEM_SLINGSHOT) = ITEM_SLINGSHOT;
AMMO(ITEM_SLINGSHOT) = 30; AMMO(ITEM_SLINGSHOT) = 30;
return ITEM_NONE; return ITEM_NONE;
@ -1938,7 +1938,7 @@ u8 Item_CheckObtainability(u8 item) {
} else if ((item == ITEM_BOMBCHUS_5) || (item == ITEM_BOMBCHUS_20)) { } else if ((item == ITEM_BOMBCHUS_5) || (item == ITEM_BOMBCHUS_20)) {
return ITEM_NONE; return ITEM_NONE;
} else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) { } else if ((item == ITEM_QUIVER_30) || (item == ITEM_BOW)) {
if (CUR_UPG_VALUE(UPG_QUIVER) == 0) { if (CUR_UPG_VALUE(UPG_QUIVER) == UPG_QUIVER_NONE) {
return ITEM_NONE; return ITEM_NONE;
} else { } else {
return 0; return 0;
@ -1948,7 +1948,7 @@ u8 Item_CheckObtainability(u8 item) {
} else if ((item == ITEM_BULLET_BAG_40) || (item == ITEM_BULLET_BAG_50)) { } else if ((item == ITEM_BULLET_BAG_40) || (item == ITEM_BULLET_BAG_50)) {
return ITEM_NONE; return ITEM_NONE;
} else if ((item == ITEM_BOMB_BAG_20) || (item == ITEM_BOMB)) { } else if ((item == ITEM_BOMB_BAG_20) || (item == ITEM_BOMB)) {
if (CUR_UPG_VALUE(UPG_BOMB_BAG) == 0) { if (CUR_UPG_VALUE(UPG_BOMB_BAG) == UPG_BOMB_BAG_NONE) {
return ITEM_NONE; return ITEM_NONE;
} else { } else {
return 0; return 0;
@ -3186,8 +3186,16 @@ void Interface_Draw(PlayState* play) {
static s16 D_80125B1C[][3] = { static s16 D_80125B1C[][3] = {
{ 0, 150, 0 }, { 100, 255, 0 }, { 255, 255, 255 }, { 0, 0, 0 }, { 255, 255, 255 }, { 0, 150, 0 }, { 100, 255, 0 }, { 255, 255, 255 }, { 0, 0, 0 }, { 255, 255, 255 },
}; };
static s16 rupeeDigitsFirst[] = { 1, 0, 0 }; static s16 rupeeDigitsFirst[] = {
static s16 rupeeDigitsCount[] = { 2, 3, 3 }; 1, // UPG_WALLET_CHILD
0, // UPG_WALLET_ADULT
0 // UPG_WALLET_GIANT
};
static s16 rupeeDigitsCount[] = {
2, // UPG_WALLET_CHILD
3, // UPG_WALLET_ADULT
3 // UPG_WALLET_GIANT
};
static s16 spoilingItemEntrances[] = { ENTR_LOST_WOODS_2, ENTR_ZORAS_DOMAIN_3, ENTR_ZORAS_DOMAIN_3 }; static s16 spoilingItemEntrances[] = { ENTR_LOST_WOODS_2, ENTR_ZORAS_DOMAIN_3, ENTR_ZORAS_DOMAIN_3 };
static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused
static s16 D_80125B5C[] = { 91, 91 }; // unused static s16 D_80125B5C[] = { 91, 91 }; // unused

View File

@ -815,7 +815,7 @@ s32 Player_GetStrength(void) {
if (LINK_IS_ADULT) { if (LINK_IS_ADULT) {
return strengthUpgrade; return strengthUpgrade;
} else if (strengthUpgrade != 0) { } else if (strengthUpgrade != UPG_STRENGTH_NONE) {
return PLAYER_STR_BRACELET; return PLAYER_STR_BRACELET;
} else { } else {
return PLAYER_STR_NONE; return PLAYER_STR_NONE;
@ -1132,10 +1132,10 @@ void Player_DrawImpl(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dL
if (LINK_IS_ADULT) { if (LINK_IS_ADULT) {
s32 strengthUpgrade = CUR_UPG_VALUE(UPG_STRENGTH); s32 strengthUpgrade = CUR_UPG_VALUE(UPG_STRENGTH);
if (strengthUpgrade >= 2) { // silver or gold gauntlets if (strengthUpgrade >= UPG_STRENGTH_SILVER_GAUNTLETS) {
gDPPipeSync(POLY_OPA_DISP++); gDPPipeSync(POLY_OPA_DISP++);
color = &sGauntletColors[strengthUpgrade - 2]; color = &sGauntletColors[strengthUpgrade - UPG_STRENGTH_SILVER_GAUNTLETS];
gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0); gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0);
gSPDisplayList(POLY_OPA_DISP++, gLinkAdultLeftGauntletPlate1DL); gSPDisplayList(POLY_OPA_DISP++, gLinkAdultLeftGauntletPlate1DL);

View File

@ -185,7 +185,16 @@ static Inventory sNewSaveInventory = {
// equipment // equipment
(((1 << EQUIP_INV_TUNIC_KOKIRI) << (EQUIP_TYPE_TUNIC * 4)) | (((1 << EQUIP_INV_TUNIC_KOKIRI) << (EQUIP_TYPE_TUNIC * 4)) |
((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4))), ((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4))),
0, // upgrades GET_PACKED_UPGRADES_VALUE(
UPG_QUIVER_NONE,
UPG_BOMB_BAG_NONE,
UPG_STRENGTH_NONE,
UPG_SCALE_NONE,
UPG_WALLET_CHILD,
UPG_BULLET_BAG_NONE,
UPG_DEKU_STICKS_NONE,
UPG_DEKU_NUTS_NONE
), // upgrades
0, // questItems 0, // questItems
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // dungeonItems { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // dungeonItems
{ {
@ -345,7 +354,16 @@ static Inventory sDebugSaveInventory = {
(((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4)) | (((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4)) |
((1 << EQUIP_INV_BOOTS_IRON) << (EQUIP_TYPE_BOOTS * 4)) | ((1 << EQUIP_INV_BOOTS_IRON) << (EQUIP_TYPE_BOOTS * 4)) |
((1 << EQUIP_INV_BOOTS_HOVER) << (EQUIP_TYPE_BOOTS * 4)))), ((1 << EQUIP_INV_BOOTS_HOVER) << (EQUIP_TYPE_BOOTS * 4)))),
0x125249, // upgrades GET_PACKED_UPGRADES_VALUE(
UPG_QUIVER_NORMAL,
UPG_BOMB_BAG_NORMAL,
UPG_STRENGTH_GORON_BRACELET,
UPG_SCALE_SILVER,
UPG_WALLET_ADULT,
UPG_BULLET_BAG_NORMAL,
UPG_DEKU_STICKS_10,
UPG_DEKU_NUTS_20
), // upgrades
0x1E3FFFF, // questItems 0x1E3FFFF, // questItems
{ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // dungeonItems { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // dungeonItems
{ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }, // dungeonKeys { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }, // dungeonKeys

View File

@ -410,13 +410,13 @@ void EnDns_Talk(EnDns* this, PlayState* play) {
void EnDns_OfferSaleItem(EnDns* this, PlayState* play) { void EnDns_OfferSaleItem(EnDns* this, PlayState* play) {
if (DNS_GET_TYPE(&this->actor) == DNS_TYPE_DEKU_STICK_UPGRADE) { if (DNS_GET_TYPE(&this->actor) == DNS_TYPE_DEKU_STICK_UPGRADE) {
if (CUR_UPG_VALUE(UPG_DEKU_STICKS) < 2) { if (CUR_UPG_VALUE(UPG_DEKU_STICKS) < UPG_DEKU_STICKS_20) {
Actor_OfferGetItem(&this->actor, play, GI_DEKU_STICK_UPGRADE_20, 130.0f, 100.0f); Actor_OfferGetItem(&this->actor, play, GI_DEKU_STICK_UPGRADE_20, 130.0f, 100.0f);
} else { } else {
Actor_OfferGetItem(&this->actor, play, GI_DEKU_STICK_UPGRADE_30, 130.0f, 100.0f); Actor_OfferGetItem(&this->actor, play, GI_DEKU_STICK_UPGRADE_30, 130.0f, 100.0f);
} }
} else if (DNS_GET_TYPE(&this->actor) == DNS_TYPE_DEKU_NUT_UPGRADE) { } else if (DNS_GET_TYPE(&this->actor) == DNS_TYPE_DEKU_NUT_UPGRADE) {
if (CUR_UPG_VALUE(UPG_DEKU_NUTS) < 2) { if (CUR_UPG_VALUE(UPG_DEKU_NUTS) < UPG_DEKU_NUTS_30) {
Actor_OfferGetItem(&this->actor, play, GI_DEKU_NUT_UPGRADE_30, 130.0f, 100.0f); Actor_OfferGetItem(&this->actor, play, GI_DEKU_NUT_UPGRADE_30, 130.0f, 100.0f);
} else { } else {
Actor_OfferGetItem(&this->actor, play, GI_DEKU_NUT_UPGRADE_40, 130.0f, 100.0f); Actor_OfferGetItem(&this->actor, play, GI_DEKU_NUT_UPGRADE_40, 130.0f, 100.0f);

View File

@ -205,7 +205,7 @@ void EnDntJiji_Walk(EnDntJiji* this, PlayState* play) {
this->actor.speed = 3.0f; this->actor.speed = 3.0f;
} }
if (this->actor.xzDistToPlayer < 100.0f) { if (this->actor.xzDistToPlayer < 100.0f) {
if (CUR_UPG_VALUE(UPG_DEKU_STICKS) == 1) { if (CUR_UPG_VALUE(UPG_DEKU_STICKS) == UPG_DEKU_STICKS_10) {
this->getItemId = GI_DEKU_STICK_UPGRADE_20; this->getItemId = GI_DEKU_STICK_UPGRADE_20;
} else { } else {
this->getItemId = GI_DEKU_STICK_UPGRADE_30; this->getItemId = GI_DEKU_STICK_UPGRADE_30;
@ -237,7 +237,7 @@ void EnDntJiji_SetupCower(EnDntJiji* this, PlayState* play) {
EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 9, 3, 10, HAHEN_OBJECT_DEFAULT, 10, NULL); EffectSsHahen_SpawnBurst(play, &this->actor.world.pos, 3.0f, 0, 9, 3, 10, HAHEN_OBJECT_DEFAULT, 10, NULL);
Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP); Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_UP);
if ((CUR_UPG_VALUE(UPG_DEKU_NUTS) == 1) || (CUR_UPG_VALUE(UPG_DEKU_NUTS) == 0)) { if ((CUR_UPG_VALUE(UPG_DEKU_NUTS) == UPG_DEKU_NUTS_20) || (CUR_UPG_VALUE(UPG_DEKU_NUTS) == UPG_DEKU_NUTS_NONE)) {
this->getItemId = GI_DEKU_NUT_UPGRADE_30; this->getItemId = GI_DEKU_NUT_UPGRADE_30;
} else { } else {
this->getItemId = GI_DEKU_NUT_UPGRADE_40; this->getItemId = GI_DEKU_NUT_UPGRADE_40;

View File

@ -117,7 +117,7 @@ u16 EnDu_GetTextId(PlayState* play, Actor* actor) {
if (textId != 0) { if (textId != 0) {
return textId; return textId;
} }
if (CUR_UPG_VALUE(UPG_STRENGTH) != 0) { if (CUR_UPG_VALUE(UPG_STRENGTH) != UPG_STRENGTH_NONE) {
if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) { if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
return 0x301E; return 0x301E;
} else { } else {
@ -522,7 +522,7 @@ void func_809FEB08(EnDu* this, PlayState* play) {
EnDu_SetupAction(this, func_809FE3C0); EnDu_SetupAction(this, func_809FE3C0);
return; return;
} }
if (CUR_UPG_VALUE(UPG_STRENGTH) <= 0) { if (CUR_UPG_VALUE(UPG_STRENGTH) < UPG_STRENGTH_GORON_BRACELET) {
this->actor.textId = 0x301C; this->actor.textId = 0x301C;
EnDu_SetupAction(this, func_809FEC14); EnDu_SetupAction(this, func_809FEC14);
} else { } else {

View File

@ -405,7 +405,7 @@ void EnExItem_TargetPrizeApproach(EnExItem* this, PlayState* play) {
this->actor.draw = NULL; this->actor.draw = NULL;
Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_7); Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_7);
this->actor.parent = NULL; this->actor.parent = NULL;
if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == UPG_BULLET_BAG_NORMAL) {
getItemId = GI_BULLET_BAG_40; getItemId = GI_BULLET_BAG_40;
} else { } else {
getItemId = GI_BULLET_BAG_50; getItemId = GI_BULLET_BAG_50;
@ -421,7 +421,7 @@ void EnExItem_TargetPrizeGive(EnExItem* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) { if (Actor_HasParent(&this->actor, play)) {
this->actionFunc = EnExItem_TargetPrizeFinish; this->actionFunc = EnExItem_TargetPrizeFinish;
} else { } else {
getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == 2) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40; getItemId = (CUR_UPG_VALUE(UPG_BULLET_BAG) == UPG_BULLET_BAG_BIG) ? GI_BULLET_BAG_50 : GI_BULLET_BAG_40;
Actor_OfferGetItem(&this->actor, play, getItemId, 2000.0f, 1000.0f); Actor_OfferGetItem(&this->actor, play, getItemId, 2000.0f, 1000.0f);
} }

View File

@ -516,10 +516,10 @@ void EnGe1_WaitTillItemGiven_Archery(EnGe1* this, PlayState* play) {
if (this->stateFlags & GE1_STATE_GIVE_QUIVER) { if (this->stateFlags & GE1_STATE_GIVE_QUIVER) {
switch (CUR_UPG_VALUE(UPG_QUIVER)) { switch (CUR_UPG_VALUE(UPG_QUIVER)) {
//! @bug Asschest. See next function for details //! @bug Asschest. See next function for details
case 1: case UPG_QUIVER_NORMAL:
getItemId = GI_QUIVER_40; getItemId = GI_QUIVER_40;
break; break;
case 2: case UPG_QUIVER_BIG:
getItemId = GI_QUIVER_50; getItemId = GI_QUIVER_50;
break; break;
} }
@ -544,10 +544,10 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, PlayState* play) {
//! over from the previous function run in EnGe1_Update, namely EnGe1_CueUpAnimation. The top stack variable //! over from the previous function run in EnGe1_Update, namely EnGe1_CueUpAnimation. The top stack variable
//! in that function is &this->skelAnime = thisx + 198, and depending on where this loads in memory, the //! in that function is &this->skelAnime = thisx + 198, and depending on where this loads in memory, the
//! getItemId changes. //! getItemId changes.
case 1: case UPG_QUIVER_NORMAL:
getItemId = GI_QUIVER_40; getItemId = GI_QUIVER_40;
break; break;
case 2: case UPG_QUIVER_BIG:
getItemId = GI_QUIVER_50; getItemId = GI_QUIVER_50;
break; break;
} }

View File

@ -275,7 +275,7 @@ s16 EnGo_UpdateTalkState(PlayState* play, Actor* thisx) {
switch (thisx->textId) { switch (thisx->textId) {
case 0x300A: case 0x300A:
if (play->msgCtx.choiceIndex == 0) { if (play->msgCtx.choiceIndex == 0) {
if (CUR_UPG_VALUE(UPG_STRENGTH) != 0 || GET_INFTABLE(INFTABLE_EB)) { if (CUR_UPG_VALUE(UPG_STRENGTH) != UPG_STRENGTH_NONE || GET_INFTABLE(INFTABLE_EB)) {
thisx->textId = 0x300B; thisx->textId = 0x300B;
} else { } else {
thisx->textId = 0x300C; thisx->textId = 0x300C;

View File

@ -383,7 +383,7 @@ s16 EnGo2_UpdateTalkStateGoronDmtBombFlower(PlayState* play, EnGo2* this) {
// Ask question to DMT Goron by bomb flower // Ask question to DMT Goron by bomb flower
if (this->actor.textId == 0x300A) { if (this->actor.textId == 0x300A) {
if (play->msgCtx.choiceIndex == 0) { if (play->msgCtx.choiceIndex == 0) {
this->actor.textId = CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x300B : 0x300C; this->actor.textId = CUR_UPG_VALUE(UPG_STRENGTH) != UPG_STRENGTH_NONE ? 0x300B : 0x300C;
} else { } else {
this->actor.textId = 0x300D; this->actor.textId = 0x300D;
} }
@ -482,7 +482,7 @@ u16 EnGo2_GetTextIdGoronCityLowestFloor(PlayState* play, EnGo2* this) {
} else if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) { } else if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
return 0x3027; return 0x3027;
} else { } else {
return CUR_UPG_VALUE(UPG_STRENGTH) != 0 ? 0x302C return CUR_UPG_VALUE(UPG_STRENGTH) != UPG_STRENGTH_NONE ? 0x302C
: !Flags_GetSwitch(play, 0x1B) ? 0x3017 : !Flags_GetSwitch(play, 0x1B) ? 0x3017
: GET_INFTABLE(INFTABLE_F8) ? 0x3019 : GET_INFTABLE(INFTABLE_F8) ? 0x3019
: 0x3018; : 0x3018;

View File

@ -536,7 +536,7 @@ void EnOssan_TalkGoronShopkeeper(PlayState* play) {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
if (GET_EVENTCHKINF(EVENTCHKINF_25)) { if (GET_EVENTCHKINF(EVENTCHKINF_25)) {
Message_ContinueTextbox(play, 0x3028); Message_ContinueTextbox(play, 0x3028);
} else if (CUR_UPG_VALUE(UPG_STRENGTH) != 0) { } else if (CUR_UPG_VALUE(UPG_STRENGTH) != UPG_STRENGTH_NONE) {
Message_ContinueTextbox(play, 0x302D); Message_ContinueTextbox(play, 0x302D);
} else { } else {
Message_ContinueTextbox(play, 0x300F); Message_ContinueTextbox(play, 0x300F);

View File

@ -247,11 +247,11 @@ void EnSth_GivePlayerItem(EnSth* this, PlayState* play) {
case 1: case 1:
case 3: case 3:
switch (CUR_UPG_VALUE(UPG_WALLET)) { switch (CUR_UPG_VALUE(UPG_WALLET)) {
case 0: case UPG_WALLET_CHILD:
getItemId = GI_WALLET_ADULT; getItemId = GI_WALLET_ADULT;
break; break;
case 1: case UPG_WALLET_ADULT:
getItemId = GI_WALLET_GIANT; getItemId = GI_WALLET_GIANT;
break; break;
} }

View File

@ -360,7 +360,7 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, PlayState* play) {
if (!GET_ITEMGETINF(ITEMGETINF_0D)) { if (!GET_ITEMGETINF(ITEMGETINF_0D)) {
PRINTF(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST, PRINTF(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Pachinko ☆☆☆☆☆ %d\n" VT_RST,
CUR_UPG_VALUE(UPG_BULLET_BAG)); CUR_UPG_VALUE(UPG_BULLET_BAG));
if (CUR_UPG_VALUE(UPG_BULLET_BAG) == 1) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) == UPG_BULLET_BAG_NORMAL) {
this->getItemId = GI_BULLET_BAG_40; this->getItemId = GI_BULLET_BAG_40;
} else { } else {
this->getItemId = GI_BULLET_BAG_50; this->getItemId = GI_BULLET_BAG_50;
@ -372,13 +372,13 @@ void EnSyatekiMan_EndGame(EnSyatekiMan* this, PlayState* play) {
if (!GET_ITEMGETINF(ITEMGETINF_0E)) { if (!GET_ITEMGETINF(ITEMGETINF_0E)) {
PRINTF(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, CUR_UPG_VALUE(UPG_QUIVER)); PRINTF(VT_FGCOL(GREEN) "☆☆☆☆☆ Equip_Bow ☆☆☆☆☆ %d\n" VT_RST, CUR_UPG_VALUE(UPG_QUIVER));
switch (CUR_UPG_VALUE(UPG_QUIVER)) { switch (CUR_UPG_VALUE(UPG_QUIVER)) {
case 0: case UPG_QUIVER_NONE:
this->getItemId = GI_RUPEE_PURPLE; this->getItemId = GI_RUPEE_PURPLE;
break; break;
case 1: case UPG_QUIVER_NORMAL:
this->getItemId = GI_QUIVER_40; this->getItemId = GI_QUIVER_40;
break; break;
case 2: case UPG_QUIVER_BIG:
this->getItemId = GI_QUIVER_50; this->getItemId = GI_QUIVER_50;
break; break;
} }

View File

@ -10888,7 +10888,11 @@ void func_80847298(Player* this) {
this->unk_6AE_rotFlags = 0; this->unk_6AE_rotFlags = 0;
} }
static f32 D_80854784[] = { 120.0f, 240.0f, 360.0f }; static f32 sDiveDepths[] = {
120.0f, // UPG_SCALE_NONE
240.0f, // UPG_SCALE_SILVER
360.0f // UPG_SCALE_GOLD
};
/** /**
* Updates the two main interface elements that player is responsible for: * Updates the two main interface elements that player is responsible for:
@ -10970,7 +10974,7 @@ void Player_UpdateInterface(PlayState* play, Player* this) {
static u8 sDiveNumberDoActions[] = { DO_ACTION_1, DO_ACTION_2, DO_ACTION_3, DO_ACTION_4, static u8 sDiveNumberDoActions[] = { DO_ACTION_1, DO_ACTION_2, DO_ACTION_3, DO_ACTION_4,
DO_ACTION_5, DO_ACTION_6, DO_ACTION_7, DO_ACTION_8 }; DO_ACTION_5, DO_ACTION_6, DO_ACTION_7, DO_ACTION_8 };
sp24 = (D_80854784[CUR_UPG_VALUE(UPG_SCALE)] - this->actor.depthInWater) / 40.0f; sp24 = (sDiveDepths[CUR_UPG_VALUE(UPG_SCALE)] - this->actor.depthInWater) / 40.0f;
sp24 = CLAMP(sp24, 0, 7); sp24 = CLAMP(sp24, 0, 7);
doAction = sDiveNumberDoActions[sp24]; doAction = sDiveNumberDoActions[sp24];
} else if (sp1C && !(this->stateFlags2 & PLAYER_STATE2_10)) { } else if (sp1C && !(this->stateFlags2 & PLAYER_STATE2_10)) {
@ -13637,7 +13641,7 @@ void Player_Action_8084DC48(Player* this, PlayState* play) {
if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_A) && !Player_ActionHandler_2(this, play) && if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_A) && !Player_ActionHandler_2(this, play) &&
!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && !(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) &&
(this->actor.depthInWater < D_80854784[CUR_UPG_VALUE(UPG_SCALE)])) { (this->actor.depthInWater < sDiveDepths[CUR_UPG_VALUE(UPG_SCALE)])) {
func_8084DBC4(play, this, -2.0f); func_8084DBC4(play, this, -2.0f);
} else { } else {
this->av1.actionVar1++; this->av1.actionVar1++;

View File

@ -239,7 +239,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) {
if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) {
//! @bug Assumes adult always has bullet bag (as adult this should rely on `UPG_QUIVER`) //! @bug Assumes adult always has bullet bag (as adult this should rely on `UPG_QUIVER`)
if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) != UPG_BULLET_BAG_NONE) {
cursorMoveResult = 1; cursorMoveResult = 1;
} }
} else { } else {
@ -329,7 +329,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) { if (pauseCtx->cursorX[PAUSE_EQUIP] == EQUIP_CURSOR_X_UPG) {
if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { if (pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) {
if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) != UPG_BULLET_BAG_NONE) {
cursorMoveResult = 1; cursorMoveResult = 1;
} }
} else { } else {
@ -383,7 +383,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
while (true) { while (true) {
if (cursorX == EQUIP_CURSOR_X_UPG) { if (cursorX == EQUIP_CURSOR_X_UPG) {
if (cursorY == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) { if (cursorY == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) {
if (CUR_UPG_VALUE(UPG_BULLET_BAG) != 0) { if (CUR_UPG_VALUE(UPG_BULLET_BAG) != UPG_BULLET_BAG_NONE) {
pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint; pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint;
pauseCtx->cursorX[PAUSE_EQUIP] = cursorX; pauseCtx->cursorX[PAUSE_EQUIP] = cursorX;
pauseCtx->cursorY[PAUSE_EQUIP] = cursorY; pauseCtx->cursorY[PAUSE_EQUIP] = cursorY;
@ -466,7 +466,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
if (LINK_AGE_IN_YEARS == YEARS_CHILD) { if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) && if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) &&
(CUR_UPG_VALUE(UPG_BULLET_BAG) != 0)) { (CUR_UPG_VALUE(UPG_BULLET_BAG) != UPG_BULLET_BAG_NONE)) {
cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1; cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1;
} else { } else {
cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] + cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] +
@ -475,7 +475,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
} }
} else { } else {
if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) && if ((pauseCtx->cursorY[PAUSE_EQUIP] == EQUIP_CURSOR_Y_BULLETBAG_QUIVER) &&
(CUR_UPG_VALUE(UPG_QUIVER) == 0)) { (CUR_UPG_VALUE(UPG_QUIVER) == UPG_QUIVER_NONE)) {
cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1; cursorItem = ITEM_BULLET_BAG_30 + CUR_UPG_VALUE(UPG_BULLET_BAG) - 1;
} else { } else {
cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] + cursorItem = ITEM_QUIVER_30 + sUpgradeItemOffsets[pauseCtx->cursorY[PAUSE_EQUIP]] +

View File

@ -3916,7 +3916,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->worldMapPoints[WORLD_MAP_POINT_GERUDO_VALLEY] = WORLD_MAP_POINT_STATE_SHOW; pauseCtx->worldMapPoints[WORLD_MAP_POINT_GERUDO_VALLEY] = WORLD_MAP_POINT_STATE_SHOW;
} }
if (CUR_UPG_VALUE(UPG_SCALE)) { if (CUR_UPG_VALUE(UPG_SCALE) != UPG_SCALE_NONE) {
pauseCtx->worldMapPoints[WORLD_MAP_POINT_LAKE_HYLIA] = WORLD_MAP_POINT_STATE_SHOW; pauseCtx->worldMapPoints[WORLD_MAP_POINT_LAKE_HYLIA] = WORLD_MAP_POINT_STATE_SHOW;
} }
if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON)) { if (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON)) {