diff --git a/asm/non_matching/playerUtils/SetInventoryValue.inc b/asm/non_matching/playerUtils/SetInventoryValue.inc deleted file mode 100644 index de8e3d40..00000000 --- a/asm/non_matching/playerUtils/SetInventoryValue.inc +++ /dev/null @@ -1,21 +0,0 @@ - .syntax unified - push {r4, lr} - adds r3, r0, #0 - lsrs r4, r3, #2 - ldr r0, _0807CAC4 @ =gUnk_02002B32 - adds r4, r4, r0 - movs r0, #3 - ands r3, r0 - lsls r3, r3, #1 - lsls r1, r3 - ldrb r2, [r4] - lsls r0, r3 - ands r0, r2 - eors r2, r0 - orrs r2, r1 - strb r2, [r4] - lsrs r0, r3 - pop {r4, pc} - .align 2, 0 -_0807CAC4: .4byte gUnk_02002B32 - .syntax divided diff --git a/asm/non_matching/playerUtils/sub_0807CAC8.inc b/asm/non_matching/playerUtils/sub_0807CAC8.inc deleted file mode 100644 index 3ee32207..00000000 --- a/asm/non_matching/playerUtils/sub_0807CAC8.inc +++ /dev/null @@ -1,18 +0,0 @@ - .syntax unified - ldr r2, _0807CAE0 @ =gSave - ldr r1, _0807CAE4 @ =gArea - ldr r3, _0807CAE8 @ =0x0000047C - adds r2, r2, r3 - ldrb r1, [r1, #3] - adds r2, r2, r1 - movs r1, #1 - lsls r1, r0 - ldrb r0, [r2] - orrs r1, r0 - strb r1, [r2] - bx lr - .align 2, 0 -_0807CAE0: .4byte gSave -_0807CAE4: .4byte gArea -_0807CAE8: .4byte 0x0000047C - .syntax divided diff --git a/asm/non_matching/playerUtils/sub_0807CAEC.inc b/asm/non_matching/playerUtils/sub_0807CAEC.inc deleted file mode 100644 index 3b284ee5..00000000 --- a/asm/non_matching/playerUtils/sub_0807CAEC.inc +++ /dev/null @@ -1,18 +0,0 @@ - .syntax unified - adds r2, r0, #0 - ldr r0, _0807CB04 @ =gSave - ldr r1, _0807CB08 @ =gArea - ldr r3, _0807CB0C @ =0x0000047C - adds r0, r0, r3 - ldrb r1, [r1, #3] - adds r0, r0, r1 - ldrb r0, [r0] - asrs r0, r2 - movs r1, #1 - ands r0, r1 - bx lr - .align 2, 0 -_0807CB04: .4byte gSave -_0807CB08: .4byte gArea -_0807CB0C: .4byte 0x0000047C - .syntax divided diff --git a/asm/non_matching/playerUtils/sub_0807CB24.inc b/asm/non_matching/playerUtils/sub_0807CB24.inc deleted file mode 100644 index 13d60790..00000000 --- a/asm/non_matching/playerUtils/sub_0807CB24.inc +++ /dev/null @@ -1,74 +0,0 @@ - .syntax unified - push {lr} - adds r2, r0, #0 - adds r3, r1, #0 - cmp r2, #0x11 - bhi _0807CB84 - lsls r0, r2, #2 - ldr r1, _0807CB38 @ =_0807CB3C - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0807CB38: .4byte _0807CB3C -_0807CB3C: @ jump table - .4byte _0807CB84 @ case 0 - .4byte _0807CB88 @ case 1 - .4byte _0807CB88 @ case 2 - .4byte _0807CB88 @ case 3 - .4byte _0807CB88 @ case 4 - .4byte _0807CB88 @ case 5 - .4byte _0807CB88 @ case 6 - .4byte _0807CB88 @ case 7 - .4byte _0807CB88 @ case 8 - .4byte _0807CB88 @ case 9 - .4byte _0807CB88 @ case 10 - .4byte _0807CB88 @ case 11 - .4byte _0807CB88 @ case 12 - .4byte _0807CB88 @ case 13 - .4byte _0807CB84 @ case 14 - .4byte _0807CBA0 @ case 15 - .4byte _0807CBAE @ case 16 - .4byte _0807CBBC @ case 17 -_0807CB84: - movs r1, #0 - b _0807CBCA -_0807CB88: - ldr r0, _0807CB9C @ =gLocalFlagBanks - lsls r1, r2, #1 - adds r1, r1, r0 - ldrh r0, [r1] - adds r1, r3, #0 - bl CheckLocalFlagByBank -_0807CB96: - adds r1, r0, #0 - b _0807CBCA - .align 2, 0 -_0807CB9C: .4byte gLocalFlagBanks -_0807CBA0: - adds r0, r3, #0 - bl GetInventoryValue - cmp r0, #0 - beq _0807CB96 - movs r0, #1 - b _0807CB96 -_0807CBAE: - adds r0, r3, #0 - bl GetInventoryValue - movs r1, #0 - cmp r0, #1 - bne _0807CBCA - b _0807CBC8 -_0807CBBC: - adds r0, r3, #0 - bl GetInventoryValue - movs r1, #0 - cmp r0, #2 - bne _0807CBCA -_0807CBC8: - movs r1, #1 -_0807CBCA: - adds r0, r1, #0 - pop {pc} - .align 2, 0 - .syntax divided diff --git a/include/player.h b/include/player.h index df2ee028..94ec3435 100644 --- a/include/player.h +++ b/include/player.h @@ -365,7 +365,7 @@ u32 IsItemEquipped(u32); /** @see Item */ u32 GetInventoryValue(u32); /** @see Item */ -void SetInventoryValue(u32, u32); +u32 SetInventoryValue(u32, u32); s32 ModHealth(s32 delta); void ModRupees(s32 delta); void ModBombs(s32 delta); diff --git a/include/save.h b/include/save.h index 4e1c1335..6ef5addc 100644 --- a/include/save.h +++ b/include/save.h @@ -66,7 +66,8 @@ typedef struct { /*0x24E*/ u8 unk24E[14]; /*0x25C*/ u8 flags[0x200]; /**< Flags. */ /*0x45C*/ u8 unk45C[0x10]; - /*0x46C*/ u8 unk46C[0x20]; + /*0x46C*/ u8 unk46C[0x10]; + /*0x46C*/ u8 unk47C[0x10]; /*0x48C*/ u32 timers[7]; /*0x4A8*/ u32 demo_timer; /**< Demo timer. */ /*0x4AC*/ u8 filler4ac[0x8]; diff --git a/linker.ld b/linker.ld index 96545965..b639a43c 100644 --- a/linker.ld +++ b/linker.ld @@ -31,7 +31,6 @@ SECTIONS { . = 0x00002A40; gSave = .; . = 0x00002AC0; gUnk_02002AC0 = .; . = 0x00002B0E; gUnk_02002B0E = .; - . = 0x00002B32; gUnk_02002B32 = .; . = 0x00002B54; gUnk_02002B54 = .; . = 0x00002B58; gUnk_02002B58 = .; . = 0x00002B6B; gUnk_02002B6B = .; diff --git a/src/game.c b/src/game.c index 607c7f42..8d047356 100644 --- a/src/game.c +++ b/src/game.c @@ -180,10 +180,6 @@ extern u8 gUnk_0200AF14; extern u8 gUnk_080FE1C6[]; extern void (*const gUnk_080FE2AC[])(void); -/** @see Item */ -void ForceEquipItem(u32, u32); -extern void SetInventoryValue(u32, u32); - extern u8 gUnk_080FE1DD[]; extern void (*const gUnk_080FE2A0[])(void); diff --git a/src/playerUtils.c b/src/playerUtils.c index 09a3852a..59575041 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -38,7 +38,6 @@ typedef struct { extern u8 gMapData; extern const u8 gUnk_020176E0[]; extern const ScreenTransitionData gUnk_0813AD88[]; -extern u8 gUnk_02002B32[]; bool32 sub_08077758(PlayerEntity*); bool32 sub_080777A0(); @@ -3000,27 +2999,36 @@ u32 FinalizeSave(void) { } u32 GetInventoryValue(u32 item) { - u32 tmp = item / 4; - return gUnk_02002B32[tmp] >> ((item & 3) << 1) & 3; + u8* address = &gSave.inventory[item / 4]; + return *address >> ((item & 3) << 1) & 3; } -ASM_FUNC("asm/non_matching/playerUtils/SetInventoryValue.inc", void SetInventoryValue(u32 a, u32 b)) +u32 SetInventoryValue(u32 item, u32 value) { + u32 masked_value, value_update, old_value, offset; + u8* address; -NONMATCH("asm/non_matching/playerUtils/sub_0807CAC8.inc", void sub_0807CAC8(u32 param_1)) { - gSave.unk46C[gArea.dungeon_idx + 0x10] |= (1 << param_1); + address = &gSave.inventory[item / 4]; + offset = (item % 4) * 2; + value_update = value << offset; + old_value = *address; + masked_value = old_value & (3 << offset); + *address = (old_value ^ masked_value) | value_update; + return masked_value >> offset; } -END_NONMATCH -NONMATCH("asm/non_matching/playerUtils/sub_0807CAEC.inc", u32 sub_0807CAEC(u32 param_1)) { - return gSave.unk46C[gArea.dungeon_idx + 0x10] >> param_1 & 1; +void sub_0807CAC8(u32 param_1) { + gSave.unk47C[gArea.dungeon_idx] |= (1 << param_1); +} + +u32 sub_0807CAEC(u32 param_1) { + return gSave.unk47C[gArea.dungeon_idx] >> param_1 & 1; } -END_NONMATCH u32 CheckLocalFlagByBank(u32 bank, u32 flag) { return ReadBit(gSave.flags, bank + flag); } -NONMATCH("asm/non_matching/playerUtils/sub_0807CB24.inc", bool32 sub_0807CB24(s32 param_1, u32 param_2)) { +bool32 sub_0807CB24(s32 param_1, u32 param_2) { bool32 result = TRUE; switch (param_1) { case 0: @@ -3043,27 +3051,14 @@ NONMATCH("asm/non_matching/playerUtils/sub_0807CB24.inc", bool32 sub_0807CB24(s3 result = CheckLocalFlagByBank(gLocalFlagBanks[param_1], param_2); break; case 0xf: - if (GetInventoryValue(param_2) == 0) { - result = FALSE; - } else { - result = TRUE; - } + result = GetInventoryValue(param_2) != 0; break; case 0x10: - if (GetInventoryValue(param_2) == 1) { - result = TRUE; - } else { - result = FALSE; - } + result = GetInventoryValue(param_2) == 1; break; case 0x11: - if (GetInventoryValue(param_2) == 2) { - result = TRUE; - } else { - result = FALSE; - } + result = GetInventoryValue(param_2) == 2; break; } return result; } -END_NONMATCH