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
|
#include "global.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_STICKS
0x00700000, // UPG_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_STICKS
~0x00700000, // UPG_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_STICKS
20, // UPG_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_STICKS
{ 0, 20, 30, 40 }, // UPG_NUTS
};
u32 gGsFlagsMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
u32 gGsFlagsShifts[] = { 0, 8, 16, 24 };
void* gItemIcons[] = {
gDekuStickIconTex,
gDekuNutIconTex,
gBombIconTex,
gFairyBowIconTex,
gFireArrowIconTex,
gDinsFireIconTex,
gFairySlingshotIconTex,
gFairyOcarinaIconTex,
gOcarinaofTimeIconTex,
gBombchuIconTex,
gHookshotIconTex,
gLongshotIconTex,
gIceArrowIconTex,
gFaroresWindIconTex,
gBoomerangIconTex,
gLensofTruthIconTex,
gMagicBeansIconTex,
gMegatonHammerIconTex,
gLightArrowIconTex,
gNayrusLoveIconTex,
gEmptyBottleIconTex,
gRedPotionIconTex,
gGreenPotionIconTex,
gBluePotionIconTex,
gBottledFairyIconTex,
gFishIconTex,
gMilkFullIconTex,
gRutosLetterIconTex,
gBlueFireIconTex,
gBugIconTex,
gBigPoeIconTex,
gMilkhalfIconTex,
gPoeIconTex,
gWeirdEggIconTex,
gCuccoIconTex,
gZeldasLetterIconTex,
gKeatonMaskIconTex,
gSkullMaskIconTex,
gSpookyMaskIconTex,
gBunnyHoodIconTex,
gGoronMaskIconTex,
gZoraMaskIconTex,
gGerudoMaskIconTex,
gMaskofTruthIconTex,
gSoldOutIconTex,
gPocketEggIconTex,
gPocketCuccoIconTex,
gCojiroIconTex,
gOddMushroomIconTex,
gOddPotionIconTex,
gPoachersSawIconTex,
gBrokenBiggoronSwordIconTex,
gPrescriptionIconTex,
gEyeBallFrogIconTex,
gEyeDropsIconTex,
gClaimCheckIconTex,
gFairyBowFireIconTex,
gFairyBowIceIconTex,
gFairyBowLightIconTex,
gKokiriSwordIconTex,
gMasterSwordIconTex,
gBiggoronSwordIconTex,
gDekuShieldIconTex,
gHylianShieldIconTex,
gMirrorShieldIconTex,
gKokiriTunicIconTex,
gGoronTunicIconTex,
gZoraTunicIconTex,
gKokiriBootsIconTex,
gIronBootsIconTex,
gHoverBootsIconTex,
gBulletBag30IconTex,
gBulletBag40IconTex,
gBulletBag50IconTex,
gQuiver30IconTex,
gQuiver40IconTex,
gQuiver50IconTex,
gBombBag20IconTex,
gBombBag30IconTex,
gBombBag40IconTex,
gGoronsBraceletIconTex,
gSilverGauntletsIconTex,
gGoldenGauntletsIconTex,
gSilverScaleIconTex,
gGoldenScaleIconTex,
gBrokenGiantsKnifeIconTex,
gAdultsWalletIconTex,
gGiantsWalletIconTex,
gDekuSeedsIconTex,
gFishingPoleIconTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gSongNoteTex,
gForestMedallionIconTex,
gFireMedallionIconTex,
gWaterMedallionIconTex,
gSpiritMedallionIconTex,
gShadowMedallionIconTex,
gLightMedallionIconTex,
gKokiriEmeraldIconTex,
gGoronRubyIconTex,
gZoraSapphireIconTex,
gStoneOfAgonyIconTex,
gGerudosCardIconTex,
gGoldSkulltulaIconTex,
gHeartContainerIconTex,
gUnusedPieceOfHeartIconTex,
gBossKeyIconTex,
gDungeonMapIconTex,
gCompassIconTex,
gBossKeyIconTex,
gSmallMagicJarIconTex,
gBigMagicJarIconTex,
gHeartPieceIcon1Tex,
gHeartPieceIcon2Tex,
gHeartPieceIcon3Tex,
gOcarinaCUpTex,
gOcarinaCDownTex,
gOcarinaCLeftTex,
gOcarinaCRightTex,
gOcarinaATex,
};
// Used to map item IDs to inventory slots
u8 gItemSlots[] = {
SLOT_STICK, // ITEM_STICK
SLOT_NUT, // ITEM_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_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, // ITEM_LENS
SLOT_BEAN, // ITEM_BEAN
SLOT_HAMMER, // ITEM_HAMMER
SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT
SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
SLOT_BOTTLE_1, // ITEM_BOTTLE
SLOT_BOTTLE_1, // ITEM_POTION_RED
SLOT_BOTTLE_1, // ITEM_POTION_GREEN
SLOT_BOTTLE_1, // ITEM_POTION_BLUE
SLOT_BOTTLE_1, // ITEM_FAIRY
SLOT_BOTTLE_1, // ITEM_FISH
SLOT_BOTTLE_1, // ITEM_MILK_BOTTLE
SLOT_BOTTLE_1, // ITEM_LETTER_RUTO
SLOT_BOTTLE_1, // ITEM_BLUE_FIRE
SLOT_BOTTLE_1, // ITEM_BUG
SLOT_BOTTLE_1, // ITEM_BIG_POE
SLOT_BOTTLE_1, // ITEM_MILK_HALF
SLOT_BOTTLE_1, // ITEM_POE
SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG
SLOT_TRADE_CHILD, // ITEM_CHICKEN
SLOT_TRADE_CHILD, // ITEM_LETTER_ZELDA
SLOT_TRADE_CHILD, // ITEM_MASK_KEATON
SLOT_TRADE_CHILD, // ITEM_MASK_SKULL
SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY
SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY
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_SAW
SLOT_TRADE_ADULT, // ITEM_SWORD_BROKEN
SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION
SLOT_TRADE_ADULT, // ITEM_FROG
SLOT_TRADE_ADULT, // ITEM_EYEDROPS
SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK
};
void Inventory_ChangeEquipment(s16 equipment, u16 value) {
gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.equips.equipment |= value << gEquipShifts[equipment];
}
u8 Inventory_DeleteEquipment(PlayState* play, s16 equipment) {
Player* player = GET_PLAYER(play);
s32 pad;
u16 equipValue = gSaveContext.equips.equipment & gEquipMasks[equipment];
// "Erasing equipment item = %d zzz=%d"
osSyncPrintf("装備アイテム抹消 = %d zzz=%d\n", equipment, equipValue);
if (equipValue) {
equipValue >>= gEquipShifts[equipment];
gSaveContext.equips.equipment &= gEquipNegMasks[equipment];
gSaveContext.inventory.equipment ^= OWNED_EQUIP_FLAG(equipment, equipValue - 1);
if (equipment == EQUIP_TYPE_TUNIC) {
gSaveContext.equips.equipment |= EQUIP_VALUE_TUNIC_KOKIRI << (EQUIP_TYPE_TUNIC * 4);
}
if (equipment == EQUIP_TYPE_SWORD) {
gSaveContext.equips.buttonItems[0] = ITEM_NONE;
gSaveContext.infTable[INFTABLE_1DX_INDEX] = 1;
}
Player_SetEquipmentData(play, player);
play->pauseCtx.cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
}
return equipValue;
}
void Inventory_ChangeUpgrade(s16 upgrade, s16 value) {
gSaveContext.inventory.upgrades &= gUpgradeNegMasks[upgrade];
gSaveContext.inventory.upgrades |= value << gUpgradeShifts[upgrade];
}
|