summaryrefslogtreecommitdiff
path: root/src/code/z_inventory.c
blob: 8ae2bcbf206e61349416b012c9d58892aa661992 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
#include "ultra64.h"
#include "printf.h"
#include "translation.h"
#include "play_state.h"
#include "player.h"
#include "save.h"

#include "assets/textures/icon_item_static/icon_item_static.h"
#include "assets/textures/icon_item_24_static/icon_item_24_static.h"
#include "assets/textures/parameter_static/parameter_static.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[EQUIP_TYPE_MAX] = {
    0xF << (EQUIP_TYPE_SWORD * 4),  // EQUIP_TYPE_SWORD
    0xF << (EQUIP_TYPE_SHIELD * 4), // EQUIP_TYPE_SHIELD
    0xF << (EQUIP_TYPE_TUNIC * 4),  // EQUIP_TYPE_TUNIC
    0xF << (EQUIP_TYPE_BOOTS * 4),  // EQUIP_TYPE_BOOTS
};
u16 gEquipNegMasks[EQUIP_TYPE_MAX] = {
    (u16) ~(0xF << (EQUIP_TYPE_SWORD * 4)),  // EQUIP_TYPE_SWORD
    (u16) ~(0xF << (EQUIP_TYPE_SHIELD * 4)), // EQUIP_TYPE_SHIELD
    (u16) ~(0xF << (EQUIP_TYPE_TUNIC * 4)),  // EQUIP_TYPE_TUNIC
    (u16) ~(0xF << (EQUIP_TYPE_BOOTS * 4)),  // EQUIP_TYPE_BOOTS
};

u32 gUpgradeMasks[UPG_MAX] = {
    0x00000007, // UPG_QUIVER
    0x00000038, // UPG_BOMB_BAG
    0x000001C0, // UPG_STRENGTH
    0x00000E00, // UPG_SCALE
    0x00003000, // UPG_WALLET
    0x0001C000, // UPG_BULLET_BAG
    0x000E0000, // UPG_DEKU_STICKS
    0x00700000, // UPG_DEKU_NUTS
};
u32 gUpgradeNegMasks[UPG_MAX] = {
    ~0x00000007, // UPG_QUIVER
    ~0x00000038, // UPG_BOMB_BAG
    ~0x000001C0, // UPG_STRENGTH
    ~0x00000E00, // UPG_SCALE
    ~0x00003000, // UPG_WALLET
    ~0x0001C000, // UPG_BULLET_BAG
    ~0x000E0000, // UPG_DEKU_STICKS
    ~0x00700000, // UPG_DEKU_NUTS
};

u8 gEquipShifts[EQUIP_TYPE_MAX] = {
    EQUIP_TYPE_SWORD * 4,  // EQUIP_TYPE_SWORD
    EQUIP_TYPE_SHIELD * 4, // EQUIP_TYPE_SHIELD
    EQUIP_TYPE_TUNIC * 4,  // EQUIP_TYPE_TUNIC
    EQUIP_TYPE_BOOTS * 4,  // EQUIP_TYPE_BOOTS
};

u8 gUpgradeShifts[UPG_MAX] = {
    0,  // UPG_QUIVER
    3,  // UPG_BOMB_BAG
    6,  // UPG_STRENGTH
    9,  // UPG_SCALE
    12, // UPG_WALLET
    14, // UPG_BULLET_BAG
    17, // UPG_DEKU_STICKS
    20, // UPG_DEKU_NUTS
};

u16 gUpgradeCapacities[UPG_MAX][4] = {
    { 0, 30, 40, 50 },     // UPG_QUIVER
    { 0, 20, 30, 40 },     // UPG_BOMB_BAG
    { 0, 0, 0, 0 },        // UPG_STRENGTH (unused)
    { 0, 0, 0, 0 },        // UPG_SCALE (unused)
    { 99, 200, 500, 500 }, // UPG_WALLET
    { 0, 30, 40, 50 },     // UPG_BULLET_BAG
    { 0, 10, 20, 30 },     // UPG_DEKU_STICKS
    { 0, 20, 30, 40 },     // UPG_DEKU_NUTS
};

u32 gGsFlagsMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
u32 gGsFlagsShifts[] = { 0, 8, 16, 24 };

void* gItemIcons[] = {
    // icon_item_static 32x32 rgba32
    gItemIconDekuStickTex,         // ITEM_DEKU_STICK
    gItemIconDekuNutTex,           // ITEM_DEKU_NUT
    gItemIconBombTex,              // ITEM_BOMB
    gItemIconBowTex,               // ITEM_BOW
    gItemIconArrowFireTex,         // ITEM_ARROW_FIRE
    gItemIconDinsFireTex,          // ITEM_DINS_FIRE
    gItemIconSlingshotTex,         // ITEM_SLINGSHOT
    gItemIconOcarinaFairyTex,      // ITEM_OCARINA_FAIRY
    gItemIconOcarinaOfTimeTex,     // ITEM_OCARINA_OF_TIME
    gItemIconBombchuTex,           // ITEM_BOMBCHU
    gItemIconHookshotTex,          // ITEM_HOOKSHOT
    gItemIconLongshotTex,          // ITEM_LONGSHOT
    gItemIconArrowIceTex,          // ITEM_ARROW_ICE
    gItemIconFaroresWindTex,       // ITEM_FARORES_WIND
    gItemIconBoomerangTex,         // ITEM_BOOMERANG
    gItemIconLensOfTruthTex,       // ITEM_LENS_OF_TRUTH
    gItemIconMagicBeanTex,         // ITEM_MAGIC_BEAN
    gItemIconHammerTex,            // ITEM_HAMMER
    gItemIconArrowLightTex,        // ITEM_ARROW_LIGHT
    gItemIconNayrusLoveTex,        // ITEM_NAYRUS_LOVE
    gItemIconBottleEmptyTex,       // ITEM_BOTTLE_EMPTY
    gItemIconBottlePotionRedTex,   // ITEM_BOTTLE_POTION_RED
    gItemIconBottlePotionGreenTex, // ITEM_BOTTLE_POTION_GREEN
    gItemIconBottlePotionBlueTex,  // ITEM_BOTTLE_POTION_BLUE
    gItemIconBottleFairyTex,       // ITEM_BOTTLE_FAIRY
    gItemIconBottleFishTex,        // ITEM_BOTTLE_FISH
    gItemIconBottleMilkFullTex,    // ITEM_BOTTLE_MILK_FULL
    gItemIconBottleRutosLetterTex, // ITEM_BOTTLE_RUTOS_LETTER
    gItemIconBottleBlueFireTex,    // ITEM_BOTTLE_BLUE_FIRE
    gItemIconBottleBugTex,         // ITEM_BOTTLE_BUG
    gItemIconBottleBigPoeTex,      // ITEM_BOTTLE_BIG_POE
    gItemIconBottleMilkHalfTex,    // ITEM_BOTTLE_MILK_HALF
    gItemIconBottlePoeTex,         // ITEM_BOTTLE_POE
    gItemIconWeirdEggTex,          // ITEM_WEIRD_EGG
    gItemIconChickenTex,           // ITEM_CHICKEN
    gItemIconZeldasLetterTex,      // ITEM_ZELDAS_LETTER
    gItemIconMaskKeatonTex,        // ITEM_MASK_KEATON
    gItemIconMaskSkullTex,         // ITEM_MASK_SKULL
    gItemIconMaskSpookyTex,        // ITEM_MASK_SPOOKY
    gItemIconMaskBunnyHoodTex,     // ITEM_MASK_BUNNY_HOOD
    gItemIconMaskGoronTex,         // ITEM_MASK_GORON
    gItemIconMaskZoraTex,          // ITEM_MASK_ZORA
    gItemIconMaskGerudoTex,        // ITEM_MASK_GERUDO
    gItemIconMaskTruthTex,         // ITEM_MASK_TRUTH
    gItemIconSoldOutTex,           // ITEM_SOLD_OUT
    gItemIconPocketEggTex,         // ITEM_POCKET_EGG
    gItemIconPocketCuccoTex,       // ITEM_POCKET_CUCCO
    gItemIconCojiroTex,            // ITEM_COJIRO
    gItemIconOddMushroomTex,       // ITEM_ODD_MUSHROOM
    gItemIconOddPotionTex,         // ITEM_ODD_POTION
    gItemIconPoachersSawTex,       // ITEM_POACHERS_SAW
    gItemIconBrokenGoronsSwordTex, // ITEM_BROKEN_GORONS_SWORD
    gItemIconPrescriptionTex,      // ITEM_PRESCRIPTION
    gItemIconEyeballFrogTex,       // ITEM_EYEBALL_FROG
    gItemIconEyeDropsTex,          // ITEM_EYE_DROPS
    gItemIconClaimCheckTex,        // ITEM_CLAIM_CHECK
    gItemIconBowFireTex,           // ITEM_BOW_FIRE
    gItemIconBowIceTex,            // ITEM_BOW_ICE
    gItemIconBowLightTex,          // ITEM_BOW_LIGHT
    gItemIconSwordKokiriTex,       // ITEM_SWORD_KOKIRI
    gItemIconSwordMasterTex,       // ITEM_SWORD_MASTER
    gItemIconSwordBiggoronTex,     // ITEM_SWORD_BIGGORON
    gItemIconShieldDekuTex,        // ITEM_SHIELD_DEKU
    gItemIconShieldHylianTex,      // ITEM_SHIELD_HYLIAN
    gItemIconShieldMirrorTex,      // ITEM_SHIELD_MIRROR
    gItemIconTunicKokiriTex,       // ITEM_TUNIC_KOKIRI
    gItemIconTunicGoronTex,        // ITEM_TUNIC_GORON
    gItemIconTunicZoraTex,         // ITEM_TUNIC_ZORA
    gItemIconBootsKokiriTex,       // ITEM_BOOTS_KOKIRI
    gItemIconBootsIronTex,         // ITEM_BOOTS_IRON
    gItemIconBootsHoverTex,        // ITEM_BOOTS_HOVER
    gItemIconBulletBag30Tex,       // ITEM_BULLET_BAG_30
    gItemIconBulletBag40Tex,       // ITEM_BULLET_BAG_40
    gItemIconBulletBag50Tex,       // ITEM_BULLET_BAG_50
    gItemIconQuiver30Tex,          // ITEM_QUIVER_30
    gItemIconQuiver40Tex,          // ITEM_QUIVER_40
    gItemIconQuiver50Tex,          // ITEM_QUIVER_50
    gItemIconBombBag20Tex,         // ITEM_BOMB_BAG_20
    gItemIconBombBag30Tex,         // ITEM_BOMB_BAG_30
    gItemIconBombBag40Tex,         // ITEM_BOMB_BAG_40
    gItemIconGoronsBraceletTex,    // ITEM_STRENGTH_GORONS_BRACELET
    gItemIconSilverGauntletsTex,   // ITEM_STRENGTH_SILVER_GAUNTLETS
    gItemIconGoldenGauntletsTex,   // ITEM_STRENGTH_GOLD_GAUNTLETS
    gItemIconScaleSilverTex,       // ITEM_SCALE_SILVER
    gItemIconScaleGoldenTex,       // ITEM_SCALE_GOLDEN
    gItemIconBrokenGiantsKnifeTex, // ITEM_GIANTS_KNIFE
    gItemIconAdultsWalletTex,      // ITEM_ADULTS_WALLET
    gItemIconGiantsWalletTex,      // ITEM_GIANTS_WALLET
    gItemIconDekuSeedsTex,         // ITEM_DEKU_SEEDS
    gItemIconFishingPoleTex,       // ITEM_FISHING_POLE
    // icon_item_static 16x24 ia8
    gSongNoteTex, // ITEM_SONG_MINUET
    gSongNoteTex, // ITEM_SONG_BOLERO
    gSongNoteTex, // ITEM_SONG_SERENADE
    gSongNoteTex, // ITEM_SONG_REQUIEM
    gSongNoteTex, // ITEM_SONG_NOCTURNE
    gSongNoteTex, // ITEM_SONG_PRELUDE
    gSongNoteTex, // ITEM_SONG_LULLABY
    gSongNoteTex, // ITEM_SONG_EPONA
    gSongNoteTex, // ITEM_SONG_SARIA
    gSongNoteTex, // ITEM_SONG_SUN
    gSongNoteTex, // ITEM_SONG_TIME
    gSongNoteTex, // ITEM_SONG_STORMS
    // icon_item_24static 24x24 rgba32
    gQuestIconMedallionForestTex, // ITEM_MEDALLION_FOREST
    gQuestIconMedallionFireTex,   // ITEM_MEDALLION_FIRE
    gQuestIconMedallionWaterTex,  // ITEM_MEDALLION_WATER
    gQuestIconMedallionSpiritTex, // ITEM_MEDALLION_SPIRIT
    gQuestIconMedallionShadowTex, // ITEM_MEDALLION_SHADOW
    gQuestIconMedallionLightTex,  // ITEM_MEDALLION_LIGHT
    gQuestIconKokiriEmeraldTex,   // ITEM_KOKIRI_EMERALD
    gQuestIconGoronRubyTex,       // ITEM_GORON_RUBY
    gQuestIconZoraSapphireTex,    // ITEM_ZORA_SAPPHIRE
    gQuestIconStoneOfAgonyTex,    // ITEM_STONE_OF_AGONY
    gQuestIconGerudosCardTex,     // ITEM_GERUDOS_CARD
    gQuestIconGoldSkulltulaTex,   // ITEM_SKULL_TOKEN
    gQuestIconHeartContainerTex,  // ITEM_HEART_CONTAINER
    gQuestIconHeartPieceTex,      // ITEM_HEART_PIECE
    gQuestIconDungeonBossKeyTex,  // ITEM_DUNGEON_BOSS_KEY
    gQuestIconDungeonMapTex,      // ITEM_DUNGEON_COMPASS (swapped with map (inconsequential))
    gQuestIconDungeonCompassTex,  // ITEM_DUNGEON_MAP (swapped with compass (inconsequential))
    gQuestIconDungeonBossKeyTex,  // ITEM_SMALL_KEY (but texture is boss key (inconsequential))
    gQuestIconMagicJarSmallTex,   // ITEM_MAGIC_JAR_SMALL
    gQuestIconMagicJarBigTex,     // ITEM_MAGIC_JAR_BIG
    // icon_item_static 48x48 ia8
    gHeartPieceIcon1Tex, // ITEM_HEART_PIECE_2
    gHeartPieceIcon2Tex, // ITEM_INVALID_1
    gHeartPieceIcon3Tex, // ITEM_INVALID_2
    // parameter_static 16x16 ia8
    gOcarinaBtnIconCUpTex,    // ITEM_INVALID_3
    gOcarinaBtnIconCDownTex,  // ITEM_INVALID_4
    gOcarinaBtnIconCLeftTex,  // ITEM_INVALID_5
    gOcarinaBtnIconCRightTex, // ITEM_INVALID_6
    gOcarinaBtnIconATex,      // ITEM_INVALID_7
};

// Used to map item IDs to inventory slots
u8 gItemSlots[] = {
    SLOT_DEKU_STICK,    // ITEM_DEKU_STICK
    SLOT_DEKU_NUT,      // ITEM_DEKU_NUT
    SLOT_BOMB,          // ITEM_BOMB
    SLOT_BOW,           // ITEM_BOW
    SLOT_ARROW_FIRE,    // ITEM_ARROW_FIRE
    SLOT_DINS_FIRE,     // ITEM_DINS_FIRE
    SLOT_SLINGSHOT,     // ITEM_SLINGSHOT
    SLOT_OCARINA,       // ITEM_OCARINA_FAIRY
    SLOT_OCARINA,       // ITEM_OCARINA_OF_TIME
    SLOT_BOMBCHU,       // ITEM_BOMBCHU
    SLOT_HOOKSHOT,      // ITEM_HOOKSHOT
    SLOT_HOOKSHOT,      // ITEM_LONGSHOT
    SLOT_ARROW_ICE,     // ITEM_ARROW_ICE
    SLOT_FARORES_WIND,  // ITEM_FARORES_WIND
    SLOT_BOOMERANG,     // ITEM_BOOMERANG
    SLOT_LENS_OF_TRUTH, // ITEM_LENS_OF_TRUTH
    SLOT_MAGIC_BEAN,    // ITEM_MAGIC_BEAN
    SLOT_HAMMER,        // ITEM_HAMMER
    SLOT_ARROW_LIGHT,   // ITEM_ARROW_LIGHT
    SLOT_NAYRUS_LOVE,   // ITEM_NAYRUS_LOVE
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_EMPTY
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_POTION_RED
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_POTION_GREEN
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_POTION_BLUE
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_FAIRY
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_FISH
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_MILK_FULL
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_RUTOS_LETTER
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_BLUE_FIRE
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_BUG
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_BIG_POE
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_MILK_HALF
    SLOT_BOTTLE_1,      // ITEM_BOTTLE_POE
    SLOT_TRADE_CHILD,   // ITEM_WEIRD_EGG
    SLOT_TRADE_CHILD,   // ITEM_CHICKEN
    SLOT_TRADE_CHILD,   // ITEM_ZELDAS_LETTER
    SLOT_TRADE_CHILD,   // ITEM_MASK_KEATON
    SLOT_TRADE_CHILD,   // ITEM_MASK_SKULL
    SLOT_TRADE_CHILD,   // ITEM_MASK_SPOOKY
    SLOT_TRADE_CHILD,   // ITEM_MASK_BUNNY_HOOD
    SLOT_TRADE_CHILD,   // ITEM_MASK_GORON
    SLOT_TRADE_CHILD,   // ITEM_MASK_ZORA
    SLOT_TRADE_CHILD,   // ITEM_MASK_GERUDO
    SLOT_TRADE_CHILD,   // ITEM_MASK_TRUTH
    SLOT_TRADE_CHILD,   // ITEM_SOLD_OUT
    SLOT_TRADE_ADULT,   // ITEM_POCKET_EGG
    SLOT_TRADE_ADULT,   // ITEM_POCKET_CUCCO
    SLOT_TRADE_ADULT,   // ITEM_COJIRO
    SLOT_TRADE_ADULT,   // ITEM_ODD_MUSHROOM
    SLOT_TRADE_ADULT,   // ITEM_ODD_POTION
    SLOT_TRADE_ADULT,   // ITEM_POACHERS_SAW
    SLOT_TRADE_ADULT,   // ITEM_BROKEN_GORONS_SWORD
    SLOT_TRADE_ADULT,   // ITEM_PRESCRIPTION
    SLOT_TRADE_ADULT,   // ITEM_EYEBALL_FROG
    SLOT_TRADE_ADULT,   // ITEM_EYE_DROPS
    SLOT_TRADE_ADULT,   // ITEM_CLAIM_CHECK
};

void Inventory_ChangeEquipment(s16 equipment, u16 value) {
    gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment];
    gSaveContext.save.info.equips.equipment |= value << gEquipShifts[equipment];
}

u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {
    Player* player = GET_PLAYER(play);
    s32 pad;
    u16 equipValue = gSaveContext.save.info.equips.equipment & gEquipMasks[equipment];

    PRINTF(T("装備アイテム抹消 = %d  zzz=%d\n", "Erasing equipment item = %d  zzz=%d\n"), equipment, equipValue);

    if (equipValue) {
        equipValue >>= gEquipShifts[equipment];

        gSaveContext.save.info.equips.equipment &= gEquipNegMasks[equipment];
        gSaveContext.save.info.inventory.equipment ^= OWNED_EQUIP_FLAG(equipment, equipValue - 1);

        if (equipment == EQUIP_TYPE_TUNIC) {
            gSaveContext.save.info.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4);
        }

        if (equipment == EQUIP_TYPE_SWORD) {
            gSaveContext.save.info.equips.buttonItems[0] = ITEM_NONE;
            gSaveContext.save.info.infTable[INFTABLE_INDEX_1DX] = 1;
        }

        Player_SetEquipmentData(play, player);
        play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
    }

    return equipValue;
}

void Inventory_ChangeUpgrade(s16 upgrade, s16 value) {
    gSaveContext.save.info.inventory.upgrades &= gUpgradeNegMasks[upgrade];
    gSaveContext.save.info.inventory.upgrades |= value << gUpgradeShifts[upgrade];
}