summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-19 20:40:26 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-19 20:40:26 -0400
commitb36ea2db9873f4a52c5245328b8c846e08757fa3 (patch)
treea943513fc2e1458952e86194eba196a60be699eb
parent33b65b547000387fcdce9fe497da9b217544ece6 (diff)
through sub_811CA20
-rw-r--r--asm/pokemon_special_anim.s814
-rw-r--r--ld_script.txt2
-rw-r--r--src/pokemon_special_anim.c412
3 files changed, 414 insertions, 814 deletions
diff --git a/asm/pokemon_special_anim.s b/asm/pokemon_special_anim.s
index b499f0999..76488e170 100644
--- a/asm/pokemon_special_anim.s
+++ b/asm/pokemon_special_anim.s
@@ -5,820 +5,6 @@
.text
- thumb_func_start sub_811C540
-sub_811C540: @ 811C540
- push {r4,lr}
- adds r4, r2, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 16
- lsrs r1, 16
- bl sub_811C5D4
- cmp r0, 0
- bne _0811C55C
- adds r0, r4, 0
- bl SetMainCallback2
- b _0811C560
-_0811C55C:
- bl sub_811C748
-_0811C560:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_811C540
-
- thumb_func_start sub_811C568
-sub_811C568: @ 811C568
- push {r4-r6,lr}
- adds r5, r3, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 16
- lsrs r1, 16
- lsls r2, 16
- lsrs r6, r2, 16
- adds r2, r5, 0
- bl sub_811C5D4
- adds r4, r0, 0
- cmp r4, 0
- bne _0811C58C
- adds r0, r5, 0
- bl SetMainCallback2
- b _0811C5A2
-_0811C58C:
- adds r0, r4, 0
- adds r0, 0x77
- movs r1, 0xD
- muls r1, r6
- ldr r2, _0811C5A8 @ =gMoveNames
- adds r1, r2
- bl StringCopy
- adds r0, r4, 0
- bl sub_811C7BC
-_0811C5A2:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0811C5A8: .4byte gMoveNames
- thumb_func_end sub_811C568
-
- thumb_func_start sub_811C5AC
-sub_811C5AC: @ 811C5AC
- push {r4,lr}
- adds r4, r2, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 16
- lsrs r1, 16
- bl sub_811C5D4
- cmp r0, 0
- bne _0811C5C8
- adds r0, r4, 0
- bl SetMainCallback2
- b _0811C5CC
-_0811C5C8:
- bl sub_811C7FC
-_0811C5CC:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_811C5AC
-
- thumb_func_start sub_811C5D4
-sub_811C5D4: @ 811C5D4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- adds r5, r2, 0
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- lsls r1, 16
- lsrs r6, r1, 16
- ldr r0, _0811C61C @ =gMain
- ldr r1, _0811C620 @ =0x00000439
- adds r0, r1
- ldrb r1, [r0]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- bne _0811C5FC
- bl ResetTasks
-_0811C5FC:
- bl ResetSpriteData
- bl FreeAllSpritePalettes
- ldr r0, _0811C624 @ =0x000028dc
- bl Alloc
- adds r7, r0, 0
- cmp r7, 0
- bne _0811C628
- adds r0, r5, 0
- bl SetMainCallback2
- movs r0, 0
- b _0811C6D2
- .align 2, 0
-_0811C61C: .4byte gMain
-_0811C620: .4byte 0x00000439
-_0811C624: .4byte 0x000028dc
-_0811C628:
- movs r0, 0x64
- mov r4, r8
- muls r4, r0
- ldr r0, _0811C6E0 @ =gPlayerParty
- adds r4, r0
- adds r0, r7, 0
- adds r0, 0x92
- movs r1, 0
- mov r9, r1
- mov r1, r9
- strh r1, [r0]
- str r5, [r7, 0x4]
- adds r0, r4, 0
- movs r1, 0xB
- bl GetMonData
- adds r1, r7, 0
- adds r1, 0x94
- strh r0, [r1]
- adds r0, r4, 0
- movs r1, 0x20
- bl GetMonData
- lsls r0, 16
- lsrs r0, 16
- bl sub_811D058
- lsls r0, 24
- lsrs r0, 24
- adds r1, r7, 0
- adds r1, 0x9C
- strh r0, [r1]
- adds r0, r4, 0
- movs r1, 0
- bl GetMonData
- adds r1, r7, 0
- adds r1, 0xA0
- str r0, [r1]
- adds r0, r7, 0
- adds r0, 0x9A
- mov r1, r8
- strh r1, [r0]
- subs r0, 0x4
- strh r6, [r0]
- adds r0, r6, 0
- bl sub_811D018
- adds r5, r7, 0
- adds r5, 0x98
- strh r0, [r5]
- adds r0, r7, 0
- adds r0, 0x8
- adds r1, r4, 0
- movs r2, 0x64
- bl memcpy
- adds r0, r7, 0
- adds r0, 0xA4
- mov r1, r9
- str r1, [r0]
- adds r2, r7, 0
- adds r2, 0x6C
- adds r0, r4, 0
- movs r1, 0x2
- bl GetMonData
- ldrh r0, [r5]
- cmp r0, 0x4
- bne _0811C6D0
- adds r0, r6, 0
- bl ItemIdToBattleMoveId
- lsls r0, 16
- lsrs r0, 16
- adds r2, r7, 0
- adds r2, 0x84
- movs r1, 0xD
- muls r1, r0
- ldr r0, _0811C6E4 @ =gMoveNames
- adds r1, r0
- adds r0, r2, 0
- bl StringCopy
-_0811C6D0:
- adds r0, r7, 0
-_0811C6D2:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0811C6E0: .4byte gPlayerParty
-_0811C6E4: .4byte gMoveNames
- thumb_func_end sub_811C5D4
-
- thumb_func_start sub_811C6E8
-sub_811C6E8: @ 811C6E8
- push {lr}
- bl TransferPlttBuffer
- bl LoadOam
- bl ProcessSpriteCopyRequests
- pop {r0}
- bx r0
- thumb_func_end sub_811C6E8
-
- thumb_func_start sub_811C6FC
-sub_811C6FC: @ 811C6FC
- push {lr}
- bl RunTextPrinters
- bl RunTasks
- bl AnimateSprites
- bl BuildOamBuffer
- bl UpdatePaletteFade
- pop {r0}
- bx r0
- thumb_func_end sub_811C6FC
-
- thumb_func_start sub_811C718
-sub_811C718: @ 811C718
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r0, 0x92
- movs r1, 0
- strh r1, [r0]
- ldr r1, _0811C744 @ =gTasks
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- str r5, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0811C744: .4byte gTasks
- thumb_func_end sub_811C718
-
- thumb_func_start sub_811C748
-sub_811C748: @ 811C748
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r0, 0x98
- ldrh r0, [r0]
- cmp r0, 0x3
- beq _0811C766
- cmp r0, 0x3
- ble _0811C75E
- cmp r0, 0x4
- beq _0811C770
- b _0811C784
-_0811C75E:
- cmp r0, 0x1
- bgt _0811C784
- cmp r0, 0
- blt _0811C784
-_0811C766:
- ldr r0, _0811C76C @ =sub_811C834
- b _0811C772
- .align 2, 0
-_0811C76C: .4byte sub_811C834
-_0811C770:
- ldr r0, _0811C780 @ =sub_811CD68
-_0811C772:
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r4, r0, 24
- b _0811C792
- .align 2, 0
-_0811C780: .4byte sub_811CD68
-_0811C784:
- ldr r0, [r5, 0x4]
- bl SetMainCallback2
- adds r0, r5, 0
- bl Free
- b _0811C7AE
-_0811C792:
- adds r1, r5, 0
- adds r1, 0x91
- movs r0, 0
- strb r0, [r1]
- adds r0, r4, 0
- movs r1, 0
- adds r2, r5, 0
- bl SetWordTaskArg
- ldr r0, _0811C7B4 @ =sub_811C6FC
- bl SetMainCallback2
- ldr r0, _0811C7B8 @ =gUnknown_203B094
- strb r4, [r0]
-_0811C7AE:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0811C7B4: .4byte sub_811C6FC
-_0811C7B8: .4byte gUnknown_203B094
- thumb_func_end sub_811C748
-
- thumb_func_start sub_811C7BC
-sub_811C7BC: @ 811C7BC
- push {r4,r5,lr}
- adds r5, r0, 0
- ldr r0, _0811C7F0 @ =sub_811CA20
- movs r1, 0
- bl CreateTask
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- movs r1, 0
- adds r2, r5, 0
- bl SetWordTaskArg
- ldr r0, _0811C7F4 @ =sub_811C6FC
- bl SetMainCallback2
- ldr r0, _0811C7F8 @ =gUnknown_203B094
- strb r4, [r0]
- adds r5, 0x91
- movs r0, 0
- strb r0, [r5]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0811C7F0: .4byte sub_811CA20
-_0811C7F4: .4byte sub_811C6FC
-_0811C7F8: .4byte gUnknown_203B094
- thumb_func_end sub_811C7BC
-
- thumb_func_start sub_811C7FC
-sub_811C7FC: @ 811C7FC
- push {r4,r5,lr}
- adds r5, r0, 0
- ldr r0, _0811C828 @ =sub_811CBE4
- movs r1, 0
- bl CreateTask
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- movs r1, 0
- adds r2, r5, 0
- bl SetWordTaskArg
- ldr r0, _0811C82C @ =sub_811C6FC
- bl SetMainCallback2
- ldr r0, _0811C830 @ =gUnknown_203B094
- strb r4, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0811C828: .4byte sub_811CBE4
-_0811C82C: .4byte sub_811C6FC
-_0811C830: .4byte gUnknown_203B094
- thumb_func_end sub_811C7FC
-
- thumb_func_start sub_811C834
-sub_811C834: @ 811C834
- push {r4-r6,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r6, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r4, r0, 0
- adds r0, 0x91
- ldrb r0, [r0]
- cmp r0, 0
- bne _0811C870
- ldr r0, _0811C868 @ =gMain
- ldrh r1, [r0, 0x2C]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _0811C870
- bl sub_811E040
- ldr r1, _0811C86C @ =sub_811CF88
- adds r0, r6, 0
- bl sub_811C718
- b _0811CA16
- .align 2, 0
-_0811C868: .4byte gMain
-_0811C86C: .4byte sub_811CF88
-_0811C870:
- adds r0, r4, 0
- adds r0, 0x92
- ldrh r1, [r0]
- adds r5, r0, 0
- cmp r1, 0xE
- bls _0811C87E
- b _0811CA16
-_0811C87E:
- lsls r0, r1, 2
- ldr r1, _0811C888 @ =_0811C88C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0811C888: .4byte _0811C88C
- .align 2, 0
-_0811C88C:
- .4byte _0811C8C8
- .4byte _0811C8E4
- .4byte _0811C9E8
- .4byte _0811C914
- .4byte _0811C920
- .4byte _0811C934
- .4byte _0811C93C
- .4byte _0811C950
- .4byte _0811C97E
- .4byte _0811C986
- .4byte _0811C98E
- .4byte _0811C996
- .4byte _0811C9AA
- .4byte _0811C9E8
- .4byte _0811CA00
-_0811C8C8:
- movs r0, 0
- bl SetVBlankCallback
- adds r0, r4, 0
- adds r0, 0xA8
- adds r1, r4, 0
- adds r1, 0x98
- ldrh r1, [r1]
- bl sub_811D184
- movs r0, 0
- bl sub_811D830
- b _0811C9F4
-_0811C8E4:
- bl sub_811D280
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- beq _0811C8F2
- b _0811CA16
-_0811C8F2:
- movs r1, 0x1
- negs r1, r1
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- ldr r0, _0811C910 @ =sub_811C6E8
- bl SetVBlankCallback
- b _0811CA16
- .align 2, 0
-_0811C910: .4byte sub_811C6E8
-_0811C914:
- adds r0, r4, 0
- adds r0, 0x9C
- ldrb r0, [r0]
- bl sub_811D948
- b _0811C9F4
-_0811C920:
- bl sub_811D9A8
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0
- bne _0811CA16
- adds r0, r4, 0
- adds r0, 0x9E
- strh r1, [r0]
- b _0811C9F4
-_0811C934:
- bl sub_811D754
- lsls r0, 24
- b _0811C9F0
-_0811C93C:
- adds r0, r4, 0
- adds r0, 0x96
- ldrh r0, [r0]
- adds r1, r4, 0
- adds r1, 0x9C
- ldrb r1, [r1]
- movs r2, 0x1
- bl sub_811DC54
- b _0811C9F4
-_0811C950:
- bl sub_811DD90
- lsls r0, 24
- cmp r0, 0
- bne _0811CA16
- adds r1, r4, 0
- adds r1, 0x91
- movs r0, 0x1
- strb r0, [r1]
- adds r0, r4, 0
- adds r0, 0x9C
- ldrh r0, [r0]
- cmp r0, 0x3
- bne _0811C978
- adds r0, r4, 0
- adds r0, 0x94
- ldrh r0, [r0]
- movs r1, 0
- bl PlayCry1
-_0811C978:
- bl sub_811D2A8
- b _0811C9F4
-_0811C97E:
- movs r0, 0
- bl sub_811D2EC
- b _0811C9F4
-_0811C986:
- bl sub_811D4EC
- lsls r0, 24
- b _0811C9F0
-_0811C98E:
- movs r0, 0
- bl sub_811D948
- b _0811C9F4
-_0811C996:
- bl sub_811D9A8
- lsls r0, 24
- cmp r0, 0
- bne _0811CA16
- adds r1, r4, 0
- adds r1, 0x91
- movs r0, 0x1
- strb r0, [r1]
- b _0811C9F4
-_0811C9AA:
- ldr r0, _0811C9DC @ =gMain
- ldrh r1, [r0, 0x2E]
- movs r0, 0x3
- ands r0, r1
- cmp r0, 0
- beq _0811CA16
- adds r0, r4, 0
- adds r0, 0x96
- ldrh r0, [r0]
- bl CheckIfItemIsTMHMOrEvolutionStone
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x2
- beq _0811C9E0
- movs r1, 0x1
- negs r1, r1
- movs r0, 0
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- b _0811C9F4
- .align 2, 0
-_0811C9DC: .4byte gMain
-_0811C9E0:
- ldrh r0, [r5]
- adds r0, 0x2
- strh r0, [r5]
- b _0811CA16
-_0811C9E8:
- ldr r0, _0811C9FC @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
-_0811C9F0:
- cmp r0, 0
- bne _0811CA16
-_0811C9F4:
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _0811CA16
- .align 2, 0
-_0811C9FC: .4byte gPaletteFade
-_0811CA00:
- ldr r0, [r4, 0x4]
- bl SetMainCallback2
- bl sub_811D29C
- adds r0, r4, 0
- bl Free
- adds r0, r6, 0
- bl DestroyTask
-_0811CA16:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_811C834
-
- thumb_func_start sub_811CA20
-sub_811CA20: @ 811CA20
- push {r4,r5,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- movs r1, 0
- bl GetWordTaskArg
- adds r5, r0, 0
- adds r0, 0x92
- ldrh r0, [r0]
- cmp r0, 0xD
- bls _0811CA3C
- b _0811CBD6
-_0811CA3C:
- lsls r0, 2
- ldr r1, _0811CA48 @ =_0811CA4C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0811CA48: .4byte _0811CA4C
- .align 2, 0
-_0811CA4C:
- .4byte _0811CA84
- .4byte _0811CAA0
- .4byte _0811CAD4
- .4byte _0811CAF4
- .4byte _0811CB0C
- .4byte _0811CB14
- .4byte _0811CB2A
- .4byte _0811CB44
- .4byte _0811CB5A
- .4byte _0811CB7E
- .4byte _0811CB9A
- .4byte _0811CBA2
- .4byte _0811CBB4
- .4byte _0811CBCE
-_0811CA84:
- movs r0, 0
- bl SetVBlankCallback
- adds r0, r5, 0
- adds r0, 0xA8
- adds r1, r5, 0
- adds r1, 0x98
- ldrh r1, [r1]
- bl sub_811D184
- movs r0, 0x3
- bl sub_811D830
- b _0811CBC2
-_0811CAA0:
- bl sub_811D280
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- beq _0811CAAE
- b _0811CBD6
-_0811CAAE:
- movs r1, 0x1
- negs r1, r1
- str r0, [sp]
- adds r0, r1, 0
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- adds r1, r5, 0
- adds r1, 0x92
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- ldr r0, _0811CAD0 @ =sub_811C6E8
- bl SetVBlankCallback
- b _0811CBD6
- .align 2, 0
-_0811CAD0: .4byte sub_811C6E8
-_0811CAD4:
- ldr r0, _0811CAF0 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _0811CBD6
- adds r1, r5, 0
- adds r1, 0x9E
- strh r0, [r1]
- subs r1, 0xC
- b _0811CBC6
- .align 2, 0
-_0811CAF0: .4byte gPaletteFade
-_0811CAF4:
- adds r1, r5, 0
- adds r1, 0x9E
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1E
- bls _0811CBD6
- bl sub_811D2A8
- b _0811CBC2
-_0811CB0C:
- movs r0, 0x2
- bl sub_811D2EC
- b _0811CBC2
-_0811CB14:
- bl sub_811D4EC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _0811CBD6
- adds r1, r5, 0
- adds r1, 0x9E
- strh r0, [r1]
- subs r1, 0xC
- b _0811CBC6
-_0811CB2A:
- adds r1, r5, 0
- adds r1, 0x9E
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1E
- bls _0811CBD6
- movs r0, 0x3
- bl sub_811D2EC
- b _0811CBC2
-_0811CB44:
- bl sub_811D4EC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _0811CBD6
- adds r1, r5, 0
- adds r1, 0x9E
- strh r0, [r1]
- subs r1, 0xC
- b _0811CBC6
-_0811CB5A:
- adds r1, r5, 0
- adds r1, 0x9E
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1E
- bls _0811CBD6
- movs r0, 0xE1
- bl PlaySE
- movs r0, 0x4
- bl sub_811D2EC
- bl sub_811D4FC
- b _0811CBC2
-_0811CB7E:
- bl sub_811D530
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- bl sub_811D4EC
- orrs r4, r0
- lsls r4, 24
- cmp r4, 0
- bne _0811CBD6
- bl sub_811D4D4
- b _0811CBC2
-_0811CB9A:
- movs r0, 0x5
- bl sub_811D2EC
- b _0811CBC2
-_0811CBA2:
- bl sub_811D4EC
- lsls r0, 24
- cmp r0, 0
- bne _0811CBD6
- movs r0, 0x6
- bl sub_811D2EC
- b _0811CBC2
-_0811CBB4:
- bl sub_811D4EC
- lsls r0, 24
- cmp r0, 0
- bne _0811CBD6
- bl sub_811D2D0
-_0811CBC2:
- adds r1, r5, 0
- adds r1, 0x92
-_0811CBC6:
- ldrh r0, [r1]
- adds r0, 0x1
- strh r0, [r1]
- b _0811CBD6
-_0811CBCE:
- ldr r1, _0811CBE0 @ =sub_811CE4C
- adds r0, r4, 0
- bl sub_811C718
-_0811CBD6:
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0811CBE0: .4byte sub_811CE4C
- thumb_func_end sub_811CA20
-
thumb_func_start sub_811CBE4
sub_811CBE4: @ 811CBE4
push {r4-r6,lr}
diff --git a/ld_script.txt b/ld_script.txt
index c92132b90..b9de60577 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -251,6 +251,7 @@ SECTIONS {
src/union_room.o(.text);
src/rfu_union_tool.o(.text);
src/union_room_battle.o(.text);
+ src/pokemon_special_anim.o(.text);
asm/pokemon_special_anim.o(.text);
src/party_menu.o(.text);
src/union_room_chat.o(.text);
@@ -553,6 +554,7 @@ SECTIONS {
src/rfu_union_tool.o(.rodata);
src/union_room_battle.o(.rodata);
src/union_room_message.o(.rodata);
+ src/pokemon_special_anim.o(.rodata);
data/pokemon_special_anim.o(.rodata);
src/party_menu.o(.rodata);
src/union_room_chat.o(.rodata);
diff --git a/src/pokemon_special_anim.c b/src/pokemon_special_anim.c
new file mode 100644
index 000000000..244b9bdde
--- /dev/null
+++ b/src/pokemon_special_anim.c
@@ -0,0 +1,412 @@
+#include "global.h"
+#include "gflib.h"
+#include "data.h"
+#include "party_menu.h"
+#include "item_use.h"
+#include "task.h"
+#include "constants/songs.h"
+
+// Functions related to the special anims Pokemon
+// make when using an item on them in the field.
+
+struct PokemonSpecialAnim
+{
+ /*0x0000*/ u8 filler_0000[0x4];
+ /*0x0004*/ MainCallback savedCallback;
+ /*0x0008*/ struct Pokemon pokemon;
+ /*0x006c*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ /*0x0077*/ u8 nameOfMoveForgotten[13];
+ /*0x0084*/ u8 nameOfMoveToTeach[13];
+ /*0x0091*/ bool8 cancelDisabled;
+ /*0x0092*/ u16 state;
+ /*0x0094*/ u16 species;
+ /*0x0096*/ u16 itemId;
+ /*0x0098*/ u16 animType;
+ /*0x009a*/ u16 slotId;
+ /*0x009c*/ u16 closeness;
+ /*0x009e*/ u16 field_009e;
+ /*0x00a0*/ u32 personality;
+ /*0x00a4*/ u32 field_00a4;
+ /*0x00a8*/ u8 field_00a8[0x2834];
+}; // size=0x28dc
+
+EWRAM_DATA u8 gUnknown_203B094 = 0;
+
+struct PokemonSpecialAnim * sub_811C5D4(u8 slotId, u16 itemId, MainCallback callback);
+void sub_811C748(struct PokemonSpecialAnim * ptr);
+void sub_811C7BC(struct PokemonSpecialAnim * ptr);
+void sub_811C7FC(struct PokemonSpecialAnim * ptr);
+void sub_811C834(u8 taskId);
+void sub_811CA20(u8 taskId);
+void sub_811CBE4(u8 taskId);
+void sub_811CD68(u8 taskId);
+void sub_811CE4C(u8 taskId);
+void sub_811CF88(u8 taskId);
+u8 sub_811D058(u16 friendship);
+u16 sub_811D018(u16 itemId);
+void sub_811D184(u8 *buffer, u16 animType);
+bool8 sub_811D280(void);
+void sub_811D29C(void);
+void sub_811D2A8(void);
+void sub_811D2D0(void);
+void sub_811D2EC(u8 a0);
+void sub_811D4D4(void);
+bool8 sub_811D4EC(void);
+void sub_811D4FC(void);
+bool8 sub_811D530(void);
+bool8 sub_811D754(void);
+void sub_811D830(u8 a0);
+void sub_811D948(u8 closeness);
+bool8 sub_811D9A8(void);
+void sub_811DC54(u16 itemId, u8 closeness, u8 a2);
+bool8 sub_811DD90(void);
+void sub_811E040(void);
+
+void sub_811C540(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ sub_811C748(ptr);
+}
+
+void sub_811C568(u8 slotId, u16 itemId, u16 moveId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ {
+ StringCopy(ptr->nameOfMoveForgotten, gMoveNames[moveId]);
+ sub_811C7BC(ptr);
+ }
+}
+
+void sub_811C5AC(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr = sub_811C5D4(slotId, itemId, callback);
+ if (ptr == NULL)
+ SetMainCallback2(callback);
+ else
+ sub_811C7FC(ptr);
+}
+
+struct PokemonSpecialAnim * sub_811C5D4(u8 slotId, u16 itemId, MainCallback callback)
+{
+ struct PokemonSpecialAnim * ptr;
+ struct Pokemon * pokemon;
+ u16 moveId;
+
+ if (!gMain.inBattle)
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ptr = Alloc(sizeof(struct PokemonSpecialAnim));
+ if (ptr == NULL)
+ {
+ SetMainCallback2(callback);
+ return NULL;
+ }
+ pokemon = &gPlayerParty[slotId];
+ ptr->state = 0;
+ ptr->savedCallback = callback;
+ ptr->species = GetMonData(pokemon, MON_DATA_SPECIES);
+ ptr->closeness = sub_811D058(GetMonData(pokemon, MON_DATA_FRIENDSHIP));
+ ptr->personality = GetMonData(pokemon, MON_DATA_PERSONALITY);
+ ptr->slotId = slotId;
+ ptr->itemId = itemId;
+ ptr->animType = sub_811D018(itemId);
+ ptr->pokemon = *pokemon;
+ ptr->field_00a4 = 0;
+ GetMonData(pokemon, MON_DATA_NICKNAME, ptr->nickname);
+ if (ptr->animType == 4)
+ {
+ moveId = ItemIdToBattleMoveId(itemId);
+ StringCopy(ptr->nameOfMoveToTeach, gMoveNames[moveId]);
+ }
+ return ptr;
+}
+
+void sub_811C6E8(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+void sub_811C6FC(void)
+{
+ RunTextPrinters();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_811C718(u8 taskId, TaskFunc func)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ ptr->state = 0;
+ gTasks[taskId].func = func;
+}
+
+void sub_811C748(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId;
+ switch (ptr->animType)
+ {
+ case 0:
+ case 1:
+ case 3:
+ taskId = CreateTask(sub_811C834, 0);
+ break;
+ case 4:
+ taskId = CreateTask(sub_811CD68, 0);
+ break;
+ default:
+ SetMainCallback2(ptr->savedCallback);
+ Free(ptr);
+ return;
+ }
+ ptr->cancelDisabled = FALSE;
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(sub_811C6FC);
+ gUnknown_203B094 = taskId;
+}
+
+void sub_811C7BC(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId = CreateTask(sub_811CA20, 0);
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(sub_811C6FC);
+ gUnknown_203B094 = taskId;
+ ptr->cancelDisabled = FALSE;
+}
+
+void sub_811C7FC(struct PokemonSpecialAnim * ptr)
+{
+ u8 taskId = CreateTask(sub_811CBE4, 0);
+ SetWordTaskArg(taskId, 0, (uintptr_t)ptr);
+ SetMainCallback2(sub_811C6FC);
+ gUnknown_203B094 = taskId;
+}
+
+void sub_811C834(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ if (!ptr->cancelDisabled && JOY_HELD(A_BUTTON | B_BUTTON))
+ {
+ sub_811E040();
+ sub_811C718(taskId, sub_811CF88);
+ return;
+ }
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_811D184(ptr->field_00a8, ptr->animType);
+ sub_811D830(0);
+ ptr->state++;
+ break;
+ case 1:
+ if (!sub_811D280())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(sub_811C6E8);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 3:
+ sub_811D948(ptr->closeness);
+ ptr->state++;
+ break;
+ case 4:
+ if (!sub_811D9A8())
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 5:
+ if (!sub_811D754())
+ {
+ ptr->state++;
+ }
+ break;
+ case 6:
+ sub_811DC54(ptr->itemId, ptr->closeness, 1);
+ ptr->state++;
+ break;
+ case 7:
+ if (!sub_811DD90())
+ {
+ ptr->cancelDisabled = TRUE;
+ if (ptr->closeness == 3)
+ {
+ PlayCry1(ptr->species, 0);
+ }
+ sub_811D2A8();
+ ptr->state++;
+ }
+ break;
+ case 8:
+ sub_811D2EC(0);
+ ptr->state++;
+ break;
+ case 9:
+ if (!sub_811D4EC())
+ {
+ ptr->state++;
+ }
+ break;
+ case 10:
+ sub_811D948(0);
+ ptr->state++;
+ break;
+ case 11:
+ if (!sub_811D9A8())
+ {
+ ptr->cancelDisabled = TRUE;
+ ptr->state++;
+ }
+ break;
+ case 12:
+ if (JOY_NEW(A_BUTTON | B_BUTTON))
+ {
+ if (CheckIfItemIsTMHMOrEvolutionStone(ptr->itemId) != 2) // evo stone
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ ptr->state++;
+ }
+ else
+ {
+ ptr->state += 2;
+ }
+ }
+ break;
+ case 13:
+ if (!gPaletteFade.active)
+ {
+ ptr->state++;
+ }
+ break;
+ case 14:
+ SetMainCallback2(ptr->savedCallback);
+ sub_811D29C();
+ Free(ptr);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_811CA20(u8 taskId)
+{
+ struct PokemonSpecialAnim * ptr = (void *)GetWordTaskArg(taskId, 0);
+ u8 r4;
+
+ switch (ptr->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_811D184(ptr->field_00a8, ptr->animType);
+ sub_811D830(3);
+ ptr->state++;
+ break;
+ case 1:
+ if (!sub_811D280())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ ptr->state++;
+ SetVBlankCallback(sub_811C6E8);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 3:
+ ptr->field_009e++;
+ if (ptr->field_009e > 30)
+ {
+ sub_811D2A8();
+ ptr->state++;
+ }
+ break;
+ case 4:
+ sub_811D2EC(2);
+ ptr->state++;
+ break;
+ case 5:
+ if (!sub_811D4EC())
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 6:
+ ptr->field_009e++;
+ if (ptr->field_009e > 30)
+ {
+ sub_811D2EC(3);
+ ptr->state++;
+ }
+ break;
+ case 7:
+ if (!sub_811D4EC())
+ {
+ ptr->field_009e = 0;
+ ptr->state++;
+ }
+ break;
+ case 8:
+ ptr->field_009e++;
+ if (ptr->field_009e > 30)
+ {
+ PlaySE(SE_W255);
+ sub_811D2EC(4);
+ sub_811D4FC();
+ ptr->state++;
+ }
+ break;
+ case 9:
+ r4 = sub_811D530();
+ if (!(r4 | sub_811D4EC()))
+ {
+ sub_811D4D4();
+ ptr->state++;
+ }
+ break;
+ case 10:
+ sub_811D2EC(5);
+ ptr->state++;
+ break;
+ case 11:
+ if (!sub_811D4EC())
+ {
+ sub_811D2EC(6);
+ ptr->state++;
+ }
+ break;
+ case 12:
+ if (!sub_811D4EC())
+ {
+ sub_811D2D0();
+ ptr->state++;
+ }
+ break;
+ case 13:
+ sub_811C718(taskId, sub_811CE4C);
+ break;
+ }
+}