summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_interface.s1827
-rw-r--r--include/battle_message.h3
-rw-r--r--ld_script.txt1
-rw-r--r--src/battle_interface.c807
-rw-r--r--src/battle_message.c2
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");