diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2020-01-12 12:13:03 -0500 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2020-01-12 12:13:03 -0500 |
commit | ae41a2742ced950f37cbe1b21cdf394483ebd05b (patch) | |
tree | a91a0fb1b14cdf466d56cbc941f3ce94a018df03 | |
parent | d09a3d7f1c6efc990b44b5ea240b36147d94104a (diff) |
Finish battle_interface.c decomp
-rw-r--r-- | asm/battle_interface.s | 1827 | ||||
-rw-r--r-- | include/battle_message.h | 3 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/battle_interface.c | 807 | ||||
-rw-r--r-- | src/battle_message.c | 2 |
5 files changed, 797 insertions, 1843 deletions
diff --git a/asm/battle_interface.s b/asm/battle_interface.s deleted file mode 100644 index e4c45c51c..000000000 --- a/asm/battle_interface.s +++ /dev/null @@ -1,1827 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start UpdateStatusIconInHealthbox -UpdateStatusIconInHealthbox: @ 8049934 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - ldr r0, _08049998 @ =gSprites - mov r2, r9 - lsls r1, r2, 4 - add r1, r9 - lsls r1, 2 - adds r1, r0 - ldrh r0, [r1, 0x3A] - lsls r0, 24 - lsrs r7, r0, 24 - ldrh r0, [r1, 0x38] - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - adds r0, r7, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080499A4 - ldr r1, _0804999C @ =gBattlerPartyIndexes - lsls r0, r7, 1 - adds r0, r1 - ldrh r1, [r0] - movs r0, 0x64 - muls r0, r1 - ldr r1, _080499A0 @ =gPlayerParty - adds r0, r1 - movs r1, 0x37 - bl GetMonData - adds r4, r0, 0 - bl IsDoubleBattle - lsls r0, 24 - movs r3, 0x12 - mov r8, r3 - cmp r0, 0 - bne _080499C0 - movs r0, 0x1A - mov r8, r0 - b _080499C0 - .align 2, 0 -_08049998: .4byte gSprites -_0804999C: .4byte gBattlerPartyIndexes -_080499A0: .4byte gPlayerParty -_080499A4: - ldr r1, _080499E0 @ =gBattlerPartyIndexes - lsls r0, r7, 1 - adds r0, r1 - ldrh r1, [r0] - movs r0, 0x64 - muls r0, r1 - ldr r1, _080499E4 @ =gEnemyParty - adds r0, r1 - movs r1, 0x37 - bl GetMonData - adds r4, r0, 0 - movs r1, 0x11 - mov r8, r1 -_080499C0: - movs r0, 0x7 - ands r0, r4 - cmp r0, 0 - beq _080499E8 - movs r0, 0x1B - adds r1, r7, 0 - bl GetStatusIconForBankId - lsls r0, 24 - lsrs r0, 24 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r0, 0x2 - b _08049AF4 - .align 2, 0 -_080499E0: .4byte gBattlerPartyIndexes -_080499E4: .4byte gEnemyParty -_080499E8: - movs r0, 0x88 - ands r0, r4 - cmp r0, 0 - beq _08049A06 - movs r0, 0x15 - adds r1, r7, 0 - bl GetStatusIconForBankId - lsls r0, 24 - lsrs r0, 24 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r0, 0 - b _08049AF4 -_08049A06: - movs r0, 0x10 - ands r0, r4 - cmp r0, 0 - beq _08049A24 - movs r0, 0x21 - adds r1, r7, 0 - bl GetStatusIconForBankId - lsls r0, 24 - lsrs r0, 24 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r0, 0x4 - b _08049AF4 -_08049A24: - movs r0, 0x20 - ands r0, r4 - cmp r0, 0 - beq _08049A42 - movs r0, 0x1E - adds r1, r7, 0 - bl GetStatusIconForBankId - lsls r0, 24 - lsrs r0, 24 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r0, 0x3 - b _08049AF4 -_08049A42: - movs r0, 0x40 - ands r0, r4 - cmp r0, 0 - beq _08049A60 - movs r0, 0x18 - adds r1, r7, 0 - bl GetStatusIconForBankId - lsls r0, 24 - lsrs r0, 24 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r0, 0x1 - b _08049AF4 -_08049A60: - movs r0, 0x27 - bl GetHealthboxElementGfxPtr - adds r6, r0, 0 - movs r4, 0 - mov r2, r9 - lsls r0, r2, 4 - mov r3, r8 - lsls r3, 16 - mov r8, r3 - lsls r7, 2 - ldr r1, _08049AE0 @ =gSprites - add r0, r9 - lsls r0, 2 - adds r5, r0, r1 -_08049A7E: - ldrh r1, [r5, 0x4] - lsls r1, 22 - lsrs r1, 22 - mov r2, r8 - asrs r0, r2, 16 - adds r1, r0 - adds r1, r4 - lsls r1, 5 - ldr r3, _08049AE4 @ =0x06010000 - adds r1, r3 - adds r0, r6, 0 - ldr r2, _08049AE8 @ =0x04000008 - bl CpuSet - adds r4, 0x1 - cmp r4, 0x2 - ble _08049A7E - ldr r0, _08049AEC @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r0, [r0] - adds r0, r7, r0 - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08049AD4 - movs r0, 0x1 - bl GetHealthboxElementGfxPtr - ldr r2, _08049AE0 @ =gSprites - mov r3, r10 - lsls r1, r3, 4 - add r1, r10 - lsls r1, 2 - adds r1, r2 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 17 - ldr r2, _08049AE4 @ =0x06010000 - adds r1, r2 - ldr r2, _08049AF0 @ =0x04000010 - bl CpuSet -_08049AD4: - mov r0, r9 - movs r1, 0x1 - bl TryAddPokeballIconToHealthbox - b _08049BB6 - .align 2, 0 -_08049AE0: .4byte gSprites -_08049AE4: .4byte 0x06010000 -_08049AE8: .4byte 0x04000008 -_08049AEC: .4byte gBattleSpritesDataPtr -_08049AF0: .4byte 0x04000010 -_08049AF4: - mov r1, r9 - lsls r5, r1, 4 - add r5, r9 - lsls r5, 2 - ldr r2, _08049BC4 @ =gSprites - adds r5, r2 - ldrb r4, [r5, 0x5] - lsrs r4, 4 - lsls r4, 4 - adds r4, 0xC - adds r4, r7 - ldr r1, _08049BC8 @ =gUnknown_826055A - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - movs r3, 0x80 - lsls r3, 1 - adds r1, r4, r3 - movs r2, 0x2 - bl FillPalette - lsls r4, 1 - ldr r0, _08049BCC @ =gPlttBufferUnfaded + 0x200 - adds r0, r4, r0 - ldr r1, _08049BD0 @ =0x05000200 - adds r4, r1 - adds r1, r4, 0 - movs r2, 0x1 - bl CpuSet - ldrh r1, [r5, 0x4] - lsls r1, 22 - lsrs r1, 22 - add r1, r8 - lsls r1, 5 - ldr r2, _08049BD4 @ =0x06010000 - mov r8, r2 - add r1, r8 - ldr r2, _08049BD8 @ =0x04000018 - adds r0, r6, 0 - bl CpuSet - bl IsDoubleBattle - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _08049B62 - adds r0, r7, 0 - bl GetBattlerSide - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08049BAE -_08049B62: - ldr r0, _08049BDC @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r1, [r0] - lsls r0, r7, 2 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08049BAE - movs r0, 0 - bl GetHealthboxElementGfxPtr - mov r3, r10 - lsls r4, r3, 4 - add r4, r10 - lsls r4, 2 - ldr r1, _08049BC4 @ =gSprites - adds r4, r1 - ldrh r1, [r4, 0x4] - lsls r1, 22 - lsrs r1, 17 - add r1, r8 - ldr r5, _08049BE0 @ =0x04000008 - adds r2, r5, 0 - bl CpuSet - movs r0, 0x41 - bl GetHealthboxElementGfxPtr - ldrh r1, [r4, 0x4] - lsls r1, 22 - lsrs r1, 17 - adds r1, 0x20 - add r1, r8 - adds r2, r5, 0 - bl CpuSet -_08049BAE: - mov r0, r9 - movs r1, 0 - bl TryAddPokeballIconToHealthbox -_08049BB6: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08049BC4: .4byte gSprites -_08049BC8: .4byte gUnknown_826055A -_08049BCC: .4byte gPlttBufferUnfaded + 0x200 -_08049BD0: .4byte 0x05000200 -_08049BD4: .4byte 0x06010000 -_08049BD8: .4byte 0x04000018 -_08049BDC: .4byte gBattleSpritesDataPtr -_08049BE0: .4byte 0x04000008 - thumb_func_end UpdateStatusIconInHealthbox - - thumb_func_start GetStatusIconForBankId -GetStatusIconForBankId: @ 8049BE4 - push {lr} - lsls r0, 24 - lsls r1, 24 - lsrs r3, r1, 24 - lsrs r2, r0, 24 - adds r0, r2, 0 - subs r0, 0x15 - cmp r0, 0xC - bhi _08049CA4 - lsls r0, 2 - ldr r1, _08049C00 @ =_08049C04 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08049C00: .4byte _08049C04 - .align 2, 0 -_08049C04: - .4byte _08049C38 - .4byte _08049CA4 - .4byte _08049CA4 - .4byte _08049C4E - .4byte _08049CA4 - .4byte _08049CA4 - .4byte _08049C64 - .4byte _08049CA4 - .4byte _08049CA4 - .4byte _08049C7A - .4byte _08049CA4 - .4byte _08049CA4 - .4byte _08049C90 -_08049C38: - movs r2, 0x15 - cmp r3, 0 - beq _08049CA4 - movs r2, 0x47 - cmp r3, 0x1 - beq _08049CA4 - movs r2, 0x65 - cmp r3, 0x2 - bne _08049CA4 - movs r2, 0x56 - b _08049CA4 -_08049C4E: - movs r2, 0x18 - cmp r3, 0 - beq _08049CA4 - movs r2, 0x4A - cmp r3, 0x1 - beq _08049CA4 - movs r2, 0x68 - cmp r3, 0x2 - bne _08049CA4 - movs r2, 0x59 - b _08049CA4 -_08049C64: - movs r2, 0x1B - cmp r3, 0 - beq _08049CA4 - movs r2, 0x4D - cmp r3, 0x1 - beq _08049CA4 - movs r2, 0x6B - cmp r3, 0x2 - bne _08049CA4 - movs r2, 0x5C - b _08049CA4 -_08049C7A: - movs r2, 0x1E - cmp r3, 0 - beq _08049CA4 - movs r2, 0x50 - cmp r3, 0x1 - beq _08049CA4 - movs r2, 0x6E - cmp r3, 0x2 - bne _08049CA4 - movs r2, 0x5F - b _08049CA4 -_08049C90: - movs r2, 0x21 - cmp r3, 0 - beq _08049CA4 - movs r2, 0x53 - cmp r3, 0x1 - beq _08049CA4 - movs r2, 0x71 - cmp r3, 0x2 - bne _08049CA4 - movs r2, 0x62 -_08049CA4: - adds r0, r2, 0 - pop {r1} - bx r1 - thumb_func_end GetStatusIconForBankId - - thumb_func_start UpdateSafariBallsTextOnHealthbox -UpdateSafariBallsTextOnHealthbox: @ 8049CAC - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r0, _08049D00 @ =gUnknown_83FE80C - movs r1, 0 - movs r2, 0x3 - mov r3, sp - bl AddTextPrinterAndCreateWindowOnHealthbox - adds r5, r0, 0 - ldr r1, _08049D04 @ =gSprites - lsls r0, r4, 4 - adds r0, r4 - lsls r0, 2 - adds r0, r1 - ldrh r4, [r0, 0x4] - lsls r4, 22 - lsrs r4, 17 - ldr r1, _08049D08 @ =0x06010040 - adds r0, r4, r1 - adds r1, r5, 0 - movs r2, 0x6 - bl TextIntoHealthboxObject - ldr r0, _08049D0C @ =0x06010800 - adds r4, r0 - adds r5, 0xC0 - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0x2 - bl TextIntoHealthboxObject - ldr r0, [sp] - bl RemoveWindowOnHealthbox - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08049D00: .4byte gUnknown_83FE80C -_08049D04: .4byte gSprites -_08049D08: .4byte 0x06010040 -_08049D0C: .4byte 0x06010800 - thumb_func_end UpdateSafariBallsTextOnHealthbox - - thumb_func_start UpdateLeftNoOfBallsTextOnHealthbox -UpdateLeftNoOfBallsTextOnHealthbox: @ 8049D10 - push {r4,r5,lr} - sub sp, 0x14 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r1, _08049D84 @ =gText_HighlightRed_Left - mov r0, sp - bl StringCopy - ldr r1, _08049D88 @ =gNumSafariBalls - ldrb r1, [r1] - movs r2, 0 - movs r3, 0x2 - bl ConvertIntToDecimalStringN - movs r0, 0 - mov r1, sp - movs r2, 0 - bl GetStringWidth - movs r1, 0x2F - subs r1, r0 - add r3, sp, 0x10 - mov r0, sp - movs r2, 0x3 - bl AddTextPrinterAndCreateWindowOnHealthbox - adds r5, r0, 0 - ldr r1, _08049D8C @ =gSprites - lsls r0, r4, 4 - adds r0, r4 - lsls r0, 2 - adds r0, r1 - ldrh r4, [r0, 0x4] - lsls r4, 22 - lsrs r4, 17 - ldr r1, _08049D90 @ =0x060102c0 - adds r0, r4, r1 - adds r1, r5, 0 - movs r2, 0x2 - bl sub_804A734 - ldr r0, _08049D94 @ =0x06010a00 - adds r4, r0 - adds r5, 0x40 - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0x4 - bl sub_804A734 - ldr r0, [sp, 0x10] - bl RemoveWindowOnHealthbox - add sp, 0x14 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08049D84: .4byte gText_HighlightRed_Left -_08049D88: .4byte gNumSafariBalls -_08049D8C: .4byte gSprites -_08049D90: .4byte 0x060102c0 -_08049D94: .4byte 0x06010a00 - thumb_func_end UpdateLeftNoOfBallsTextOnHealthbox - - thumb_func_start UpdateHealthboxAttribute -UpdateHealthboxAttribute: @ 8049D98 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r1 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r2, 24 - lsrs r7, r2, 24 - ldr r1, _08049F44 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrh r0, [r0, 0x3A] - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - cmp r7, 0 - bne _08049DD4 - bl IsDoubleBattle - lsls r0, 24 - cmp r0, 0 - bne _08049DD4 - mov r0, r9 - bl GetBattlerSide -_08049DD4: - ldr r1, _08049F44 @ =gSprites - lsls r0, r6, 4 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrh r0, [r0, 0x3A] - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _08049DF0 - b _08049F50 -_08049DF0: - cmp r7, 0x3 - beq _08049DF8 - cmp r7, 0 - bne _08049E0C -_08049DF8: - mov r0, r8 - movs r1, 0x38 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r6, 0 - bl UpdateLvlInHealthbox -_08049E0C: - cmp r7, 0x1 - bhi _08049E26 - mov r0, r8 - movs r1, 0x39 - bl GetMonData - adds r1, r0, 0 - lsls r1, 16 - asrs r1, 16 - adds r0, r6, 0 - movs r2, 0 - bl UpdateHpTextInHealthbox -_08049E26: - cmp r7, 0x2 - beq _08049E2E - cmp r7, 0 - bne _08049E44 -_08049E2E: - mov r0, r8 - movs r1, 0x3A - bl GetMonData - adds r1, r0, 0 - lsls r1, 16 - asrs r1, 16 - adds r0, r6, 0 - movs r2, 0x1 - bl UpdateHpTextInHealthbox -_08049E44: - cmp r7, 0x5 - beq _08049E4C - cmp r7, 0 - bne _08049E80 -_08049E4C: - movs r0, 0 - bl LoadBattleBarGfx - mov r0, r8 - movs r1, 0x3A - bl GetMonData - adds r4, r0, 0 - mov r0, r8 - movs r1, 0x39 - bl GetMonData - adds r3, r0, 0 - movs r0, 0 - str r0, [sp] - mov r0, r9 - adds r1, r6, 0 - adds r2, r4, 0 - bl SetBattleBarStruct - mov r0, r9 - adds r1, r6, 0 - movs r2, 0 - movs r3, 0 - bl MoveBattleBar -_08049E80: - bl IsDoubleBattle - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - cmp r0, 0 - bne _08049F06 - cmp r7, 0x6 - beq _08049E96 - cmp r7, 0 - bne _08049F06 -_08049E96: - movs r0, 0x3 - bl LoadBattleBarGfx - mov r0, r8 - movs r1, 0xB - bl GetMonData - adds r5, r0, 0 - lsls r5, 16 - lsrs r5, 16 - mov r0, r8 - movs r1, 0x38 - bl GetMonData - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - mov r0, r8 - movs r1, 0x19 - bl GetMonData - adds r3, r0, 0 - ldr r0, _08049F48 @ =gExperienceTables - mov r12, r0 - lsls r1, r4, 2 - ldr r2, _08049F4C @ =gBaseStats - lsls r0, r5, 3 - subs r0, r5 - lsls r0, 2 - adds r0, r2 - ldrb r2, [r0, 0x13] - movs r0, 0xCA - lsls r0, 1 - muls r0, r2 - adds r1, r0 - add r1, r12 - ldr r1, [r1] - subs r3, r1 - adds r4, 0x1 - lsls r4, 2 - adds r4, r0 - add r4, r12 - ldr r2, [r4] - subs r2, r1 - mov r0, r10 - str r0, [sp] - mov r0, r9 - adds r1, r6, 0 - bl SetBattleBarStruct - mov r0, r9 - adds r1, r6, 0 - movs r2, 0x1 - movs r3, 0 - bl MoveBattleBar -_08049F06: - cmp r7, 0x4 - beq _08049F0E - cmp r7, 0 - bne _08049F16 -_08049F0E: - adds r0, r6, 0 - mov r1, r8 - bl UpdateNickInHealthbox -_08049F16: - cmp r7, 0x9 - beq _08049F1E - cmp r7, 0 - bne _08049F24 -_08049F1E: - adds r0, r6, 0 - bl UpdateStatusIconInHealthbox -_08049F24: - cmp r7, 0xA - bne _08049F2E - adds r0, r6, 0 - bl UpdateSafariBallsTextOnHealthbox -_08049F2E: - adds r0, r7, 0 - subs r0, 0xA - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bhi _08049FC6 - adds r0, r6, 0 - bl UpdateLeftNoOfBallsTextOnHealthbox - b _08049FC6 - .align 2, 0 -_08049F44: .4byte gSprites -_08049F48: .4byte gExperienceTables -_08049F4C: .4byte gBaseStats -_08049F50: - cmp r7, 0x3 - beq _08049F58 - cmp r7, 0 - bne _08049F6C -_08049F58: - mov r0, r8 - movs r1, 0x38 - bl GetMonData - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r6, 0 - bl UpdateLvlInHealthbox -_08049F6C: - cmp r7, 0x5 - beq _08049F74 - cmp r7, 0 - bne _08049FA8 -_08049F74: - movs r0, 0 - bl LoadBattleBarGfx - mov r0, r8 - movs r1, 0x3A - bl GetMonData - adds r4, r0, 0 - mov r0, r8 - movs r1, 0x39 - bl GetMonData - adds r3, r0, 0 - movs r0, 0 - str r0, [sp] - mov r0, r9 - adds r1, r6, 0 - adds r2, r4, 0 - bl SetBattleBarStruct - mov r0, r9 - adds r1, r6, 0 - movs r2, 0 - movs r3, 0 - bl MoveBattleBar -_08049FA8: - cmp r7, 0x4 - beq _08049FB0 - cmp r7, 0 - bne _08049FB8 -_08049FB0: - adds r0, r6, 0 - mov r1, r8 - bl UpdateNickInHealthbox -_08049FB8: - cmp r7, 0x9 - beq _08049FC0 - cmp r7, 0 - bne _08049FC6 -_08049FC0: - adds r0, r6, 0 - bl UpdateStatusIconInHealthbox -_08049FC6: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end UpdateHealthboxAttribute - - thumb_func_start MoveBattleBar -MoveBattleBar: @ 8049FD8 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r2, 24 - lsrs r2, 24 - mov r9, r2 - cmp r2, 0 - bne _0804A024 - ldr r0, _0804A020 @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r0, [r0, 0xC] - mov r1, r8 - lsls r5, r1, 2 - adds r3, r5, r1 - lsls r3, 2 - adds r3, r0 - ldr r0, [r3, 0x4] - ldr r1, [r3, 0x8] - ldr r2, [r3, 0xC] - adds r3, 0x10 - movs r4, 0x6 - str r4, [sp] - movs r4, 0x1 - str r4, [sp, 0x4] - bl sub_804A2F0 - adds r4, r0, 0 - adds r7, r5, 0 - b _0804A080 - .align 2, 0 -_0804A020: .4byte gBattleSpritesDataPtr -_0804A024: - ldr r2, _0804A0D0 @ =gBattleSpritesDataPtr - mov r10, r2 - ldr r0, [r2] - ldr r2, [r0, 0xC] - mov r0, r8 - lsls r4, r0, 2 - adds r0, r4, r0 - lsls r6, r0, 2 - adds r2, r6, r2 - ldr r0, [r2, 0x8] - ldr r1, [r2, 0xC] - ldr r2, [r2, 0x4] - movs r3, 0x8 - bl GetScaledExpFraction - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r4, 0 - cmp r5, 0 - bne _0804A04E - movs r5, 0x1 -_0804A04E: - mov r1, r10 - ldr r0, [r1] - ldr r0, [r0, 0xC] - adds r4, r6, r0 - ldr r6, [r4, 0xC] - adds r0, r6, 0 - adds r1, r5, 0 - bl __divsi3 - cmp r0, 0 - bge _0804A066 - negs r0, r0 -_0804A066: - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, [r4, 0x4] - ldr r1, [r4, 0x8] - adds r3, r4, 0 - adds r3, 0x10 - movs r2, 0x8 - str r2, [sp] - str r5, [sp, 0x4] - adds r2, r6, 0 - bl sub_804A2F0 - adds r4, r0, 0 -_0804A080: - mov r2, r9 - cmp r2, 0x1 - beq _0804A09C - cmp r2, 0 - bne _0804A0A4 - ldr r0, _0804A0D0 @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r0, [r0] - adds r0, r7, r0 - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _0804A0A4 -_0804A09C: - mov r0, r8 - mov r1, r9 - bl sub_804A0D4 -_0804A0A4: - movs r0, 0x1 - negs r0, r0 - cmp r4, r0 - bne _0804A0BE - ldr r0, _0804A0D0 @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r1, [r0, 0xC] - mov r2, r8 - adds r0, r7, r2 - lsls r0, 2 - adds r0, r1 - movs r1, 0 - str r1, [r0, 0x10] -_0804A0BE: - adds r0, r4, 0 - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0804A0D0: .4byte gBattleSpritesDataPtr - thumb_func_end MoveBattleBar - - thumb_func_start sub_804A0D4 -sub_804A0D4: @ 804A0D4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r1, 24 - lsrs r1, 24 - cmp r1, 0 - beq _0804A0F0 - cmp r1, 0x1 - beq _0804A1D8 - b _0804A2D6 -_0804A0F0: - ldr r0, _0804A184 @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r0, [r0, 0xC] - lsls r5, r6, 2 - adds r3, r5, r6 - lsls r3, 2 - adds r3, r0 - ldr r0, [r3, 0x4] - ldr r1, [r3, 0x8] - ldr r2, [r3, 0xC] - adds r3, 0x10 - add r4, sp, 0x8 - str r4, [sp] - movs r4, 0x6 - str r4, [sp, 0x4] - bl sub_804A3C4 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x3 - mov r9, r1 - adds r7, r5, 0 - cmp r0, 0x18 - bhi _0804A12C - movs r2, 0x38 - mov r9, r2 - cmp r0, 0x9 - bls _0804A12C - movs r4, 0x2F - mov r9, r4 -_0804A12C: - movs r5, 0 - ldr r0, _0804A188 @ =gSprites - mov r8, r0 -_0804A132: - ldr r0, _0804A184 @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r1, [r0, 0xC] - adds r0, r7, r6 - lsls r0, 2 - adds r0, r1 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - add r0, r8 - ldrh r0, [r0, 0x38] - lsls r0, 24 - lsrs r4, r0, 24 - cmp r5, 0x1 - bhi _0804A194 - mov r0, r9 - bl GetHealthboxElementGfxPtr - mov r1, sp - adds r1, r5 - adds r1, 0x8 - ldrb r1, [r1] - lsls r1, 5 - adds r0, r1 - lsls r1, r4, 4 - adds r1, r4 - lsls r1, 2 - add r1, r8 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 22 - adds r2, r5, 0x2 - adds r1, r2 - lsls r1, 5 - ldr r2, _0804A18C @ =0x06010000 - adds r1, r2 - ldr r2, _0804A190 @ =0x04000008 - bl CpuSet - b _0804A1C2 - .align 2, 0 -_0804A184: .4byte gBattleSpritesDataPtr -_0804A188: .4byte gSprites -_0804A18C: .4byte 0x06010000 -_0804A190: .4byte 0x04000008 -_0804A194: - mov r0, r9 - bl GetHealthboxElementGfxPtr - mov r1, sp - adds r1, r5 - adds r1, 0x8 - ldrb r1, [r1] - lsls r1, 5 - adds r0, r1 - lsls r1, r4, 4 - adds r1, r4 - lsls r1, 2 - add r1, r8 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 22 - adds r1, r5, r1 - lsls r1, 5 - ldr r4, _0804A1D0 @ =0x06010040 - adds r1, r4 - ldr r2, _0804A1D4 @ =0x04000008 - bl CpuSet -_0804A1C2: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x5 - bls _0804A132 - b _0804A2D6 - .align 2, 0 -_0804A1D0: .4byte 0x06010040 -_0804A1D4: .4byte 0x04000008 -_0804A1D8: - ldr r0, _0804A27C @ =gBattleSpritesDataPtr - ldr r0, [r0] - ldr r0, [r0, 0xC] - lsls r5, r6, 2 - adds r3, r5, r6 - lsls r3, 2 - adds r3, r0 - ldr r0, [r3, 0x4] - ldr r1, [r3, 0x8] - ldr r2, [r3, 0xC] - adds r3, 0x10 - add r4, sp, 0x8 - str r4, [sp] - movs r4, 0x8 - str r4, [sp, 0x4] - bl sub_804A3C4 - ldr r1, _0804A280 @ =gBattlerPartyIndexes - lsls r0, r6, 1 - adds r0, r1 - ldrh r1, [r0] - movs r0, 0x64 - muls r0, r1 - ldr r1, _0804A284 @ =gPlayerParty - adds r0, r1 - movs r1, 0x38 - bl GetMonData - lsls r0, 24 - lsrs r0, 24 - adds r7, r5, 0 - cmp r0, 0x64 - bne _0804A230 - movs r5, 0 - movs r1, 0 -_0804A21E: - mov r0, sp - adds r0, r5 - adds r0, 0x8 - strb r1, [r0] - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x7 - bls _0804A21E -_0804A230: - movs r5, 0 - ldr r0, _0804A288 @ =gSprites - mov r8, r0 - adds r0, r7, r6 - lsls r4, r0, 2 -_0804A23A: - cmp r5, 0x3 - bhi _0804A294 - movs r0, 0xC - bl GetHealthboxElementGfxPtr - mov r1, sp - adds r1, r5 - adds r1, 0x8 - ldrb r1, [r1] - lsls r1, 5 - adds r0, r1 - ldr r1, _0804A27C @ =gBattleSpritesDataPtr - ldr r1, [r1] - ldr r1, [r1, 0xC] - adds r1, r4, r1 - ldrb r2, [r1] - lsls r1, r2, 4 - adds r1, r2 - lsls r1, 2 - add r1, r8 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 22 - adds r2, r5, 0 - adds r2, 0x24 - adds r1, r2 - lsls r1, 5 - ldr r2, _0804A28C @ =0x06010000 - adds r1, r2 - ldr r2, _0804A290 @ =0x04000008 - bl CpuSet - b _0804A2CC - .align 2, 0 -_0804A27C: .4byte gBattleSpritesDataPtr -_0804A280: .4byte gBattlerPartyIndexes -_0804A284: .4byte gPlayerParty -_0804A288: .4byte gSprites -_0804A28C: .4byte 0x06010000 -_0804A290: .4byte 0x04000008 -_0804A294: - movs r0, 0xC - bl GetHealthboxElementGfxPtr - mov r1, sp - adds r1, r5 - adds r1, 0x8 - ldrb r1, [r1] - lsls r1, 5 - adds r0, r1 - ldr r1, _0804A2E4 @ =gBattleSpritesDataPtr - ldr r1, [r1] - ldr r1, [r1, 0xC] - adds r1, r4, r1 - ldrb r2, [r1] - lsls r1, r2, 4 - adds r1, r2 - lsls r1, 2 - add r1, r8 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 22 - adds r1, r5, r1 - lsls r1, 5 - ldr r2, _0804A2E8 @ =0x06010b80 - adds r1, r2 - ldr r2, _0804A2EC @ =0x04000008 - bl CpuSet -_0804A2CC: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x7 - bls _0804A23A -_0804A2D6: - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804A2E4: .4byte gBattleSpritesDataPtr -_0804A2E8: .4byte 0x06010b80 -_0804A2EC: .4byte 0x04000008 - thumb_func_end sub_804A0D4 - - thumb_func_start sub_804A2F0 -sub_804A2F0: @ 804A2F0 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r7, r0, 0 - adds r4, r1, 0 - mov r8, r2 - adds r5, r3, 0 - ldr r1, [sp, 0x18] - ldr r0, [sp, 0x1C] - lsls r0, 16 - lsrs r3, r0, 16 - lsls r1, 27 - lsrs r2, r1, 24 - ldr r1, [r5] - ldr r0, _0804A31C @ =0xffff8000 - cmp r1, r0 - bne _0804A322 - cmp r7, r2 - bge _0804A320 - lsls r0, r4, 8 - str r0, [r5] - b _0804A322 - .align 2, 0 -_0804A31C: .4byte 0xffff8000 -_0804A320: - str r4, [r5] -_0804A322: - mov r0, r8 - subs r4, r0 - cmp r4, 0 - bge _0804A32E - movs r4, 0 - b _0804A334 -_0804A32E: - cmp r4, r7 - ble _0804A334 - adds r4, r7, 0 -_0804A334: - cmp r7, r2 - bge _0804A350 - ldr r0, [r5] - asrs r1, r0, 8 - adds r6, r0, 0 - cmp r4, r1 - bne _0804A35C - movs r0, 0xFF - ands r0, r6 - cmp r0, 0 - bne _0804A35C - movs r0, 0x1 - negs r0, r0 - b _0804A3B8 -_0804A350: - ldr r6, [r5] - cmp r4, r6 - bne _0804A35C - movs r0, 0x1 - negs r0, r0 - b _0804A3B8 -_0804A35C: - cmp r7, r2 - bge _0804A396 - lsls r0, r7, 8 - adds r1, r2, 0 - bl __divsi3 - mov r1, r8 - cmp r1, 0 - bge _0804A37A - adds r0, r6, r0 - str r0, [r5] - asrs r2, r0, 8 - cmp r2, r4 - blt _0804A3B6 - b _0804A38E -_0804A37A: - subs r0, r6, r0 - str r0, [r5] - asrs r2, r0, 8 - movs r1, 0xFF - ands r0, r1 - cmp r0, 0 - ble _0804A38A - adds r2, 0x1 -_0804A38A: - cmp r2, r4 - bgt _0804A3B6 -_0804A38E: - lsls r0, r4, 8 - str r0, [r5] - adds r2, r4, 0 - b _0804A3B6 -_0804A396: - mov r0, r8 - cmp r0, 0 - bge _0804A3A8 - ldr r0, [r5] - adds r0, r3 - str r0, [r5] - cmp r0, r4 - ble _0804A3B4 - b _0804A3B2 -_0804A3A8: - ldr r0, [r5] - subs r0, r3 - str r0, [r5] - cmp r0, r4 - bge _0804A3B4 -_0804A3B2: - str r4, [r5] -_0804A3B4: - ldr r2, [r5] -_0804A3B6: - adds r0, r2, 0 -_0804A3B8: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_804A2F0 - - thumb_func_start sub_804A3C4 -sub_804A3C4: @ 804A3C4 - push {r4-r7,lr} - adds r4, r0, 0 - mov r12, r3 - ldr r7, [sp, 0x14] - ldr r0, [sp, 0x18] - lsls r0, 24 - lsrs r6, r0, 24 - subs r5, r1, r2 - cmp r5, 0 - bge _0804A3DC - movs r5, 0 - b _0804A3E2 -_0804A3DC: - cmp r5, r4 - ble _0804A3E2 - adds r5, r4, 0 -_0804A3E2: - lsls r0, r6, 27 - lsrs r3, r0, 24 - movs r1, 0 - cmp r1, r6 - bcs _0804A3FC - movs r2, 0 -_0804A3EE: - adds r0, r7, r1 - strb r2, [r0] - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, r6 - bcc _0804A3EE -_0804A3FC: - cmp r4, r3 - bge _0804A410 - mov r1, r12 - ldr r0, [r1] - muls r0, r3 - adds r1, r4, 0 - bl __divsi3 - asrs r0, 8 - b _0804A41C -_0804A410: - mov r1, r12 - ldr r0, [r1] - muls r0, r3 - adds r1, r4, 0 - bl __divsi3 -_0804A41C: - lsls r0, 24 - lsrs r2, r0, 24 - adds r3, r2, 0 - cmp r3, 0 - bne _0804A432 - cmp r5, 0 - ble _0804A432 - movs r0, 0x1 - strb r0, [r7] - movs r3, 0x1 - b _0804A456 -_0804A432: - movs r1, 0 - movs r4, 0x8 -_0804A436: - cmp r1, r6 - bcs _0804A456 - cmp r2, 0x7 - bls _0804A452 - adds r0, r7, r1 - strb r4, [r0] - adds r0, r2, 0 - subs r0, 0x8 - lsls r0, 24 - lsrs r2, r0, 24 - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - b _0804A436 -_0804A452: - adds r0, r7, r1 - strb r2, [r0] -_0804A456: - adds r0, r3, 0 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_804A3C4 - - thumb_func_start sub_804A460 -sub_804A460: @ 804A460 - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0x8 - mov r9, r0 - mov r10, r1 - adds r6, r2, 0 - mov r8, r3 - ldr r5, [sp, 0x24] - lsls r6, 24 - lsrs r6, 24 - mov r0, r8 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r5, 24 - lsrs r5, 24 - mov r1, r9 - ldr r0, [r1] - ldr r1, [r1, 0x4] - mov r3, r9 - ldr r2, [r3, 0x8] - movs r3, 0x6 - str r3, [sp] - movs r3, 0x1 - str r3, [sp, 0x4] - mov r3, r10 - bl sub_804A2F0 - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - str r5, [sp] - mov r0, r9 - mov r1, r10 - adds r2, r6, 0 - mov r3, r8 - bl sub_804A510 - lsls r4, 16 - asrs r4, 16 - adds r0, r4, 0 - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_804A460 - - thumb_func_start sub_804A4C8 -sub_804A4C8: @ 804A4C8 - push {r4,lr} - sub sp, 0x8 - adds r3, r1, 0 - ldr r4, [r0] - ldr r1, [r0, 0x4] - ldr r2, [r0, 0x8] - movs r0, 0x6 - str r0, [sp] - movs r0, 0x1 - str r0, [sp, 0x4] - adds r0, r4, 0 - bl sub_804A2F0 - lsls r0, 16 - asrs r0, 16 - add sp, 0x8 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_804A4C8 - - thumb_func_start sub_804A4F0 -sub_804A4F0: @ 804A4F0 - push {r4,lr} - sub sp, 0x4 - ldr r4, [sp, 0xC] - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - lsls r4, 24 - lsrs r4, 24 - str r4, [sp] - bl sub_804A510 - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_804A4F0 - - thumb_func_start sub_804A510 -sub_804A510: @ 804A510 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - adds r4, r0, 0 - adds r5, r1, 0 - ldr r0, [sp, 0x40] - lsls r2, 24 - lsrs r2, 24 - mov r9, r2 - lsls r3, 24 - lsrs r3, 24 - mov r10, r3 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r0, [r4] - ldr r1, [r4, 0x4] - ldr r2, [r4, 0x8] - add r3, sp, 0xC - str r3, [sp] - movs r3, 0x6 - str r3, [sp, 0x4] - adds r3, r5, 0 - bl sub_804A3C4 - movs r3, 0 - add r6, sp, 0x14 - adds r7, r6, 0 - ldrb r0, [r4, 0xC] - lsls r5, r0, 27 - ldr r4, [r4, 0x10] -_0804A554: - lsls r2, r3, 1 - adds r2, r7, r2 - lsrs r1, r5, 15 - mov r0, sp - adds r0, r3 - adds r0, 0xC - ldrb r0, [r0] - adds r0, r4, r0 - orrs r1, r0 - strh r1, [r2] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x5 - bls _0804A554 - movs r0, 0x6 - str r0, [sp] - movs r0, 0x1 - str r0, [sp, 0x4] - movs r0, 0x11 - str r0, [sp, 0x8] - mov r0, r9 - adds r1, r6, 0 - mov r2, r10 - mov r3, r8 - bl CopyToBgTilemapBufferRect_ChangePalette - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_804A510 - - thumb_func_start GetScaledExpFraction -GetScaledExpFraction: @ 804A59C - push {r4-r7,lr} - adds r6, r2, 0 - lsls r3, 27 - lsrs r7, r3, 24 - subs r5, r0, r1 - cmp r5, 0 - bge _0804A5AE - movs r5, 0 - b _0804A5B4 -_0804A5AE: - cmp r5, r6 - ble _0804A5B4 - adds r5, r6, 0 -_0804A5B4: - muls r0, r7 - adds r1, r6, 0 - bl __divsi3 - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - adds r0, r5, 0 - muls r0, r7 - adds r1, r6, 0 - bl __divsi3 - lsls r4, 24 - asrs r4, 24 - lsls r0, 24 - asrs r0, 24 - subs r0, r4, r0 - cmp r0, 0 - bge _0804A5DC - negs r0, r0 -_0804A5DC: - lsls r0, 24 - lsrs r0, 24 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end GetScaledExpFraction - - thumb_func_start GetScaledHPFraction -GetScaledHPFraction: @ 804A5E8 - push {r4,lr} - lsls r2, 24 - lsrs r2, 24 - lsls r0, 16 - asrs r4, r0, 16 - adds r0, r4, 0 - muls r0, r2 - lsls r1, 16 - asrs r1, 16 - bl __divsi3 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _0804A60C - cmp r4, 0 - ble _0804A60C - movs r0, 0x1 -_0804A60C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end GetScaledHPFraction - - thumb_func_start GetHPBarLevel -GetHPBarLevel: @ 804A614 - push {lr} - lsls r0, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - cmp r0, r1 - bne _0804A626 - movs r0, 0x4 - b _0804A642 -_0804A626: - movs r2, 0x30 - bl GetScaledHPFraction - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x3 - cmp r1, 0x18 - bhi _0804A642 - movs r0, 0x2 - cmp r1, 0x9 - bhi _0804A642 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 -_0804A642: - pop {r1} - bx r1 - thumb_func_end GetHPBarLevel - - thumb_func_start AddTextPrinterAndCreateWindowOnHealthbox -AddTextPrinterAndCreateWindowOnHealthbox: @ 804A648 - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0x20 - mov r9, r0 - adds r6, r1, 0 - mov r8, r2 - mov r10, r3 - ldr r0, _0804A6D4 @ =gUnknown_8260564 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp, 0x18] - str r1, [sp, 0x1C] - add r0, sp, 0x18 - bl AddWindow - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - lsls r5, r4, 24 - lsrs r5, 24 - adds r0, r5, 0 - movs r1, 0x22 - bl FillWindowPixelBuffer - add r1, sp, 0x14 - movs r2, 0 - movs r0, 0x2 - strb r0, [r1] - movs r0, 0x1 - strb r0, [r1, 0x1] - movs r0, 0x3 - strb r0, [r1, 0x2] - lsls r6, 24 - lsrs r6, 24 - mov r0, r8 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - str r2, [sp] - str r2, [sp, 0x4] - str r1, [sp, 0x8] - movs r0, 0x1 - negs r0, r0 - str r0, [sp, 0xC] - mov r0, r9 - str r0, [sp, 0x10] - adds r0, r5, 0 - movs r1, 0 - adds r2, r6, 0 - mov r3, r8 - bl AddTextPrinterParameterized4 - mov r0, r10 - str r4, [r0] - adds r0, r5, 0 - movs r1, 0x7 - bl GetWindowAttribute - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0804A6D4: .4byte gUnknown_8260564 - thumb_func_end AddTextPrinterAndCreateWindowOnHealthbox - - thumb_func_start RemoveWindowOnHealthbox -RemoveWindowOnHealthbox: @ 804A6D8 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl RemoveWindow - pop {r0} - bx r0 - thumb_func_end RemoveWindowOnHealthbox - - thumb_func_start TextIntoHealthboxObject -TextIntoHealthboxObject: @ 804A6E8 - push {r4-r6,lr} - adds r6, r0, 0 - adds r5, r1, 0 - adds r4, r2, 0 - movs r1, 0x80 - lsls r1, 1 - adds r0, r5, r1 - adds r1, r6, r1 - lsls r2, r4, 3 - ldr r3, _0804A72C @ =0x001fffff - ands r2, r3 - movs r3, 0x80 - lsls r3, 19 - orrs r2, r3 - bl CpuSet - cmp r4, 0 - ble _0804A724 -_0804A70C: - adds r0, r5, 0 - adds r0, 0x14 - adds r1, r6, 0 - adds r1, 0x14 - ldr r2, _0804A730 @ =0x04000003 - bl CpuSet - adds r6, 0x20 - adds r5, 0x20 - subs r4, 0x1 - cmp r4, 0 - bne _0804A70C -_0804A724: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0804A72C: .4byte 0x001fffff -_0804A730: .4byte 0x04000003 - thumb_func_end TextIntoHealthboxObject - - thumb_func_start sub_804A734 -sub_804A734: @ 804A734 - push {r4-r6,lr} - adds r6, r0, 0 - adds r5, r1, 0 - lsls r4, r2, 3 - ldr r0, _0804A768 @ =0x001fffff - ands r4, r0 - movs r0, 0x80 - lsls r0, 19 - orrs r4, r0 - adds r0, r5, 0 - adds r1, r6, 0 - adds r2, r4, 0 - bl CpuSet - movs r0, 0x80 - lsls r0, 1 - adds r5, r0 - adds r6, r0 - adds r0, r5, 0 - adds r1, r6, 0 - adds r2, r4, 0 - bl CpuSet - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0804A768: .4byte 0x001fffff - thumb_func_end sub_804A734 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/battle_message.h b/include/battle_message.h index 612b253cf..2e2baa278 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -248,4 +248,7 @@ extern const u8 gUnknown_83FE85C[]; extern const u8 gUnknown_83FE860[]; extern const u8 gUnknown_83FE864[]; +extern const u8 gText_SafariBalls[]; +extern const u8 gText_HighlightRed_Left[]; + #endif // GUARD_BATTLE_MESSAGE_H diff --git a/ld_script.txt b/ld_script.txt index 30ba74347..d3ed6bf39 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -80,7 +80,6 @@ SECTIONS { src/blend_palette.o(.text); src/daycare.o(.text); src/battle_interface.o(.text); - asm/battle_interface.o(.text); asm/smokescreen.o(.text); src/pokeball.o(.text); src/load_save.o(.text); diff --git a/src/battle_interface.c b/src/battle_interface.c index 489378a13..4098025fe 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -5,8 +5,11 @@ #include "decompress.h" #include "gpu_regs.h" #include "graphics.h" +#include "menu.h" +#include "palette.h" #include "pokedex.h" #include "pokemon_summary_screen.h" +#include "safari_zone.h" #include "sound.h" #include "string_util.h" #include "strings.h" @@ -14,6 +17,148 @@ #include "window.h" #include "constants/songs.h" +#define GetStringRightAlignXOffset(fontId, string, destWidth) ({ \ + s32 w = GetStringWidth(fontId, string, 0); \ + destWidth - w; \ +}) + +#define abs(a) ((a) < 0 ? -(a) : (a)) + +#define Q_24_8(n) ((s32)((n) * 256)) +#define Q_24_8_TO_INT(n) ((int)((n) >> 8)) + +struct TestingBar +{ + s32 maxValue; + s32 oldValue; + s32 receivedValue; + u32 pal:5; + u32 tileOffset; +}; + +enum +{ // Corresponds to gHealthboxElementsGfxTable (and the tables after it) in graphics.c + // These are indexes into the tables, which are filled with 8x8 square pixel data. + HEALTHBOX_GFX_0, //hp bar [black section] + HEALTHBOX_GFX_1, //hp bar "H" + HEALTHBOX_GFX_2, //hp bar "P" + HEALTHBOX_GFX_HP_BAR_GREEN, //hp bar [0 pixels] + HEALTHBOX_GFX_4, //hp bar [1 pixels] + HEALTHBOX_GFX_5, //hp bar [2 pixels] + HEALTHBOX_GFX_6, //hp bar [3 pixels] + HEALTHBOX_GFX_7, //hp bar [4 pixels] + HEALTHBOX_GFX_8, //hp bar [5 pixels] + HEALTHBOX_GFX_9, //hp bar [6 pixels] + HEALTHBOX_GFX_10, //hp bar [7 pixels] + HEALTHBOX_GFX_11, //hp bar [8 pixels] + HEALTHBOX_GFX_12, //exp bar [0 pixels] + HEALTHBOX_GFX_13, //exp bar [1 pixels] + HEALTHBOX_GFX_14, //exp bar [2 pixels] + HEALTHBOX_GFX_15, //exp bar [3 pixels] + HEALTHBOX_GFX_16, //exp bar [4 pixels] + HEALTHBOX_GFX_17, //exp bar [5 pixels] + HEALTHBOX_GFX_18, //exp bar [6 pixels] + HEALTHBOX_GFX_19, //exp bar [7 pixels] + HEALTHBOX_GFX_20, //exp bar [8 pixels] + HEALTHBOX_GFX_STATUS_PSN_BATTLER0, //status psn "(P" + HEALTHBOX_GFX_22, //status psn "SN" + HEALTHBOX_GFX_23, //status psn "|)"" + HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, //status prz + HEALTHBOX_GFX_25, + HEALTHBOX_GFX_26, + HEALTHBOX_GFX_STATUS_SLP_BATTLER0, //status slp + HEALTHBOX_GFX_28, + HEALTHBOX_GFX_29, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, //status frz + HEALTHBOX_GFX_31, + HEALTHBOX_GFX_32, + HEALTHBOX_GFX_STATUS_BRN_BATTLER0, //status brn + HEALTHBOX_GFX_34, + HEALTHBOX_GFX_35, + HEALTHBOX_GFX_36, //misc [Black section] + HEALTHBOX_GFX_37, //misc [Black section] + HEALTHBOX_GFX_38, //misc [Black section] + HEALTHBOX_GFX_39, //misc [Blank Health Window?] + HEALTHBOX_GFX_40, //misc [Blank Health Window?] + HEALTHBOX_GFX_41, //misc [Blank Health Window?] + HEALTHBOX_GFX_42, //misc [Blank Health Window?] + HEALTHBOX_GFX_43, //misc [Top of Health Window?] + HEALTHBOX_GFX_44, //misc [Top of Health Window?] + HEALTHBOX_GFX_45, //misc [Top of Health Window?] + HEALTHBOX_GFX_46, //misc [Blank Health Window?] + HEALTHBOX_GFX_HP_BAR_YELLOW, //hp bar yellow [0 pixels] + HEALTHBOX_GFX_48, //hp bar yellow [1 pixels] + HEALTHBOX_GFX_49, //hp bar yellow [2 pixels] + HEALTHBOX_GFX_50, //hp bar yellow [3 pixels] + HEALTHBOX_GFX_51, //hp bar yellow [4 pixels] + HEALTHBOX_GFX_52, //hp bar yellow [5 pixels] + HEALTHBOX_GFX_53, //hp bar yellow [6 pixels] + HEALTHBOX_GFX_54, //hp bar yellow [7 pixels] + HEALTHBOX_GFX_55, //hp bar yellow [8 pixels] + HEALTHBOX_GFX_HP_BAR_RED, //hp bar red [0 pixels] + HEALTHBOX_GFX_57, //hp bar red [1 pixels] + HEALTHBOX_GFX_58, //hp bar red [2 pixels] + HEALTHBOX_GFX_59, //hp bar red [3 pixels] + HEALTHBOX_GFX_60, //hp bar red [4 pixels] + HEALTHBOX_GFX_61, //hp bar red [5 pixels] + HEALTHBOX_GFX_62, //hp bar red [6 pixels] + HEALTHBOX_GFX_63, //hp bar red [7 pixels] + HEALTHBOX_GFX_64, //hp bar red [8 pixels] + HEALTHBOX_GFX_65, //hp bar frame end + HEALTHBOX_GFX_66, //status ball [full] + HEALTHBOX_GFX_67, //status ball [empty] + HEALTHBOX_GFX_68, //status ball [fainted] + HEALTHBOX_GFX_69, //status ball [statused] + HEALTHBOX_GFX_70, //status ball [unused extra] + HEALTHBOX_GFX_STATUS_PSN_BATTLER1, //status2 "PSN" + HEALTHBOX_GFX_72, + HEALTHBOX_GFX_73, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER1, //status2 "PRZ" + HEALTHBOX_GFX_75, + HEALTHBOX_GFX_76, + HEALTHBOX_GFX_STATUS_SLP_BATTLER1, //status2 "SLP" + HEALTHBOX_GFX_78, + HEALTHBOX_GFX_79, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER1, //status2 "FRZ" + HEALTHBOX_GFX_81, + HEALTHBOX_GFX_82, + HEALTHBOX_GFX_STATUS_BRN_BATTLER1, //status2 "BRN" + HEALTHBOX_GFX_84, + HEALTHBOX_GFX_85, + HEALTHBOX_GFX_STATUS_PSN_BATTLER2, //status3 "PSN" + HEALTHBOX_GFX_87, + HEALTHBOX_GFX_88, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER2, //status3 "PRZ" + HEALTHBOX_GFX_90, + HEALTHBOX_GFX_91, + HEALTHBOX_GFX_STATUS_SLP_BATTLER2, //status3 "SLP" + HEALTHBOX_GFX_93, + HEALTHBOX_GFX_94, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER2, //status3 "FRZ" + HEALTHBOX_GFX_96, + HEALTHBOX_GFX_97, + HEALTHBOX_GFX_STATUS_BRN_BATTLER2, //status3 "BRN" + HEALTHBOX_GFX_99, + HEALTHBOX_GFX_100, + HEALTHBOX_GFX_STATUS_PSN_BATTLER3, //status4 "PSN" + HEALTHBOX_GFX_102, + HEALTHBOX_GFX_103, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER3, //status4 "PRZ" + HEALTHBOX_GFX_105, + HEALTHBOX_GFX_106, + HEALTHBOX_GFX_STATUS_SLP_BATTLER3, //status4 "SLP" + HEALTHBOX_GFX_108, + HEALTHBOX_GFX_109, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER3, //status4 "FRZ" + HEALTHBOX_GFX_111, + HEALTHBOX_GFX_112, + HEALTHBOX_GFX_STATUS_BRN_BATTLER3, //status4 "BRN" + HEALTHBOX_GFX_114, + HEALTHBOX_GFX_115, + HEALTHBOX_GFX_116, //unknown_D12FEC + HEALTHBOX_GFX_117, //unknown_D1300C +}; + void SpriteCB_HealthBoxOther(struct Sprite * sprite); void SpriteCB_HealthBar(struct Sprite * sprite); const u8 *GetHealthboxElementGfxPtr(u8 which); @@ -27,6 +172,13 @@ void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite * sprite); void UpdateStatusIconInHealthbox(u8 spriteId); void SpriteCB_StatusSummaryBar(struct Sprite * sprite); void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite * sprite); +u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId); +void MoveBattleBarGraphically(u8 battlerId, u8 whichBar); +u8 GetScaledExpFraction(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale); +u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale); +s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); +void sub_804A510(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y); +void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth); u8 *AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId); void RemoveWindowOnHealthbox(u32 windowId); void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth); @@ -426,7 +578,7 @@ u8 CreateBattlerHealthboxSprites(u8 a) SetSubspriteTables(sprite, &gUnknown_82603C4[GetBattlerSide(a)]); sprite->subspriteMode = 2; sprite->oam.priority = 1; - CpuCopy32(GetHealthboxElementGfxPtr(1), OBJ_VRAM0 + sprite->oam.tileNum * 32, 64); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), OBJ_VRAM0 + sprite->oam.tileNum * 32, 64); gSprites[healthboxLeftSpriteId].hBar_HealthBoxSpriteId = healthbarSpriteId; gSprites[healthboxLeftSpriteId].hBar_Data6 = a; @@ -753,7 +905,7 @@ void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrC { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // Impossible to reach part, because the battlerId is from the opponent's side. { - CpuCopy32(GetHealthboxElementGfxPtr(116), + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116), (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * TILE_SIZE_4BPP), 0x20); } @@ -781,11 +933,11 @@ void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon) u8 elementId; if ((text[j] >= 55 && text[j] <= 74) || (text[j] >= 135 && text[j] <= 154)) - elementId = 44; + elementId = HEALTHBOX_GFX_44; else if ((text[j] >= 75 && text[j] <= 79) || (text[j] >= 155 && text[j] <= 159)) - elementId = 45; + elementId = HEALTHBOX_GFX_45; else - elementId = 43; + elementId = HEALTHBOX_GFX_43; CpuCopy32(GetHealthboxElementGfxPtr(elementId), barFontGfx + (i * 64), 0x20); } @@ -860,7 +1012,7 @@ void SwapHpBarsWithHpText(void) { UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]); UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR); - CpuCopy32(GetHealthboxElementGfxPtr(117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * TILE_SIZE_4BPP), 32); } } else @@ -2000,20 +2152,601 @@ void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; if (noStatus) - CpuCopy32(GetHealthboxElementGfxPtr(70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); else CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * TILE_SIZE_4BPP), 32); } -const u16 gUnknown_826055A[] = { - RGB(24, 12, 24), - RGB(23, 23, 3), - RGB(20, 20, 17), - RGB(17, 22, 28), - RGB(28, 14, 10) +enum +{ + PAL_STATUS_PSN, + PAL_STATUS_PAR, + PAL_STATUS_SLP, + PAL_STATUS_FRZ, + PAL_STATUS_BRN +}; + +const u16 sStatusIconColors[] = { + [PAL_STATUS_PSN] = RGB(24, 12, 24), + [PAL_STATUS_PAR] = RGB(23, 23, 3), + [PAL_STATUS_SLP] = RGB(20, 20, 17), + [PAL_STATUS_FRZ] = RGB(17, 22, 28), + [PAL_STATUS_BRN] = RGB(28, 14, 10) }; -const struct WindowTemplate gUnknown_8260564 = { +void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) +{ + s32 i; + u8 battlerId, healthBarSpriteId; + u32 status, pltAdder; + const u8 *statusGfxPtr; + s16 tileNumAdder; + u8 statusPalId; + + battlerId = gSprites[healthboxSpriteId].hMain_Battler; + healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + { + status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); + if (!IsDoubleBattle()) + tileNumAdder = 0x1A; + else + tileNumAdder = 0x12; + } + else + { + status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); + tileNumAdder = 0x11; + } + + if (status & STATUS1_SLEEP) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_SLP_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_SLP; + } + else if (status & STATUS1_PSN_ANY) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PSN_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_PSN; + } + else if (status & STATUS1_BURN) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_BRN_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_BRN; + } + else if (status & STATUS1_FREEZE) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_FRZ; + } + else if (status & STATUS1_PARALYSIS) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_PAR; + } + else + { + statusGfxPtr = GetHealthboxElementGfxPtr(HEALTHBOX_GFX_39); + + for (i = 0; i < 3; i++) + CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * TILE_SIZE_4BPP), 32); + + if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 64); + + TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); + return; + } + + pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16; + pltAdder += battlerId + 12; + + FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2); + CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2); + CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 96); + if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + { + if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) + { + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * TILE_SIZE_4BPP), 32); + } + } + TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); +} + +u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) +{ + u8 ret = statusElementId; + + switch (statusElementId) + { + case HEALTHBOX_GFX_STATUS_PSN_BATTLER0: + if (battlerId == 0) + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER0; + else if (battlerId == 1) + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER1; + else if (battlerId == 2) + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER2; + else + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER3; + break; + case HEALTHBOX_GFX_STATUS_PRZ_BATTLER0: + if (battlerId == 0) + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER0; + else if (battlerId == 1) + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER1; + else if (battlerId == 2) + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER2; + else + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER3; + break; + case HEALTHBOX_GFX_STATUS_SLP_BATTLER0: + if (battlerId == 0) + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER0; + else if (battlerId == 1) + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER1; + else if (battlerId == 2) + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER2; + else + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER3; + break; + case HEALTHBOX_GFX_STATUS_FRZ_BATTLER0: + if (battlerId == 0) + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER0; + else if (battlerId == 1) + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER1; + else if (battlerId == 2) + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER2; + else + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER3; + break; + case HEALTHBOX_GFX_STATUS_BRN_BATTLER0: + if (battlerId == 0) + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER0; + else if (battlerId == 1) + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER1; + else if (battlerId == 2) + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER2; + else + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER3; + break; + } + return ret; +} + +void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) +{ + u32 windowId, spriteTileNum; + u8 *windowTileData; + + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, &windowId); + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6); + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2); + RemoveWindowOnHealthbox(windowId); +} + +void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) +{ + u8 text[16]; + u8 *txtPtr; + u32 windowId, spriteTileNum; + u8 *windowTileData; + + txtPtr = StringCopy(text, gText_HighlightRed_Left); + ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2); + + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, text, 0x2F), 3, &windowId); + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; + SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2); + SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4); + RemoveWindowOnHealthbox(windowId); +} + +void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) +{ + s32 maxHp, currHp; + u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler; + + if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) + GetBattlerSide(battlerId); // Pointless function call. + + if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) + { + u8 isDoubles; + + if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) + UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); + if (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), HP_CURRENT); + if (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), HP_MAX); + if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) + { + LoadBattleBarGfx(0); + maxHp = GetMonData(mon, MON_DATA_MAX_HP); + currHp = GetMonData(mon, MON_DATA_HP); + SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); + MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); + } + isDoubles = IsDoubleBattle(); + if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) + { + u16 species; + u32 exp, currLevelExp; + s32 currExpBarValue, maxExpBarValue; + u8 level; + + LoadBattleBarGfx(3); + species = GetMonData(mon, MON_DATA_SPECIES); + level = GetMonData(mon, MON_DATA_LEVEL); + exp = GetMonData(mon, MON_DATA_EXP); + currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; + currExpBarValue = exp - currLevelExp; + maxExpBarValue = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; + SetBattleBarStruct(battlerId, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); + MoveBattleBar(battlerId, healthboxSpriteId, EXP_BAR, 0); + } + if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) + UpdateNickInHealthbox(healthboxSpriteId, mon); + if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) + UpdateStatusIconInHealthbox(healthboxSpriteId); + if (elementId == HEALTHBOX_SAFARI_ALL_TEXT) + UpdateSafariBallsTextOnHealthbox(healthboxSpriteId); + if (elementId == HEALTHBOX_SAFARI_ALL_TEXT || elementId == HEALTHBOX_SAFARI_BALLS_TEXT) + UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId); + } + else + { + if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) + UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); + if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) + { + LoadBattleBarGfx(0); + maxHp = GetMonData(mon, MON_DATA_MAX_HP); + currHp = GetMonData(mon, MON_DATA_HP); + SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); + MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); + } + if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) + UpdateNickInHealthbox(healthboxSpriteId, mon); + if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) + UpdateStatusIconInHealthbox(healthboxSpriteId); + } +} + +#define B_EXPBAR_PIXELS 64 +#define B_HEALTHBAR_PIXELS 48 + +s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) +{ + s32 currentBarValue; + + if (whichBar == HEALTH_BAR) // health bar + { + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, + gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + B_HEALTHBAR_PIXELS / 8, 1); + } + else // exp bar + { + u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battlerId].oldValue, + gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, + gBattleSpritesDataPtr->battleBars[battlerId].maxValue, 8); + if (expFraction == 0) + expFraction = 1; + expFraction = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / expFraction); + + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, + gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + B_EXPBAR_PIXELS / 8, expFraction); + } + + if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)) + MoveBattleBarGraphically(battlerId, whichBar); + + if (currentBarValue == -1) + gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0; + + return currentBarValue; +} + +void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) +{ + u8 array[8]; + u8 filledPixelsCount, level; + u8 barElementId; + u8 i; + + switch (whichBar) + { + case HEALTH_BAR: + filledPixelsCount = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, + gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + array, B_HEALTHBAR_PIXELS / 8); + + if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp + barElementId = HEALTHBOX_GFX_HP_BAR_GREEN; + else if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp + barElementId = HEALTHBOX_GFX_HP_BAR_YELLOW; + else + barElementId = HEALTHBOX_GFX_HP_BAR_RED; // 20 % or less + + for (i = 0; i < 6; i++) + { + u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].hMain_HealthBarSpriteId; + if (i < 2) + CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, + (void*)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * TILE_SIZE_4BPP), 32); + else + CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, + (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32); + } + break; + case EXP_BAR: + CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, + gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + array, B_EXPBAR_PIXELS / 8); + level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL); + if (level == MAX_LEVEL) + { + for (i = 0; i < 8; i++) + array[i] = 0; + } + for (i = 0; i < 8; i++) + { + if (i < 4) + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, + (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 0x24 + i) * TILE_SIZE_4BPP), 32); + else + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, + (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32); + } + break; + } +} +s32 CalcNewBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 scale, u16 toAdd) +{ + s32 ret, newValue; + scale *= 8; + + if (*currValue == -32768) // first function call + { + if (maxValue < scale) + *currValue = Q_24_8(oldValue); + else + *currValue = oldValue; + } + + newValue = oldValue - receivedValue; + if (newValue < 0) + newValue = 0; + else if (newValue > maxValue) + newValue = maxValue; + + if (maxValue < scale) + { + if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0) + return -1; + } + else + { + if (newValue == *currValue) // we're done, the bar's value has been updated + return -1; + } + + if (maxValue < scale) // handle cases of max var having less pixels than the whole bar + { + s32 toAdd_ = Q_24_8(maxValue) / scale; + + if (receivedValue < 0) // fill bar right + { + *currValue += toAdd_; + ret = Q_24_8_TO_INT(*currValue); + if (ret >= newValue) + { + *currValue = Q_24_8(newValue); + ret = newValue; + } + } + else // move bar left + { + *currValue -= toAdd_; + ret = Q_24_8_TO_INT(*currValue); + // try round up + if ((*currValue & 0xFF) > 0) + ret++; + if (ret <= newValue) + { + *currValue = Q_24_8(newValue); + ret = newValue; + } + } + } + else + { + if (receivedValue < 0) // fill bar right + { + *currValue += toAdd; + if (*currValue > newValue) + *currValue = newValue; + ret = *currValue; + } + else // move bar left + { + *currValue -= toAdd; + if (*currValue < newValue) + *currValue = newValue; + ret = *currValue; + } + } + + return ret; +} + +u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale) +{ + u8 pixels, filledPixels, totalPixels; + u8 i; + + s32 newValue = oldValue - receivedValue; + if (newValue < 0) + newValue = 0; + else if (newValue > maxValue) + newValue = maxValue; + + totalPixels = scale * 8; + + for (i = 0; i < scale; i++) + arg4[i] = 0; + + if (maxValue < totalPixels) + pixels = (*currValue * totalPixels / maxValue) >> 8; + else + pixels = *currValue * totalPixels / maxValue; + + filledPixels = pixels; + + if (filledPixels == 0 && newValue > 0) + { + arg4[0] = 1; + filledPixels = 1; + } + else + { + for (i = 0; i < scale; i++) + { + if (pixels >= 8) + { + arg4[i] = 8; + } + else + { + arg4[i] = pixels; + break; + } + pixels -= 8; + } + } + + return filledPixels; +} + +// These functions seem as if they were made for testing the health bar. +s16 sub_804A460(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) +{ + s16 ret; + + ret = CalcNewBarValue(barInfo->maxValue, + barInfo->oldValue, + barInfo->receivedValue, + currValue, B_HEALTHBAR_PIXELS / 8, 1); + + sub_804A510(barInfo, currValue, bg, x, y); + + return ret; +} + +s16 sub_804A4C8(struct TestingBar *barInfo, s32 *currValue) +{ + s16 ret; + + ret = CalcNewBarValue(barInfo->maxValue, + barInfo->oldValue, + barInfo->receivedValue, + currValue, B_HEALTHBAR_PIXELS / 8, 1); + + return ret; +} + +void sub_804A4F0(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) +{ + sub_804A510(barInfo, currValue, bg, x, y); +} + +void sub_804A510(struct TestingBar *barInfo, s32 *currValue, u8 bg, u8 x, u8 y) +{ + u8 spC[B_HEALTHBAR_PIXELS / 8]; + u16 tiles[B_HEALTHBAR_PIXELS / 8]; + u8 i; + + CalcBarFilledPixels(barInfo->maxValue, + barInfo->oldValue, + barInfo->receivedValue, + currValue, spC, B_HEALTHBAR_PIXELS / 8); + + for (i = 0; i < B_HEALTHBAR_PIXELS / 8; i++) + { + tiles[i] = (barInfo->pal << 12) | (barInfo->tileOffset + spC[i]); + } + + CopyToBgTilemapBufferRect_ChangePalette(bg, tiles, x, y, 6, 1, 17); +} + +u8 GetScaledExpFraction(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale) +{ + s32 newVal, result; + s8 oldToMax, newToMax; + + scale *= 8; + newVal = oldValue - receivedValue; + + if (newVal < 0) + newVal = 0; + else if (newVal > maxValue) + newVal = maxValue; + + oldToMax = oldValue * scale / maxValue; + newToMax = newVal * scale / maxValue; + result = oldToMax - newToMax; + + return abs(result); +} + +u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) +{ + u8 result = hp * scale / maxhp; + + if (result == 0 && hp > 0) + return 1; + + return result; +} + +u8 GetHPBarLevel(s16 hp, s16 maxhp) +{ + u8 result; + + if (hp == maxhp) + { + result = HP_BAR_FULL; + } + else + { + u8 fraction = GetScaledHPFraction(hp, maxhp, B_HEALTHBAR_PIXELS); + if (fraction > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp + result = HP_BAR_GREEN; + else if (fraction > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp + result = HP_BAR_YELLOW; + else if (fraction > 0) + result = HP_BAR_RED; + else + result = HP_BAR_EMPTY; + } + + return result; +} + +const struct WindowTemplate sHealthboxWindowTemplate = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, @@ -2022,3 +2755,49 @@ const struct WindowTemplate gUnknown_8260564 = { .paletteNum = 0, .baseBlock = 0x000 }; + + +u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 *windowId) +{ + u16 winId; + u8 color[3]; + struct WindowTemplate winTemplate = sHealthboxWindowTemplate; + + winId = AddWindow(&winTemplate); + FillWindowPixelBuffer(winId, PIXEL_FILL(2)); + + color[0] = 2; + color[1] = 1; + color[2] = 3; + + AddTextPrinterParameterized4(winId, 0, x, y, 0, 0, color, -1, str); + + *windowId = winId; + return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA)); +} + +void RemoveWindowOnHealthbox(u32 windowId) +{ + RemoveWindow(windowId); +} + +void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 windowWidth) +{ + CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); +// + 256 as that prevents the top 4 blank rows of sHealthboxWindowTemplate from being copied + if (windowWidth > 0) + { + do + { + CpuCopy32(windowTileData + 20, dest + 20, 12); + dest += 32, windowTileData += 32; + windowWidth--; + } while (windowWidth != 0); + } +} + +void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 windowWidth) +{ + CpuCopy32(windowTileData, dest, windowWidth * TILE_SIZE_4BPP); + CpuCopy32(windowTileData + 256, dest + 256, windowWidth * TILE_SIZE_4BPP); +} diff --git a/src/battle_message.c b/src/battle_message.c index 396c4c7f0..2513aaff6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1254,7 +1254,7 @@ const u8 *const gUnknown_83FE7F4[] = { sText_Speed }; -const u8 gUnknown_83FE80C[] = _("{HIGHLIGHT 2}SAFARI BALLS"); // +const u8 gText_SafariBalls[] = _("{HIGHLIGHT 2}SAFARI BALLS"); // const u8 gText_HighlightRed_Left[] = _("{HIGHLIGHT 2}Left: "); const u8 gText_HighlightRed[] = _("{HIGHLIGHT 2}"); const u8 gText_Sleep[] = _("sleep"); |