diff options
-rw-r--r-- | asm/pokemon_special_anim.s | 1264 | ||||
-rw-r--r-- | data/pokemon_special_anim.s | 126 | ||||
-rw-r--r-- | include/pokemon_special_anim_internal.h | 11 | ||||
-rw-r--r-- | include/strings.h | 6 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/pokemon_special_anim.c | 4 | ||||
-rw-r--r-- | src/pokemon_special_anim_scene.c | 700 |
7 files changed, 706 insertions, 1406 deletions
diff --git a/asm/pokemon_special_anim.s b/asm/pokemon_special_anim.s index 49fff6ca5..29241bf2b 100644 --- a/asm/pokemon_special_anim.s +++ b/asm/pokemon_special_anim.s @@ -5,1270 +5,6 @@ .text - thumb_func_start sub_811D6EC -sub_811D6EC: @ 811D6EC - push {lr} - bl sub_811D0A8 - movs r1, 0 - strh r1, [r0] - pop {r0} - bx r0 - thumb_func_end sub_811D6EC - - thumb_func_start sub_811D6FC -sub_811D6FC: @ 811D6FC - push {r4,lr} - bl sub_811D0A8 - adds r4, r0, 0 - ldrh r0, [r4] - cmp r0, 0 - beq _0811D710 - cmp r0, 0x1 - beq _0811D722 - b _0811D72C -_0811D710: - bl sub_811E10C - movs r0, 0x1D - bl PlaySE - ldrh r0, [r4] - adds r0, 0x1 - strh r0, [r4] - b _0811D72C -_0811D722: - bl sub_811E138 - lsls r0, 24 - lsrs r0, 24 - b _0811D72E -_0811D72C: - movs r0, 0x1 -_0811D72E: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_811D6FC - - thumb_func_start sub_811D734 -sub_811D734: @ 811D734 - push {lr} - sub sp, 0x8 - movs r0, 0x2 - str r0, [sp] - movs r0, 0 - str r0, [sp, 0x4] - movs r0, 0x78 - movs r1, 0x38 - movs r2, 0x4 - movs r3, 0x4 - bl sub_811E5B8 - add sp, 0x8 - pop {r0} - bx r0 - thumb_func_end sub_811D734 - - thumb_func_start sub_811D754 -sub_811D754: @ 811D754 - push {lr} - bl sub_811E680 - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_811D754 - - thumb_func_start sub_811D764 -sub_811D764: @ 811D764 - push {r4,r5,lr} - sub sp, 0x8 - adds r4, r0, 0 - adds r5, r1, 0 - movs r0, 0x1 - movs r1, 0x1 - movs r2, 0xE - bl DrawTextBorderOuter - movs r0, 0x2 - str r0, [sp] - movs r0, 0x3 - str r0, [sp, 0x4] - movs r0, 0x1 - adds r1, r4, 0 - adds r2, r5, 0 - movs r3, 0x1 - bl DrawLevelUpWindowPg1 - movs r0, 0x1 - bl PutWindowTilemap - movs r0, 0x1 - movs r1, 0x3 - bl CopyWindowToVram - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_811D764 - - thumb_func_start sub_811D7A0 -sub_811D7A0: @ 811D7A0 - push {lr} - sub sp, 0x4 - adds r1, r0, 0 - movs r0, 0x3 - str r0, [sp] - movs r0, 0x1 - movs r2, 0x1 - movs r3, 0x2 - bl DrawLevelUpWindowPg2 - movs r0, 0x1 - movs r1, 0x2 - bl CopyWindowToVram - add sp, 0x4 - pop {r0} - bx r0 - thumb_func_end sub_811D7A0 - - thumb_func_start sub_811D7C4 -sub_811D7C4: @ 811D7C4 - push {lr} - bl IsDma3ManagerBusyWithBgCopy - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_811D7C4 - - thumb_func_start sub_811D7D4 -sub_811D7D4: @ 811D7D4 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - ldr r1, _0811D80C @ =gUnknown_845973C - movs r0, 0x3 - movs r2, 0 - movs r3, 0 - bl CopyToBgTilemapBuffer - ldr r1, _0811D810 @ =gUnknown_845967C - movs r0, 0 - str r0, [sp] - movs r0, 0x3 - movs r2, 0 - movs r3, 0 - bl DecompressAndCopyTileDataToVram - cmp r4, 0x4 - beq _0811D818 - ldr r0, _0811D814 @ =gUnknown_845963C - movs r1, 0 - movs r2, 0x20 - bl LoadPalette - b _0811D822 - .align 2, 0 -_0811D80C: .4byte gUnknown_845973C -_0811D810: .4byte gUnknown_845967C -_0811D814: .4byte gUnknown_845963C -_0811D818: - ldr r0, _0811D82C @ =gUnknown_845965C - movs r1, 0 - movs r2, 0x20 - bl LoadPalette -_0811D822: - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0811D82C: .4byte gUnknown_845965C - thumb_func_end sub_811D7D4 - - thumb_func_start sub_811D830 -sub_811D830: @ 811D830 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] - bl sub_811D0A8 - adds r5, r0, 0 - bl sub_811D094 - mov r8, r0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r7, r0, 16 - mov r0, r8 - movs r1, 0 - bl GetMonData - mov r10, r0 - adds r0, r7, 0 - mov r1, r10 - movs r2, 0x2 - bl sub_812EA78 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0xFF - beq _0811D87E - movs r0, 0x48 - strh r0, [r5, 0x6] - adds r0, r1, 0 - adds r0, 0x30 - b _0811D884 -_0811D87E: - movs r0, 0x48 - strh r0, [r5, 0x6] - movs r0, 0x60 -_0811D884: - strh r0, [r5, 0x8] - movs r4, 0x80 - lsls r4, 6 - adds r0, r4, 0 - bl Alloc - adds r6, r0, 0 - adds r0, r4, 0 - bl Alloc - mov r9, r0 - movs r0, 0x80 - lsls r0, 1 - bl Alloc - adds r4, r0, 0 - cmp r6, 0 - beq _0811D920 - mov r0, r9 - cmp r0, 0 - beq _0811D916 - cmp r4, 0 - beq _0811D916 - lsls r0, r7, 3 - ldr r1, _0811D900 @ =gMonFrontPicTable - adds r0, r1 - adds r1, r6, 0 - adds r2, r7, 0 - mov r3, r10 - bl HandleLoadSpecialPokePic - mov r0, r8 - bl GetMonFrontSpritePal - adds r1, r4, 0 - bl LZ77UnCompWram - adds r0, r6, 0 - adds r1, r4, 0 - bl sub_811DC14 - ldr r0, _0811D904 @ =gUnknown_8459A30 - movs r1, 0x6 - ldrsh r2, [r5, r1] - movs r1, 0x78 - movs r3, 0x4 - bl CreateSprite - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _0811D90C - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _0811D908 @ =gSprites - adds r0, r1 - str r0, [r5, 0xC] - ldr r1, [sp] - bl sub_811DB14 - b _0811D910 - .align 2, 0 -_0811D900: .4byte gMonFrontPicTable -_0811D904: .4byte gUnknown_8459A30 -_0811D908: .4byte gSprites -_0811D90C: - movs r0, 0 - str r0, [r5, 0xC] -_0811D910: - mov r0, sp - ldrb r0, [r0] - strb r0, [r5, 0xA] -_0811D916: - cmp r6, 0 - beq _0811D920 - adds r0, r6, 0 - bl Free -_0811D920: - mov r1, r9 - cmp r1, 0 - beq _0811D92C - mov r0, r9 - bl Free -_0811D92C: - cmp r4, 0 - beq _0811D936 - adds r0, r4, 0 - bl Free -_0811D936: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_811D830 - - thumb_func_start sub_811D948 -sub_811D948: @ 811D948 - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - bl sub_811D0A8 - adds r5, r0, 0 - ldrb r0, [r5, 0xA] - cmp r6, r0 - beq _0811D99C - ldr r0, _0811D990 @ =sub_811D9BC - movs r1, 0x4 - bl CreateTask - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r2, [r5, 0xC] - adds r0, r4, 0 - movs r1, 0x6 - bl SetWordTaskArg - ldr r1, _0811D994 @ =gTasks - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - adds r1, r0, r1 - ldrb r0, [r5, 0xA] - strh r0, [r1, 0xA] - strh r6, [r1, 0xC] - movs r0, 0x6 - strh r0, [r1, 0x12] - ldrb r5, [r5, 0xA] - cmp r6, r5 - bls _0811D998 - movs r0, 0x1 - b _0811D99A - .align 2, 0 -_0811D990: .4byte sub_811D9BC -_0811D994: .4byte gTasks -_0811D998: - ldr r0, _0811D9A4 @ =0x0000ffff -_0811D99A: - strh r0, [r1, 0xE] -_0811D99C: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0811D9A4: .4byte 0x0000ffff - thumb_func_end sub_811D948 - - thumb_func_start sub_811D9A8 -sub_811D9A8: @ 811D9A8 - push {lr} - ldr r0, _0811D9B8 @ =sub_811D9BC - bl FuncIsActiveTask - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - .align 2, 0 -_0811D9B8: .4byte sub_811D9BC - thumb_func_end sub_811D9A8 - - thumb_func_start sub_811D9BC -sub_811D9BC: @ 811D9BC - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r6, r0, 24 - mov r8, r6 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 3 - ldr r1, _0811D9F0 @ =gTasks+0x8 - adds r4, r0, r1 - adds r0, r6, 0 - movs r1, 0x6 - bl GetWordTaskArg - adds r5, r0, 0 - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0x1 - beq _0811DA26 - cmp r0, 0x1 - bgt _0811D9F4 - cmp r0, 0 - beq _0811D9FA - b _0811DA90 - .align 2, 0 -_0811D9F0: .4byte gTasks+0x8 -_0811D9F4: - cmp r0, 0x2 - beq _0811DA7A - b _0811DA90 -_0811D9FA: - ldrb r1, [r4, 0x2] - adds r0, r5, 0 - bl sub_811DA9C - movs r2, 0x10 - ldrsh r0, [r4, r2] - cmp r0, 0 - beq _0811DA18 - adds r0, r6, 0 - movs r1, 0x9 - bl GetWordTaskArg - ldrb r1, [r4, 0x2] - bl sub_811DA9C -_0811DA18: - ldrh r0, [r4, 0x6] - ldrh r1, [r4, 0x2] - adds r0, r1 - strh r0, [r4, 0x2] - ldrh r0, [r4] - adds r0, 0x1 - b _0811DA8E -_0811DA26: - adds r0, r5, 0 - bl sub_811DAAC - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0 - bne _0811DA90 - movs r0, 0x6D - bl PlaySE - ldrb r1, [r4, 0x2] - adds r0, r5, 0 - bl sub_811DB14 - movs r2, 0x10 - ldrsh r0, [r4, r2] - cmp r0, 0 - beq _0811DA58 - adds r0, r6, 0 - movs r1, 0x9 - bl GetWordTaskArg - ldrb r1, [r4, 0x2] - bl sub_811DB48 -_0811DA58: - movs r0, 0x2 - ldrsh r1, [r4, r0] - movs r2, 0x4 - ldrsh r0, [r4, r2] - cmp r1, r0 - bne _0811DA74 - bl sub_811D0A8 - ldrh r1, [r4, 0x4] - strb r1, [r0, 0xA] - mov r0, r8 - bl DestroyTask - b _0811DA90 -_0811DA74: - strh r7, [r4, 0x8] - movs r0, 0x2 - b _0811DA8E -_0811DA7A: - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - lsls r0, 16 - asrs r0, 16 - movs r2, 0xA - ldrsh r1, [r4, r2] - cmp r0, r1 - ble _0811DA90 - movs r0, 0 -_0811DA8E: - strh r0, [r4] -_0811DA90: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_811D9BC - - thumb_func_start sub_811DA9C -sub_811DA9C: @ 811DA9C - lsls r1, 24 - lsrs r1, 24 - movs r2, 0 - strh r2, [r0, 0x2E] - strh r2, [r0, 0x30] - strh r1, [r0, 0x32] - bx lr - thumb_func_end sub_811DA9C - - thumb_func_start sub_811DAAC -sub_811DAAC: @ 811DAAC - ldr r1, [r0, 0x1C] - ldr r0, _0811DABC @ =SpriteCallbackDummy - eors r1, r0 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - bx lr - .align 2, 0 -_0811DABC: .4byte SpriteCallbackDummy - thumb_func_end sub_811DAAC - - thumb_func_start sub_811DAC0 -sub_811DAC0: @ 811DAC0 - lsls r1, 24 - lsls r0, 16 - asrs r0, 16 - ldr r2, _0811DAD8 @ =gUnknown_84599AA - lsrs r1, 23 - adds r1, r2 - ldrh r1, [r1] - muls r0, r1 - lsls r0, 8 - asrs r0, 16 - bx lr - .align 2, 0 -_0811DAD8: .4byte gUnknown_84599AA - thumb_func_end sub_811DAC0 - - thumb_func_start sub_811DADC -sub_811DADC: @ 811DADC - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - bl sub_811D0A8 - ldrh r1, [r0, 0x8] - ldrh r2, [r0, 0x6] - subs r1, r2 - lsls r1, 16 - asrs r1, 8 - cmp r1, 0 - bge _0811DAF6 - adds r1, 0xFF -_0811DAF6: - asrs r1, 8 - ldr r3, _0811DB10 @ =0xffffff00 - adds r0, r4, r3 - muls r0, r1 - lsls r0, 8 - asrs r0, 16 - adds r0, r2 - lsls r0, 16 - lsrs r0, 16 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0811DB10: .4byte 0xffffff00 - thumb_func_end sub_811DADC - - thumb_func_start sub_811DB14 -sub_811DB14: @ 811DB14 - push {r4,r5,lr} - adds r5, r0, 0 - lsls r1, 24 - lsrs r4, r1, 24 - cmp r4, 0x3 - bls _0811DB22 - movs r4, 0x3 -_0811DB22: - bl sub_811D0A8 - adds r0, r5, 0 - adds r1, r4, 0 - bl StartSpriteAffineAnim - ldr r1, _0811DB44 @ =gUnknown_84599AA - lsls r0, r4, 1 - adds r0, r1 - ldrh r0, [r0] - bl sub_811DADC - strh r0, [r5, 0x22] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0811DB44: .4byte gUnknown_84599AA - thumb_func_end sub_811DB14 - - thumb_func_start sub_811DB48 -sub_811DB48: @ 811DB48 - push {r4,r5,lr} - adds r5, r0, 0 - lsls r4, r1, 24 - lsrs r4, 24 - adds r1, r4, 0 - bl sub_811DB14 - ldrh r0, [r5, 0x3A] - subs r0, 0x20 - lsls r0, 16 - asrs r0, 16 - adds r1, r4, 0 - bl sub_811DAC0 - strh r0, [r5, 0x24] - ldrh r0, [r5, 0x3C] - subs r0, 0x20 - lsls r0, 16 - asrs r0, 16 - adds r1, r4, 0 - bl sub_811DAC0 - strh r0, [r5, 0x26] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_811DB48 - - thumb_func_start sub_811DB7C -sub_811DB7C: @ 811DB7C - push {r4,lr} - lsls r1, 24 - lsrs r1, 24 - lsls r2, 24 - lsrs r2, 24 - lsls r3, 24 - lsrs r3, 24 - ldr r4, [r0, 0xC] - strh r1, [r4, 0x2E] - ldr r1, [r0, 0xC] - strh r2, [r1, 0x30] - ldr r1, [r0, 0xC] - strh r3, [r1, 0x32] - ldr r1, [r0, 0xC] - ldr r0, _0811DBA4 @ =sub_811DBBC - str r0, [r1, 0x1C] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0811DBA4: .4byte sub_811DBBC - thumb_func_end sub_811DB7C - - thumb_func_start sub_811DBA8 -sub_811DBA8: @ 811DBA8 - ldr r2, [r0, 0xC] - movs r1, 0 - strh r1, [r2, 0x24] - ldr r1, [r0, 0xC] - ldr r0, _0811DBB8 @ =SpriteCallbackDummy - str r0, [r1, 0x1C] - bx lr - .align 2, 0 -_0811DBB8: .4byte SpriteCallbackDummy - thumb_func_end sub_811DBA8 - - thumb_func_start sub_811DBBC -sub_811DBBC: @ 811DBBC - push {r4,lr} - adds r2, r0, 0 - ldrh r0, [r2, 0x3C] - adds r0, 0x1 - movs r3, 0 - strh r0, [r2, 0x3C] - lsls r0, 16 - asrs r0, 16 - movs r4, 0x2E - ldrsh r1, [r2, r4] - cmp r0, r1 - ble _0811DC0C - strh r3, [r2, 0x3C] - ldrh r0, [r2, 0x3A] - adds r0, 0x1 - strh r0, [r2, 0x3A] - movs r4, 0x30 - ldrsh r1, [r2, r4] - cmp r1, 0 - beq _0811DBF8 - lsls r0, 16 - asrs r0, 16 - cmp r0, r1 - blt _0811DBF8 - strh r3, [r2, 0x24] - ldr r0, _0811DBF4 @ =SpriteCallbackDummy - str r0, [r2, 0x1C] - b _0811DC0C - .align 2, 0 -_0811DBF4: .4byte SpriteCallbackDummy -_0811DBF8: - ldrh r1, [r2, 0x3A] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0811DC06 - ldrh r0, [r2, 0x32] - b _0811DC0A -_0811DC06: - ldrh r0, [r2, 0x32] - negs r0, r0 -_0811DC0A: - strh r0, [r2, 0x24] -_0811DC0C: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_811DBBC - - thumb_func_start sub_811DC14 -sub_811DC14: @ 811DC14 - push {r4,lr} - sub sp, 0x10 - str r0, [sp] - ldr r3, _0811DC4C @ =0xffff0000 - ldr r0, [sp, 0x4] - ands r0, r3 - movs r2, 0x80 - lsls r2, 4 - orrs r0, r2 - ldr r2, _0811DC50 @ =0x0000ffff - ands r0, r2 - str r0, [sp, 0x4] - str r1, [sp, 0x8] - add r4, sp, 0x8 - ldr r0, [r4, 0x4] - ands r0, r3 - str r0, [r4, 0x4] - mov r0, sp - bl LoadSpriteSheet - adds r0, r4, 0 - bl LoadSpritePalette - add sp, 0x10 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0811DC4C: .4byte 0xffff0000 -_0811DC50: .4byte 0x0000ffff - thumb_func_end sub_811DC14 - - thumb_func_start sub_811DC54 -sub_811DC54: @ 811DC54 - push {r4-r7,lr} - mov r7, r8 - push {r7} - mov r8, r2 - lsls r0, 16 - lsrs r7, r0, 16 - lsls r1, 24 - lsrs r6, r1, 24 - bl sub_811D0A8 - adds r5, r0, 0 - adds r0, r7, 0 - bl sub_811DD20 - adds r1, r0, 0 - str r1, [r5, 0x10] - cmp r1, 0 - beq _0811DCD2 - adds r0, r5, 0 - adds r2, r6, 0 - bl sub_811E06C - ldr r0, [r5, 0x10] - adds r1, r6, 0 - bl StartSpriteAffineAnim - ldr r1, [r5, 0x10] - adds r1, 0x3E - ldrb r0, [r1] - movs r2, 0x4 - orrs r0, r2 - strb r0, [r1] - ldr r0, _0811DCDC @ =sub_811DDA4 - movs r1, 0x2 - bl CreateTask - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r2, [r5, 0x10] - adds r0, r4, 0 - movs r1, 0x4 - bl SetWordTaskArg - ldr r0, _0811DCE0 @ =gTasks - lsls r5, r4, 2 - adds r5, r4 - lsls r5, 3 - adds r5, r0 - strh r6, [r5, 0xC] - ldr r1, _0811DCE4 @ =gUnknown_84599AA - lsls r0, r6, 1 - adds r0, r1 - ldrh r0, [r0] - bl sub_811DADC - strh r0, [r5, 0xE] - mov r0, r8 - strh r0, [r5, 0x14] - adds r0, r7, 0 - bl sub_811DCE8 - strh r0, [r5, 0x1A] -_0811DCD2: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0811DCDC: .4byte sub_811DDA4 -_0811DCE0: .4byte gTasks -_0811DCE4: .4byte gUnknown_84599AA - thumb_func_end sub_811DC54 - - thumb_func_start sub_811DCE8 -sub_811DCE8: @ 811DCE8 - ldr r0, _0811DCEC @ =0x00007fff - bx lr - .align 2, 0 -_0811DCEC: .4byte 0x00007fff - thumb_func_end sub_811DCE8 - - thumb_func_start sub_811DCF0 -sub_811DCF0: @ 811DCF0 - push {r4,r5,lr} - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - bl sub_811D0A8 - adds r5, r0, 0 - adds r0, r4, 0 - bl sub_811DD20 - str r0, [r5, 0x10] - cmp r0, 0 - beq _0811DD1A - movs r1, 0x3 - bl StartSpriteAffineAnim - ldr r1, [r5, 0x10] - adds r0, r5, 0 - movs r2, 0x3 - bl sub_811E06C -_0811DD1A: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_811DCF0 - - thumb_func_start sub_811DD20 -sub_811DD20: @ 811DD20 - push {r4,lr} - adds r2, r0, 0 - lsls r2, 16 - lsrs r2, 16 - movs r0, 0x1 - movs r1, 0x1 - bl AddItemIconObject - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x40 - beq _0811DD88 - ldr r3, _0811DD7C @ =gSprites - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - adds r4, r2, r3 - ldrb r0, [r4, 0x1] - movs r1, 0x3 - orrs r0, r1 - strb r0, [r4, 0x1] - ldrb r1, [r4, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r1 - movs r1, 0x4 - orrs r0, r1 - strb r0, [r4, 0x5] - adds r1, r4, 0 - adds r1, 0x43 - movs r0, 0x1 - strb r0, [r1] - adds r0, r3, 0 - adds r0, 0x10 - adds r0, r2, r0 - ldr r1, _0811DD80 @ =gUnknown_8459A20 - str r1, [r0] - adds r3, 0x1C - adds r2, r3 - ldr r0, _0811DD84 @ =SpriteCallbackDummy - str r0, [r2] - adds r0, r4, 0 - bl InitSpriteAffineAnim - adds r0, r4, 0 - b _0811DD8A - .align 2, 0 -_0811DD7C: .4byte gSprites -_0811DD80: .4byte gUnknown_8459A20 -_0811DD84: .4byte SpriteCallbackDummy -_0811DD88: - movs r0, 0 -_0811DD8A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_811DD20 - - thumb_func_start sub_811DD90 -sub_811DD90: @ 811DD90 - push {lr} - ldr r0, _0811DDA0 @ =sub_811DDA4 - bl FuncIsActiveTask - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - .align 2, 0 -_0811DDA0: .4byte sub_811DDA4 - thumb_func_end sub_811DD90 - - thumb_func_start sub_811DDA4 -sub_811DDA4: @ 811DDA4 - push {r4-r6,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r6, r0, 24 - lsls r0, r6, 2 - adds r0, r6 - lsls r0, 3 - ldr r1, _0811DDD4 @ =gTasks+0x8 - adds r4, r0, r1 - adds r0, r6, 0 - movs r1, 0x4 - bl GetWordTaskArg - adds r5, r0, 0 - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0x4 - bls _0811DDCA - b _0811DF0C -_0811DDCA: - lsls r0, 2 - ldr r1, _0811DDD8 @ =_0811DDDC - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0811DDD4: .4byte gTasks+0x8 -_0811DDD8: .4byte _0811DDDC - .align 2, 0 -_0811DDDC: - .4byte _0811DDF0 - .4byte _0811DE2A - .4byte _0811DE7C - .4byte _0811DEA0 - .4byte _0811DEF0 -_0811DDF0: - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x14 - bgt _0811DE00 - b _0811DF0C -_0811DE00: - movs r0, 0 - strh r0, [r4, 0x2] - movs r0, 0xBB - bl PlaySE - adds r2, r5, 0 - adds r2, 0x3E - ldrb r1, [r2] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - strb r0, [r2] - movs r2, 0x16 - ldrsh r0, [r4, r2] - cmp r0, 0 - bne _0811DE24 - bl sub_811E588 -_0811DE24: - movs r0, 0x1 - strh r0, [r4] - b _0811DF0C -_0811DE2A: - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x1E - ble _0811DF0C - movs r0, 0 - strh r0, [r4, 0x2] - ldr r0, _0811DE78 @ =gUnknown_8459AA8 - str r0, [r5, 0x10] - ldrb r1, [r4, 0x4] - adds r0, r5, 0 - bl StartSpriteAffineAnim - movs r0, 0x1 - bl IndexOfSpritePaletteTag - lsls r0, 24 - lsrs r0, 24 - movs r2, 0x80 - lsls r2, 9 - lsls r2, r0 - movs r1, 0x2 - negs r1, r1 - ldrh r0, [r4, 0x12] - str r0, [sp] - adds r0, r2, 0 - movs r2, 0 - movs r3, 0xC - bl BeginNormalPaletteFade - movs r0, 0x2 - strh r0, [r4] - movs r0, 0xDA - bl PlaySE - b _0811DF0C - .align 2, 0 -_0811DE78: .4byte gUnknown_8459AA8 -_0811DE7C: - adds r0, r5, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0811DF0C - adds r2, r5, 0 - adds r2, 0x3E - ldrb r0, [r2] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2] - movs r0, 0x14 - strh r0, [r4, 0x14] - movs r0, 0x3 - strh r0, [r4] - b _0811DF0C -_0811DEA0: - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - lsls r0, 16 - asrs r0, 16 - movs r2, 0x14 - ldrsh r1, [r4, r2] - cmp r0, r1 - ble _0811DF0C - movs r0, 0 - strh r0, [r4, 0x2] - movs r1, 0x16 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0811DEC8 - adds r0, r6, 0 - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_811DF14 -_0811DEC8: - movs r2, 0xE - ldrsh r0, [r4, r2] - cmp r0, 0 - bne _0811DED6 - movs r0, 0xD2 - bl PlaySE -_0811DED6: - ldrh r0, [r4, 0xE] - adds r0, 0x1 - strh r0, [r4, 0xE] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x2 - ble _0811DEEA - movs r0, 0x4 - strh r0, [r4] - b _0811DF0C -_0811DEEA: - movs r0, 0x8 - strh r0, [r4, 0x14] - b _0811DF0C -_0811DEF0: - movs r1, 0x10 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0811DF0C - movs r2, 0xC - ldrsh r0, [r4, r2] - cmp r0, 0 - beq _0811DF06 - adds r0, r5, 0 - bl DestroySprite -_0811DF06: - adds r0, r6, 0 - bl DestroyTask -_0811DF0C: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_811DDA4 - - thumb_func_start sub_811DF14 -sub_811DF14: @ 811DF14 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r7, r1, 0 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - movs r0, 0x20 - ldrsh r5, [r2, r0] - movs r1, 0x24 - ldrsh r0, [r2, r1] - adds r5, r0 - subs r5, 0x4 - movs r0, 0x22 - ldrsh r4, [r2, r0] - movs r1, 0x26 - ldrsh r0, [r2, r1] - adds r4, r0 - subs r4, 0x4 - movs r0, 0x5 - bl IndexOfSpritePaletteTag - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x80 - lsls r1, 9 - lsls r1, r0 - ldrh r2, [r7, 0x12] - adds r0, r1, 0 - movs r1, 0x10 - bl BlendPalettes - movs r6, 0 - ldr r2, _0811DFB4 @ =gSprites - mov r8, r2 - movs r0, 0x1C - add r0, r8 - mov r10, r0 - lsls r5, 16 - lsls r4, 16 -_0811DF68: - ldr r0, _0811DFB8 @ =gUnknown_8459B30 - asrs r1, r5, 16 - asrs r2, r4, 16 - movs r3, 0 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x40 - beq _0811DFA0 - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - mov r2, r8 - adds r0, r1, r2 - lsls r2, r6, 4 - strh r2, [r0, 0x30] - mov r2, r9 - strh r2, [r0, 0x3C] - add r1, r10 - ldr r2, _0811DFBC @ =sub_811DFC0 - str r2, [r1] - movs r1, 0x1 - bl StartSpriteAnim - ldrh r0, [r7, 0x10] - adds r0, 0x1 - strh r0, [r7, 0x10] -_0811DFA0: - adds r6, 0x1 - cmp r6, 0xE - ble _0811DF68 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0811DFB4: .4byte gSprites -_0811DFB8: .4byte gUnknown_8459B30 -_0811DFBC: .4byte sub_811DFC0 - thumb_func_end sub_811DF14 - - thumb_func_start sub_811DFC0 -sub_811DFC0: @ 811DFC0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r3, r4, 0 - adds r3, 0x2E - ldrh r1, [r4, 0x2E] - movs r2, 0x2E - ldrsh r0, [r4, r2] - cmp r0, 0xF - bgt _0811E01C - adds r0, r1, 0x1 - strh r0, [r4, 0x2E] - ldrh r0, [r3, 0x2] - adds r0, 0x7 - movs r1, 0xFF - ands r0, r1 - strh r0, [r3, 0x2] - ldrh r0, [r3, 0x4] - adds r0, 0x4 - strh r0, [r3, 0x4] - movs r5, 0x4 - ldrsh r1, [r3, r5] - ldr r2, _0811E018 @ =gSineTable - movs r5, 0x2 - ldrsh r0, [r3, r5] - adds r0, 0x40 - lsls r0, 1 - adds r0, r2 - movs r5, 0 - ldrsh r0, [r0, r5] - muls r0, r1 - asrs r0, 8 - strh r0, [r4, 0x24] - movs r0, 0x4 - ldrsh r1, [r3, r0] - movs r5, 0x2 - ldrsh r0, [r3, r5] - lsls r0, 1 - adds r0, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - muls r0, r1 - asrs r0, 8 - strh r0, [r4, 0x26] - b _0811E036 - .align 2, 0 -_0811E018: .4byte gSineTable -_0811E01C: - ldr r2, _0811E03C @ =gTasks - movs r5, 0xE - ldrsh r1, [r3, r5] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - adds r0, r2 - ldrh r1, [r0, 0x18] - subs r1, 0x1 - strh r1, [r0, 0x18] - adds r0, r4, 0 - bl DestroySprite -_0811E036: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0811E03C: .4byte gTasks - thumb_func_end sub_811DFC0 - - thumb_func_start sub_811E040 -sub_811E040: @ 811E040 - push {lr} - ldr r0, _0811E064 @ =sub_811DDA4 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0xFF - beq _0811E05E - ldr r0, _0811E068 @ =gTasks - lsls r1, r2, 2 - adds r1, r2 - lsls r1, 3 - adds r1, r0 - movs r0, 0x1 - strh r0, [r1, 0x1E] -_0811E05E: - pop {r0} - bx r0 - .align 2, 0 -_0811E064: .4byte sub_811DDA4 -_0811E068: .4byte gTasks - thumb_func_end sub_811E040 - thumb_func_start sub_811E06C sub_811E06C: @ 811E06C push {r4-r7,lr} diff --git a/data/pokemon_special_anim.s b/data/pokemon_special_anim.s index b944a4aed..7f56c11ad 100644 --- a/data/pokemon_special_anim.s +++ b/data/pokemon_special_anim.s @@ -5,129 +5,3 @@ .include "constants/constants.inc" .section .rodata .align 2 - -gUnknown_84599A4:: @ 84599A4 - .2byte 0x0000, 0x0010 - -gUnknown_84599A8:: @ 84599A8 unref, data16? - .2byte 0x0044 - -gUnknown_84599AA:: @ 84599AA data16 - .2byte 0x0100, 0x0155, 0x01aa, 0x0200 - -gUnknown_84599B2:: @ 84599B2 data8 - .byte 0xf8, 0xf8, 0x06, 0xf3, 0x08, 0xf8 - -gUnknown_84599B8:: @ 84599B8 sprite_sheet - obj_tiles gUnknown_84598C4, 0x0080, 2 - -gUnknown_84599C0:: @ 84599C0 sprite_palette - obj_pal gUnknown_84598A4, 2 - -gUnknown_84599C8:: @ 84599C8 sprite_sheet - obj_tiles gUnknown_8459960, 0x0060, 5 - -gUnknown_84599D0:: @ 84599D0 sprite_palette - obj_pal gUnknown_8459940, 5 - -gUnknown_84599D8:: @ 84599D8 - .4byte 0xc0000300, 0x00000400 - -gUnknown_84599E0:: @ 84599E0 - obj_rot_scal_anim_frame 256, 256, 0, 0 - obj_rot_scal_anim_end - -gUnknown_84599F0:: @ 84599F0 - obj_rot_scal_anim_frame 341, 341, 0, 0 - obj_rot_scal_anim_end - -gUnknown_8459A00:: @ 8459A00 - obj_rot_scal_anim_frame 426, 426, 0, 0 - obj_rot_scal_anim_end - -gUnknown_8459A10:: @ 8459A10 - obj_rot_scal_anim_frame 512, 512, 0, 0 - obj_rot_scal_anim_end - -gUnknown_8459A20:: @ 8459A20 dataptr - .4byte gUnknown_84599E0 - .4byte gUnknown_84599F0 - .4byte gUnknown_8459A00 - .4byte gUnknown_8459A10 - -gUnknown_8459A30:: @ 8459A30 spr_template - spr_template 0, 0, gUnknown_84599D8, gDummySpriteAnimTable, NULL, gUnknown_8459A20, SpriteCallbackDummy - -gUnknown_8459A48:: @ 8459A48 affine_anim_cmd? - obj_rot_scal_anim_frame 256, 256, 0, 0 - obj_rot_scal_anim_frame -28, -28, 0, 8 - obj_rot_scal_anim_end - -gUnknown_8459A60:: @ 459A60 - obj_rot_scal_anim_frame 341, 341, 0, 0 - obj_rot_scal_anim_frame -37, -37, 0, 8 - obj_rot_scal_anim_end - -gUnknown_8459A78:: @ 459A78 - obj_rot_scal_anim_frame 426, 426, 0, 0 - obj_rot_scal_anim_frame -47, -47, 0, 8 - obj_rot_scal_anim_end - -gUnknown_8459A90:: @ 459A90 - obj_rot_scal_anim_frame 512, 512, 0, 0 - obj_rot_scal_anim_frame -56, -56, 0, 8 - obj_rot_scal_anim_end - -gUnknown_8459AA8:: @ 8459AA8 dataptr - .4byte gUnknown_8459A48 - .4byte gUnknown_8459A60 - .4byte gUnknown_8459A78 - .4byte gUnknown_8459A90 - -gUnknown_8459AB8:: @ 8459AB8 - .4byte 0x00008400, 0x00000400 - -gUnknown_8459AC0:: @ 8459AC0 - obj_image_anim_frame 0x0000, 3 - obj_image_anim_end - -gUnknown_8459AC8:: @ 8459AC8 - .4byte gUnknown_8459AC0 - -gUnknown_8459ACC:: @ 8459ACC spr_template - spr_template 0, 0, gUnknown_8459AB8, gUnknown_8459AC8, NULL, gDummySpriteAffineAnimTable, sub_811E7B4 - -gUnknown_8459AE4:: @ 8459AE4 - .4byte 0x40000000, 0x00000400 - -gUnknown_8459AEC:: @ 8459AEC spr_template - spr_template 2, 2, gUnknown_8459AE4, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_811E300 - -gUnknown_8459B04:: @ 8459B04 - .4byte 0x00000000, 0x00000000 - -gUnknown_8459B0C:: @ 8459B0C - obj_image_anim_frame 0x0000, 16 - obj_image_anim_frame 0x0001, 8 - obj_image_anim_frame 0x0002, 4 - obj_image_anim_end - -gUnknown_8459B1C:: @ 8459B1C - obj_image_anim_frame 0x0001, 4 - obj_image_anim_frame 0x0000, 4 - obj_image_anim_end - -gUnknown_8459B28:: @ 8459B28 - .4byte gUnknown_8459B0C - .4byte gUnknown_8459B1C - -gUnknown_8459B30:: @ 8459B30 spr_template - spr_template 5, 5, gUnknown_8459B04, gUnknown_8459B28, NULL, gDummySpriteAffineAnimTable, sub_811E520 - -gUnknown_8459B48:: @ 8459B48 dataptr - .4byte gUnknown_841B2A9 - .4byte gUnknown_841B2B7 - .4byte gUnknown_841B2BE - .4byte gUnknown_841B2CC - .4byte gUnknown_841B2D4 - .4byte gUnknown_841B2C6 diff --git a/include/pokemon_special_anim_internal.h b/include/pokemon_special_anim_internal.h index 07acd3443..0777d492b 100644 --- a/include/pokemon_special_anim_internal.h +++ b/include/pokemon_special_anim_internal.h @@ -8,7 +8,10 @@ struct PokemonSpecialAnimScene u16 field_0000; u8 filler_0002[2]; u16 field_0004; - u8 filler_0006[0xA]; + u16 field_0006; + u16 field_0008; + u8 field_000a; + struct Sprite * field_000c; struct Sprite * field_0010; u8 field_0014[0x900]; u8 field_0914[BG_SCREEN_SIZE]; @@ -57,7 +60,7 @@ bool8 sub_811D280(void); void sub_811D29C(void); void sub_811D2A8(void); void sub_811D2D0(void); -void sub_811D2EC(u8 a0); +void sub_811D2EC(u8 messageId); void sub_811D4D4(void); bool8 sub_811D4EC(void); void sub_811D4FC(void); @@ -68,10 +71,10 @@ bool8 sub_811D5C0(void); void sub_811D6EC(void); bool8 sub_811D6FC(void); bool8 sub_811D754(void); -void sub_811D830(u8 a0); +void sub_811D830(u8 closeness); void sub_811D948(u8 closeness); bool8 sub_811D9A8(void); -void sub_811DC54(u16 itemId, u8 closeness, u8 a2); +void sub_811DC54(u16 itemId, u8 closeness, bool32 a2); void sub_811DCF0(u16 itemId); bool8 sub_811DD90(void); void sub_811E040(void); diff --git a/include/strings.h b/include/strings.h index 809a17d9d..3fd24516d 100644 --- a/include/strings.h +++ b/include/strings.h @@ -1454,5 +1454,11 @@ extern const u8 gUnknown_841B306[]; extern const u8 gUnknown_841B315[]; extern const u8 gUnknown_841B31B[]; extern const u8 gUnknown_841B329[]; +extern const u8 gUnknown_841B2A9[]; +extern const u8 gUnknown_841B2B7[]; +extern const u8 gUnknown_841B2BE[]; +extern const u8 gUnknown_841B2CC[]; +extern const u8 gUnknown_841B2D4[]; +extern const u8 gUnknown_841B2C6[]; #endif //GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index bd57e8664..40547541f 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -557,7 +557,6 @@ SECTIONS { src/union_room_message.o(.rodata); src/pokemon_special_anim.o(.rodata); src/pokemon_special_anim_scene.o(.rodata); - data/pokemon_special_anim.o(.rodata); src/party_menu.o(.rodata); src/union_room_chat.o(.rodata); src/union_room_chat_display.o(.rodata); diff --git a/src/pokemon_special_anim.c b/src/pokemon_special_anim.c index b743d65a3..5dcb9821d 100644 --- a/src/pokemon_special_anim.c +++ b/src/pokemon_special_anim.c @@ -208,7 +208,7 @@ void sub_811C834(u8 taskId) } break; case 6: - sub_811DC54(ptr->itemId, ptr->closeness, 1); + sub_811DC54(ptr->itemId, ptr->closeness, TRUE); ptr->state++; break; case 7: @@ -414,7 +414,7 @@ void sub_811CBE4(u8 taskId) ptr->state++; break; case 4: - sub_811DC54(ptr->itemId, ptr->closeness, 0); + sub_811DC54(ptr->itemId, ptr->closeness, FALSE); ptr->state++; break; case 5: diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c index 50d546415..7184b5198 100644 --- a/src/pokemon_special_anim_scene.c +++ b/src/pokemon_special_anim_scene.c @@ -1,23 +1,46 @@ #include "global.h" #include "gflib.h" +#include "data.h" +#include "decompress.h" #include "dynamic_placeholder_text_util.h" #include "item.h" +#include "item_menu_icons.h" #include "menu.h" #include "new_menu_helpers.h" #include "pokemon_special_anim_internal.h" #include "strings.h" #include "text_window.h" +#include "trig.h" #include "constants/songs.h" void sub_811D7D4(u16 animType); +void sub_811D9BC(u8 taskId); +void sub_811DA9C(struct Sprite * sprite, u8 closeness); +bool8 sub_811DAAC(struct Sprite * sprite); +void sub_811DB14(struct Sprite * sprite, u8 closeness); +void sub_811DB48(struct Sprite * sprite, u8 closeness); void sub_811DB7C(struct PokemonSpecialAnimScene * scene, u8 a1, u8 a2, u8 a3); void sub_811DBA8(struct PokemonSpecialAnimScene * scene); +void sub_811DBBC(struct Sprite * sprite); +void sub_811DC14(u16 *tilees, u16 *palette); +struct Sprite * sub_811DD20(u16 itemId); +u16 sub_811DCE8(u16 itemId); +void sub_811DDA4(u8 taskId); +void sub_811DF14(u8 taskId, s16 *data, struct Sprite * sprite); +void sub_811DFC0(struct Sprite * sprite); +void sub_811E06C(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness); +void sub_811E10C(void); +bool8 sub_811E138(void); void sub_811E194(u8 a0); void sub_811E204(struct PokemonSpecialAnimScene * scene); bool8 sub_811E2F4(void); +void sub_811E300(struct Sprite * sprite); void sub_811E348(struct PokemonSpecialAnimScene * scene); void sub_811E388(void); +void sub_811E520(struct Sprite * sprite); +void sub_811E588(void); bool32 sub_811E5A4(void); +void sub_811E7B4(struct Sprite * sprite); const u16 gUnknown_845963C[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845963C.gbapal"); const u16 gUnknown_845965C[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845965C.gbapal"); @@ -68,6 +91,238 @@ const u8 *const gUnknown_8459998[] = { gUnknown_841B2FF, // Poof! }; +const u16 sUnref_84599A4[] = { + 0, 16, 68 +}; + +const u16 gUnknown_84599AA[] = { + 0x100, + 0x155, + 0x1AA, + 0x200 +}; + +const s8 gUnknown_84599B2[] = { + -8, -8, 6, -13, 8, -8 +}; + +const struct CompressedSpriteSheet gUnknown_84599B8 = { + gUnknown_84598C4, + 0x80, + 2 +}; + +const struct SpritePalette gUnknown_84599C0 = { + gUnknown_84598A4, + 2 +}; + +const struct CompressedSpriteSheet gUnknown_84599C8 = { + gUnknown_8459960, + 0x60, + 5 +}; + +const struct SpritePalette gUnknown_84599D0 = { + gUnknown_8459940, + 5 +}; + +const struct OamData gUnknown_84599D8 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_DOUBLE, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0x000, + .priority = 1, + .paletteNum = 0 +}; + + +const union AffineAnimCmd gUnknown_84599E0[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_84599F0[] = { + AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_8459A00[] = { + AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_8459A10[] = { + AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gUnknown_8459A20[] = { + gUnknown_84599E0, + gUnknown_84599F0, + gUnknown_8459A00, + gUnknown_8459A10 +}; + +const struct SpriteTemplate gUnknown_8459A30 = { + .tileTag = 0, + .paletteTag = 0, + .oam = &gUnknown_84599D8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gUnknown_8459A20, + .callback = SpriteCallbackDummy +}; + +const union AffineAnimCmd gUnknown_8459A48[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(-28, -28, 0, 8), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_8459A60[] = { + AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), + AFFINEANIMCMD_FRAME(-37, -37, 0, 8), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_8459A78[] = { + AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), + AFFINEANIMCMD_FRAME(-47, -47, 0, 8), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gUnknown_8459A90[] = { + AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), + AFFINEANIMCMD_FRAME(-56, -56, 0, 8), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gUnknown_8459AA8[] = { + gUnknown_8459A48, + gUnknown_8459A60, + gUnknown_8459A78, + gUnknown_8459A90 +}; + +const struct OamData gUnknown_8459AB8 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_BLEND, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x16), + .tileNum = 0x000, + .priority = 1, + .paletteNum = 0 +}; + +const union AnimCmd gUnknown_8459AC0[] = { + ANIMCMD_FRAME(0, 3), + ANIMCMD_END +}; + +const union AnimCmd *const gUnknown_8459AC8[] = { + gUnknown_8459AC0 +}; + +const struct SpriteTemplate gUnknown_8459ACC = { + .tileTag = 0, + .paletteTag = 0, + .oam = &gUnknown_8459AB8, + .anims = gUnknown_8459AC8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_811E7B4 +}; + +const struct OamData gUnknown_8459AE4 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0x000, + .priority = 1, + .paletteNum = 0 +}; + +const struct SpriteTemplate gUnknown_8459AEC = { + .tileTag = 2, + .paletteTag = 2, + .oam = &gUnknown_8459AE4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_811E300 +}; + +const struct OamData gUnknown_8459B04 = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0 +}; + +const union AnimCmd gUnknown_8459B0C[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END +}; + +const union AnimCmd gUnknown_8459B1C[] = { + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gUnknown_8459B28[] = { + gUnknown_8459B0C, + gUnknown_8459B1C +}; + +const struct SpriteTemplate gUnknown_8459B30 = { + .tileTag = 5, + .paletteTag = 5, + .oam = &gUnknown_8459B04, + .anims = gUnknown_8459B28, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_811E520 +}; + +const u8 *const gUnknown_8459B48[] = { + gUnknown_841B2A9, + gUnknown_841B2B7, + gUnknown_841B2BE, + gUnknown_841B2CC, + gUnknown_841B2D4, + gUnknown_841B2C6 +}; + void sub_811D184(struct PokemonSpecialAnimScene * buffer, u16 animType) { FreeAllWindowBuffers(); @@ -126,18 +381,17 @@ void sub_811D2D0(void) CopyWindowToVram(0, 1); } -void sub_811D2EC(u8 a0) +void sub_811D2EC(u8 messageId) { - // a0 --> r5 - struct PokemonSpecialAnimScene * scene = sub_811D0A8(); // r4 - u16 itemId = sub_811D0B4(); // r7 - u16 strWidth = 0; // r8 - u8 textSpeed = GetTextSpeedSetting(); // r9 - struct Pokemon * pokemon = sub_811D094(); // r6 + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + u16 itemId = sub_811D0B4(); + u16 strWidth = 0; + u8 textSpeed = GetTextSpeedSetting(); + struct Pokemon * pokemon = sub_811D094(); u16 level; u8 *str; - switch (a0) + switch (messageId) { case 0: // Item was used on Mon str = StringCopy(scene->field_0014, ItemId_GetName(itemId)); @@ -167,7 +421,7 @@ void sub_811D2EC(u8 a0) strWidth += GetStringWidth(2, gUnknown_841B2ED, -1); // fallthrough case 2: // 1 - StringCopy(scene->field_0014, gUnknown_8459998[a0 - 2]); + StringCopy(scene->field_0014, gUnknown_8459998[messageId - 2]); textSpeed = 1; break; case 5: // Mon forgot move @@ -316,3 +570,431 @@ bool8 sub_811D5C0(void) } return TRUE; } + +void sub_811D6EC(void) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + scene->field_0000 = 0; +} + +bool8 sub_811D6FC(void) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + + switch (scene->field_0000) + { + case 0: + sub_811E10C(); + PlaySE(SE_MU_PACHI); + scene->field_0000++; + break; + case 1: + return sub_811E138(); + } + return TRUE; +} + +void sub_811D734(void) +{ + sub_811E5B8(120, 56, 4, 4, 2, 0); +} + +bool8 sub_811D754(void) +{ + return sub_811E680(); +} + +void sub_811D764(u16 *statsBefore, u16 *statsAfter) +{ + DrawTextBorderOuter(1, 0x001, 0xE); + DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + PutWindowTilemap(1); + CopyWindowToVram(1, 3); +} +void sub_811D7A0(u16 *currStats) +{ + DrawLevelUpWindowPg2(1, currStats, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + CopyWindowToVram(1, 2); +} + +bool8 sub_811D7C4(void) +{ + return IsDma3ManagerBusyWithBgCopy(); +} + +void sub_811D7D4(u16 animType) +{ + CopyToBgTilemapBuffer(3, gUnknown_845973C, 0, 0x000); + DecompressAndCopyTileDataToVram(3, gUnknown_845967C, 0, 0x000, 0); + if (animType != 4) + LoadPalette(gUnknown_845963C, 0x00, 0x20); + else + LoadPalette(gUnknown_845965C, 0x00, 0x20); +} + +void sub_811D830(u8 closeness) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + struct Pokemon * pokemon = sub_811D094(); + u16 species = GetMonData(pokemon, MON_DATA_SPECIES); + u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); + u8 r1 = sub_812EA78(species, personality, 2); + void * r6; + void * r9; + void * r4; + u8 spriteId; + + if (r1 != 0xFF) + { + scene->field_0006 = 0x48; + scene->field_0008 = r1 + 0x30; + } + else + { + scene->field_0006 = 0x48; + scene->field_0008 = 0x60; + } + + r6 = Alloc(0x2000); + r9 = Alloc(0x2000); + r4 = Alloc(0x100); + if (r6 != NULL && r9 != NULL && r4 != NULL) + { + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], r6, species, personality); + LZ77UnCompWram(GetMonFrontSpritePal(pokemon), r4); + sub_811DC14(r6, r4); + spriteId = CreateSprite(&gUnknown_8459A30, 120, scene->field_0006, 4); + if (spriteId != MAX_SPRITES) + { + scene->field_000c = &gSprites[spriteId]; + sub_811DB14(scene->field_000c, closeness); + } + else + scene->field_000c = NULL; + scene->field_000a = closeness; + } + if (r6 != NULL) Free(r6); + if (r9 != NULL) Free(r9); + if (r4 != NULL) Free(r4); +} + +void sub_811D948(u8 closeness) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + u8 taskId; + if (closeness != scene->field_000a) + { + taskId = CreateTask(sub_811D9BC, 4); + SetWordTaskArg(taskId, 6, (uintptr_t)scene->field_000c); + gTasks[taskId].data[1] = scene->field_000a; + gTasks[taskId].data[2] = closeness; + gTasks[taskId].data[5] = 6; + if (closeness > scene->field_000a) + gTasks[taskId].data[3] = 1; + else + gTasks[taskId].data[3] = -1; + } +} + +bool8 sub_811D9A8(void) +{ + return FuncIsActiveTask(sub_811D9BC); +} + +void sub_811D9BC(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + struct Sprite * sprite = (void *)GetWordTaskArg(taskId, 6); + switch (data[0]) + { + case 0: + sub_811DA9C(sprite, data[1]); + if (data[8]) + sub_811DA9C((void *)GetWordTaskArg(taskId, 9), data[1]); + data[1] += data[3]; + data[0]++; + break; + case 1: + if (!sub_811DAAC(sprite)) + { + PlaySE(SE_TB_KARA); + sub_811DB14(sprite, data[1]); + if (data[8]) + sub_811DB48((void *)GetWordTaskArg(taskId, 9), data[1]); + if (data[1] == data[2]) + { + sub_811D0A8()->field_000a = data[2]; + DestroyTask(taskId); + } + else + { + data[4] = 0; + data[0] = 2; + } + } + break; + case 2: + data[4]++; + if (data[4] > data[5]) + data[0] = 0; + break; + } +} + +void sub_811DA9C(struct Sprite * sprite, u8 closeness) +{ + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = closeness; +} + +bool8 sub_811DAAC(struct Sprite * sprite) +{ + return sprite->callback != SpriteCallbackDummy; +} + +s16 sub_811DAC0(s16 pos, u8 closeness) +{ + return (pos * gUnknown_84599AA[closeness]) >> 8; +} + +// FIXME: better math +u16 sub_811DADC(u16 pos) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + s32 v = ((((((scene->field_0008 - scene->field_0006) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16); + return v += scene->field_0006; +} + +void sub_811DB14(struct Sprite * sprite, u8 closeness) +{ + if (closeness > 3) + closeness = 3; + sub_811D0A8(); // return value not used + StartSpriteAffineAnim(sprite, closeness); + sprite->pos1.y = sub_811DADC(gUnknown_84599AA[closeness]); +} + +void sub_811DB48(struct Sprite * sprite, u8 closeness) +{ + sub_811DB14(sprite, closeness); + sprite->pos2.x = sub_811DAC0(sprite->data[6] - 32, closeness); + sprite->pos2.y = sub_811DAC0(sprite->data[7] - 32, closeness); +} + +void sub_811DB7C(struct PokemonSpecialAnimScene * scene, u8 a1, u8 a2, u8 a3) +{ + scene->field_000c->data[0] = a1; + scene->field_000c->data[1] = a2; + scene->field_000c->data[2] = a3; + scene->field_000c->callback = sub_811DBBC; +} + +void sub_811DBA8(struct PokemonSpecialAnimScene * scene) +{ + scene->field_000c->pos2.x = 0; + scene->field_000c->callback = SpriteCallbackDummy; +} + +void sub_811DBBC(struct Sprite * sprite) +{ + sprite->data[7]++; + if (sprite->data[7] > sprite->data[0]) + { + sprite->data[7] = 0; + sprite->data[6]++; + if (sprite->data[1] != 0 && sprite->data[6] >= sprite->data[1]) + { + sprite->pos2.x = 0; + sprite->callback = SpriteCallbackDummy; + } + else if (sprite->data[6] & 1) + sprite->pos2.x = sprite->data[2]; + else + sprite->pos2.x = -sprite->data[2]; + } +} + +void sub_811DC14(u16 *tiles, u16 *palette) +{ + struct SpriteSheet spriteSheet; + struct SpritePalette spritePalette; + + spriteSheet.data = tiles; + spriteSheet.size = 0x800; + spriteSheet.tag = 0; + spritePalette.data = palette; + spritePalette.tag = 0; + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); +} + +void sub_811DC54(u16 itemId, u8 closeness, bool32 a2) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + u8 taskId; + scene->field_0010 = sub_811DD20(itemId); + if (scene->field_0010 != NULL) + { + sub_811E06C(scene, scene->field_0010, closeness); + StartSpriteAffineAnim(scene->field_0010, closeness); + scene->field_0010->invisible = TRUE; + taskId = CreateTask(sub_811DDA4, 2); + SetWordTaskArg(taskId, 4, (uintptr_t)scene->field_0010); + gTasks[taskId].data[2] = closeness; + gTasks[taskId].data[3] = sub_811DADC(gUnknown_84599AA[closeness]); + gTasks[taskId].data[6] = a2; + gTasks[taskId].data[9] = sub_811DCE8(itemId); + } +} + +u16 sub_811DCE8(u16 itemId) +{ + return RGB_WHITE; +} + +void sub_811DCF0(u16 itemId) +{ + struct PokemonSpecialAnimScene * scene = sub_811D0A8(); + scene->field_0010 = sub_811DD20(itemId); + if (scene->field_0010 != NULL) + { + StartSpriteAffineAnim(scene->field_0010, 3); + sub_811E06C(scene, scene->field_0010, 3); + } +} + +struct Sprite * sub_811DD20(u16 itemId) +{ + u8 spriteId; + struct Sprite * sprite; + spriteId = AddItemIconObject(1, 1, itemId); + if (spriteId == MAX_SPRITES) + return NULL; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].subpriority = 1; + gSprites[spriteId].affineAnims = gUnknown_8459A20; + gSprites[spriteId].callback = SpriteCallbackDummy; + InitSpriteAffineAnim(&gSprites[spriteId]); + return &gSprites[spriteId]; +} + +bool8 sub_811DD90(void) +{ + return FuncIsActiveTask(sub_811DDA4); +} + +void sub_811DDA4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + struct Sprite * sprite = (void *)GetWordTaskArg(taskId, 4); + switch (data[0]) + { + case 0: + data[1]++; + if (data[1] > 20) + { + data[1] = 0; + PlaySE(SE_W207B); + sprite->invisible = FALSE; + if (!data[11]) + sub_811E588(); + data[0] = 1; + } + break; + case 1: + data[1]++; + if (data[1] > 30) + { + data[1] = 0; + sprite->affineAnims = gUnknown_8459AA8; + StartSpriteAffineAnim(sprite, data[2]); + BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, data[9]); + data[0] = 2; + PlaySE(SE_W208); + } + break; + case 2: + if (sprite->affineAnimEnded) + { + sprite->invisible = TRUE; + data[10] = 20; + data[0] = 3; + } + break; + case 3: + data[1]++; + if (data[1] > data[10]) + { + data[1] = 0; + if (!data[11]) + sub_811DF14(taskId, data, sprite); + if (data[7] == 0) + PlaySE(SE_W179); + data[7]++; + if (data[7] > 2) + data[0] = 4; + else + data[10] = 8; + } + break; + case 4: + if (data[8] == 0) + { + if (data[6] != 0) + DestroySprite(sprite); + DestroyTask(taskId); + } + break; + } +} + +void sub_811DF14(u8 taskId, s16 *data, struct Sprite * sprite) +{ + int x = sprite->pos1.x + sprite->pos2.x - 4; + int y = sprite->pos1.y + sprite->pos2.y - 4; + u8 spriteId; + int i; + BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, data[9]); + for (i = 0; i < 15; i++) + { + spriteId = CreateSprite(&gUnknown_8459B30, x, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[1] = i << 4; + gSprites[spriteId].data[7] = taskId; + gSprites[spriteId].callback = sub_811DFC0; + StartSpriteAnim(&gSprites[spriteId], 1); + data[8]++; + } + } +} + +void sub_811DFC0(struct Sprite * sprite) +{ + s16 *data = sprite->data; + if (data[0] < 16) + { + data[0]++; + data[1] += 7; + data[1] &= 0xFF; + data[2] += 4; + sprite->pos2.x = (data[2] * gSineTable[data[1] + 0x40]) >> 8; + sprite->pos2.y = (data[2] * gSineTable[data[1]]) >> 8; + } + else + { + gTasks[data[7]].data[8]--; + DestroySprite(sprite); + } +} + +void sub_811E040(void) +{ + u8 taskId = FindTaskIdByFunc(sub_811DDA4); + if (taskId != 0xFF) + { + gTasks[taskId].data[11] = TRUE; + } +} |