From 39f73a2977b7d898ac5194b15607e155cef046a8 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 23 Aug 2022 16:09:41 +0300 Subject: [PATCH] Match DrawHearts --- asm/non_matching/ui/DrawHearts.inc | 196 ----------------------------- src/ui.c | 97 +++++++++++++- 2 files changed, 96 insertions(+), 197 deletions(-) delete mode 100644 asm/non_matching/ui/DrawHearts.inc diff --git a/asm/non_matching/ui/DrawHearts.inc b/asm/non_matching/ui/DrawHearts.inc deleted file mode 100644 index 092d7b9d..00000000 --- a/asm/non_matching/ui/DrawHearts.inc +++ /dev/null @@ -1,196 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - ldr r2, _0801C6CC @ =gUnk_0200AF00 - ldrb r1, [r2, #1] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - beq _0801C6D0 - bl sub_0801C824 - bl sub_0801C66C - b _0801C802 - .align 2, 0 -_0801C6CC: .4byte gUnk_0200AF00 -_0801C6D0: - ldr r5, _0801C6F8 @ =gSave - adds r0, r5, #0 - adds r0, #0xab - ldrb r0, [r0] - lsrs r4, r0, #1 - ldrb r0, [r2, #4] - cmp r4, r0 - beq _0801C6EA - strb r4, [r2, #4] - bl sub_0801C824 - bl sub_0801C66C -_0801C6EA: - adds r1, r5, #0 - adds r1, #0xaa - ldrb r0, [r1] - cmp r0, #1 - beq _0801C6FC - lsrs r1, r0, #1 - b _0801C6FE - .align 2, 0 -_0801C6F8: .4byte gSave -_0801C6FC: - movs r1, #1 -_0801C6FE: - cmp r1, r4 - ble _0801C704 - adds r1, r4, #0 -_0801C704: - movs r4, #0 - ldr r0, _0801C748 @ =gUnk_0200AF00 - ldrb r2, [r0, #3] - adds r7, r0, #0 - cmp r1, r2 - beq _0801C718 - movs r4, #1 - cmp r1, r2 - ble _0801C718 - movs r4, #2 -_0801C718: - cmp r4, #1 - beq _0801C750 - cmp r4, #2 - bne _0801C756 - ldrb r0, [r7, #5] - adds r1, r0, #1 - strb r1, [r7, #5] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _0801C74C - movs r0, #7 - ands r1, r0 - cmp r1, #0 - bne _0801C740 - movs r0, #0x71 - bl SoundReq -_0801C740: - ldrb r0, [r7, #3] - adds r0, #1 - strb r0, [r7, #3] - b _0801C75A - .align 2, 0 -_0801C748: .4byte gUnk_0200AF00 -_0801C74C: - movs r4, #0 - b _0801C75A -_0801C750: - ldrb r0, [r7, #3] - subs r0, #1 - strb r0, [r7, #3] -_0801C756: - movs r0, #0 - strb r0, [r7, #5] -_0801C75A: - ldrb r0, [r7, #2] - cmp r0, #0 - beq _0801C764 - cmp r4, #0 - beq _0801C802 -_0801C764: - movs r0, #2 - strb r0, [r7, #2] - ldrb r0, [r7, #3] - lsrs r3, r0, #2 - cmp r3, #0xa - ble _0801C77A - movs r1, #0xa - mov r8, r1 - adds r6, r3, #0 - subs r6, #0xa - b _0801C77E -_0801C77A: - mov r8, r3 - movs r6, #0 -_0801C77E: - ldrb r0, [r7, #4] - lsrs r4, r0, #2 - adds r1, r4, #0 - cmp r4, #0xa - ble _0801C78A - movs r4, #0xa -_0801C78A: - adds r2, r1, #0 - subs r2, #0xa - ldr r0, _0801C808 @ =gUnk_080C8F2C - mov ip, r0 - cmp r2, #0 - ble _0801C7B8 - ldr r5, _0801C80C @ =gUnk_02034D30 - ldr r1, _0801C810 @ =0x0000F010 - adds r0, r1, #0 - strh r0, [r5] - ldr r1, _0801C814 @ =0x040000D4 - movs r0, #0xa - subs r0, r0, r6 - lsls r0, r0, #1 - add r0, ip - str r0, [r1] - adds r0, r5, #2 - str r0, [r1, #4] - movs r0, #0x80 - lsls r0, r0, #0x18 - orrs r2, r0 - str r2, [r1, #8] - ldr r0, [r1, #8] -_0801C7B8: - ldr r5, _0801C818 @ =gUnk_02034CF0 - ldr r2, _0801C810 @ =0x0000F010 - adds r0, r2, #0 - strh r0, [r5] - ldr r1, _0801C814 @ =0x040000D4 - movs r0, #0xa - mov r2, r8 - subs r0, r0, r2 - lsls r0, r0, #1 - add r0, ip - str r0, [r1] - adds r0, r5, #2 - str r0, [r1, #4] - movs r0, #0x80 - lsls r0, r0, #0x18 - orrs r4, r0 - str r4, [r1, #8] - ldr r0, [r1, #8] - ldrb r0, [r7, #3] - movs r1, #3 - ands r1, r0 - cmp r1, #0 - beq _0801C7FC - cmp r3, #9 - ble _0801C7EE - subs r3, #0xa - adds r5, #0x40 -_0801C7EE: - lsls r0, r3, #1 - adds r0, r0, r5 - adds r1, #0x11 - ldr r3, _0801C81C @ =0xFFFFF000 - adds r2, r3, #0 - orrs r1, r2 - strh r1, [r0, #2] -_0801C7FC: - ldr r1, _0801C820 @ =gScreen - movs r0, #1 - strh r0, [r1, #0xe] -_0801C802: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0801C808: .4byte gUnk_080C8F2C -_0801C80C: .4byte gUnk_02034D30 -_0801C810: .4byte 0x0000F010 -_0801C814: .4byte 0x040000D4 -_0801C818: .4byte gUnk_02034CF0 -_0801C81C: .4byte 0xFFFFF000 -_0801C820: .4byte gScreen - .syntax divided diff --git a/src/ui.c b/src/ui.c index b70180b5..47f3599b 100644 --- a/src/ui.c +++ b/src/ui.c @@ -60,6 +60,7 @@ typedef struct { extern struct_020350E2 gUnk_020350E2; +extern const u16 gUnk_080C8F2C[]; extern u32 gUnk_085C4620[]; extern Frame* gSpriteAnimations_322[]; @@ -95,6 +96,7 @@ void sub_0801CB20(UIElement*, UIElementDefinition*); UIElement* FindUIElement(u32); void sub_0801CAD0(UIElement*); void sub_0801CAB8(UIElement*, Frame*); +void sub_0801C824(void); void UpdateUIElements(void) { u32 index; @@ -374,7 +376,100 @@ void sub_0801C66C(void) { } } -ASM_FUNC("asm/non_matching/ui/DrawHearts.inc", void DrawHearts()) +void DrawHearts(void) { + s32 health; + s32 uVar1; + s32 uVar2; + s32 uVar4; + u32 uVar6; + s32 maxHealth; + const u16* ptr; + s32 tmp1; + u16* ptr2; + + if ((gUnk_0200AF00.unk_1 & 0x10) != 0) { + sub_0801C824(); + sub_0801C66C(); + return; + } + maxHealth = gSave.stats.maxHealth / 2; + if (maxHealth != gUnk_0200AF00.maxHealth) { + gUnk_0200AF00.maxHealth = maxHealth; + sub_0801C824(); + sub_0801C66C(); + } + if (gSave.stats.health != 1) { + health = gSave.stats.health / 2; + } else { + health = 1; + } + if (health > maxHealth) { + health = maxHealth; + } + maxHealth = 0; + if (health != gUnk_0200AF00.health) { + maxHealth = 1; + if (health > gUnk_0200AF00.health) { + maxHealth = 2; + } + } + + switch (maxHealth) { + case 2: + uVar1 = gUnk_0200AF00.unk_5++; + if ((uVar1 & 1) == 0) { + if ((uVar1 & 7) == 0) { + SoundReq(SFX_HEART_GET); + } + gUnk_0200AF00.health++; + } else { + maxHealth = 0; + } + break; + case 1: + gUnk_0200AF00.health--; + // fallthough + default: + gUnk_0200AF00.unk_5 = 0; + break; + } + if ((gUnk_0200AF00.unk_2 == 0) || (maxHealth != 0)) { + gUnk_0200AF00.unk_2 = 2; + uVar2 = gUnk_0200AF00.health >> 2; + if (uVar2 > 10) { + tmp1 = 10; + uVar6 = uVar2 - 10; + } else { + tmp1 = uVar2; + uVar6 = 0; + } + + maxHealth = gUnk_0200AF00.maxHealth >> 2; + uVar1 = maxHealth; + if (maxHealth > 10) { + maxHealth = 10; + } + + if (uVar1 - 10 > 0) { + ptr2 = (u16*)&gUnk_02034D30; + *ptr2 = 0xf010; + DmaSet(3, gUnk_080C8F2C + (10 - uVar6), ptr2 + 1, (uVar1 - 10) | 0x80000000); + } + ptr2 = (u16*)&gUnk_02034CF0[0].unk_0; + *ptr2 = 0xf010; + + DmaSet(3, gUnk_080C8F2C + (10 - tmp1), ptr2 + 1, maxHealth | 0x80000000); + + if ((gUnk_0200AF00.health & 3) != 0) { + if (9 < uVar2) { + uVar2 -= 10; + ptr2 += 0x20; + } + ptr2[uVar2 + 1] = ((gUnk_0200AF00.health & 3) + 0x11) | 0xf000; + } + gScreen.bg0.updated = 1; + } +} void sub_0801C824(void) { struct_02034CF0* ptr;