Match GiveItem

This commit is contained in:
Tal Hayon
2022-07-22 18:41:19 +03:00
parent e03eec07b9
commit b5ab963454
2 changed files with 148 additions and 315 deletions
+148 -1
View File
@@ -82,6 +82,7 @@ extern u8 gUpdateVisibleTiles;
extern u16 gUnk_020178E0[];
extern u8 gUnk_02024090[];
extern const u16 gUnk_080FD5A8[];
extern void** gAreaTilesets[];
extern void** gAreaRoomMaps[];
@@ -157,6 +158,9 @@ static void InitAllRoomResInfo(void);
static void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 room);
static void sub_080532E4(void);
static void ResetTimerFlags(void);
bool32 ItemIsBottle(u32);
void ModArrows(s32);
void ModShells(s32);
typedef struct {
u8 dest_off[8];
@@ -2249,7 +2253,150 @@ s32 GetItemPrice(u32 item) {
return ptr[0];
}
ASM_FUNC("asm/non_matching/game/GiveItem.inc", u32 GiveItem(u32 a, u32 b))
u32 GiveItem(Item item, u32 param_2) {
u32 uVar4;
u32 result;
u32 uVar9;
const ItemMetaData* metaData;
uVar4 = GetInventoryValue(item);
metaData = &gItemMetaData[item];
if (uVar4 == 0) {
result = *(u16*)&metaData->textId;
} else {
result = *(u16*)&metaData->unk6;
}
if (!ItemIsBottle(item)) {
PutItemOnSlot(item);
if (uVar4 == 0) {
SetInventoryValue(item, 1);
}
}
switch (metaData->unk1) {
case 0:
default:
break;
case 1:
ModHealth(metaData->unk2);
SoundReq(SFX_HEART_GET);
break;
case 2:
ModRupees((u32)gUnk_080FD5A8[metaData->unk2]);
SoundReq(SFX_RUPEE_GET);
break;
case 3:
uVar9 = 0;
while (TRUE) {
if (3 < uVar9) {
return result;
}
if (GetInventoryValue(ITEM_BOTTLE1 + uVar9) == 0)
break;
uVar9++;
}
item = ITEM_BOTTLE1 + uVar9;
if (gSave.stats.bottles[uVar9] == 0) {
gSave.stats.bottles[uVar9] = 0x20;
}
SetInventoryValue(item, 1);
PutItemOnSlot(item);
break;
case 4:
uVar9 = 0;
while (gSave.stats.bottles[uVar9] != 0x20) {
uVar9++;
if (3 < uVar9) {
return result;
}
}
if (3 < uVar9) {
break;
}
gSave.stats.bottles[uVar9] = (u8)item;
SetInventoryValue(item, 1);
SoundReq(SFX_ITEM_GET);
break;
case 5:
sub_080526F8(1);
SoundReq(SFX_103);
break;
case 6:
gSave.unk46C[gArea.dungeon_idx] |= metaData->unk2;
break;
case 0xd:
sub_0801E738(0x72);
break;
case 0x12:
if (item == ITEM_BOOMERANG) {
SetInventoryValue(ITEM_MAGIC_BOOMERANG, 0);
} else {
SetInventoryValue(ITEM_BOOMERANG, 0);
}
case 0x11:
LoadItemGfx();
break;
case 7:
if (item == ITEM_BOMBS) {
SetInventoryValue(ITEM_REMOTE_BOMBS, 0);
} else {
SetInventoryValue(ITEM_BOMBS, 0);
}
ModBombs(99);
LoadItemGfx();
break;
case 8:
if (uVar4 == 0) {
SetInventoryValue(ITEM_BOMBS, 1);
PutItemOnSlot(7);
} else {
gSave.stats.bombBagType++;
if (3 < gSave.stats.bombBagType) {
gSave.stats.bombBagType = 3;
}
}
ModBombs(99);
break;
case 9:
ModBombs(metaData->unk2);
SoundReq(SFX_103);
break;
case 0xb:
if (GetInventoryValue(ITEM_LARGE_QUIVER) == 0) {
SetInventoryValue(ITEM_LARGE_QUIVER, 1);
}
ModArrows(99);
LoadItemGfx();
break;
case 0xa:
gSave.stats.quiverType++;
if (3 < gSave.stats.quiverType) {
gSave.stats.quiverType = 3;
}
ModArrows(99);
break;
case 0xc:
ModArrows(metaData->unk2);
SoundReq(SFX_103);
break;
case 0x0e:
SetInventoryValue(ITEM_SHELLS, 1);
ModShells(param_2);
SoundReq(SFX_103);
break;
case 0x0f:
sub_0801E738(param_2);
break;
case 0x10:
gSave.stats.walletType++;
if (gSave.stats.walletType < 4) {
break;
}
gSave.stats.walletType = 3;
break;
}
return result;
}
// TODO Adapt ItemMetaData struct
void sub_08054288(s32 param_1) {