diff options
-rw-r--r-- | asm/battle_interface.s | 978 | ||||
-rw-r--r-- | include/battle_interface.h | 4 | ||||
-rw-r--r-- | src/battle_gfx_sfx_util.c | 4 | ||||
-rw-r--r-- | src/battle_interface.c | 334 |
4 files changed, 340 insertions, 980 deletions
diff --git a/asm/battle_interface.s b/asm/battle_interface.s index 5d3aa7b20..e4c45c51c 100644 --- a/asm/battle_interface.s +++ b/asm/battle_interface.s @@ -5,976 +5,6 @@ .text - thumb_func_start Task_HidePartyStatusSummary -Task_HidePartyStatusSummary: @ 80491B0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r2, _080492C0 @ =gTasks - lsls r3, r0, 2 - adds r1, r3, r0 - lsls r1, 3 - adds r0, r1, r2 - ldrb r7, [r0, 0x1C] - ldrb r4, [r0, 0xA] - mov r10, r4 - ldrb r0, [r0, 0x8] - str r0, [sp, 0x8] - movs r5, 0 - str r3, [sp, 0xC] - adds r2, 0xE - adds r2, r1, r2 -_080491DE: - mov r0, sp - adds r1, r0, r5 - ldrh r0, [r2] - strb r0, [r1] - adds r2, 0x2 - adds r5, 0x1 - cmp r5, 0x5 - ble _080491DE - movs r1, 0xFD - lsls r1, 6 - movs r0, 0x50 - bl SetGpuReg - movs r0, 0x52 - movs r1, 0x10 - bl SetGpuReg - ldr r1, _080492C0 @ =gTasks - ldr r0, [sp, 0xC] - add r0, r8 - lsls r0, 3 - adds r0, r1 - movs r1, 0x10 - strh r1, [r0, 0x26] - movs r5, 0 - mov r1, r10 - lsls r1, 4 - str r1, [sp, 0x10] - ldr r3, _080492C4 @ =gSprites - movs r6, 0xD - negs r6, r6 - mov r12, r3 - movs r4, 0x4 -_08049220: - mov r2, sp - adds r0, r2, r5 - ldrb r0, [r0] - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - adds r1, r3 - ldrb r2, [r1, 0x1] - adds r0, r6, 0 - ands r0, r2 - orrs r0, r4 - strb r0, [r1, 0x1] - adds r5, 0x1 - cmp r5, 0x5 - ble _08049220 - ldr r2, [sp, 0x10] - add r2, r10 - lsls r2, 2 - add r2, r12 - ldrb r1, [r2, 0x1] - movs r0, 0xD - negs r0, r0 - ands r0, r1 - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2, 0x1] - cmp r7, 0 - bne _0804925A - b _08049360 -_0804925A: - movs r5, 0 - mov r6, r12 - mov r9, r5 - adds r3, r6, 0 - adds r3, 0x1C - mov r4, sp - movs r7, 0 -_08049268: - ldr r0, [sp, 0x8] - str r3, [sp, 0x14] - bl GetBattlerSide - lsls r0, 24 - lsrs r2, r0, 24 - ldr r3, [sp, 0x14] - cmp r2, 0 - beq _080492CC - movs r0, 0x5 - subs r0, r5 - mov r1, sp - adds r2, r1, r0 - ldrb r1, [r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - strh r7, [r0, 0x30] - ldrb r1, [r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - mov r1, r9 - strh r1, [r0, 0x34] - ldrb r1, [r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - mov r1, r9 - strh r1, [r0, 0x36] - ldrb r1, [r2] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - ldr r1, _080492C8 @ =sub_8049630 - str r1, [r0] - ldr r2, _080492C4 @ =gSprites - mov r12, r2 - b _08049302 - .align 2, 0 -_080492C0: .4byte gTasks -_080492C4: .4byte gSprites -_080492C8: .4byte sub_8049630 -_080492CC: - ldrb r1, [r4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - strh r7, [r0, 0x30] - ldrb r1, [r4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - strh r2, [r0, 0x34] - ldrb r1, [r4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r6 - strh r2, [r0, 0x36] - ldrb r1, [r4] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - ldr r1, _08049348 @ =sub_8049630 - str r1, [r0] - ldr r0, _0804934C @ =gSprites - mov r12, r0 -_08049302: - adds r4, 0x1 - adds r7, 0x7 - adds r5, 0x1 - cmp r5, 0x5 - ble _08049268 - ldr r3, [sp, 0x10] - add r3, r10 - lsls r3, 2 - mov r1, r12 - adds r0, r3, r1 - movs r2, 0x2E - ldrsh r1, [r0, r2] - lsrs r2, r1, 31 - adds r1, r2 - asrs r1, 1 - movs r2, 0 - strh r1, [r0, 0x2E] - strh r2, [r0, 0x30] - mov r1, r12 - adds r1, 0x1C - adds r3, r1 - ldr r1, _08049350 @ =sub_8049568 - str r1, [r3] - ldr r1, _08049354 @ =gUnknown_8260404 - bl SetSubspriteTables - ldr r1, _08049358 @ =gTasks - ldr r0, [sp, 0xC] - add r0, r8 - lsls r0, 3 - adds r0, r1 - ldr r1, _0804935C @ =sub_8049388 - str r1, [r0] - b _0804936E - .align 2, 0 -_08049348: .4byte sub_8049630 -_0804934C: .4byte gSprites -_08049350: .4byte sub_8049568 -_08049354: .4byte gUnknown_8260404 -_08049358: .4byte gTasks -_0804935C: .4byte sub_8049388 -_08049360: - ldr r0, _08049380 @ =gTasks - ldr r1, [sp, 0xC] - add r1, r8 - lsls r1, 3 - adds r1, r0 - ldr r0, _08049384 @ =sub_804948C - str r0, [r1] -_0804936E: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08049380: .4byte gTasks -_08049384: .4byte sub_804948C - thumb_func_end Task_HidePartyStatusSummary - - thumb_func_start sub_8049388 -sub_8049388: @ 8049388 - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080493DC @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r4, r1, r2 - ldrh r0, [r4, 0x1E] - adds r1, r0, 0x1 - strh r1, [r4, 0x1E] - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - bne _080493C8 - ldrh r0, [r4, 0x26] - subs r1, r0, 0x1 - strh r1, [r4, 0x26] - lsls r0, r1, 16 - cmp r0, 0 - blt _080493D4 - movs r0, 0x10 - subs r0, r1 - lsls r0, 8 - orrs r1, r0 - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x52 - bl SetGpuReg -_080493C8: - movs r1, 0x26 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _080493D4 - ldr r0, _080493E0 @ =sub_80493E4 - str r0, [r4] -_080493D4: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080493DC: .4byte gTasks -_080493E0: .4byte sub_80493E4 - thumb_func_end sub_8049388 - - thumb_func_start sub_80493E4 -sub_80493E4: @ 80493E4 - push {r4-r7,lr} - sub sp, 0x8 - lsls r0, 24 - lsrs r4, r0, 24 - ldr r7, _0804945C @ =gTasks - lsls r0, r4, 2 - adds r0, r4 - lsls r6, r0, 3 - adds r1, r6, r7 - ldrh r0, [r1, 0x26] - subs r0, 0x1 - strh r0, [r1, 0x26] - lsls r0, 16 - asrs r2, r0, 16 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - bne _08049464 - ldrb r3, [r1, 0xA] - movs r5, 0 - adds r0, r7, 0 - adds r0, 0xE - adds r2, r6, r0 -_08049412: - mov r0, sp - adds r1, r0, r5 - ldrh r0, [r2] - strb r0, [r1] - adds r2, 0x2 - adds r5, 0x1 - cmp r5, 0x5 - ble _08049412 - lsls r0, r3, 4 - adds r0, r3 - lsls r0, 2 - ldr r4, _08049460 @ =gSprites - adds r0, r4 - bl DestroySpriteAndFreeResources - mov r0, sp - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl DestroySpriteAndFreeResources - movs r5, 0x1 -_08049442: - mov r1, sp - adds r0, r1, r5 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl DestroySprite - adds r5, 0x1 - cmp r5, 0x5 - ble _08049442 - b _08049482 - .align 2, 0 -_0804945C: .4byte gTasks -_08049460: .4byte gSprites -_08049464: - movs r0, 0x3 - negs r0, r0 - cmp r2, r0 - bne _08049482 - movs r0, 0x50 - movs r1, 0 - bl SetGpuReg - movs r0, 0x52 - movs r1, 0 - bl SetGpuReg - adds r0, r4, 0 - bl DestroyTask -_08049482: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80493E4 - - thumb_func_start sub_804948C -sub_804948C: @ 804948C - push {r4-r7,lr} - sub sp, 0x8 - lsls r0, 24 - lsrs r0, 24 - adds r4, r0, 0 - ldr r7, _080494C4 @ =gTasks - lsls r0, r4, 2 - adds r0, r4 - lsls r6, r0, 3 - adds r3, r6, r7 - ldrh r0, [r3, 0x26] - subs r1, r0, 0x1 - strh r1, [r3, 0x26] - lsls r0, r1, 16 - asrs r2, r0, 16 - cmp r2, 0 - blt _080494C8 - movs r0, 0x10 - subs r0, r1 - lsls r0, 8 - orrs r1, r0 - lsls r1, 16 - lsrs r1, 16 - movs r0, 0x52 - bl SetGpuReg - b _08049546 - .align 2, 0 -_080494C4: .4byte gTasks -_080494C8: - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - bne _08049528 - ldrb r3, [r3, 0xA] - movs r5, 0 - adds r0, r7, 0 - adds r0, 0xE - adds r2, r6, r0 -_080494DA: - mov r0, sp - adds r1, r0, r5 - ldrh r0, [r2] - strb r0, [r1] - adds r2, 0x2 - adds r5, 0x1 - cmp r5, 0x5 - ble _080494DA - lsls r0, r3, 4 - adds r0, r3 - lsls r0, 2 - ldr r4, _08049524 @ =gSprites - adds r0, r4 - bl DestroySpriteAndFreeResources - mov r0, sp - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl DestroySpriteAndFreeResources - movs r5, 0x1 -_0804950A: - mov r1, sp - adds r0, r1, r5 - ldrb r1, [r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r4 - bl DestroySprite - adds r5, 0x1 - cmp r5, 0x5 - ble _0804950A - b _08049546 - .align 2, 0 -_08049524: .4byte gSprites -_08049528: - movs r0, 0x3 - negs r0, r0 - cmp r2, r0 - bne _08049546 - movs r0, 0x50 - movs r1, 0 - bl SetGpuReg - movs r0, 0x52 - movs r1, 0 - bl SetGpuReg - adds r0, r4, 0 - bl DestroyTask -_08049546: - add sp, 0x8 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_804948C - - thumb_func_start SpriteCB_StatusSummaryBar -SpriteCB_StatusSummaryBar: @ 8049550 - push {lr} - adds r1, r0, 0 - ldrh r2, [r1, 0x24] - movs r3, 0x24 - ldrsh r0, [r1, r3] - cmp r0, 0 - beq _08049564 - ldrh r0, [r1, 0x2E] - adds r0, r2, r0 - strh r0, [r1, 0x24] -_08049564: - pop {r0} - bx r0 - thumb_func_end SpriteCB_StatusSummaryBar - - thumb_func_start sub_8049568 -sub_8049568: @ 8049568 - push {lr} - adds r2, r0, 0 - ldrh r0, [r2, 0x30] - adds r1, r0, 0 - adds r1, 0x20 - strh r1, [r2, 0x30] - movs r3, 0x2E - ldrsh r0, [r2, r3] - cmp r0, 0 - ble _08049586 - lsls r0, r1, 16 - asrs r0, 20 - ldrh r1, [r2, 0x24] - adds r0, r1 - b _0804958E -_08049586: - lsls r1, 16 - asrs r1, 20 - ldrh r0, [r2, 0x24] - subs r0, r1 -_0804958E: - strh r0, [r2, 0x24] - ldrh r1, [r2, 0x30] - movs r0, 0xF - ands r0, r1 - strh r0, [r2, 0x30] - pop {r0} - bx r0 - thumb_func_end sub_8049568 - - thumb_func_start SpriteCB_StatusSummaryBallsOnBattleStart -SpriteCB_StatusSummaryBallsOnBattleStart: @ 804959C - push {r4,lr} - adds r4, r0, 0 - ldrh r1, [r4, 0x30] - movs r2, 0x30 - ldrsh r0, [r4, r2] - cmp r0, 0 - ble _080495B0 - subs r0, r1, 0x1 - strh r0, [r4, 0x30] - b _08049626 -_080495B0: - ldrh r0, [r4, 0x32] - lsls r0, 24 - lsrs r3, r0, 24 - ldrh r2, [r4, 0x34] - adds r0, r2, 0 - adds r0, 0x38 - lsls r1, r0, 16 - lsrs r2, r1, 16 - ldr r0, _080495E0 @ =0x0000fff0 - ands r2, r0 - strh r2, [r4, 0x34] - cmp r3, 0 - beq _080495E4 - lsrs r0, r1, 20 - ldrh r1, [r4, 0x24] - adds r0, r1 - strh r0, [r4, 0x24] - lsls r0, 16 - cmp r0, 0 - ble _080495F4 - movs r0, 0 - strh r0, [r4, 0x24] - b _080495F4 - .align 2, 0 -_080495E0: .4byte 0x0000fff0 -_080495E4: - lsrs r1, 20 - ldrh r0, [r4, 0x24] - subs r0, r1 - strh r0, [r4, 0x24] - lsls r0, 16 - cmp r0, 0 - bge _080495F4 - strh r3, [r4, 0x24] -_080495F4: - movs r2, 0x24 - ldrsh r0, [r4, r2] - cmp r0, 0 - bne _08049626 - movs r1, 0x3F - cmp r3, 0 - beq _08049604 - movs r1, 0xC0 -_08049604: - movs r2, 0x3C - ldrsh r0, [r4, r2] - cmp r0, 0 - beq _08049618 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x6D - bl PlaySE2WithPanning - b _08049622 -_08049618: - lsls r1, 24 - asrs r1, 24 - movs r0, 0x6C - bl PlaySE1WithPanning -_08049622: - ldr r0, _0804962C @ =SpriteCallbackDummy - str r0, [r4, 0x1C] -_08049626: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0804962C: .4byte SpriteCallbackDummy - thumb_func_end SpriteCB_StatusSummaryBallsOnBattleStart - - thumb_func_start sub_8049630 -sub_8049630: @ 8049630 - push {r4,lr} - adds r3, r0, 0 - ldrh r1, [r3, 0x30] - movs r2, 0x30 - ldrsh r0, [r3, r2] - cmp r0, 0 - ble _08049644 - subs r0, r1, 0x1 - strh r0, [r3, 0x30] - b _08049694 -_08049644: - ldrh r0, [r3, 0x32] - lsls r0, 24 - ldrh r2, [r3, 0x34] - adds r1, r2, 0 - adds r1, 0x38 - lsls r4, r1, 16 - lsrs r2, r4, 16 - ldr r1, _08049664 @ =0x0000fff0 - ands r2, r1 - strh r2, [r3, 0x34] - cmp r0, 0 - beq _08049668 - lsrs r0, r4, 20 - ldrh r1, [r3, 0x24] - adds r0, r1 - b _0804966E - .align 2, 0 -_08049664: .4byte 0x0000fff0 -_08049668: - lsrs r1, r4, 20 - ldrh r0, [r3, 0x24] - subs r0, r1 -_0804966E: - strh r0, [r3, 0x24] - movs r2, 0x24 - ldrsh r0, [r3, r2] - movs r2, 0x20 - ldrsh r1, [r3, r2] - adds r0, r1 - adds r0, 0x8 - movs r1, 0x80 - lsls r1, 1 - cmp r0, r1 - bls _08049694 - adds r2, r3, 0 - adds r2, 0x3E - ldrb r0, [r2] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2] - ldr r0, _0804969C @ =SpriteCallbackDummy - str r0, [r3, 0x1C] -_08049694: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0804969C: .4byte SpriteCallbackDummy - thumb_func_end sub_8049630 - - thumb_func_start SpriteCB_StatusSummaryBallsOnSwitchout -SpriteCB_StatusSummaryBallsOnSwitchout: @ 80496A0 - ldrh r2, [r0, 0x2E] - lsls r2, 24 - lsrs r2, 24 - ldr r3, _080496BC @ =gSprites - lsls r1, r2, 4 - adds r1, r2 - lsls r1, 2 - adds r1, r3 - ldrh r2, [r1, 0x24] - strh r2, [r0, 0x24] - ldrh r1, [r1, 0x26] - strh r1, [r0, 0x26] - bx lr - .align 2, 0 -_080496BC: .4byte gSprites - thumb_func_end SpriteCB_StatusSummaryBallsOnSwitchout - - thumb_func_start sub_80496C0 -sub_80496C0: @ 80496C0 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x10 - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r0, _08049760 @ =gDisplayedStringBattle - ldr r1, _08049764 @ =gUnknown_8260556 - bl StringCopy - adds r5, r0, 0 - adds r0, r7, 0 - movs r1, 0x2 - mov r2, sp - bl GetMonData - mov r0, sp - bl StringGetEnd10 - adds r0, r5, 0 - mov r1, sp - bl StringCopy - adds r5, r0, 0 - movs r0, 0xFC - strb r0, [r5] - adds r5, 0x1 - movs r0, 0x1 - strb r0, [r5] - adds r5, 0x1 - adds r0, r7, 0 - bl GetMonGender - lsls r0, 24 - lsrs r6, r0, 24 - adds r0, r7, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - adds r1, r0, 0 - cmp r0, 0x1D - beq _08049720 - cmp r0, 0x20 - bne _08049734 -_08049720: - movs r0, 0xB - muls r1, r0 - ldr r0, _08049768 @ =gSpeciesNames - adds r1, r0 - mov r0, sp - bl StringCompare - cmp r0, 0 - bne _08049734 - movs r6, 0x64 -_08049734: - ldr r1, _0804976C @ =gSprites - mov r0, r8 - lsls r4, r0, 4 - adds r0, r4, r0 - lsls r0, 2 - adds r0, r1 - ldrh r1, [r0, 0x3A] - lsls r1, 24 - lsrs r1, 24 - adds r0, r7, 0 - bl CheckBattleTypeGhost - lsls r0, 24 - cmp r0, 0 - beq _08049754 - movs r6, 0x64 -_08049754: - cmp r6, 0 - beq _08049770 - cmp r6, 0xFE - beq _0804977A - movs r0, 0xB - b _08049782 - .align 2, 0 -_08049760: .4byte gDisplayedStringBattle -_08049764: .4byte gUnknown_8260556 -_08049768: .4byte gSpeciesNames -_0804976C: .4byte gSprites -_08049770: - movs r0, 0xB - strb r0, [r5] - adds r5, 0x1 - movs r0, 0xB5 - b _08049782 -_0804977A: - movs r0, 0xA - strb r0, [r5] - adds r5, 0x1 - movs r0, 0xB6 -_08049782: - strb r0, [r5] - movs r0, 0xFF - strb r0, [r5, 0x1] - ldr r0, _080497E4 @ =gDisplayedStringBattle - add r3, sp, 0xC - movs r1, 0 - movs r2, 0x3 - bl AddTextPrinterAndCreateWindowOnHealthbox - adds r6, r0, 0 - ldr r0, _080497E8 @ =gSprites - mov r2, r8 - adds r1, r4, r2 - lsls r1, 2 - adds r1, r0 - ldrh r0, [r1, 0x4] - lsls r0, 22 - lsrs r4, r0, 17 - ldrh r0, [r1, 0x3A] - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080497F8 - ldr r1, _080497EC @ =0x06010040 - adds r0, r4, r1 - adds r1, r6, 0 - movs r2, 0x6 - bl TextIntoHealthboxObject - bl IsDoubleBattle - lsls r0, 24 - ldr r2, _080497F0 @ =0x06010400 - adds r5, r4, r2 - cmp r0, 0 - bne _080497D4 - ldr r0, _080497F4 @ =0x06010800 - adds r5, r4, r0 -_080497D4: - adds r1, r6, 0 - adds r1, 0xC0 - adds r0, r5, 0 - movs r2, 0x1 - bl TextIntoHealthboxObject - b _08049804 - .align 2, 0 -_080497E4: .4byte gDisplayedStringBattle -_080497E8: .4byte gSprites -_080497EC: .4byte 0x06010040 -_080497F0: .4byte 0x06010400 -_080497F4: .4byte 0x06010800 -_080497F8: - ldr r1, _08049818 @ =0x06010020 - adds r0, r4, r1 - adds r1, r6, 0 - movs r2, 0x7 - bl TextIntoHealthboxObject -_08049804: - ldr r0, [sp, 0xC] - bl RemoveWindowOnHealthbox - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08049818: .4byte 0x06010020 - thumb_func_end sub_80496C0 - - thumb_func_start sub_804981C -sub_804981C: @ 804981C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r2, r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - ldr r0, _080498DC @ =gBattleTypeFlags - ldr r1, [r0] - ldr r0, _080498E0 @ =0x00010210 - ands r0, r1 - cmp r0, 0 - bne _0804991C - movs r0, 0x8 - ands r1, r0 - cmp r1, 0 - bne _0804991C - ldr r0, _080498E4 @ =gSprites - mov r9, r0 - lsls r0, r2, 4 - adds r0, r2 - lsls r0, 2 - add r0, r9 - mov r8, r0 - ldrh r0, [r0, 0x3A] - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - beq _0804991C - ldr r1, _080498E8 @ =gBattlerPartyIndexes - lsls r0, r4, 1 - adds r5, r0, r1 - ldrh r0, [r5] - movs r7, 0x64 - muls r0, r7 - ldr r6, _080498EC @ =gEnemyParty - adds r0, r6 - adds r1, r4, 0 - bl CheckBattleTypeGhost - lsls r0, 24 - cmp r0, 0 - bne _0804991C - ldrh r0, [r5] - muls r0, r7 - adds r0, r6 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - bl SpeciesToNationalPokedexNum - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x1 - bl GetSetPokedexFlag - lsls r0, 24 - cmp r0, 0 - beq _0804991C - mov r1, r8 - ldrh r0, [r1, 0x38] - lsls r0, 24 - lsrs r4, r0, 24 - mov r2, r10 - cmp r2, 0 - beq _080498F8 - movs r0, 0x46 - bl GetHealthboxElementGfxPtr - lsls r1, r4, 4 - adds r1, r4 - lsls r1, 2 - add r1, r9 - ldrh r1, [r1, 0x4] - lsls r1, 22 - lsrs r1, 17 - movs r2, 0x80 - lsls r2, 1 - adds r1, r2 - ldr r2, _080498F0 @ =0x06010000 - adds r1, r2 - ldr r2, _080498F4 @ =0x04000008 - bl CpuSet - b _0804991C - .align 2, 0 -_080498DC: .4byte gBattleTypeFlags -_080498E0: .4byte 0x00010210 -_080498E4: .4byte gSprites -_080498E8: .4byte gBattlerPartyIndexes -_080498EC: .4byte gEnemyParty -_080498F0: .4byte 0x06010000 -_080498F4: .4byte 0x04000008 -_080498F8: - mov r0, r10 - str r0, [sp] - lsls r0, r4, 4 - adds r0, r4 - lsls r0, 2 - add r0, r9 - ldrh r1, [r0, 0x4] - lsls r1, 22 - lsrs r1, 17 - movs r2, 0x80 - lsls r2, 1 - adds r1, r2 - ldr r0, _0804992C @ =0x06010000 - adds r1, r0 - ldr r2, _08049930 @ =0x05000008 - mov r0, sp - bl CpuSet -_0804991C: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0804992C: .4byte 0x06010000 -_08049930: .4byte 0x05000008 - thumb_func_end sub_804981C - thumb_func_start UpdateStatusIconInHealthbox UpdateStatusIconInHealthbox: @ 8049934 push {r4-r7,lr} @@ -1173,7 +203,7 @@ _08049A7E: _08049AD4: mov r0, r9 movs r1, 0x1 - bl sub_804981C + bl TryAddPokeballIconToHealthbox b _08049BB6 .align 2, 0 _08049AE0: .4byte gSprites @@ -1270,7 +300,7 @@ _08049B62: _08049BAE: mov r0, r9 movs r1, 0 - bl sub_804981C + bl TryAddPokeballIconToHealthbox _08049BB6: pop {r3-r5} mov r8, r3 @@ -1676,7 +706,7 @@ _08049F06: _08049F0E: adds r0, r6, 0 mov r1, r8 - bl sub_80496C0 + bl UpdateNickInHealthbox _08049F16: cmp r7, 0x9 beq _08049F1E @@ -1753,7 +783,7 @@ _08049FA8: _08049FB0: adds r0, r6, 0 mov r1, r8 - bl sub_80496C0 + bl UpdateNickInHealthbox _08049FB8: cmp r7, 0x9 beq _08049FC0 diff --git a/include/battle_interface.h b/include/battle_interface.h index 162faa8cb..01f3c4b29 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -79,8 +79,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3); u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale); u8 GetHPBarLevel(s16 hp, s16 maxhp); -void sub_80496C0(u8 spriteId, struct Pokemon *mon); -void sub_804981C(u8 spriteId, u8); +void UpdateNickInHealthbox(u8 spriteId, struct Pokemon *mon); +void TryAddPokeballIconToHealthbox(u8 spriteId, u8); s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 arg3); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d7bccb298..60cff27be 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -687,8 +687,8 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 notTransform) gSprites[gBattlerSpriteIds[battlerAtk]].pos1.y = GetBattlerSpriteDefault_Y(battlerAtk); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]); SetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_NICKNAME, gSpeciesNames[targetSpecies]); - sub_80496C0(gHealthboxSpriteIds[battlerAtk], &gEnemyParty[gBattlerPartyIndexes[battlerAtk]]); - sub_804981C(gHealthboxSpriteIds[battlerAtk], 1); + UpdateNickInHealthbox(gHealthboxSpriteIds[battlerAtk], &gEnemyParty[gBattlerPartyIndexes[battlerAtk]]); + TryAddPokeballIconToHealthbox(gHealthboxSpriteIds[battlerAtk], 1); } else if (notTransform) { diff --git a/src/battle_interface.c b/src/battle_interface.c index 77ac1db80..489378a13 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1,8 +1,11 @@ #include "global.h" #include "battle_anim.h" #include "battle_interface.h" +#include "battle_message.h" #include "decompress.h" +#include "gpu_regs.h" #include "graphics.h" +#include "pokedex.h" #include "pokemon_summary_screen.h" #include "sound.h" #include "string_util.h" @@ -15,6 +18,11 @@ void SpriteCB_HealthBoxOther(struct Sprite * sprite); void SpriteCB_HealthBar(struct Sprite * sprite); const u8 *GetHealthboxElementGfxPtr(u8 which); void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); +void sub_8049388(u8 taskId); +void sub_80493E4(u8 taskId); +void sub_8049568(struct Sprite * sprite); +void sub_8049630(struct Sprite * sprite); +void sub_804948C(u8 taskId); void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite * sprite); void UpdateStatusIconInHealthbox(u8 spriteId); void SpriteCB_StatusSummaryBar(struct Sprite * sprite); @@ -183,8 +191,9 @@ const struct SubspriteTable sStatusSummaryBar_SubspriteTable[] = {NELEMS(gUnknown_82603D4), gUnknown_82603D4} }; -const struct SubspriteTable gUnknown_8260404 = -{NELEMS(gUnknown_82603E4), gUnknown_82603E4}; +const struct SubspriteTable gUnknown_8260404[] = { + {NELEMS(gUnknown_82603E4), gUnknown_82603E4} +}; const u16 gUnknown_26040C[] = INCBIN_U16("graphics/battle_interface/unk_826404C.4bpp"); @@ -1673,8 +1682,329 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } #endif //NONMATCHING +void Task_HidePartyStatusSummary(u8 taskId) +{ + u8 ballIconSpriteIds[PARTY_SIZE]; + bool8 isBattleStart; + u8 summaryBarSpriteId; + u8 battlerId; + s32 i; + + isBattleStart = gTasks[taskId].tIsBattleStart; + summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; + battlerId = gTasks[taskId].tBattler; + + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); + + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + + gTasks[taskId].tData15 = 16; + + for (i = 0; i < PARTY_SIZE; i++) + gSprites[ballIconSpriteIds[i]].oam.objMode = ST_OAM_OBJ_BLEND; + + gSprites[summaryBarSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + + if (isBattleStart) + { + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + { + gSprites[ballIconSpriteIds[5 - i]].data[1] = 7 * i; + gSprites[ballIconSpriteIds[5 - i]].data[3] = 0; + gSprites[ballIconSpriteIds[5 - i]].data[4] = 0; + gSprites[ballIconSpriteIds[5 - i]].callback = sub_8049630; + } + else + { + gSprites[ballIconSpriteIds[i]].data[1] = 7 * i; + gSprites[ballIconSpriteIds[i]].data[3] = 0; + gSprites[ballIconSpriteIds[i]].data[4] = 0; + gSprites[ballIconSpriteIds[i]].callback = sub_8049630; + } + } + gSprites[summaryBarSpriteId].data[0] /= 2; + gSprites[summaryBarSpriteId].data[1] = 0; + gSprites[summaryBarSpriteId].callback = sub_8049568; + SetSubspriteTables(&gSprites[summaryBarSpriteId], gUnknown_8260404); + gTasks[taskId].func = sub_8049388; + } + else + { + gTasks[taskId].func = sub_804948C; + } +} + +void sub_8049388(u8 taskId) +{ + if ((gTasks[taskId].data[11]++ % 2) == 0) + { + if (--gTasks[taskId].tData15 < 0) + return; + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15])); + } + if (gTasks[taskId].tData15 == 0) + gTasks[taskId].func = sub_80493E4; +} + +void sub_80493E4(u8 taskId) +{ + u8 ballIconSpriteIds[PARTY_SIZE]; + s32 i; + + u8 battlerId = gTasks[taskId].tBattler; + if (--gTasks[taskId].tData15 == -1) + { + u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; + + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); + + DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); + DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); + + for (i = 1; i < PARTY_SIZE; i++) + DestroySprite(&gSprites[ballIconSpriteIds[i]]); + } + else if (gTasks[taskId].tData15 == -3) + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyTask(taskId); + } +} + +void sub_804948C(u8 taskId) +{ + u8 ballIconSpriteIds[PARTY_SIZE]; + s32 i; + u8 battlerId = gTasks[taskId].tBattler; + + if (--gTasks[taskId].tData15 >= 0) + { + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15])); + } + else if (gTasks[taskId].tData15 == -1) + { + u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; + + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); + + DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); + DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); + + for (i = 1; i < PARTY_SIZE; i++) + DestroySprite(&gSprites[ballIconSpriteIds[i]]); + } + else if (gTasks[taskId].tData15 == -3) + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyTask(taskId); + } +} + +#undef tBattler +#undef tSummaryBarSpriteId +#undef tBallIconSpriteId +#undef tIsBattleStart +#undef tData15 + +void SpriteCB_StatusSummaryBar(struct Sprite *sprite) +{ + if (sprite->pos2.x != 0) + sprite->pos2.x += sprite->data[0]; +} + +void sub_8049568(struct Sprite *sprite) +{ + sprite->data[1] += 32; + if (sprite->data[0] > 0) + sprite->pos2.x += sprite->data[1] >> 4; + else + sprite->pos2.x -= sprite->data[1] >> 4; + sprite->data[1] &= 0xF; +} + +void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) +{ + u8 var1; + u16 var2; + s8 pan; + + if (sprite->data[1] > 0) + { + sprite->data[1]--; + return; + } + + var1 = sprite->data[2]; + var2 = sprite->data[3]; + var2 += 56; + sprite->data[3] = var2 & 0xFFF0; + + if (var1 != 0) + { + sprite->pos2.x += var2 >> 4; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + } + else + { + sprite->pos2.x -= var2 >> 4; + if (sprite->pos2.x < 0) + sprite->pos2.x = 0; + } + + if (sprite->pos2.x == 0) + { + pan = SOUND_PAN_TARGET; + if (var1 != 0) + pan = SOUND_PAN_ATTACKER; + + if (sprite->data[7] != 0) + PlaySE2WithPanning(SE_TB_KARA, pan); + else + PlaySE1WithPanning(SE_TB_KON, pan); + + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_8049630(struct Sprite *sprite) +{ + u8 var1; + u16 var2; + + if (sprite->data[1] > 0) + { + sprite->data[1]--; + return; + } + var1 = sprite->data[2]; + var2 = sprite->data[3]; + var2 += 56; + sprite->data[3] = var2 & 0xFFF0; + if (var1 != 0) + sprite->pos2.x += var2 >> 4; + else + sprite->pos2.x -= var2 >> 4; + if (sprite->pos2.x + sprite->pos1.x > 248 + || sprite->pos2.x + sprite->pos1.x < -8) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } +} + +void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite) +{ + u8 barSpriteId = sprite->data[0]; + + sprite->pos2.x = gSprites[barSpriteId].pos2.x; + sprite->pos2.y = gSprites[barSpriteId].pos2.y; +} + const u8 gUnknown_8260556[] = _("{HIGHLIGHT 02}"); +void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) +{ + u8 nickname[POKEMON_NAME_LENGTH + 1]; + u8 *ptr; + u32 windowId, spriteTileNum; + u8 *windowTileData; + u16 species; + u8 gender; + + ptr = StringCopy(gDisplayedStringBattle, gUnknown_8260556); + GetMonData(mon, MON_DATA_NICKNAME, nickname); + StringGetEnd10(nickname); + ptr = StringCopy(ptr, nickname); + *ptr++ = EXT_CTRL_CODE_BEGIN; + *ptr++ = EXT_CTRL_CODE_COLOR; + + gender = GetMonGender(mon); + species = GetMonData(mon, MON_DATA_SPECIES); + + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, gSpeciesNames[species]) == 0) + gender = 100; + + if (CheckBattleTypeGhost(mon, gSprites[healthboxSpriteId].hMain_Battler)) + gender = 100; + + // AddTextPrinterAndCreateWindowOnHealthbox's arguments are the same in all 3 cases. + // It's possible they may have been different in early development phases. + switch (gender) + { + default: + *ptr++ = TEXT_DYNAMIC_COLOR_2; + *ptr++ = EOS; + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); + break; + case MON_MALE: + *ptr++ = TEXT_DYNAMIC_COLOR_2; + *ptr++ = CHAR_MALE; + *ptr++ = EOS; + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); + break; + case MON_FEMALE: + *ptr++ = TEXT_DYNAMIC_COLOR_1; + *ptr++ = CHAR_FEMALE; + *ptr++ = EOS; + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, &windowId); + break; + } + + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; + + if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) + { + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40 + spriteTileNum), windowTileData, 6); + ptr = (void*)(OBJ_VRAM0); + if (!IsDoubleBattle()) + ptr += spriteTileNum + 0x800; + else + ptr += spriteTileNum + 0x400; + TextIntoHealthboxObject(ptr, windowTileData + 0xC0, 1); + } + else + { + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x20 + spriteTileNum), windowTileData, 7); + } + + RemoveWindowOnHealthbox(windowId); +} +void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) +{ + u8 battlerId, healthBarSpriteId; + + if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) + return; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + return; + + battlerId = gSprites[healthboxSpriteId].hMain_Battler; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + return; + if (CheckBattleTypeGhost(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId)) + return; + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) + return; + + healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; + + if (noStatus) + CpuCopy32(GetHealthboxElementGfxPtr(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), |