diff --git a/asm/overlay_12_battle_command.s b/asm/overlay_12_battle_command.s index e00f03b26..f0e871bcd 100644 --- a/asm/overlay_12_battle_command.s +++ b/asm/overlay_12_battle_command.s @@ -10,1459 +10,6 @@ .text - thumb_func_start Task_GetPokemon -Task_GetPokemon: ; 0x022465A8 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x158 - add r4, r1, #0 - str r0, [sp, #0x10] - ldr r0, [r4] - bl BattleSystem_GetMessageLoader - str r0, [sp, #0x20] - ldr r0, [r4] - bl BattleSystem_GetPaletteData - add r5, r0, #0 - ldr r0, [r4] - bl ov12_0223A8D4 - mov r7, #1 - str r0, [sp, #0x24] - add r0, r7, #0 - ldr r6, [r4, #4] - bl MaskOfFlagNo - ldr r1, _02246900 ; =0x00003108 - ldrb r1, [r6, r1] - tst r0, r1 - beq _022465DC - mov r7, #3 -_022465DC: - ldr r0, [r4, #0x28] - cmp r0, #0x21 - bls _022465E6 - bl _02247216 -_022465E6: - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_022465F2: ; jump table - .short _02246636 - _022465F2 - 2 ; case 0 - .short _022466F8 - _022465F2 - 2 ; case 1 - .short _02246744 - _022465F2 - 2 ; case 2 - .short _02246772 - _022465F2 - 2 ; case 3 - .short _0224679C - _022465F2 - 2 ; case 4 - .short _022467B0 - _022465F2 - 2 ; case 5 - .short _022467E4 - _022465F2 - 2 ; case 6 - .short _02246806 - _022465F2 - 2 ; case 7 - .short _02246826 - _022465F2 - 2 ; case 8 - .short _0224686C - _022465F2 - 2 ; case 9 - .short _0224688A - _022465F2 - 2 ; case 10 - .short _02246A18 - _022465F2 - 2 ; case 11 - .short _02246A66 - _022465F2 - 2 ; case 12 - .short _02246AFA - _022465F2 - 2 ; case 13 - .short _02246B7A - _022465F2 - 2 ; case 14 - .short _02246BC4 - _022465F2 - 2 ; case 15 - .short _02246BF4 - _022465F2 - 2 ; case 16 - .short _02246C84 - _022465F2 - 2 ; case 17 - .short _02246CAA - _022465F2 - 2 ; case 18 - .short _02246CEA - _022465F2 - 2 ; case 19 - .short _02246D42 - _022465F2 - 2 ; case 20 - .short _02246E2A - _022465F2 - 2 ; case 21 - .short _02246E78 - _022465F2 - 2 ; case 22 - .short _02246E78 - _022465F2 - 2 ; case 23 - .short _02246E78 - _022465F2 - 2 ; case 24 - .short _0224702E - _022465F2 - 2 ; case 25 - .short _02247094 - _022465F2 - 2 ; case 26 - .short _022470D0 - _022465F2 - 2 ; case 27 - .short _02247116 - _022465F2 - 2 ; case 28 - .short _02247146 - _022465F2 - 2 ; case 29 - .short _0224715E - _022465F2 - 2 ; case 30 - .short _02247174 - _022465F2 - 2 ; case 31 - .short _022471AC - _022465F2 - 2 ; case 32 - .short _022471DC - _022465F2 - 2 ; case 33 -_02246636: - ldr r0, [r4, #0x24] - cmp r0, #0 - bne _022466B0 - mov r0, #3 - str r0, [sp, #0x138] - mov r0, #5 - str r0, [sp, #0x134] - ldr r0, _02246904 ; =0x00004E20 - add r0, r7, r0 - str r0, [sp, #0x13c] - ldr r0, [r4, #0x2c] - str r0, [sp, #0x140] - ldr r0, [r4] - bl BattleSystem_GetSpriteSystem - str r0, [sp, #0x14c] - ldr r0, [r4] - bl BattleSystem_GetPaletteData - str r0, [sp, #0x150] - mov r0, #1 - str r0, [sp, #0x144] - mov r0, #0 - str r0, [sp, #0x148] - ldr r0, [r4] - str r0, [sp, #0x154] - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #2 - tst r0, r1 - beq _02246686 - cmp r7, #1 - bne _02246680 - mov r0, #0x10 - str r0, [sp, #0x130] - b _0224668A -_02246680: - mov r0, #0x11 - str r0, [sp, #0x130] - b _0224668A -_02246686: - mov r0, #0xf - str r0, [sp, #0x130] -_0224668A: - add r0, sp, #0x130 - bl ov07_02233DB8 - str r0, [r4, #8] - mov r0, #1 - str r0, [r4, #0x28] - ldr r0, _02246908 ; =0x0000070A - bl PlaySE - ldr r2, [r4] - ldr r0, _0224690C ; =0x00002422 - ldrh r1, [r2, r0] - add r1, r1, #1 - strh r1, [r2, r0] - ldr r0, [r4, #8] - mov r1, #0 - bl ov07_02232F58 - b _022466F0 -_022466B0: - ldr r0, [r4] - mov r1, #0 - bl BattleSystem_GetOpponentData - add r5, r0, #0 - add r0, #0x88 - ldr r0, [r0] - bl ov07_02233F20 - cmp r0, #4 - beq _022466F0 - add r0, r5, #0 - add r0, #0x88 - ldr r0, [r0] - add r5, #0x88 - str r0, [r4, #8] - mov r0, #0 - str r0, [r5] - mov r0, #1 - str r0, [r4, #0x28] - ldr r0, _02246908 ; =0x0000070A - bl PlaySE - ldr r2, [r4] - ldr r0, _0224690C ; =0x00002422 - ldrh r1, [r2, r0] - add r1, r1, #1 - strh r1, [r2, r0] - ldr r0, [r4, #8] - mov r1, #0 - bl ov07_02232F58 -_022466F0: - mov r0, #0 - add sp, #0x158 - str r0, [r4, #0x40] - pop {r3, r4, r5, r6, r7, pc} -_022466F8: - ldr r0, [r4, #8] - mov r1, #0 - bl ov07_02232F60 - cmp r0, #0 - bne _02246788 - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #1 - tst r0, r1 - beq _02246728 - ldr r0, _02246910 ; =0x000005E6 - mov r1, #0x75 - bl sub_0200602C - ldr r0, [r4, #8] - mov r1, #2 - bl ov07_02232F58 - mov r0, #0x1a - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246728: - ldr r0, _02246914 ; =0x00000708 - mov r1, #0x75 - bl sub_0200602C - ldr r0, [r4, #8] - mov r1, #1 - bl ov07_02232F58 - mov r0, #2 - str r0, [r4, #0x28] - mov r0, #0x17 - add sp, #0x158 - str r0, [r4, #0x34] - pop {r3, r4, r5, r6, r7, pc} -_02246744: - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _02246788 - ldr r0, [r4] - ldr r2, [r4, #0x2c] - add r1, r7, #0 - bl ov12_022628A0 - ldr r0, [r4] - ldr r1, [r4, #4] - bl ov12_02247228 - str r0, [r4, #0x38] - cmp r0, #4 - bge _02246766 - b _02246768 -_02246766: - mov r0, #3 -_02246768: - str r0, [r4, #0x3c] - mov r0, #3 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246772: - ldr r0, [r4, #8] - mov r1, #1 - bl ov07_02232F60 - cmp r0, #0 - bne _02246788 - ldr r0, [r4, #4] - bl Link_QueueNotEmpty - cmp r0, #0 - bne _0224678C -_02246788: - bl _02247216 -_0224678C: - ldr r0, [r4, #8] - mov r1, #3 - bl ov07_02232F58 - mov r0, #4 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_0224679C: - ldr r0, [r4, #8] - mov r1, #3 - bl ov07_02232F60 - cmp r0, #0 - bne _0224689E - mov r0, #5 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_022467B0: - ldr r0, [r4, #0x3c] - cmp r0, #0 - bne _022467D0 - ldr r0, [r4, #0x38] - cmp r0, #4 - bne _022467C8 - mov r0, #7 - str r0, [r4, #0x28] - mov r0, #0xc - add sp, #0x158 - str r0, [r4, #0x34] - pop {r3, r4, r5, r6, r7, pc} -_022467C8: - mov r0, #0x1d - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_022467D0: - ldr r0, [r4, #8] - mov r1, #4 - bl ov07_02232F58 - mov r0, #6 - str r0, [r4, #0x28] - mov r0, #0xc - add sp, #0x158 - str r0, [r4, #0x34] - pop {r3, r4, r5, r6, r7, pc} -_022467E4: - ldr r0, [r4, #8] - mov r1, #4 - bl ov07_02232F60 - cmp r0, #0 - bne _0224689E - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _0224689E - ldr r0, [r4, #0x3c] - add sp, #0x158 - sub r0, r0, #1 - str r0, [r4, #0x3c] - mov r0, #5 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246806: - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _0224689E - ldr r0, [r4, #8] - mov r1, #6 - bl ov07_02232F58 - ldr r0, _02246918 ; =0x00000709 - mov r1, #0x75 - bl sub_0200602C - mov r0, #8 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246826: - ldr r0, [r4, #8] - mov r1, #6 - bl ov07_02232F60 - cmp r0, #0 - bne _0224689E - ldr r1, _0224691C ; =0x00000363 - add r0, sp, #0x10c - strh r1, [r0, #2] - mov r1, #0x82 - strb r1, [r0, #1] - str r7, [sp, #0x110] - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0x10c - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #9 - str r0, [r4, #0x28] - ldr r0, _02246920 ; =SEQ_GS_WIN2 - bl PlayBGM - ldr r0, [r4] - mov r1, #2 - bl BattleSystem_SetCriticalHpMusicFlag - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_0224686C: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _0224689E - mov r0, #0xa - str r0, [r4, #0x28] - ldr r0, [r4, #8] - mov r1, #7 - bl ov07_02232F58 - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_0224688A: - ldr r0, [r4, #8] - mov r1, #7 - bl ov07_02232F60 - cmp r0, #0 - bne _0224689E - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - beq _022468A2 -_0224689E: - bl _02247216 -_022468A2: - ldr r0, [r4] - add r1, r7, #0 - bl ov12_0223BD8C - ldr r2, [r4, #4] - ldr r0, [r4] - add r3, r2, r7 - ldr r2, _02246924 ; =0x0000219C - add r1, r7, #0 - ldrb r2, [r3, r2] - bl BattleSystem_GetPartyMon - add r6, r0, #0 - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #6 - lsl r1, r1, #8 - tst r0, r1 - beq _02246950 - ldr r2, [r4, #4] - ldr r0, [r4] - add r3, r2, r7 - ldr r2, _02246924 ; =0x0000219C - add r1, r7, #0 - ldrb r2, [r3, r2] - bl BattleSystem_GetPartyMon - add r2, r0, #0 - ldr r0, [r4] - ldr r1, [r4, #4] - bl ov12_022567D4 - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02246928 ; =0x0000FFFF - b _0224692C - nop -_02246900: .word 0x00003108 -_02246904: .word 0x00004E20 -_02246908: .word 0x0000070A -_0224690C: .word 0x00002422 -_02246910: .word 0x000005E6 -_02246914: .word 0x00000708 -_02246918: .word 0x00000709 -_0224691C: .word 0x00000363 -_02246920: .word SEQ_GS_WIN2 -_02246924: .word 0x0000219C -_02246928: .word 0x0000FFFF -_0224692C: - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x21 - str r0, [r4, #0x28] - mov r0, #1 - add sp, #0x158 - str r0, [r4, #0x40] - pop {r3, r4, r5, r6, r7, pc} -_02246950: - add r0, r6, #0 - mov r1, #5 - mov r2, #0 - bl GetMonData - add r1, r0, #0 - ldr r0, [r4] - bl BattleSystem_CheckMonCaught - cmp r0, #0 - beq _022469E6 - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #1 - lsl r1, r1, #0xc - tst r0, r1 - ldr r0, [r4] - beq _022469B0 - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02246CB8 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x16 - str r0, [r4, #0x28] - mov r0, #1 - add sp, #0x158 - str r0, [r4, #0x40] - pop {r3, r4, r5, r6, r7, pc} -_022469B0: - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02246CB8 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #5 - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x10 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_022469E6: - ldr r1, _02246CBC ; =0x00000367 - add r0, sp, #0xe8 - strh r1, [r0, #2] - mov r1, #0x82 - strb r1, [r0, #1] - str r7, [sp, #0xec] - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0xe8 - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #0xb - str r0, [r4, #0x28] - ldr r0, [r4] - bl ov12_0223BB44 - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246A18: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _02246A70 - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _02246A70 - mov r0, #0xc - str r0, [r4, #0x28] - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02246CB8 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #5 - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - str r1, [sp] - mov r2, #0x10 - add r3, r1, #0 - bl Pokepic_StartPaletteFadeAll - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246A66: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - beq _02246A72 -_02246A70: - b _02247216 -_02246A72: - ldr r0, [r4, #8] - bl ov07_02233ECC - ldr r0, [sp, #0x24] - bl PokepicManager_DeleteAllPics - ldr r0, [r4] - bl ov12_02237CC4 - ldr r0, [r4] - mov r1, #0 - bl ov12_0223A8F4 - mov r1, #0 - bl ov12_02265FC4 - ldr r0, [r4] - mov r1, #1 - bl ov12_0223A8F4 - mov r1, #0 - bl ov12_02265FC4 - ldr r0, [r4] - mov r1, #0 - bl BattleSystem_GetOpponentData - mov r1, #0 - bl ov12_02261294 - ldr r0, [r4] - bl BattleSystem_GetBgConfig - str r0, [sp, #0xd0] - ldr r0, [r4] - bl BattleSystem_GetPaletteData - str r0, [sp, #0xd4] - ldr r0, [sp, #0x24] - add r1, r7, #0 - str r0, [sp, #0xd8] - mov r0, #5 - str r0, [sp, #0xe4] - ldr r2, [r4, #4] - ldr r0, [r4] - add r3, r2, r7 - ldr r2, _02246CC0 ; =0x0000219C - ldrb r2, [r3, r2] - bl BattleSystem_GetPartyMon - str r0, [sp, #0xdc] - ldr r0, [r4] - bl BattleSystem_GetPokedex - bl Pokedex_IsNatDexEnabled - str r0, [sp, #0xe0] - bl ObjCharTransfer_PopTaskManager - str r0, [r4, #0x54] - add r0, sp, #0xd0 - bl ov18_021F8974 - str r0, [r4, #0x50] - mov r0, #0xd - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246AFA: - ldr r0, [r4, #0x50] - bl ov18_021F89C8 - cmp r0, #1 - bne _02246BFE - ldr r0, _02246CC4 ; =gSystem - ldr r1, [r0, #0x48] - mov r0, #1 - tst r0, r1 - beq _02246B14 - mov r0, #0xe - str r0, [r4, #0x28] - b _02246B26 -_02246B14: - bl System_GetTouchNew - cmp r0, #0 - beq _02246B26 - ldr r0, _02246CC8 ; =0x000005DC - bl PlaySE - mov r0, #0xe - str r0, [r4, #0x28] -_02246B26: - ldr r0, [r4, #0x28] - cmp r0, #0xe - bne _02246BFE - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #1 - lsl r1, r1, #0xc - tst r0, r1 - ldr r2, _02246CB8 ; =0x0000FFFF - beq _02246B62 - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246B62: - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - add r0, r5, #0 - mov r1, #5 - mov r3, #1 - bl PaletteData_BeginPaletteFade - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246B7A: - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #1 - lsl r1, r1, #0xc - tst r0, r1 - beq _02246B90 - mov r0, #0x17 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246B90: - ldr r0, [r4, #0x50] - bl ov18_021F95F8 - add r5, r0, #0 - mov r1, #0 - mov r2, #4 - bl Pokepic_AddAttr - add r0, r5, #0 - mov r1, #0 - bl Pokepic_GetAttr - cmp r0, #0x80 - blt _02246BFE - add r0, r5, #0 - mov r1, #0 - mov r2, #0x80 - bl Pokepic_SetAttr - ldr r0, [r4, #0x50] - bl ov18_021F95AC - mov r0, #0xf - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246BC4: - ldr r0, [r4, #0x50] - bl ov18_021F89D0 - ldr r0, [r4, #0x54] - bl ObjCharTransfer_PushTaskManager - ldr r0, [r4] - bl ov12_02237D00 - mov r0, #0x10 - str r0, [sp] - mov r0, #0 - str r0, [sp, #4] - str r0, [sp, #8] - ldr r2, _02246CB8 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #5 - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r0, #0x11 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246BF4: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - beq _02246C00 -_02246BFE: - b _02247216 -_02246C00: - ldr r2, [r4, #4] - ldr r0, [r4] - add r3, r2, r7 - ldr r2, _02246CC0 ; =0x0000219C - add r1, r7, #0 - ldrb r2, [r3, r2] - bl BattleSystem_GetPartyMon - add r6, r0, #0 - ldr r0, [r4, #8] - bl ov07_02233ECC - ldr r0, [sp, #0x24] - bl PokepicManager_DeleteAllPics - ldr r0, [r4] - mov r1, #0 - bl BattleSystem_GetOpponentData - mov r1, #0 - bl ov12_02261294 - ldr r0, [r4] - bl ov12_02237CC4 - ldr r0, [r4] - bl ov12_02237D00 - add r0, sp, #0xc0 - add r1, r6, #0 - mov r2, #2 - bl GetPokemonSpriteCharAndPlttNarcIds - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - str r0, [sp, #0xc] - ldr r0, [sp, #0x24] - add r1, sp, #0xc0 - mov r2, #0x80 - mov r3, #0x48 - bl PokepicManager_CreatePokepic - mov r0, #0x10 - str r0, [sp] - mov r0, #0 - str r0, [sp, #4] - str r0, [sp, #8] - ldr r2, _02246CB8 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #5 - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r2, #0 - ldr r0, [sp, #0x24] - mov r1, #0x10 - add r3, r2, #0 - str r2, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x11 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246C84: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - bne _02246D4C - mov r0, #0x12 - str r0, [r4, #0x28] - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #0 - bl sub_0201649C - add r0, r5, #0 - mov r1, #1 - bl PaletteData_SetAutoTransparent - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246CAA: - ldr r1, [r4, #4] - mov r0, #5 - str r0, [sp] - mov r2, #0 - ldr r0, _02246CC0 ; =0x0000219C - b _02246CCC - nop -_02246CB8: .word 0x0000FFFF -_02246CBC: .word 0x00000367 -_02246CC0: .word 0x0000219C -_02246CC4: .word gSystem -_02246CC8: .word 0x000005DC -_02246CCC: - str r2, [sp, #4] - add r3, r1, r7 - ldrb r0, [r3, r0] - mov r3, #0xd9 - lsl r3, r3, #2 - orr r0, r7 - str r0, [sp, #8] - ldr r0, [r4] - bl BattleController_EmitDrawYesNoBox - ldr r0, [r4, #0x28] - add sp, #0x158 - add r0, r0, #1 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246CEA: - add r0, r6, #0 - mov r1, #0 - bl BattleBuffer_GetNext - cmp r0, #0 - beq _02246D4C - ldr r0, [r4, #4] - mov r1, #0 - bl BattleBuffer_GetNext - cmp r0, #0xff - bne _02246D0A - mov r0, #0x16 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246D0A: - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02247060 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x14 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246D42: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - beq _02246D4E -_02246D4C: - b _02247216 -_02246D4E: - mov r0, #0 - add r1, r0, #0 - bl sub_0200FBF4 - mov r0, #1 - mov r1, #0 - bl sub_0200FBF4 - ldr r2, [r4, #4] - ldr r0, [r4] - add r3, r2, r7 - ldr r2, _02247064 ; =0x0000219C - add r1, r7, #0 - ldrb r2, [r3, r2] - bl BattleSystem_GetPartyMon - mov r1, #5 - mov r2, #0 - add r6, r0, #0 - bl GetMonData - add r5, r0, #0 - ldr r0, [r4] - bl BattleSystem_GetOptions - str r0, [sp] - mov r0, #0 - str r0, [sp, #4] - mov r0, #5 - mov r1, #1 - add r2, r5, #0 - mov r3, #0xa - bl NamingScreen_CreateArgs - add r5, r0, #0 - str r5, [r4, #0x54] - ldr r0, [r4] - mov r1, #0 - bl BattleSystem_GetPartySize - cmp r0, #6 - bge _02246DA6 - mov r0, #0 - b _02246DB0 -_02246DA6: - ldr r0, [r4] - bl ov12_0223BB1C - ldr r1, _02247068 ; =0x00000496 - add r0, r0, r1 -_02246DB0: - str r0, [r5, #0x44] - add r0, r6, #0 - mov r1, #0x70 - mov r2, #0 - bl GetMonData - str r0, [r5, #8] - ldr r0, [r4] - bl BattleSystem_GetPcStorage - str r0, [r5, #0x48] - add r0, r6, #0 - mov r1, #0x6f - mov r2, #0 - bl GetMonData - str r0, [r5, #0x10] - ldr r0, _0224706C ; =gOverlayTemplate_NamingScreen - add r1, r5, #0 - mov r2, #5 - bl OverlayManager_New - str r0, [r4, #0x50] - mov r0, #0x15 - str r0, [r4, #0x28] - ldr r0, [r4] - bl BattleSystem_HpBar_Delete - ldr r0, [r4] - mov r5, #0 - bl BattleSystem_GetMaxBattlers - cmp r0, #0 - ble _02246E18 - add r7, r5, #0 -_02246DF6: - ldr r0, [r4] - add r1, r5, #0 - bl BattleSystem_GetOpponentData - add r6, r0, #0 - ldr r0, [r6, #0x18] - cmp r0, #0 - beq _02246E0C - bl Sprite_DeleteAndFreeResources - str r7, [r6, #0x18] -_02246E0C: - ldr r0, [r4] - add r5, r5, #1 - bl BattleSystem_GetMaxBattlers - cmp r5, r0 - blt _02246DF6 -_02246E18: - ldr r0, [r4] - bl ov12_02237B6C - ldr r0, [r4] - mov r1, #1 - bl ov12_0223BBF0 - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02246E2A: - ldr r0, [r4, #0x50] - bl OverlayManager_Run - cmp r0, #0 - beq _02246E82 - ldr r2, [r4, #4] - ldr r5, [r4, #0x54] - add r3, r2, r7 - ldr r2, _02247064 ; =0x0000219C - ldr r0, [r4] - ldrb r2, [r3, r2] - add r1, r7, #0 - bl BattleSystem_GetPartyMon - ldr r1, [r5, #0x14] - cmp r1, #0 - bne _02246E5C - ldr r2, [r5, #0x18] - mov r1, #0x78 - bl SetMonData - ldr r0, [r4] - mov r1, #0x32 - bl BattleSystem_GameStatIncrement -_02246E5C: - add r0, r5, #0 - bl NamingScreen_DeleteArgs - ldr r0, [r4, #0x50] - bl OverlayManager_Delete - ldr r0, [r4] - mov r1, #2 - bl ov12_0223BBF0 - mov r0, #0x18 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246E78: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - beq _02246E84 -_02246E82: - b _02247216 -_02246E84: - ldr r0, [r4] - mov r1, #0 - bl BattleSystem_GetParty - ldr r2, [r4, #4] - str r0, [sp, #0x28] - add r3, r2, r7 - ldr r2, _02247064 ; =0x0000219C - ldr r0, [r4] - ldrb r2, [r3, r2] - add r1, r7, #0 - bl BattleSystem_GetPartyMon - add r6, r0, #0 - ldr r0, [r4] - add r1, r7, #0 - bl BattleSystem_SetPokedexCaught - ldr r0, [r4] - ldr r1, [r4, #4] - add r2, r6, #0 - bl ov12_022567D4 - ldr r0, [r4] - add r1, r6, #0 - bl ov12_0223B870 - mov r1, #0 - ldr r0, [r4] - add r2, r1, #0 - mov r3, #0xa - bl BattleController_EmitIncrementGameStat - ldr r0, [r4] - bl BattleSystem_GetBattleType - mov r1, #1 - lsl r1, r1, #0xc - tst r0, r1 - beq _02246F14 - ldr r0, [r4, #0x28] - cmp r0, #0x17 - bne _02246EEC - ldr r0, [r4, #0x50] - bl ov18_021F89D0 - ldr r0, [r4, #0x54] - bl ObjCharTransfer_PushTaskManager - ldr r0, [r4] - bl ov12_02237D00 -_02246EEC: - ldr r0, [r4] - bl BattleSystem_GetBugContestCaughtMon - add r1, r0, #0 - add r0, r6, #0 - bl CopyPokemonToPokemon - ldr r0, [r4, #0x28] - cmp r0, #0x16 - bne _02246F0C - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C -_02246F0C: - mov r0, #0x21 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246F14: - ldr r0, [sp, #0x28] - add r1, r6, #0 - bl Party_AddMon - cmp r0, #1 - bne _02246F5E - ldr r0, [r4, #0x28] - cmp r0, #0x16 - bne _02246F56 - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02247060 ; =0x0000FFFF - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll -_02246F56: - mov r0, #0x21 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02246F5E: - ldr r0, [r4] - bl BattleSystem_GetPcStorage - str r0, [sp, #0x1c] - bl PCStorage_GetActiveBox - str r0, [sp, #0x18] - ldr r0, [sp, #0x1c] - bl PCStorage_FindFirstBoxWithEmptySlot - str r0, [sp, #0x14] - ldr r0, [sp, #0x1c] - ldr r1, [sp, #0x14] - bl PCStorage_SetActiveBox - mov r5, #0 -_02246F7E: - add r1, r5, #0 - add r0, r6, #0 - add r1, #0x42 - mov r2, #0 - bl GetMonData - add r1, r5, #0 - str r0, [sp, #0x2c] - add r0, r6, #0 - add r1, #0x3a - add r2, sp, #0x2c - bl SetMonData - add r5, r5, #1 - cmp r5, #4 - blt _02246F7E - add r0, r6, #0 - bl Mon_UpdateGiratinaForm - mov r1, #0 - mvn r1, r1 - cmp r0, r1 - beq _02246FB4 - ldr r0, [r4] - add r1, r7, #0 - bl BattleSystem_SetPokedexCaught -_02246FB4: - add r0, r6, #0 - bl Mon_GetBoxMon - add r2, r0, #0 - ldr r0, [sp, #0x1c] - ldr r1, [sp, #0x14] - bl PCStorage_PlaceMonInBoxFirstEmptySlot - ldr r0, [r4, #0x28] - cmp r0, #0x16 - bne _02247026 - ldr r1, [sp, #0x18] - ldr r0, [sp, #0x14] - cmp r1, r0 - ldr r0, [r4] - bne _02246FEC - bl ov12_0223BB1C - ldr r1, _02247068 ; =0x00000496 - add r1, r0, r1 - add r0, sp, #0x9c - strh r1, [r0, #2] - mov r1, #0x93 - strb r1, [r0, #1] - ldr r0, [sp, #0x18] - str r7, [sp, #0xa0] - str r0, [sp, #0xa4] - b _02247006 -_02246FEC: - bl ov12_0223BB1C - ldr r1, _02247070 ; =0x00000498 - add r1, r0, r1 - add r0, sp, #0x9c - strh r1, [r0, #2] - mov r1, #0xaf - strb r1, [r0, #1] - ldr r0, [sp, #0x18] - str r7, [sp, #0xa0] - str r0, [sp, #0xa4] - ldr r0, [sp, #0x14] - str r0, [sp, #0xa8] -_02247006: - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0x9c - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #0x19 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02247026: - mov r0, #0x21 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_0224702E: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _022470E6 - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _022470E6 - ldr r0, [r4] - bl BattleSystem_GetMessageIcon - mov r1, #1 - bl sub_0201649C - mov r1, #0 - str r1, [sp] - mov r0, #0x10 - str r0, [sp, #4] - str r1, [sp, #8] - ldr r2, _02247060 ; =0x0000FFFF - b _02247074 - nop -_02247060: .word 0x0000FFFF -_02247064: .word 0x0000219C -_02247068: .word 0x00000496 -_0224706C: .word gOverlayTemplate_NamingScreen -_02247070: .word 0x00000498 -_02247074: - add r0, r5, #0 - mov r1, #0xf - mov r3, #1 - bl PaletteData_BeginPaletteFade - mov r1, #0 - ldr r0, [sp, #0x24] - mov r2, #0x10 - add r3, r1, #0 - str r1, [sp] - bl Pokepic_StartPaletteFadeAll - mov r0, #0x21 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02247094: - ldr r0, [r4, #8] - mov r1, #2 - bl ov07_02232F60 - cmp r0, #0 - bne _022470E6 - ldr r0, [r4, #8] - bl ov07_02233ECC - ldr r1, _0224721C ; =0x0000035B - add r0, sp, #0x78 - strh r1, [r0, #2] - mov r1, #0 - strb r1, [r0, #1] - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0x78 - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #0x1b - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_022470D0: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _022470E6 - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - beq _022470E8 -_022470E6: - b _02247216 -_022470E8: - mov r1, #0xd7 - lsl r1, r1, #2 - add r0, sp, #0x2c - strh r1, [r0, #0x2a] - mov r1, #0 - add r0, sp, #0x54 - strb r1, [r0, #1] - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0x54 - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #0x1c - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02247116: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _02247216 - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _02247216 - mov r0, #0x5e - ldr r1, [r4, #4] - mov r2, #0 - lsl r0, r0, #2 - str r2, [r1, r0] - add r0, r4, #0 - bl Heap_Free - ldr r0, [sp, #0x10] - bl SysTask_Destroy - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_02247146: - ldr r0, [r4] - ldr r2, [r4, #0x2c] - add r1, r7, #0 - mov r3, #1 - bl BattleController_EmitPokemonSendOut - mov r0, #0x1e - str r0, [r4, #0x28] - mov r0, #2 - add sp, #0x158 - str r0, [r4, #0x34] - pop {r3, r4, r5, r6, r7, pc} -_0224715E: - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _02247216 - ldr r0, [r4, #8] - bl ov07_02233ECC - mov r0, #0x1f - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_02247174: - add r0, r6, #0 - bl Link_QueueNotEmpty - cmp r0, #0 - beq _02247216 - ldr r1, [r4, #0x38] - ldr r0, _02247220 ; =0x0000035F - add r1, r1, r0 - add r0, sp, #0x2c - strh r1, [r0, #6] - mov r1, #0 - strb r1, [r0, #5] - ldr r0, [r4] - bl BattleSystem_GetTextFrameDelay - add r3, r0, #0 - ldr r0, [r4] - ldr r1, [sp, #0x20] - add r2, sp, #0x30 - bl BattleSystem_PrintBattleMessage - str r0, [r4, #0x30] - mov r0, #0x1e - str r0, [r4, #0x34] - mov r0, #0x20 - add sp, #0x158 - str r0, [r4, #0x28] - pop {r3, r4, r5, r6, r7, pc} -_022471AC: - ldr r0, [r4, #0x30] - lsl r0, r0, #0x18 - lsr r0, r0, #0x18 - bl TextPrinterCheckActive - cmp r0, #0 - bne _02247216 - ldr r0, [r4, #0x34] - sub r0, r0, #1 - str r0, [r4, #0x34] - bne _02247216 - mov r0, #0x5e - ldr r1, [r4, #4] - mov r2, #0 - lsl r0, r0, #2 - str r2, [r1, r0] - add r0, r4, #0 - bl Heap_Free - ldr r0, [sp, #0x10] - bl SysTask_Destroy - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} -_022471DC: - add r0, r5, #0 - bl PaletteData_GetSelectedBuffersBitmask - cmp r0, #0 - bne _02247216 - ldr r0, [r4, #0x40] - cmp r0, #0 - beq _022471F8 - ldr r0, [r4, #8] - bl ov07_02233ECC - ldr r0, [sp, #0x24] - bl PokepicManager_DeleteAllPics -_022471F8: - ldr r1, [r4] - ldr r0, _02247224 ; =0x00002420 - mov r2, #4 - strb r2, [r1, r0] - mov r0, #0x5e - ldr r1, [r4, #4] - mov r2, #0 - lsl r0, r0, #2 - str r2, [r1, r0] - add r0, r4, #0 - bl Heap_Free - ldr r0, [sp, #0x10] - bl SysTask_Destroy -_02247216: - add sp, #0x158 - pop {r3, r4, r5, r6, r7, pc} - nop -_0224721C: .word 0x0000035B -_02247220: .word 0x0000035F -_02247224: .word 0x00002420 - thumb_func_end Task_GetPokemon - thumb_func_start ov12_02247228 ov12_02247228: ; 0x02247228 push {r4, r5, r6, r7, lr} diff --git a/include/battle/battle.h b/include/battle/battle.h index f4d6f9e23..6047b22eb 100644 --- a/include/battle/battle.h +++ b/include/battle/battle.h @@ -476,13 +476,15 @@ typedef struct BattleHpBar { typedef struct OpponentData { u32 unk0[6]; - u32 unk18; + ManagedSprite *managedSprite; u32 *unk1C; Pokepic *pokepic; u32 *unk24; BattleHpBar hpBar; void *unk80; - u8 unk84[0x110]; + u8 unk84[0x4]; + int unk88; + u8 unk8C[0x108]; u8 unk194; u8 unk195; u8 unk196; @@ -543,7 +545,7 @@ struct BattleSystem { PCStorage *storage; Party *trainerParty[4]; SOUND_CHATOT *chatotVoice[4]; - u32 *unk88; + PokepicManager *pokepicManager; u32 *unk8C; SpriteSystem *spriteRenderer; SpriteManager *gfxHandler; @@ -640,7 +642,8 @@ struct GetterWork { int unk24; int state; int unk2C; - int unk30[8]; + int printerId; + int unk34[7]; void *unk50[2]; }; // size: 0x58 @@ -677,4 +680,26 @@ typedef struct BattleItem { typedef struct BattleCursorPosition BattleCursorPosition; +typedef struct UnkStruct_134 { + s32 unk0; + s32 heapID; + s32 unk8; + s32 unkC; + int ball; + s32 unk14; + s32 unk18; + SpriteSystem *spriteSystem; + PaletteData *paletteData; + BattleSystem *battleSystem; +} UnkStruct_134; + +typedef struct UnkStruct_50C { + BgConfig *bgConfig; + PaletteData *paletteData; + PokepicManager *pokepicManager; + Pokemon *mon; + BOOL natDexEnabled; + u32 heapID; +} UnkStruct_50C; + #endif diff --git a/include/battle/battle_system.h b/include/battle/battle_system.h index f0deda6df..7c2cc1190 100644 --- a/include/battle/battle_system.h +++ b/include/battle/battle_system.h @@ -17,7 +17,7 @@ int BattleSystem_GetMaxBattlers(BattleSystem *battleSystem); Party *BattleSystem_GetParty(BattleSystem *battleSystem, int battlerId); int BattleSystem_GetPartySize(BattleSystem *battleSystem, int battlerId); Pokemon *BattleSystem_GetPartyMon(BattleSystem *battleSystem, int battlerId, int index); -u32 *ov12_0223A8D4(BattleSystem *battleSystem); +PokepicManager *ov12_0223A8D4(BattleSystem *battleSystem); u32 *ov12_0223A8DC(BattleSystem *battleSystem); SpriteSystem *BattleSystem_GetSpriteSystem(BattleSystem *battleSystem); SpriteManager *BattleSystem_GetSpriteManager(BattleSystem *battleSystem); diff --git a/include/constants/battle.h b/include/constants/battle.h index c53bfd3fd..e4b5a9ece 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -644,5 +644,7 @@ typedef enum ControllerCommand { // Critical Music Flags #define CRITICAL_MUSIC_OFF 2 +#define MAX_BALL_SHAKE_COUNT 4 + #endif // PM_ASM #endif // POKEHEARTGOLD_CONSTANTS_BATTLE_H diff --git a/include/constants/sndseq.h b/include/constants/sndseq.h index 3be28a199..e0b1e2118 100644 --- a/include/constants/sndseq.h +++ b/include/constants/sndseq.h @@ -797,7 +797,7 @@ #define SEQ_SE_DP_BOWA3 1799 #define SEQ_SE_DP_BOWA4 1800 #define SEQ_SE_DP_GETTING 1801 -#define SEQ_SE_DP_NAGERU 1802 +#define SEQ_SE_DP_THROW 1802 #define SEQ_SE_DP_EXP 1803 #define SEQ_SE_DP_EXPMAX 1804 #define SEQ_SE_DP_EXPMAX2 1805 diff --git a/src/battle/battle_command.c b/src/battle/battle_command.c index 556c2b32f..6273323b6 100644 --- a/src/battle/battle_command.c +++ b/src/battle/battle_command.c @@ -14,6 +14,7 @@ #include "constants/pokemon.h" #include "constants/sndseq.h" +#include "battle/battle_022378C0.h" #include "battle/battle_controller.h" #include "battle/battle_controller_player.h" #include "battle/overlay_12_0224E4FC.h" @@ -21,8 +22,12 @@ #include "assert.h" #include "item.h" +#include "naming_screen.h" +#include "obj_char_transfer.h" +#include "overlay_manager.h" #include "palette.h" #include "party.h" +#include "pokedex_util.h" #include "pokemon.h" #include "pokemon_mood.h" #include "render_window.h" @@ -33,6 +38,7 @@ #include "text.h" #include "touchscreen.h" #include "unk_02005D10.h" +#include "unk_0200FA24.h" #include "unk_0208805C.h" int BattleScriptReadWord(BattleContext *ctx); @@ -1243,7 +1249,7 @@ BOOL BtlCmd_StartGetExpTask(BattleSystem *battleSystem, BattleContext *ctx) { ctx->getterWork->battleSystem = battleSystem; ctx->getterWork->ctx = ctx; ctx->getterWork->state = 0; - ctx->getterWork->unk30[6] = 0; + ctx->getterWork->unk34[5] = 0; SysTask_CreateOnMainQueue(Task_GetExp, ctx->getterWork, 0); @@ -5940,7 +5946,7 @@ static void Task_GetExp(SysTask *task, void *inData) { expBattler = 0; // Figure out which mon we're working on - for (slot = data->unk30[6]; slot < BattleSystem_GetPartySize(data->battleSystem, expBattler); slot++) { + for (slot = data->unk34[5]; slot < BattleSystem_GetPartySize(data->battleSystem, expBattler); slot++) { mon = BattleSystem_GetPartyMon(data->battleSystem, expBattler, slot); item = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); itemEffect = GetItemAttr(item, ITEM_VAR_HOLD_EFFECT, HEAP_ID_BATTLE); @@ -6006,7 +6012,7 @@ static void Task_GetExp(SysTask *task, void *inData) { } u32 newExp = GetMonData(mon, MON_DATA_EXPERIENCE, NULL); - data->unk30[3] = newExp - GetMonBaseExperienceAtCurrentLevel(mon); + data->unk34[2] = newExp - GetMonBaseExperienceAtCurrentLevel(mon); newExp += totalExp; if (slot == data->ctx->selectedMonIndex[expBattler]) { @@ -6025,8 +6031,8 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.tag = TAG_NICKNAME_NUM; msg.param[0] = expBattler | (slot << 8); msg.param[1] = totalExp; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); - data->unk30[1] = 7; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 7; data->state++; } else { data->state = STATE_GET_EXP_CHECK_DONE; @@ -6035,13 +6041,13 @@ static void Task_GetExp(SysTask *task, void *inData) { break; case STATE_GET_EXP_WAIT_MESSAGE_PRINT: - if (!TextPrinterCheckActive(data->unk30[0])) { + if (!TextPrinterCheckActive(data->printerId)) { data->state++; } break; case STATE_GET_EXP_WAIT_MESSAGE_DELAY: - if (--data->unk30[1] == 0) { + if (--data->unk34[0] == 0) { data->state++; } break; @@ -6049,8 +6055,8 @@ static void Task_GetExp(SysTask *task, void *inData) { case STATE_GET_EXP_GAUGE: // Only animate the gauge for an active battler if (slot == data->ctx->selectedMonIndex[expBattler]) { - ov12_02263564(data->battleSystem, data->ctx, expBattler, data->unk30[3]); - data->unk30[3] = 0; + ov12_02263564(data->battleSystem, data->ctx, expBattler, data->unk34[2]); + data->unk34[2] = 0; data->state++; } else { data->state = STATE_GET_EXP_CHECK_LEVEL_UP; @@ -6103,15 +6109,15 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.tag = TAG_NICKNAME_NUM; msg.param[0] = expBattler | (slot << 8); msg.param[1] = level; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state = STATE_GET_EXP_WAIT_LEVEL_UP_MESSAGE_PRINT; } break; case STATE_GET_EXP_WAIT_LEVEL_UP_MESSAGE_PRINT: - if (TextPrinterCheckActive(data->unk30[0]) == 0) { + if (TextPrinterCheckActive(data->printerId) == 0) { data->state = STATE_GET_EXP_LEVEL_UP_SUMMARY_LOAD_ICON; - data->unk30[2] = 0; + data->unk34[1] = 0; } break; @@ -6220,14 +6226,14 @@ static void Task_GetExp(SysTask *task, void *inData) { u16 move; BgConfig *bgConfig = BattleSystem_GetBgConfig(data->battleSystem); // unused, but must be kept to match - switch (MonTryLearnMoveOnLevelUp(mon, &data->unk30[2], &move)) { + switch (MonTryLearnMoveOnLevelUp(mon, &data->unk34[1], &move)) { case 0: data->state = STATE_GET_EXP_GAUGE; break; case 0xFFFE: break; case 0xFFFF: - data->unk30[4] = move; + data->unk34[3] = move; data->state = STATE_GET_EXP_WANTS_TO_LEARN_MOVE_PRINT; break; default: @@ -6239,7 +6245,7 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.tag = TAG_NICKNAME_MOVE; msg.param[0] = expBattler | (slot << 8); msg.param[1] = move; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state = STATE_GET_EXP_LEARNED_MOVE_WAIT; break; } @@ -6250,8 +6256,8 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.id = msg_0197_01178; // "{0} wants to learn the move {1}." msg.tag = TAG_NICKNAME_MOVE; msg.param[0] = expBattler | (slot << 8); - msg.param[1] = data->unk30[4]; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + msg.param[1] = data->unk34[3]; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; @@ -6259,7 +6265,7 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.id = msg_0197_01179; // "But {0} can't learn more than four moves." msg.tag = TAG_NICKNAME; msg.param[0] = expBattler | (slot << 8); - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; @@ -6269,7 +6275,7 @@ static void Task_GetExp(SysTask *task, void *inData) { case STATE_GET_EXP_FORGOT_HOW_TO_USE_WAIT: case STATE_GET_EXP_AND_DOTDOTDOT_WAIT: case STATE_GET_EXP_MAKE_IT_FORGET_CANCELLED_WAIT: - if (!TextPrinterCheckActive(data->unk30[0])) { + if (!TextPrinterCheckActive(data->printerId)) { data->state++; } break; @@ -6287,15 +6293,15 @@ static void Task_GetExp(SysTask *task, void *inData) { } else { msg.id = msg_0197_01183; // "Which move should be forgotten?" msg.tag = TAG_NONE; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state = STATE_GET_EXP_MAKE_IT_FORGET_WAIT; } } break; case STATE_GET_EXP_MAKE_IT_FORGET_WAIT: - if (!TextPrinterCheckActive(data->unk30[0])) { - ov12_02263D14(data->battleSystem, expBattler, data->unk30[4], slot); + if (!TextPrinterCheckActive(data->printerId)) { + ov12_02263D14(data->battleSystem, expBattler, data->unk34[3], slot); data->state++; } break; @@ -6304,7 +6310,7 @@ static void Task_GetExp(SysTask *task, void *inData) { if (BattleBuffer_GetNext(data->ctx, expBattler) == 0xFF) { data->state = STATE_GET_EXP_MAKE_IT_FORGET_CANCELLED; } else if (BattleBuffer_GetNext(data->ctx, expBattler)) { - data->unk30[5] = data->ctx->battleBuffer[expBattler][0] - 1; + data->unk34[4] = data->ctx->battleBuffer[expBattler][0] - 1; data->state = STATE_GET_EXP_ONE_TWO_POOF; } break; @@ -6312,13 +6318,13 @@ static void Task_GetExp(SysTask *task, void *inData) { case STATE_GET_EXP_MAKE_IT_FORGET_CANCELLED: msg.id = msg_0197_01184; // "Well, then..." msg.tag = TAG_NONE; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; case STATE_GET_EXP_GIVE_UP_LEARNING_PROMPT: // "Should this Pokémon give up on learning this new move?" - BattleController_EmitDrawYesNoBox(data->battleSystem, data->ctx, expBattler, msg_0197_01185, 2, data->unk30[4], 0); + BattleController_EmitDrawYesNoBox(data->battleSystem, data->ctx, expBattler, msg_0197_01185, 2, data->unk34[3], 0); data->state++; break; @@ -6330,15 +6336,15 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.id = msg_0197_01188; // "{0} did not learn {1}." msg.tag = TAG_NICKNAME_MOVE; msg.param[0] = expBattler | (slot << 8); - msg.param[1] = data->unk30[4]; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + msg.param[1] = data->unk34[3]; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state = 35; } } break; case STATE_GET_EXP_GIVE_UP_LEARNING_WAIT: - if (!TextPrinterCheckActive(data->unk30[0])) { + if (!TextPrinterCheckActive(data->printerId)) { // Check for another move to learn data->state = STATE_GET_EXP_CHECK_LEARN_MOVE; } @@ -6347,7 +6353,7 @@ static void Task_GetExp(SysTask *task, void *inData) { case STATE_GET_EXP_ONE_TWO_POOF: msg.id = msg_0197_01189; // "1, 2, and... ... Poof!" msg.tag = 0; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; @@ -6355,15 +6361,15 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.id = msg_0197_01190; // "{0} forgot how to use {1}." msg.tag = TAG_NICKNAME_MOVE; msg.param[0] = expBattler | (slot << 8); - msg.param[1] = GetMonData(mon, MON_DATA_MOVE1 + data->unk30[5], NULL); - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + msg.param[1] = GetMonData(mon, MON_DATA_MOVE1 + data->unk34[4], NULL); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; case STATE_GET_EXP_AND_DOTDOTDOT: msg.id = msg_0197_01191; // "And..." msg.tag = TAG_NONE; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); data->state++; break; @@ -6371,12 +6377,12 @@ static void Task_GetExp(SysTask *task, void *inData) { msg.id = msg_0197_01192; // "{0} learned {1}!" msg.tag = TAG_NICKNAME_MOVE; msg.param[0] = expBattler | (slot << 8); - msg.param[1] = data->unk30[4]; - data->unk30[0] = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + msg.param[1] = data->unk34[3]; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgLoader, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); i = 0; - SetMonData(mon, MON_DATA_MOVE1_PP_UPS + data->unk30[5], &i); - MonSetMoveInSlot(mon, data->unk30[4], data->unk30[5]); + SetMonData(mon, MON_DATA_MOVE1_PP_UPS + data->unk34[4], &i); + MonSetMoveInSlot(mon, data->unk34[3], data->unk34[4]); if (data->ctx->selectedMonIndex[expBattler] == slot) { BattleSystem_ReloadMonData(data->battleSystem, data->ctx, expBattler, data->ctx->selectedMonIndex[expBattler]); @@ -6386,7 +6392,7 @@ static void Task_GetExp(SysTask *task, void *inData) { break; case STATE_GET_EXP_LEARNED_MOVE_WAIT: - if (!TextPrinterCheckActive(data->unk30[0])) { + if (!TextPrinterCheckActive(data->printerId)) { // Check for another move to learn data->state = STATE_GET_EXP_CHECK_LEARN_MOVE; } @@ -6394,7 +6400,7 @@ static void Task_GetExp(SysTask *task, void *inData) { case STATE_GET_EXP_CHECK_DONE: data->ctx->unk_A4[side] &= (MaskOfFlagNo(slot) ^ 0xFFFFFFFF); // this mon is done - data->unk30[6] = slot + 1; + data->unk34[5] = slot + 1; data->state = STATE_GET_EXP_START; // go back to the top and get the next mon break; @@ -6498,4 +6504,562 @@ void BattleScript_CalcEffortValues(Party* party, int partySlot, u32 species, u32 SetMonData(mon, stat + MON_DATA_HP_EV, &stat_evs[stat]); } FreeMonPersonal(baseStats); +} + +void ov07_02232F58(s32, s32); // PlayBallAnimation? +BOOL ov07_02232F60(s32, s32); // IsBallAnimationPlaying? +s32 ov07_02233DB8(UnkStruct_134 *unkStruct_134); +void ov07_02233ECC(s32); +s32 ov07_02233F20(s32); + +void ov12_02237D00(BattleSystem *battleSystem); +void ov12_02237CC4(BattleSystem *battleSystem); +u32 ov12_02247228(BattleSystem *battleSystem, BattleContext *ctx); // TODO: BattleSystem_CalculateBallShakes +void ov12_02261294(OpponentData *opponentData, s32); +void ov12_022628A0(BattleSystem *battleSystem, s32 battlerId, s32); +void ov12_02265FC4(UnkBattleSystemSub17C *unkBattleSystemSub17C, s32); + +OverlayManager *ov18_021F8974(UnkStruct_50C *unkStruct); +s32 ov18_021F89C8(OverlayManager *overlayManager); +void ov18_021F89D0(OverlayManager *overlayManager); +Pokepic *ov18_021F95F8(OverlayManager *overlayManager); +void ov18_021F95AC(OverlayManager *overlayManager); + +void sub_0200602C(u16, s32); +void sub_0201649C(void *msgIcon, s32 unk0); + +enum { + STATE_GET_POKEMON_START = 0, + STATE_GET_POKEMON_CHECK_IF_TRAINER, + STATE_GET_POKEMON_CALCULATE_SHAKES, + STATE_GET_POKEMON_BALL_FALL, + STATE_GET_POKEMON_WAIT_FOR_BALL_FALL, + STATE_GET_POKEMON_BALL_SHAKE, + STATE_GET_POKEMON_BALL_SHAKE_DECREMENT, + STATE_GET_POKEMON_BALL_CLICK, + STATE_GET_POKEMON_GOTCHA, + STATE_GET_POKEMON_BALL_FADE, + STATE_GET_POKEMON_CHECK_MON_DATA, // 10 + // 11-13 + STATE_GET_POKEMON_MOVE_POKEPIC_TO_CENTER = 14, + // 15-17 + STATE_GET_POKEMON_ASK_FOR_NICKNAME = 18, + STATE_GET_POKEMON_WAIT_FOR_YESNO, + STATE_GET_POKEMON_PREPARE_NAMING_SCREEN, + STATE_GET_POKEMON_WAIT_FOR_NAMING_SCREEN, + STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN, + // STATE_GET_POKEMON_STORE_NEW_MON_BUG_CONTEST, + STATE_GET_POKEMON_STORE_NEW_MON_AFTER_NAMING_SCREEN = 24, + // Fade out Pokemon image if no naming screen? + STATE_GET_POKEMON_BALL_BLOCKED = 26, + STATE_GET_POKEMON_NO_STEALING, + STATE_GET_POKEMON_DONE_NO_STEALING, + STATE_GET_POKEMON_BREAK_OUT, + // STATE_GET_POKEMON_BREAK_OUT_ANIMATION? + STATE_GET_POKEMON_BREAK_OUT_MESSAGE = 31, + STATE_GET_POKEMON_DONE_BREAK_OUT, + STATE_GET_POKEMON_DONE_CAUGHT, +}; + +enum { // These are purely speculative until we can decomp ov07_02232F58. + BALL_ANIM_THROW = 0, + BALL_ANIM_OPEN, + BALL_ANIM_DEFLECT, + BALL_ANIM_FALL, + BALL_ANIM_SHAKE, + BALL_ANIM_5, // Seemingly unused, at least here. + BALL_ANIM_CLICK, + BALL_ANIM_FADE, +}; + +void Task_GetPokemon(SysTask *task, void *inData) { + GetterWork *data = inData; + SysTask *sysTask = task; + PokepicManager *pokepicManager; + MsgData *msgData = BattleSystem_GetMessageLoader(data->battleSystem); + PaletteData *paletteData = BattleSystem_GetPaletteData(data->battleSystem); + pokepicManager = ov12_0223A8D4(data->battleSystem); // TODO: BattleSystem_GetPokepicManager + + s32 battlerId = BATTLER_ENEMY; + if (MaskOfFlagNo(1) & data->ctx->switchInFlag) { + battlerId = BATTLER_ENEMY2; + } + + switch (data->state) { + case STATE_GET_POKEMON_START: + if (data->unk24 == CAPTURE_NORMAL) { + UnkStruct_134 unkStruct; + unkStruct.unk8 = 3; + unkStruct.heapID = HEAP_ID_BATTLE; + unkStruct.unkC = battlerId + 20000; + unkStruct.ball = data->unk2C; + unkStruct.spriteSystem = BattleSystem_GetSpriteSystem(data->battleSystem); + unkStruct.paletteData = BattleSystem_GetPaletteData(data->battleSystem); + unkStruct.unk14 = 1; + unkStruct.unk18 = 0; + unkStruct.battleSystem = data->battleSystem; + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_DOUBLES) { + if (battlerId == BATTLER_ENEMY) { + unkStruct.unk0 = 16; + } else { // BATTLER_ENEMY2, assumedly. + unkStruct.unk0 = 17; + } + } else { // This is a single battle. + unkStruct.unk0 = 15; + } + data->unk8 = ov07_02233DB8(&unkStruct); // Likely returns the index for the ball, otherwise it's unclear how the game would know which sprites to use. + data->state = STATE_GET_POKEMON_CHECK_IF_TRAINER; + PlaySE(SEQ_SE_DP_THROW); + data->battleSystem->unk2422++; + ov07_02232F58(data->unk8, BALL_ANIM_THROW); + } else { // CAPTURE_SAFARI + OpponentData *opponentData = BattleSystem_GetOpponentData(data->battleSystem, BATTLER_PLAYER); + if (ov07_02233F20(opponentData->unk88) != 4) { + data->unk8 = opponentData->unk88; + opponentData->unk88 = 0; + data->state = STATE_GET_POKEMON_CHECK_IF_TRAINER; + PlaySE(SEQ_SE_DP_THROW); + data->battleSystem->unk2422++; + ov07_02232F58(data->unk8, BALL_ANIM_THROW); + } + } + data->unk34[3] = 0; + break; + case STATE_GET_POKEMON_CHECK_IF_TRAINER: + if (!ov07_02232F60(data->unk8, BALL_ANIM_THROW)) { // Likely checking if the current ball animation is still active. + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_TRAINER) { + sub_0200602C(SEQ_SE_DP_KON, 0x75); + ov07_02232F58(data->unk8, BALL_ANIM_DEFLECT); + data->state = STATE_GET_POKEMON_BALL_BLOCKED; + break; + } + sub_0200602C(SEQ_SE_DP_BOWA4, 0x75); + ov07_02232F58(data->unk8, BALL_ANIM_OPEN); + data->state = STATE_GET_POKEMON_CALCULATE_SHAKES; + data->unk34[0] = 23; // Probably a wait frame counter. + } + break; + case STATE_GET_POKEMON_CALCULATE_SHAKES: + data->unk34[0]--; // Decrement the frame counter by 1. + if (data->unk34[0] == 0) { // After 23 frames have passed... + ov12_022628A0(data->battleSystem, battlerId, data->unk2C); + data->unk34[1] = ov12_02247228(data->battleSystem, data->ctx); + + if (data->unk34[1] < MAX_BALL_SHAKE_COUNT) { + data->unk34[2] = data->unk34[1]; // Store the number of shake animations we actually need to do. + } else { + data->unk34[2] = 3; // Even if we should catch, there should still only be 3 shakes. The 4th is a different animation. + } + data->state = STATE_GET_POKEMON_BALL_FALL; + } + break; + case STATE_GET_POKEMON_BALL_FALL: + if (!ov07_02232F60(data->unk8, BALL_ANIM_OPEN) && Link_QueueNotEmpty(data->ctx)) { // Wait for whatever this is to resolve before continuing. + ov07_02232F58(data->unk8, BALL_ANIM_FALL); + data->state = STATE_GET_POKEMON_WAIT_FOR_BALL_FALL; + } + break; + case STATE_GET_POKEMON_WAIT_FOR_BALL_FALL: + if (!ov07_02232F60(data->unk8, BALL_ANIM_FALL)) { + data->state = STATE_GET_POKEMON_BALL_SHAKE; + } + break; + case STATE_GET_POKEMON_BALL_SHAKE: + if (data->unk34[2] == 0) { // If there are no more ball shake animations to do... + if (data->unk34[1] == MAX_BALL_SHAKE_COUNT) { // If the Pokemon should be caught... + data->state = STATE_GET_POKEMON_BALL_CLICK; + data->unk34[0] = 12; // Set the wait frame counter. + break; + } + data->state = STATE_GET_POKEMON_BREAK_OUT; + break; + } + ov07_02232F58(data->unk8, BALL_ANIM_SHAKE); + data->state = STATE_GET_POKEMON_BALL_SHAKE_DECREMENT; + data->unk34[0] = 12; + break; + case STATE_GET_POKEMON_BALL_SHAKE_DECREMENT: + if (!ov07_02232F60(data->unk8, BALL_ANIM_SHAKE)) { + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 12 frames have passed... + data->unk34[2]--; // Decrement the ball shake counter. + data->state = STATE_GET_POKEMON_BALL_SHAKE; + } + } + break; + case STATE_GET_POKEMON_BALL_CLICK: + data->unk34[0]--; // Decrement the wait frame counter. + if (data->unk34[0] == 0) { // Perform the next step when there are no more frames to wait. + ov07_02232F58(data->unk8, BALL_ANIM_CLICK); + sub_0200602C(SEQ_SE_DP_GETTING, 0x75); + data->state = STATE_GET_POKEMON_GOTCHA; + } + break; + case STATE_GET_POKEMON_GOTCHA: + if (!ov07_02232F60(data->unk8, BALL_ANIM_CLICK)) { + BattleMessage msg; + msg.id = 0x363; // Gotcha! {0} was caught! + msg.tag = TAG_NICKNAME | 0x80; + msg.param[0] = battlerId; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = STATE_GET_POKEMON_BALL_FADE; + PlayBGM(SEQ_GS_WIN2); + BattleSystem_SetCriticalHpMusicFlag(data->battleSystem, 2); + } + break; + case STATE_GET_POKEMON_BALL_FADE: + if (!TextPrinterCheckActive(data->printerId)) { // Wait for the text box to finish printing. + data->state = STATE_GET_POKEMON_CHECK_MON_DATA; + ov07_02232F58(data->unk8, BALL_ANIM_FADE); + } + break; + case STATE_GET_POKEMON_CHECK_MON_DATA: + if (!ov07_02232F60(data->unk8, BALL_ANIM_FADE) && !(data->unk34[0]--, (data->unk34[0]))) { + ov12_0223BD8C(data->battleSystem, battlerId); + Pokemon *mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); // Get the data of the caught Pokemon. + if (BattleSystem_GetBattleType(data->battleSystem) & (BATTLE_TYPE_PAL_PARK | BATTLE_TYPE_TUTORIAL)) { // If this was the Catching Demo or a Pal Park encounter... + ov12_022567D4(data->battleSystem, data->ctx, BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId])); + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + data->state = STATE_GET_POKEMON_DONE_CAUGHT; + data->unk34[3] = 1; + break; + } + if (BattleSystem_CheckMonCaught(data->battleSystem, GetMonData(mon, MON_DATA_SPECIES, 0))) { + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_BUG_CONTEST) { // If this was the Bug Catching Contest... + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + data->state = STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN; + data->unk34[3] = 1; + break; + } + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 5, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + data->state = 16; + break; + } + BattleMessage msg; + msg.id = 0x367; // {0}’s data has been added to the Pokédex. + msg.tag = TAG_NICKNAME | 0x80; + msg.param[0] = battlerId; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = 11; + ov12_0223BB44(data->battleSystem); + } + break; + case 11: + if (!TextPrinterCheckActive(data->printerId)) { // Wait for the text box to finish printing. + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 30 frames have passed... + data->state = 12; + PaletteData_BeginPaletteFade(paletteData, 5, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + } + } + break; + case 12: + if (!PaletteData_GetSelectedBuffersBitmask(paletteData)) { + ov07_02233ECC(data->unk8); + PokepicManager_DeleteAllPics(pokepicManager); + ov12_02237CC4(data->battleSystem); + ov12_02265FC4(ov12_0223A8F4(data->battleSystem, 0), 0); + ov12_02265FC4(ov12_0223A8F4(data->battleSystem, 1), 0); + ov12_02261294(BattleSystem_GetOpponentData(data->battleSystem, BATTLER_PLAYER), 0); + UnkStruct_50C unkStruct; + unkStruct.bgConfig = BattleSystem_GetBgConfig(data->battleSystem); + unkStruct.paletteData = BattleSystem_GetPaletteData(data->battleSystem); + unkStruct.pokepicManager = pokepicManager; + unkStruct.heapID = HEAP_ID_BATTLE; + unkStruct.mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); + unkStruct.natDexEnabled = Pokedex_IsNatDexEnabled(BattleSystem_GetPokedex(data->battleSystem)); + data->unk50[1] = ObjCharTransfer_PopTaskManager(); + data->unk50[0] = ov18_021F8974(&unkStruct); + data->state = 13; + } + break; + case 13: + if (ov18_021F89C8(data->unk50[0]) == 1) { + if (PAD_BUTTON_A & gSystem.newKeys) { // If the A button is pressed... + data->state = STATE_GET_POKEMON_MOVE_POKEPIC_TO_CENTER; + } else if (System_GetTouchNew()) { // If the touch screen is pressed... + PlaySE(SEQ_SE_DP_SELECT); // For some reason, a sound effect only plays if the touch screen is used here. + data->state = STATE_GET_POKEMON_MOVE_POKEPIC_TO_CENTER; + } + if (data->state == STATE_GET_POKEMON_MOVE_POKEPIC_TO_CENTER) { + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_BUG_CONTEST) { + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + break; + } + PaletteData_BeginPaletteFade(paletteData, 5, 0xFFFF, 1, 0, 0x10, 0); + } + } + break; + case STATE_GET_POKEMON_MOVE_POKEPIC_TO_CENTER: + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_BUG_CONTEST) { + data->state = 23; + break; + } + Pokepic *pic = ov18_021F95F8(data->unk50[0]); + Pokepic_AddAttr(pic, POKEPIC_X, 4); // Move the Pokepic 4 pixels to the right each frame. + if (Pokepic_GetAttr(pic, POKEPIC_X) >= 128) { // Stop when the Pokepic has reached the center of the screen. + Pokepic_SetAttr(pic, POKEPIC_X, 128); + ov18_021F95AC(data->unk50[0]); + data->state = 15; + } + break; + case 15: + ov18_021F89D0(data->unk50[0]); + ObjCharTransfer_PushTaskManager(data->unk50[1]); + ov12_02237D00(data->battleSystem); + PaletteData_BeginPaletteFade(paletteData, 5, 0xFFFF, 1, 0x10, 0, 0); + data->state = 17; + break; + case 16: + if (!PaletteData_GetSelectedBuffersBitmask(paletteData)) { + Pokemon *mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); + ov07_02233ECC(data->unk8); + PokepicManager_DeleteAllPics(pokepicManager); + ov12_02261294(BattleSystem_GetOpponentData(data->battleSystem, BATTLER_PLAYER), 0); + ov12_02237CC4(data->battleSystem); + ov12_02237D00(data->battleSystem); + PokepicTemplate picTemplate; + GetPokemonSpriteCharAndPlttNarcIds(&picTemplate, mon, 2); + PokepicManager_CreatePokepic(pokepicManager, &picTemplate, 0x80, 0x48, 0, 0, 0, 0); + PaletteData_BeginPaletteFade(paletteData, 5, 0xFFFF, 1, 0x10, 0, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0x10, 0, 0, 0); + data->state = 17; + } + break; + case 17: + if (!PaletteData_GetSelectedBuffersBitmask(paletteData)) { + data->state = STATE_GET_POKEMON_ASK_FOR_NICKNAME; + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 0); + PaletteData_SetAutoTransparent(paletteData, 1); + } + break; + case STATE_GET_POKEMON_ASK_FOR_NICKNAME: + BattleController_EmitDrawYesNoBox(data->battleSystem, data->ctx, 0, 0x364, 5, 0, data->ctx->selectedMonIndex[battlerId] | battlerId); // Would you like to give {0} a nickname? + data->state++; + break; + case STATE_GET_POKEMON_WAIT_FOR_YESNO: + if (BattleBuffer_GetNext(data->ctx, BATTLER_PLAYER)) { // Wait for the player to prompt the game to continue. + if (BattleBuffer_GetNext(data->ctx, BATTLER_PLAYER) == 0xFF) { // If the player said no... + data->state = STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN; + break; + } + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + data->state = STATE_GET_POKEMON_PREPARE_NAMING_SCREEN; + } + break; + case STATE_GET_POKEMON_PREPARE_NAMING_SCREEN: + if (!PaletteData_GetSelectedBuffersBitmask(paletteData)) { + sub_0200FBF4(PM_LCD_TOP, RGB_BLACK); + sub_0200FBF4(PM_LCD_BOTTOM, RGB_BLACK); + Pokemon *mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); + NamingScreenArgs *namingScreenArgs = NamingScreen_CreateArgs(HEAP_ID_BATTLE, NAME_SCREEN_POKEMON, GetMonData(mon, MON_DATA_SPECIES, 0), 0xA, BattleSystem_GetOptions(data->battleSystem), 0); + data->unk50[1] = namingScreenArgs; + if (BattleSystem_GetPartySize(data->battleSystem, 0) < PARTY_SIZE) { + namingScreenArgs->battleMsgId = 0; + } else { + // TODO: BattleSystem_MetBill + namingScreenArgs->battleMsgId = ov12_0223BB1C(data->battleSystem) + 0x496; // {0} was transferred to {1} in someone’s/Bill's PC! + } + namingScreenArgs->monForm = GetMonData(mon, MON_DATA_FORM, 0); + namingScreenArgs->pcStorage = BattleSystem_GetPcStorage(data->battleSystem); + namingScreenArgs->monGender = GetMonData(mon, MON_DATA_GENDER, 0); + data->unk50[0] = OverlayManager_New(&gOverlayTemplate_NamingScreen, namingScreenArgs, HEAP_ID_BATTLE); + data->state = STATE_GET_POKEMON_WAIT_FOR_NAMING_SCREEN; + BattleSystem_HpBar_Delete(data->battleSystem); + + for (int battlerId = 0; battlerId < BattleSystem_GetMaxBattlers(data->battleSystem); battlerId++) { + OpponentData *opponentData = BattleSystem_GetOpponentData(data->battleSystem, battlerId); + if (opponentData->managedSprite) { + Sprite_DeleteAndFreeResources(opponentData->managedSprite); + opponentData->managedSprite = NULL; + } + } + + ov12_02237B6C(data->battleSystem); + ov12_0223BBF0(data->battleSystem, 1); + } + break; + case STATE_GET_POKEMON_WAIT_FOR_NAMING_SCREEN: + if (OverlayManager_Run(data->unk50[0])) { + NamingScreenArgs *namingScreenArgs = data->unk50[1]; + Pokemon *mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); + if (!namingScreenArgs->noInput) { + SetMonData(mon, MON_DATA_NICKNAME_STRING_AND_FLAG, namingScreenArgs->nameInputString); + BattleSystem_GameStatIncrement(data->battleSystem, 50); + } + NamingScreen_DeleteArgs(namingScreenArgs); + OverlayManager_Delete(data->unk50[0]); + ov12_0223BBF0(data->battleSystem, 2); + data->state = STATE_GET_POKEMON_STORE_NEW_MON_AFTER_NAMING_SCREEN; + } + break; + case STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN: + case 23: // Something other than just the Bug Contest is going on here, since we can arrive in state 22 as well. + case STATE_GET_POKEMON_STORE_NEW_MON_AFTER_NAMING_SCREEN: + if (!PaletteData_GetSelectedBuffersBitmask(paletteData)) { + Party *party = BattleSystem_GetParty(data->battleSystem, BATTLER_PLAYER); + Pokemon *mon = BattleSystem_GetPartyMon(data->battleSystem, battlerId, data->ctx->selectedMonIndex[battlerId]); + BattleSystem_SetPokedexCaught(data->battleSystem, battlerId); + ov12_022567D4(data->battleSystem, data->ctx, mon); + ov12_0223B870(data->battleSystem, mon); + BattleController_EmitIncrementGameStat(data->battleSystem, BATTLER_PLAYER, 0, GAME_STAT_CAUGHT_MON); + if (BattleSystem_GetBattleType(data->battleSystem) & BATTLE_TYPE_BUG_CONTEST) { + if (data->state == 23) { + ov18_021F89D0(data->unk50[0]); + ObjCharTransfer_PushTaskManager(data->unk50[1]); + ov12_02237D00(data->battleSystem); + } + CopyPokemonToPokemon(mon, BattleSystem_GetBugContestCaughtMon(data->battleSystem)); + if (data->state == STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN) { + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + } + data->state = STATE_GET_POKEMON_DONE_CAUGHT; + break; + } + if (Party_AddMon(party, mon) == TRUE) { + if (data->state == STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN) { + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + } + data->state = STATE_GET_POKEMON_DONE_CAUGHT; + break; + } + PCStorage *pcStorage = BattleSystem_GetPcStorage(data->battleSystem); + int activeBox = PCStorage_GetActiveBox(pcStorage); + int emptyBox = PCStorage_FindFirstBoxWithEmptySlot(pcStorage); + PCStorage_SetActiveBox(pcStorage, emptyBox); + + for (s32 moveSlot = 0; moveSlot < 4; moveSlot++) { + u32 maxPP = GetMonData(mon, MON_DATA_MOVE1_MAX_PP + moveSlot, 0); + SetMonData(mon, MON_DATA_MOVE1_PP + moveSlot, &maxPP); + } + + if (Mon_UpdateGiratinaForm(mon) != -1) { + BattleSystem_SetPokedexCaught(data->battleSystem, battlerId); + } + PCStorage_PlaceMonInBoxFirstEmptySlot(pcStorage, emptyBox, Mon_GetBoxMon(mon)); + if (data->state == STATE_GET_POKEMON_STORE_NEW_MON_NO_NAMING_SCREEN) { + BattleMessage msg; + if (activeBox == emptyBox) { + msg.id = ov12_0223BB1C(data->battleSystem) + 0x496; // {0} was transferred to {1} in someone’s PC! + msg.tag = TAG_NICKNAME_BOX | 0x80; + msg.param[0] = battlerId; + msg.param[1] = activeBox; + } else { + msg.id = ov12_0223BB1C(data->battleSystem) + 0x498; // {1} in someone’s PC is full. {0} was transferred to {2} instead! + msg.tag = TAG_NICKNAME_BOX_BOX | 0x80; + msg.param[0] = battlerId; + msg.param[1] = activeBox; + msg.param[2] = emptyBox; + } + data->printerId= BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = 25; + break; + } + data->state = STATE_GET_POKEMON_DONE_CAUGHT; + } + break; + case 25: + if (!TextPrinterCheckActive(data->printerId)) { + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 30 frames have passed... + sub_0201649C(BattleSystem_GetMessageIcon(data->battleSystem), 1); + PaletteData_BeginPaletteFade(paletteData, 0xF, 0xFFFF, 1, 0, 0x10, 0); + Pokepic_StartPaletteFadeAll(pokepicManager, 0, 0x10, 0, 0); + data->state = STATE_GET_POKEMON_DONE_CAUGHT; + } + } + break; + case STATE_GET_POKEMON_BALL_BLOCKED: + if (!ov07_02232F60(data->unk8, BALL_ANIM_DEFLECT)) { + ov07_02233ECC(data->unk8); + BattleMessage msg; + msg.id = 0x35B; // The Trainer blocked the Ball! + msg.tag = TAG_NONE; + data->printerId= BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = STATE_GET_POKEMON_NO_STEALING; + } + break; + case STATE_GET_POKEMON_NO_STEALING: + if (!TextPrinterCheckActive(data->printerId) && !--data->unk34[0]) { + BattleMessage msg; + msg.id = 0x35C; // Don’t be a thief! + msg.tag = TAG_NONE; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = STATE_GET_POKEMON_DONE_NO_STEALING; + } + break; + case STATE_GET_POKEMON_DONE_NO_STEALING: + if (!TextPrinterCheckActive(data->printerId)) { + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 30 frames have passed... + data->ctx->getterWork = 0; + Heap_Free(data); + SysTask_Destroy(sysTask); + } + } + default: + break; + case STATE_GET_POKEMON_BREAK_OUT: + BattleController_EmitPokemonSendOut(data->battleSystem, battlerId, data->unk2C, 1); // Breaking out hijacks the send out animation. + data->state = 30; + data->unk34[0] = 2; + break; + case 30: + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 2 frames have passed... + ov07_02233ECC(data->unk8); + data->state = STATE_GET_POKEMON_BREAK_OUT_MESSAGE; + } + break; + case STATE_GET_POKEMON_BREAK_OUT_MESSAGE: + if (Link_QueueNotEmpty(data->ctx)) { + BattleMessage msg; + msg.id = data->unk34[1] + 0x35F; // Break-out messages, including ball shake offsets. + msg.tag = TAG_NONE; + data->printerId = BattleSystem_PrintBattleMessage(data->battleSystem, msgData, &msg, BattleSystem_GetTextFrameDelay(data->battleSystem)); + data->unk34[0] = 30; + data->state = STATE_GET_POKEMON_DONE_BREAK_OUT; + } + break; + case STATE_GET_POKEMON_DONE_BREAK_OUT: + if (!TextPrinterCheckActive(data->printerId)) { + data->unk34[0]--; + if (data->unk34[0] == 0) { // After 30 frames have passed... + data->ctx->getterWork = 0; + Heap_Free(data); + SysTask_Destroy(sysTask); + } + } + break; + case STATE_GET_POKEMON_DONE_CAUGHT: + if (PaletteData_GetSelectedBuffersBitmask(paletteData) == 0) { + if (data->unk34[3]) { + ov07_02233ECC(data->unk8); + PokepicManager_DeleteAllPics(pokepicManager); + } + data->battleSystem->battleOutcomeFlag = BATTLE_OUTCOME_MON_CAUGHT; + data->ctx->getterWork = 0; + Heap_Free(data); + SysTask_Destroy(sysTask); + } + break; + } } \ No newline at end of file diff --git a/src/battle/battle_system.c b/src/battle/battle_system.c index f2d8382ad..7b670fb67 100644 --- a/src/battle/battle_system.c +++ b/src/battle/battle_system.c @@ -99,8 +99,8 @@ Pokemon *BattleSystem_GetPartyMon(BattleSystem *battleSystem, int battlerId, int } } -u32 *ov12_0223A8D4(BattleSystem *battleSystem) { - return battleSystem->unk88; +PokepicManager *ov12_0223A8D4(BattleSystem *battleSystem) { + return battleSystem->pokepicManager; } u32 *ov12_0223A8DC(BattleSystem *battleSystem) {