From b5ab963454438489b5fa462a0f19f693ca065574 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Fri, 22 Jul 2022 18:41:19 +0300 Subject: [PATCH] Match GiveItem --- asm/non_matching/game/GiveItem.inc | 314 ----------------------------- src/game.c | 149 +++++++++++++- 2 files changed, 148 insertions(+), 315 deletions(-) delete mode 100644 asm/non_matching/game/GiveItem.inc diff --git a/asm/non_matching/game/GiveItem.inc b/asm/non_matching/game/GiveItem.inc deleted file mode 100644 index 303a305f..00000000 --- a/asm/non_matching/game/GiveItem.inc +++ /dev/null @@ -1,314 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - adds r7, r1, #0 - bl GetInventoryValue - adds r5, r0, #0 - lsls r1, r6, #3 - ldr r0, _08054010 @ =gItemMetaData - adds r4, r1, r0 - cmp r5, #0 - bne _08054014 - ldrh r0, [r4, #4] - mov r8, r0 - b _08054018 - .align 2, 0 -_08054010: .4byte gItemMetaData -_08054014: - ldrh r2, [r4, #6] - mov r8, r2 -_08054018: - adds r0, r6, #0 - bl ItemIsBottle - cmp r0, #0 - bne _08054034 - adds r0, r6, #0 - bl PutItemOnSlot - cmp r5, #0 - bne _08054034 - adds r0, r6, #0 - movs r1, #1 - bl SetInventoryValue -_08054034: - ldrb r0, [r4, #1] - cmp r0, #0x12 - bls _0805403C - b _0805427C -_0805403C: - lsls r0, r0, #2 - ldr r1, _08054048 @ =_0805404C - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08054048: .4byte _0805404C -_0805404C: @ jump table - .4byte _0805427C @ case 0 - .4byte _08054098 @ case 1 - .4byte _080540A6 @ case 2 - .4byte _080540C0 @ case 3 - .4byte _08054104 @ case 4 - .4byte _0805414C @ case 5 - .4byte _08054154 @ case 6 - .4byte _08054194 @ case 7 - .4byte _080541B6 @ case 8 - .4byte _080541F0 @ case 9 - .4byte _08054212 @ case 10 - .4byte _080541F8 @ case 11 - .4byte _08054238 @ case 12 - .4byte _08054174 @ case 13 - .4byte _08054240 @ case 14 - .4byte _0805425C @ case 15 - .4byte _08054264 @ case 16 - .4byte _080541B0 @ case 17 - .4byte _0805417C @ case 18 -_08054098: - ldrb r0, [r4, #2] - bl ModHealth - movs r0, #0x71 - bl SoundReq - b _0805427C -_080540A6: - ldr r0, _080540BC @ =gUnk_080FD5A8 - ldrb r1, [r4, #2] - lsls r1, r1, #1 - adds r1, r1, r0 - ldrh r0, [r1] - bl ModRupees - movs r0, #0x6f - bl SoundReq - b _0805427C - .align 2, 0 -_080540BC: .4byte gUnk_080FD5A8 -_080540C0: - movs r5, #0 - movs r4, #0x1c - b _080540CA -_080540C6: - adds r4, r1, #1 - adds r5, #1 -_080540CA: - cmp r5, #3 - bls _080540D0 - b _0805427C -_080540D0: - adds r0, r4, #0 - bl GetInventoryValue - adds r1, r4, #0 - cmp r0, #0 - bne _080540C6 - adds r6, r4, #0 - ldr r0, _08054100 @ =gSave - adds r0, #0xb6 - adds r1, r5, r0 - ldrb r0, [r1] - cmp r0, #0 - bne _080540EE - movs r0, #0x20 - strb r0, [r1] -_080540EE: - adds r0, r6, #0 - movs r1, #1 - bl SetInventoryValue - adds r0, r6, #0 - bl PutItemOnSlot - b _0805427C - .align 2, 0 -_08054100: .4byte gSave -_08054104: - movs r5, #0 - ldr r0, _08054144 @ =gSave - adds r2, r0, #0 - adds r2, #0xb6 - ldrb r1, [r2] - adds r3, r0, #0 - cmp r1, #0x20 - beq _08054126 - adds r1, r2, #0 -_08054116: - adds r5, #1 - cmp r5, #3 - bls _0805411E - b _0805427C -_0805411E: - adds r0, r5, r1 - ldrb r0, [r0] - cmp r0, #0x20 - bne _08054116 -_08054126: - cmp r5, #3 - bls _0805412C - b _0805427C -_0805412C: - adds r0, r3, #0 - adds r0, #0xb6 - adds r0, r5, r0 - strb r6, [r0] - adds r0, r6, #0 - movs r1, #1 - bl SetInventoryValue - ldr r0, _08054148 @ =0x00000109 - bl SoundReq - b _0805427C - .align 2, 0 -_08054144: .4byte gSave -_08054148: .4byte 0x00000109 -_0805414C: - movs r0, #1 - bl sub_080526F8 - b _0805424E -_08054154: - ldr r1, _08054168 @ =gSave - ldr r0, _0805416C @ =gArea - ldr r2, _08054170 @ =0x0000046C - adds r1, r1, r2 - ldrb r0, [r0, #3] - adds r1, r1, r0 - ldrb r0, [r1] - ldrb r2, [r4, #2] - orrs r0, r2 - b _0805427A - .align 2, 0 -_08054168: .4byte gSave -_0805416C: .4byte gArea -_08054170: .4byte 0x0000046C -_08054174: - movs r0, #0x72 - bl sub_0801E738 - b _0805427C -_0805417C: - cmp r6, #0xb - bne _0805418A - movs r0, #0xc - movs r1, #0 - bl SetInventoryValue - b _080541B0 -_0805418A: - movs r0, #0xb - movs r1, #0 - bl SetInventoryValue - b _080541B0 -_08054194: - cmp r6, #7 - bne _080541A2 - movs r0, #8 - movs r1, #0 - bl SetInventoryValue - b _080541AA -_080541A2: - movs r0, #7 - movs r1, #0 - bl SetInventoryValue -_080541AA: - movs r0, #0x63 - bl ModBombs -_080541B0: - bl LoadItemGfx - b _0805427C -_080541B6: - cmp r5, #0 - bne _080541CA - movs r0, #7 - movs r1, #1 - bl SetInventoryValue - movs r0, #7 - bl PutItemOnSlot - b _080541E2 -_080541CA: - ldr r0, _080541EC @ =gSave - adds r1, r0, #0 - adds r1, #0xae - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #3 - bls _080541E2 - movs r0, #3 - strb r0, [r1] -_080541E2: - movs r0, #0x63 - bl ModBombs - b _0805427C - .align 2, 0 -_080541EC: .4byte gSave -_080541F0: - ldrb r0, [r4, #2] - bl ModBombs - b _0805424E -_080541F8: - movs r0, #0x66 - bl GetInventoryValue - cmp r0, #0 - bne _0805420A - movs r0, #0x66 - movs r1, #1 - bl SetInventoryValue -_0805420A: - movs r0, #0x63 - bl ModArrows - b _080541B0 -_08054212: - ldr r0, _08054234 @ =gSave - adds r1, r0, #0 - adds r1, #0xaf - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #3 - bls _0805422A - movs r0, #3 - strb r0, [r1] -_0805422A: - movs r0, #0x63 - bl ModArrows - b _0805427C - .align 2, 0 -_08054234: .4byte gSave -_08054238: - ldrb r0, [r4, #2] - bl ModArrows - b _0805424E -_08054240: - movs r0, #0x3f - movs r1, #1 - bl SetInventoryValue - adds r0, r7, #0 - bl ModShells -_0805424E: - ldr r0, _08054258 @ =0x00000103 - bl SoundReq - b _0805427C - .align 2, 0 -_08054258: .4byte 0x00000103 -_0805425C: - adds r0, r7, #0 - bl sub_0801E738 - b _0805427C -_08054264: - ldr r0, _08054284 @ =gSave - adds r1, r0, #0 - adds r1, #0xa8 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #3 - bls _0805427C - movs r0, #3 -_0805427A: - strb r0, [r1] -_0805427C: - mov r0, r8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08054284: .4byte gSave - .syntax divided diff --git a/src/game.c b/src/game.c index 94bf542c..ac8f9a62 100644 --- a/src/game.c +++ b/src/game.c @@ -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) {