summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-28 17:10:06 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-28 17:10:06 -0500
commitfb064f17ba63a79df09901c874b03665f4bf11e8 (patch)
treefd926b107d56cbf0886272605ca0d8dd34b3db32
parentf8251866551143e2febe55fe47e92f7c826696b3 (diff)
Fly field effect
-rw-r--r--asm/field_effect.s1545
-rw-r--r--data/field_effect.s54
-rw-r--r--include/event_object_movement.h1
-rw-r--r--include/field_effect_helpers.h1
-rw-r--r--src/field_effect.c585
5 files changed, 587 insertions, 1599 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index 370016f84..b955fe12c 100644
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -5,1551 +5,6 @@
.text
- thumb_func_start FldEff_NpcFlyOut
-FldEff_NpcFlyOut: @ 8086D38
- push {r4,lr}
- ldr r0, _08086D84 @ =gFieldEffectObjectTemplatePointers
- ldr r0, [r0, 0x68]
- movs r1, 0x78
- movs r2, 0
- movs r3, 0x1
- bl CreateSprite
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- lsls r2, r4, 4
- adds r2, r4
- lsls r2, 2
- ldr r0, _08086D88 @ =gSprites
- adds r2, r0
- ldrb r1, [r2, 0x5]
- movs r0, 0xF
- ands r0, r1
- movs r1, 0xD
- negs r1, r1
- ands r0, r1
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2, 0x5]
- ldr r0, _08086D8C @ =sub_8086D94
- str r0, [r2, 0x1C]
- ldr r0, _08086D90 @ =gFieldEffectArguments
- ldr r0, [r0]
- strh r0, [r2, 0x30]
- movs r0, 0x97
- bl PlaySE
- adds r0, r4, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08086D84: .4byte gFieldEffectObjectTemplatePointers
-_08086D88: .4byte gSprites
-_08086D8C: .4byte sub_8086D94
-_08086D90: .4byte gFieldEffectArguments
- thumb_func_end FldEff_NpcFlyOut
-
- thumb_func_start sub_8086D94
-sub_8086D94: @ 8086D94
- push {r4,r5,lr}
- adds r4, r0, 0
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- movs r1, 0x8C
- bl Cos
- movs r5, 0
- strh r0, [r4, 0x24]
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- movs r1, 0x48
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x32]
- adds r0, 0x4
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0x32]
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- cmp r0, 0
- beq _08086DF6
- movs r2, 0x30
- ldrsh r0, [r4, r2]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _08086E0C @ =gSprites
- adds r1, r0
- adds r3, r1, 0
- adds r3, 0x3E
- ldrb r2, [r3]
- movs r0, 0x3
- negs r0, r0
- ands r0, r2
- strb r0, [r3]
- ldrh r0, [r4, 0x24]
- ldrh r2, [r4, 0x20]
- adds r0, r2
- strh r0, [r1, 0x20]
- ldrh r0, [r4, 0x26]
- ldrh r2, [r4, 0x22]
- adds r0, r2
- subs r0, 0x8
- strh r0, [r1, 0x22]
- strh r5, [r1, 0x24]
- strh r5, [r1, 0x26]
-_08086DF6:
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- cmp r0, 0x7F
- ble _08086E06
- adds r0, r4, 0
- movs r1, 0x1E
- bl FieldEffectStop
-_08086E06:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08086E0C: .4byte gSprites
- thumb_func_end sub_8086D94
-
- thumb_func_start FldEff_UseFly
-FldEff_UseFly: @ 8086E10
- push {lr}
- ldr r0, _08086E34 @ =Task_UseFly
- movs r1, 0xFE
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08086E38 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r0, _08086E3C @ =gFieldEffectArguments
- ldr r0, [r0]
- strh r0, [r1, 0xA]
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08086E34: .4byte Task_UseFly
-_08086E38: .4byte gTasks
-_08086E3C: .4byte gFieldEffectArguments
- thumb_func_end FldEff_UseFly
-
- thumb_func_start Task_UseFly
-Task_UseFly: @ 8086E40
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08086E68 @ =sUseFlyEffectFuncs
- ldr r2, _08086E6C @ =gTasks
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- movs r2, 0x8
- ldrsh r1, [r0, r2]
- lsls r1, 2
- adds r1, r3
- ldr r1, [r1]
- bl _call_via_r1
- pop {r0}
- bx r0
- .align 2, 0
-_08086E68: .4byte sUseFlyEffectFuncs
-_08086E6C: .4byte gTasks
- thumb_func_end Task_UseFly
-
- thumb_func_start UseFlyEffect_1
-UseFlyEffect_1: @ 8086E70
- push {r4-r6,lr}
- adds r5, r0, 0
- ldr r6, _08086EC0 @ =gPlayerAvatar
- ldrb r1, [r6, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086EC4 @ =gObjectEvents
- adds r4, r0, r1
- adds r0, r4, 0
- bl ObjectEventIsMovementOverridden
- lsls r0, 24
- cmp r0, 0
- beq _08086E9A
- adds r0, r4, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _08086EB8
-_08086E9A:
- ldrb r0, [r6]
- strh r0, [r5, 0x26]
- movs r0, 0x1
- strb r0, [r6, 0x6]
- bl SetPlayerAvatarStateMask
- bl sub_805CB70
- adds r0, r4, 0
- movs r1, 0x45
- bl ObjectEventSetHeldMovement
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_08086EB8:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08086EC0: .4byte gPlayerAvatar
-_08086EC4: .4byte gObjectEvents
- thumb_func_end UseFlyEffect_1
-
- thumb_func_start UseFlyEffect_2
-UseFlyEffect_2: @ 8086EC8
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _08086F00 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086F04 @ =gObjectEvents
- adds r0, r1
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _08086EF8
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- ldr r1, _08086F08 @ =gFieldEffectArguments
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- str r0, [r1]
- movs r0, 0x3B
- bl FieldEffectStart
-_08086EF8:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08086F00: .4byte gPlayerAvatar
-_08086F04: .4byte gObjectEvents
-_08086F08: .4byte gFieldEffectArguments
- thumb_func_end UseFlyEffect_2
-
- thumb_func_start UseFlyEffect_3
-UseFlyEffect_3: @ 8086F0C
- push {r4,r5,lr}
- adds r4, r0, 0
- movs r0, 0x6
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _08086F54
- ldr r0, _08086F5C @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086F60 @ =gObjectEvents
- adds r5, r0, r1
- ldrh r1, [r4, 0x26]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _08086F44
- ldrb r0, [r5, 0x1A]
- movs r1, 0x2
- bl sub_80DC44C
- ldrb r0, [r5, 0x1A]
- movs r1, 0
- bl sub_80DC478
-_08086F44:
- bl sub_8087168
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_08086F54:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08086F5C: .4byte gPlayerAvatar
-_08086F60: .4byte gObjectEvents
- thumb_func_end UseFlyEffect_3
-
- thumb_func_start UseFlyEffect_4
-UseFlyEffect_4: @ 8086F64
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0xA]
- bl sub_80871AC
- lsls r0, 24
- cmp r0, 0
- beq _08086F98
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x10
- strh r0, [r4, 0xC]
- movs r0, 0x1
- bl SetPlayerAvatarTransitionFlags
- ldr r0, _08086FA0 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086FA4 @ =gObjectEvents
- adds r0, r1
- movs r1, 0x2
- bl ObjectEventSetHeldMovement
-_08086F98:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08086FA0: .4byte gPlayerAvatar
-_08086FA4: .4byte gObjectEvents
- thumb_func_end UseFlyEffect_4
-
- thumb_func_start UseFlyEffect_5
-UseFlyEffect_5: @ 8086FA8
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _08086FF4 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086FF8 @ =gObjectEvents
- adds r2, r0, r1
- ldrh r1, [r4, 0xC]
- movs r3, 0xC
- ldrsh r0, [r4, r3]
- cmp r0, 0
- beq _08086FCE
- subs r0, r1, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- cmp r0, 0
- bne _08086FEC
-_08086FCE:
- adds r0, r2, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _08086FEC
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x97
- bl PlaySE
- ldrb r0, [r4, 0xA]
- bl sub_80871C8
-_08086FEC:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08086FF4: .4byte gPlayerAvatar
-_08086FF8: .4byte gObjectEvents
- thumb_func_end UseFlyEffect_5
-
- thumb_func_start UseFlyEffect_6
-UseFlyEffect_6: @ 8086FFC
- push {r4,r5,lr}
- adds r5, r0, 0
- ldrh r0, [r5, 0xC]
- adds r0, 0x1
- strh r0, [r5, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x7
- ble _0808705A
- ldr r0, _08087060 @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _08087064 @ =gObjectEvents
- adds r4, r0
- movs r0, 0x2
- bl GetPlayerAvatarGraphicsIdByStateId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl ObjectEventSetGraphicsId
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08087068 @ =gSprites
- adds r0, r1
- movs r1, 0x16
- bl StartSpriteAnim
- ldrb r0, [r4, 0x1]
- movs r1, 0x10
- orrs r0, r1
- strb r0, [r4, 0x1]
- adds r0, r4, 0
- movs r1, 0x54
- bl ObjectEventSetHeldMovement
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- movs r0, 0
- strh r0, [r5, 0xC]
-_0808705A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08087060: .4byte gPlayerAvatar
-_08087064: .4byte gObjectEvents
-_08087068: .4byte gSprites
- thumb_func_end UseFlyEffect_6
-
- thumb_func_start UseFlyEffect_7
-UseFlyEffect_7: @ 808706C
- push {r4,r5,lr}
- adds r5, r0, 0
- ldrh r0, [r5, 0xC]
- adds r0, 0x1
- strh r0, [r5, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x9
- ble _080870FC
- ldr r0, _08087104 @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _08087108 @ =gObjectEvents
- adds r4, r0
- adds r0, r4, 0
- bl ObjectEventClearAnimIfSpecialAnimActive
- ldrb r1, [r4, 0x1]
- movs r0, 0x11
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x1]
- ldrb r1, [r4, 0x2]
- movs r0, 0x41
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x2]
- ldrb r0, [r5, 0xA]
- ldrb r1, [r4, 0x4]
- bl sub_8087204
- movs r0, 0xA
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r4, _0808710C @ =gSprites
- adds r0, r4
- ldr r1, _08087110 @ =gSaveBlock2Ptr
- ldr r1, [r1]
- ldrb r1, [r1, 0x8]
- lsls r1, 1
- adds r1, 0x1
- lsls r1, 24
- lsrs r1, 24
- bl StartSpriteAnim
- movs r0, 0xA
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- movs r1, 0
- bl sub_80877FC
- movs r0, 0xA
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r4, 0x1C
- adds r0, r4
- ldr r1, _08087114 @ =sub_8087828
- str r1, [r0]
- bl CameraObjectReset2
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
-_080870FC:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08087104: .4byte gPlayerAvatar
-_08087108: .4byte gObjectEvents
-_0808710C: .4byte gSprites
-_08087110: .4byte gSaveBlock2Ptr
-_08087114: .4byte sub_8087828
- thumb_func_end UseFlyEffect_7
-
- thumb_func_start UseFlyEffect_8
-UseFlyEffect_8: @ 8087118
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0xA]
- bl sub_80871AC
- lsls r0, 24
- cmp r0, 0
- beq _08087132
- bl WarpFadeOutScreen
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_08087132:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end UseFlyEffect_8
-
- thumb_func_start UseFlyEffect_9
-UseFlyEffect_9: @ 8087138
- push {lr}
- ldr r0, _08087160 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _0808715A
- movs r0, 0x1F
- bl FieldEffectActiveListRemove
- ldr r0, _08087164 @ =Task_UseFly
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_0808715A:
- pop {r0}
- bx r0
- .align 2, 0
-_08087160: .4byte gPaletteFade
-_08087164: .4byte Task_UseFly
- thumb_func_end UseFlyEffect_9
-
- thumb_func_start sub_8087168
-sub_8087168: @ 8087168
- push {lr}
- ldr r0, _080871A0 @ =gFieldEffectObjectTemplatePointers
- ldr r0, [r0, 0x68]
- movs r1, 0xFF
- movs r2, 0xB4
- movs r3, 0x1
- bl CreateSprite
- lsls r0, 24
- lsrs r0, 24
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- ldr r1, _080871A4 @ =gSprites
- adds r2, r1
- ldrb r3, [r2, 0x5]
- movs r1, 0xF
- ands r1, r3
- movs r3, 0xD
- negs r3, r3
- ands r1, r3
- movs r3, 0x4
- orrs r1, r3
- strb r1, [r2, 0x5]
- ldr r1, _080871A8 @ =sub_8087220
- str r1, [r2, 0x1C]
- pop {r1}
- bx r1
- .align 2, 0
-_080871A0: .4byte gFieldEffectObjectTemplatePointers
-_080871A4: .4byte gSprites
-_080871A8: .4byte sub_8087220
- thumb_func_end sub_8087168
-
- thumb_func_start sub_80871AC
-sub_80871AC: @ 80871AC
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080871C4 @ =gSprites
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- ldrh r0, [r1, 0x3C]
- lsls r0, 24
- lsrs r0, 24
- bx lr
- .align 2, 0
-_080871C4: .4byte gSprites
- thumb_func_end sub_80871AC
-
- thumb_func_start sub_80871C8
-sub_80871C8: @ 80871C8
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _080871FC @ =gSprites
- adds r4, r0
- ldr r0, _08087200 @ =sub_80872F0
- str r0, [r4, 0x1C]
- movs r1, 0
- movs r0, 0x78
- strh r0, [r4, 0x20]
- strh r1, [r4, 0x22]
- strh r1, [r4, 0x24]
- strh r1, [r4, 0x26]
- adds r0, r4, 0
- adds r0, 0x2E
- movs r2, 0x10
- bl memset
- movs r0, 0x40
- strh r0, [r4, 0x3A]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080871FC: .4byte gSprites
-_08087200: .4byte sub_80872F0
- thumb_func_end sub_80871C8
-
- thumb_func_start sub_8087204
-sub_8087204: @ 8087204
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _0808721C @ =gSprites
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- adds r2, r3
- strh r1, [r2, 0x3A]
- bx lr
- .align 2, 0
-_0808721C: .4byte gSprites
- thumb_func_end sub_8087204
-
- thumb_func_start sub_8087220
-sub_8087220: @ 8087220
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x3C
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _080872E2
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _0808727A
- ldrb r0, [r4, 0x1]
- movs r1, 0x3
- orrs r0, r1
- strb r0, [r4, 0x1]
- ldr r0, _0808725C @ =gUnknown_83CC1CC
- str r0, [r4, 0x10]
- adds r0, r4, 0
- bl InitSpriteAffineAnim
- adds r0, r4, 0
- movs r1, 0
- bl StartSpriteAffineAnim
- ldr r0, _08087260 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r0, [r0, 0x8]
- cmp r0, 0
- bne _08087264
- movs r0, 0x80
- b _08087266
- .align 2, 0
-_0808725C: .4byte gUnknown_83CC1CC
-_08087260: .4byte gSaveBlock2Ptr
-_08087264:
- movs r0, 0x76
-_08087266:
- strh r0, [r4, 0x20]
- ldr r0, _080872E8 @ =0x0000ffd0
- strh r0, [r4, 0x22]
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- movs r0, 0x40
- strh r0, [r4, 0x30]
- adds r0, 0xC0
- strh r0, [r4, 0x32]
-_0808727A:
- ldrh r0, [r4, 0x32]
- lsls r0, 16
- asrs r0, 24
- ldrh r1, [r4, 0x30]
- adds r0, r1
- strh r0, [r4, 0x30]
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- movs r1, 0x78
- bl Cos
- strh r0, [r4, 0x24]
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- movs r1, 0x78
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r2, [r4, 0x32]
- movs r0, 0x32
- ldrsh r1, [r4, r0]
- ldr r0, _080872EC @ =0x000007ff
- cmp r1, r0
- bgt _080872B0
- adds r0, r2, 0
- adds r0, 0x60
- strh r0, [r4, 0x32]
-_080872B0:
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- cmp r0, 0x81
- ble _080872E2
- ldrh r0, [r4, 0x3C]
- adds r0, 0x1
- strh r0, [r4, 0x3C]
- ldrb r1, [r4, 0x1]
- movs r0, 0x4
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x1]
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r0, 27
- bl FreeOamMatrix
- ldrb r1, [r4, 0x1]
- lsrs r1, 6
- ldrb r2, [r4, 0x3]
- lsrs r2, 6
- adds r0, r4, 0
- movs r3, 0
- bl CalcCenterToCornerVec
-_080872E2:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080872E8: .4byte 0x0000ffd0
-_080872EC: .4byte 0x000007ff
- thumb_func_end sub_8087220
-
- thumb_func_start sub_80872F0
-sub_80872F0: @ 80872F0
- push {r4,r5,lr}
- adds r4, r0, 0
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- movs r1, 0x8C
- bl Cos
- movs r5, 0
- strh r0, [r4, 0x24]
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- movs r1, 0x48
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x32]
- adds r0, 0x4
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0x32]
- movs r1, 0x3A
- ldrsh r0, [r4, r1]
- cmp r0, 0x40
- beq _0808734E
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _08087360 @ =gSprites
- adds r1, r0
- adds r3, r1, 0
- adds r3, 0x3E
- ldrb r2, [r3]
- movs r0, 0x3
- negs r0, r0
- ands r0, r2
- strb r0, [r3]
- ldrh r0, [r4, 0x24]
- ldrh r2, [r4, 0x20]
- adds r0, r2
- strh r0, [r1, 0x20]
- ldrh r0, [r4, 0x26]
- ldrh r2, [r4, 0x22]
- adds r0, r2
- subs r0, 0x8
- strh r0, [r1, 0x22]
- strh r5, [r1, 0x24]
- strh r5, [r1, 0x26]
-_0808734E:
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- cmp r0, 0x7F
- ble _0808735A
- movs r0, 0x1
- strh r0, [r4, 0x3C]
-_0808735A:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08087360: .4byte gSprites
- thumb_func_end sub_80872F0
-
- thumb_func_start sub_8087364
-sub_8087364: @ 8087364
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x3C
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _0808744E
- movs r2, 0x2E
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _080873C4
- ldrb r0, [r4, 0x1]
- movs r1, 0x3
- orrs r0, r1
- strb r0, [r4, 0x1]
- ldr r0, _080873A0 @ =gUnknown_83CC1CC
- str r0, [r4, 0x10]
- adds r0, r4, 0
- bl InitSpriteAffineAnim
- adds r0, r4, 0
- movs r1, 0x1
- bl StartSpriteAffineAnim
- ldr r0, _080873A4 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r0, [r0, 0x8]
- cmp r0, 0
- bne _080873A8
- movs r0, 0x70
- b _080873AA
- .align 2, 0
-_080873A0: .4byte gUnknown_83CC1CC
-_080873A4: .4byte gSaveBlock2Ptr
-_080873A8:
- movs r0, 0x64
-_080873AA:
- strh r0, [r4, 0x20]
- ldr r0, _08087454 @ =0x0000ffe0
- strh r0, [r4, 0x22]
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- movs r0, 0xF0
- strh r0, [r4, 0x30]
- movs r0, 0x80
- lsls r0, 4
- strh r0, [r4, 0x32]
- movs r0, 0x80
- strh r0, [r4, 0x36]
-_080873C4:
- ldrh r1, [r4, 0x32]
- lsls r1, 16
- asrs r1, 24
- ldrh r2, [r4, 0x30]
- adds r2, r1
- ldrh r0, [r4, 0x34]
- adds r0, r1
- strh r0, [r4, 0x34]
- movs r0, 0xFF
- ands r2, r0
- strh r2, [r4, 0x30]
- movs r3, 0x30
- ldrsh r0, [r4, r3]
- movs r1, 0x20
- bl Cos
- strh r0, [r4, 0x24]
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- movs r1, 0x78
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r1, [r4, 0x32]
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- movs r2, 0x80
- lsls r2, 1
- cmp r0, r2
- ble _08087406
- ldrh r0, [r4, 0x36]
- subs r0, r1, r0
- strh r0, [r4, 0x32]
-_08087406:
- ldrh r1, [r4, 0x36]
- movs r3, 0x36
- ldrsh r0, [r4, r3]
- cmp r0, 0xFF
- bgt _08087416
- adds r0, r1, 0
- adds r0, 0x18
- strh r0, [r4, 0x36]
-_08087416:
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- cmp r0, 0xFF
- bgt _08087420
- strh r2, [r4, 0x32]
-_08087420:
- movs r2, 0x34
- ldrsh r0, [r4, r2]
- cmp r0, 0x3B
- ble _0808744E
- ldrh r0, [r4, 0x3C]
- adds r0, 0x1
- strh r0, [r4, 0x3C]
- ldrb r1, [r4, 0x1]
- movs r0, 0x4
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x1]
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r0, 27
- bl FreeOamMatrix
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r2]
-_0808744E:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08087454: .4byte 0x0000ffe0
- thumb_func_end sub_8087364
-
- thumb_func_start sub_8087458
-sub_8087458: @ 8087458
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- bl sub_80871C8
- ldr r1, _0808747C @ =gSprites
- lsls r0, r4, 4
- adds r0, r4
- lsls r0, 2
- adds r1, 0x1C
- adds r0, r1
- ldr r1, _08087480 @ =sub_8087364
- str r1, [r0]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0808747C: .4byte gSprites
-_08087480: .4byte sub_8087364
- thumb_func_end sub_8087458
-
- thumb_func_start FldEff_FlyIn
-FldEff_FlyIn: @ 8087484
- push {lr}
- ldr r0, _08087494 @ =sub_8087498
- movs r1, 0xFE
- bl CreateTask
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_08087494: .4byte sub_8087498
- thumb_func_end FldEff_FlyIn
-
- thumb_func_start sub_8087498
-sub_8087498: @ 8087498
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _080874C0 @ =gUnknown_83CC1D4
- ldr r2, _080874C4 @ =gTasks
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r0, r2
- movs r2, 0x8
- ldrsh r1, [r0, r2]
- lsls r1, 2
- adds r1, r3
- ldr r1, [r1]
- bl _call_via_r1
- pop {r0}
- bx r0
- .align 2, 0
-_080874C0: .4byte gUnknown_83CC1D4
-_080874C4: .4byte gTasks
- thumb_func_end sub_8087498
-
- thumb_func_start sub_80874C8
-sub_80874C8: @ 80874C8
- push {r4-r6,lr}
- adds r6, r0, 0
- ldr r4, _080875B4 @ =gPlayerAvatar
- ldrb r1, [r4, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080875B8 @ =gObjectEvents
- adds r5, r0, r1
- adds r0, r5, 0
- bl ObjectEventIsMovementOverridden
- lsls r0, 24
- cmp r0, 0
- beq _080874F2
- adds r0, r5, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _080875AE
-_080874F2:
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
- movs r0, 0x21
- strh r0, [r6, 0xC]
- ldrb r0, [r4]
- strh r0, [r6, 0x26]
- movs r0, 0x1
- strb r0, [r4, 0x6]
- bl SetPlayerAvatarStateMask
- ldrh r1, [r6, 0x26]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _0808751A
- ldrb r0, [r5, 0x1A]
- movs r1, 0
- bl sub_80DC44C
-_0808751A:
- movs r0, 0x2
- bl GetPlayerAvatarGraphicsIdByStateId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r5, 0
- bl ObjectEventSetGraphicsId
- bl CameraObjectReset2
- adds r0, r5, 0
- movs r1, 0x3
- bl ObjectEventTurn
- ldrb r1, [r5, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r4, _080875BC @ =gSprites
- adds r0, r4
- movs r1, 0x16
- bl StartSpriteAnim
- ldrb r1, [r5, 0x1]
- movs r0, 0x21
- negs r0, r0
- ands r0, r1
- strb r0, [r5, 0x1]
- bl sub_8087168
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r6, 0xA]
- bl sub_80871C8
- ldrb r0, [r6, 0xA]
- ldrb r1, [r5, 0x4]
- bl sub_8087204
- movs r0, 0xA
- ldrsh r1, [r6, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- ldr r1, _080875C0 @ =gSaveBlock2Ptr
- ldr r1, [r1]
- ldrb r1, [r1, 0x8]
- lsls r1, 25
- movs r2, 0x80
- lsls r2, 18
- adds r1, r2
- lsrs r1, 24
- bl StartSpriteAnim
- movs r0, 0xA
- ldrsh r1, [r6, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r4
- movs r1, 0x1
- bl sub_80877FC
- movs r2, 0xA
- ldrsh r1, [r6, r2]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r4, 0x1C
- adds r0, r4
- ldr r1, _080875C4 @ =sub_8087828
- str r1, [r0]
-_080875AE:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080875B4: .4byte gPlayerAvatar
-_080875B8: .4byte gObjectEvents
-_080875BC: .4byte gSprites
-_080875C0: .4byte gSaveBlock2Ptr
-_080875C4: .4byte sub_8087828
- thumb_func_end sub_80874C8
-
- thumb_func_start sub_80875C8
-sub_80875C8: @ 80875C8
- push {r4-r6,lr}
- adds r5, r0, 0
- movs r0, 0xA
- ldrsh r1, [r5, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r6, _08087638 @ =gSprites
- adds r0, r6
- bl sub_80878C0
- ldrh r1, [r5, 0xC]
- movs r2, 0xC
- ldrsh r0, [r5, r2]
- cmp r0, 0
- beq _080875F2
- subs r0, r1, 0x1
- strh r0, [r5, 0xC]
- lsls r0, 16
- cmp r0, 0
- bne _08087630
-_080875F2:
- ldr r0, _0808763C @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08087640 @ =gObjectEvents
- adds r0, r1
- ldrb r0, [r0, 0x4]
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- adds r4, r6
- ldrb r0, [r5, 0xA]
- movs r1, 0x40
- bl sub_8087204
- ldrh r0, [r4, 0x24]
- ldrh r1, [r4, 0x20]
- adds r0, r1
- movs r1, 0
- strh r0, [r4, 0x20]
- ldrh r0, [r4, 0x26]
- ldrh r2, [r4, 0x22]
- adds r0, r2
- strh r0, [r4, 0x22]
- strh r1, [r4, 0x24]
- strh r1, [r4, 0x26]
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- strh r1, [r5, 0xC]
-_08087630:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08087638: .4byte gSprites
-_0808763C: .4byte gPlayerAvatar
-_08087640: .4byte gObjectEvents
- thumb_func_end sub_80875C8
-
- thumb_func_start sub_8087644
-sub_8087644: @ 8087644
- push {r4,lr}
- sub sp, 0x24
- adds r4, r0, 0
- ldr r1, _0808768C @ =gUnknown_83CC1F0
- mov r0, sp
- movs r2, 0x24
- bl memcpy
- ldr r0, _08087690 @ =gPlayerAvatar
- ldrb r0, [r0, 0x4]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _08087694 @ =gSprites
- adds r1, r0
- movs r2, 0xC
- ldrsh r0, [r4, r2]
- lsls r0, 1
- add r0, sp
- ldrh r0, [r0]
- strh r0, [r1, 0x26]
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x11
- ble _08087682
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_08087682:
- add sp, 0x24
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0808768C: .4byte gUnknown_83CC1F0
-_08087690: .4byte gPlayerAvatar
-_08087694: .4byte gSprites
- thumb_func_end sub_8087644
-
- thumb_func_start sub_8087698
-sub_8087698: @ 8087698
- push {r4-r6,lr}
- adds r6, r0, 0
- ldrb r0, [r6, 0xA]
- bl sub_80871AC
- lsls r0, 24
- cmp r0, 0
- beq _080876FC
- ldr r0, _08087704 @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- lsls r5, r0, 3
- adds r5, r0
- lsls r5, 2
- ldr r0, _08087708 @ =gObjectEvents
- adds r5, r0
- ldrb r0, [r5, 0x4]
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- ldr r0, _0808770C @ =gSprites
- adds r4, r0
- ldrb r1, [r5, 0x1]
- movs r0, 0x11
- negs r0, r0
- ands r0, r1
- strb r0, [r5, 0x1]
- movs r0, 0x10
- ldrsh r1, [r5, r0]
- movs r0, 0x12
- ldrsh r2, [r5, r0]
- adds r0, r5, 0
- bl sub_805F724
- movs r0, 0
- strh r0, [r4, 0x24]
- strh r0, [r4, 0x26]
- adds r4, 0x3E
- ldrb r0, [r4]
- movs r1, 0x2
- orrs r0, r1
- strb r0, [r4]
- bl sub_805CB70
- adds r0, r5, 0
- movs r1, 0x45
- bl ObjectEventSetHeldMovement
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
-_080876FC:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08087704: .4byte gPlayerAvatar
-_08087708: .4byte gObjectEvents
-_0808770C: .4byte gSprites
- thumb_func_end sub_8087698
-
- thumb_func_start sub_8087710
-sub_8087710: @ 8087710
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _08087740 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08087744 @ =gObjectEvents
- adds r0, r1
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _08087738
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- ldrb r0, [r4, 0xA]
- bl sub_8087458
-_08087738:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08087740: .4byte gPlayerAvatar
-_08087744: .4byte gObjectEvents
- thumb_func_end sub_8087710
-
- thumb_func_start sub_8087748
-sub_8087748: @ 8087748
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0xA]
- bl sub_80871AC
- lsls r0, 24
- cmp r0, 0
- beq _08087774
- movs r0, 0xA
- ldrsh r1, [r4, r0]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _0808777C @ =gSprites
- adds r0, r1
- bl DestroySprite
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x10
- strh r0, [r4, 0xA]
-_08087774:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0808777C: .4byte gSprites
- thumb_func_end sub_8087748
-
- thumb_func_start fishE
-fishE: @ 8087780
- push {r4-r7,lr}
- adds r5, r0, 0
- ldrh r0, [r5, 0xA]
- subs r0, 0x1
- strh r0, [r5, 0xA]
- lsls r0, 16
- cmp r0, 0
- bne _080877EA
- ldr r6, _080877F0 @ =gPlayerAvatar
- ldrb r1, [r6, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080877F4 @ =gObjectEvents
- adds r4, r0, r1
- movs r7, 0
- ldrh r1, [r5, 0x26]
- movs r0, 0x8
- ands r0, r1
- cmp r0, 0
- beq _080877B4
- movs r7, 0x2
- ldrb r0, [r4, 0x1A]
- movs r1, 0x1
- bl sub_80DC44C
-_080877B4:
- adds r0, r7, 0
- bl GetPlayerAvatarGraphicsIdByStateId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl ObjectEventSetGraphicsId
- adds r0, r4, 0
- movs r1, 0x1
- bl ObjectEventTurn
- ldrh r0, [r5, 0x26]
- strb r0, [r6]
- movs r0, 0
- strb r0, [r6, 0x6]
- movs r0, 0x20
- bl FieldEffectActiveListRemove
- ldr r0, _080877F8 @ =sub_8087498
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080877EA:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080877F0: .4byte gPlayerAvatar
-_080877F4: .4byte gObjectEvents
-_080877F8: .4byte sub_8087498
- thumb_func_end fishE
-
- thumb_func_start sub_80877FC
-sub_80877FC: @ 80877FC
- push {r4,r5,lr}
- adds r4, r0, 0
- lsls r5, r1, 24
- lsrs r5, 24
- ldrb r0, [r4, 0x1]
- movs r1, 0x3
- orrs r0, r1
- strb r0, [r4, 0x1]
- ldr r0, _08087824 @ =gUnknown_83CC23C
- str r0, [r4, 0x10]
- adds r0, r4, 0
- bl InitSpriteAffineAnim
- adds r0, r4, 0
- adds r1, r5, 0
- bl StartSpriteAffineAnim
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08087824: .4byte gUnknown_83CC23C
- thumb_func_end sub_80877FC
-
- thumb_func_start sub_8087828
-sub_8087828: @ 8087828
- push {r4,r5,lr}
- adds r4, r0, 0
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- movs r1, 0xB4
- bl Cos
- movs r5, 0
- strh r0, [r4, 0x24]
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- movs r1, 0x48
- bl Sin
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x32]
- adds r0, 0x2
- movs r1, 0xFF
- ands r0, r1
- strh r0, [r4, 0x32]
- movs r1, 0x3A
- ldrsh r0, [r4, r1]
- cmp r0, 0x40
- beq _08087886
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _080878BC @ =gSprites
- adds r1, r0
- adds r3, r1, 0
- adds r3, 0x3E
- ldrb r2, [r3]
- movs r0, 0x3
- negs r0, r0
- ands r0, r2
- strb r0, [r3]
- ldrh r0, [r4, 0x24]
- ldrh r2, [r4, 0x20]
- adds r0, r2
- strh r0, [r1, 0x20]
- ldrh r0, [r4, 0x26]
- ldrh r2, [r4, 0x22]
- adds r0, r2
- subs r0, 0x8
- strh r0, [r1, 0x22]
- strh r5, [r1, 0x24]
- strh r5, [r1, 0x26]
-_08087886:
- movs r1, 0x32
- ldrsh r0, [r4, r1]
- cmp r0, 0x7F
- ble _080878B4
- movs r0, 0x1
- strh r0, [r4, 0x3C]
- ldrb r1, [r4, 0x1]
- subs r0, 0x5
- ands r0, r1
- strb r0, [r4, 0x1]
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r0, 27
- bl FreeOamMatrix
- ldrb r1, [r4, 0x1]
- lsrs r1, 6
- ldrb r2, [r4, 0x3]
- lsrs r2, 6
- adds r0, r4, 0
- movs r3, 0
- bl CalcCenterToCornerVec
-_080878B4:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080878BC: .4byte gSprites
- thumb_func_end sub_8087828
-
- thumb_func_start sub_80878C0
-sub_80878C0: @ 80878C0
- push {r4-r6,lr}
- adds r4, r0, 0
- ldrb r5, [r4, 0x1]
- lsls r0, r5, 30
- cmp r0, 0
- beq _08087916
- ldr r1, _0808791C @ =gOamMatrices
- ldrb r0, [r4, 0x3]
- lsls r0, 26
- lsrs r3, r0, 27
- lsls r0, r3, 3
- adds r1, r0, r1
- movs r2, 0
- ldrsh r0, [r1, r2]
- movs r2, 0x80
- lsls r2, 1
- cmp r0, r2
- beq _080878EC
- movs r6, 0x6
- ldrsh r0, [r1, r6]
- cmp r0, r2
- bne _08087916
-_080878EC:
- movs r0, 0x4
- negs r0, r0
- ands r0, r5
- strb r0, [r4, 0x1]
- adds r0, r3, 0
- bl FreeOamMatrix
- ldrb r1, [r4, 0x1]
- lsrs r1, 6
- ldrb r2, [r4, 0x3]
- lsrs r2, 6
- adds r0, r4, 0
- movs r3, 0
- bl CalcCenterToCornerVec
- adds r0, r4, 0
- movs r1, 0
- bl StartSpriteAnim
- ldr r0, _08087920 @ =sub_80872F0
- str r0, [r4, 0x1C]
-_08087916:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0808791C: .4byte gOamMatrices
-_08087920: .4byte sub_80872F0
- thumb_func_end sub_80878C0
-
thumb_func_start sub_8087924
sub_8087924: @ 8087924
push {r4-r7,lr}
diff --git a/data/field_effect.s b/data/field_effect.s
index 63142e981..529205a57 100644
--- a/data/field_effect.s
+++ b/data/field_effect.s
@@ -6,60 +6,6 @@
.section .rodata
.align 2
-sUseFlyEffectFuncs:: @ 83CC178 dataptr (incomplete)
- .4byte UseFlyEffect_1
- .4byte UseFlyEffect_2
- .4byte UseFlyEffect_3
- .4byte UseFlyEffect_4
- .4byte UseFlyEffect_5
- .4byte UseFlyEffect_6
- .4byte UseFlyEffect_7
- .4byte UseFlyEffect_8
- .4byte UseFlyEffect_9
-
-gUnknown_83CC19C:: @ 83CC19C affineanimcmd
- obj_rot_scal_anim_frame 8, 8, 226, 0
- obj_rot_scal_anim_frame 28, 28, 0, 30
- obj_rot_scal_anim_end
-
-gUnknown_83CC1B4:: @ 83CC1B4 affineanimcmd
- obj_rot_scal_anim_frame 256, 256, 64, 0
- obj_rot_scal_anim_frame -10, -10, 0, 22
- obj_rot_scal_anim_end
-
- .align 2
-gUnknown_83CC1CC:: @ 83CC1CC dataptr
- .4byte gUnknown_83CC19C
- .4byte gUnknown_83CC1B4
-
- .align 2
-gUnknown_83CC1D4:: @ 83CC1D4 dataptr
- .4byte sub_80874C8
- .4byte sub_80875C8
- .4byte sub_8087644
- .4byte sub_8087698
- .4byte sub_8087710
- .4byte sub_8087748
- .4byte fishE
-
-gUnknown_83CC1F0:: @ 83CC1F0 data16
- .2byte 0xfffe, 0xfffc, 0xfffb, 0xfffa, 0xfff9, 0xfff8, 0xfff8, 0xfff8, 0xfff9, 0xfff9, 0xfffa, 0xfffb, 0xfffd, 0xfffe, 0x0000, 0x0002
- .2byte 0x0004, 0x0008
-
-gUnknown_83CC214:: @ 83CC214 affineanimcmd
- obj_rot_scal_anim_frame 24, 24, 0, 1
- obj_rot_scal_anim_jump 0
-
-gUnknown_83CC224:: @ 83CC224 affineanimcmd
- obj_rot_scal_anim_frame 512, 512, 0, 1
- obj_rot_scal_anim_frame -16, -16, 0, 1
- obj_rot_scal_anim_jump 1
-
- .align 2
-gUnknown_83CC23C:: @ 83CC23C dataptr
- .4byte gUnknown_83CC214
- .4byte gUnknown_83CC224
-
gUnknown_83CC244:: @ 83CC244 dataptr
.4byte sub_8087C00
.4byte sub_8087C2C
diff --git a/include/event_object_movement.h b/include/event_object_movement.h
index 1e63727fb..edc5c8b11 100644
--- a/include/event_object_movement.h
+++ b/include/event_object_movement.h
@@ -131,5 +131,6 @@ extern const struct OamData gObjectEventBaseOam_32x32;
extern const struct UCoords16 gUnknown_83A64C8[];
extern const u16 gUnknown_8398648[];
extern const u16 gUnknown_8398688[];
+void sub_805F724(struct ObjectEvent *, s16 x, s16 y);
#endif // GUARD_EVENT_OBJECT_MOVEMENT_H
diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h
index e1a56a26c..c3e5ae29a 100644
--- a/include/field_effect_helpers.h
+++ b/include/field_effect_helpers.h
@@ -15,6 +15,7 @@
u8 sub_8154228(void);
bool8 sub_8155DA0(struct ObjectEvent *);
void sub_80DC44C(u8, u8);
+void sub_80DC478(u8, u8);
void StartAshFieldEffect(s16, s16, u16, s16);
#endif //GUARD_FIELD_EFFECT_HELPERS_H
diff --git a/src/field_effect.c b/src/field_effect.c
index 3b710167d..81b572893 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -3039,3 +3039,588 @@ void UseVsSeekerEffect_4(struct Task * task)
DestroyTask(FindTaskIdByFunc(Task_FldEffUseVsSeeker));
}
}
+
+void sub_8086D94(struct Sprite * sprite);
+
+u8 FldEff_NpcFlyOut(void)
+{
+ u8 spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1);
+ struct Sprite * sprite = &gSprites[spriteId];
+
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_8086D94;
+ sprite->data[1] = gFieldEffectArguments[0];
+ PlaySE(SE_W019);
+ return spriteId;
+}
+
+void sub_8086D94(struct Sprite * sprite)
+{
+ struct Sprite * npcSprite;
+
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[0])
+ {
+ npcSprite = &gSprites[sprite->data[1]];
+ npcSprite->coordOffsetEnabled = 0;
+ npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ npcSprite->pos2.x = 0;
+ npcSprite->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT);
+ }
+}
+
+void Task_UseFly(u8 taskId);
+void UseFlyEffect_1(struct Task * task);
+void UseFlyEffect_2(struct Task * task);
+void UseFlyEffect_3(struct Task * task);
+void UseFlyEffect_4(struct Task * task);
+void UseFlyEffect_5(struct Task * task);
+void UseFlyEffect_6(struct Task * task);
+void UseFlyEffect_7(struct Task * task);
+void UseFlyEffect_8(struct Task * task);
+void UseFlyEffect_9(struct Task * task);
+u8 sub_8087168(void);
+bool8 sub_80871AC(u8 flyBlobSpriteId);
+void sub_80871C8(u8 flyBlobSpriteId);
+void sub_8087204(u8 flyBlobSpriteId, u8 playerSpriteId);
+void sub_8087220(struct Sprite * sprite);
+void sub_80872F0(struct Sprite * sprite);
+void sub_80877FC(struct Sprite * sprite, u8 affineAnimId);
+void sub_8087828(struct Sprite * sprite);
+
+void (*const sUseFlyEffectFuncs[])(struct Task * ) = {
+ UseFlyEffect_1,
+ UseFlyEffect_2,
+ UseFlyEffect_3,
+ UseFlyEffect_4,
+ UseFlyEffect_5,
+ UseFlyEffect_6,
+ UseFlyEffect_7,
+ UseFlyEffect_8,
+ UseFlyEffect_9
+};
+
+u8 FldEff_UseFly(void)
+{
+ u8 taskId = CreateTask(Task_UseFly, 0xfe);
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
+ return 0;
+}
+
+void Task_UseFly(u8 taskId)
+{
+ sUseFlyEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void UseFlyEffect_1(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(1);
+ sub_805CB70();
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+void UseFlyEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ gFieldEffectArguments[0] = task->data[1];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ }
+}
+
+void UseFlyEffect_3(struct Task * task)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (task->data[15] & 0x08)
+ {
+ sub_80DC44C(objectEvent->mapobj_unk_1A, 2);
+ sub_80DC478(objectEvent->mapobj_unk_1A, 0);
+ }
+ task->data[1] = sub_8087168();
+ task->data[0]++;
+ }
+}
+
+void UseFlyEffect_4(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ task->data[0]++;
+ task->data[2] = 16;
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], MOVEMENT_ACTION_FACE_LEFT);
+ }
+}
+
+void UseFlyEffect_5(struct Task * task)
+{
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if ((task->data[2] == 0 || (--task->data[2]) == 0) && ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ PlaySE(SE_W019);
+ sub_80871C8(task->data[1]);
+ }
+}
+
+void UseFlyEffect_6(struct Task * task)
+{
+ if ((++task->data[2]) >= 8)
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
+ StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16);
+ objectEvent->inanimate = 1;
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT);
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+void UseFlyEffect_7(struct Task * task)
+{
+ if ((++task->data[2]) >= 10)
+ {
+ struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ ObjectEventClearAnimIfSpecialAnimActive(objectEvent);
+ objectEvent->inanimate = 0;
+ objectEvent->hasShadow = 0;
+ sub_8087204(task->data[1], objectEvent->spriteId);
+ StartSpriteAnim(&gSprites[task->data[1]], gSaveBlock2Ptr->playerGender * 2 + 1);
+ sub_80877FC(&gSprites[task->data[1]], 0);
+ gSprites[task->data[1]].callback = sub_8087828;
+ CameraObjectReset2();
+ task->data[0]++;
+ }
+}
+
+void UseFlyEffect_8(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ WarpFadeOutScreen();
+ task->data[0]++;
+ }
+}
+
+void UseFlyEffect_9(struct Task * task)
+{
+ if (!gPaletteFade.active)
+ {
+ FieldEffectActiveListRemove(FLDEFF_USE_FLY);
+ DestroyTask(FindTaskIdByFunc(Task_UseFly));
+ }
+}
+
+u8 sub_8087168(void)
+{
+ u8 spriteId;
+ struct Sprite * sprite;
+ spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1);
+ sprite = &gSprites[spriteId];
+ sprite->oam.paletteNum = 0;
+ sprite->oam.priority = 1;
+ sprite->callback = sub_8087220;
+ return spriteId;
+}
+
+u8 sub_80871AC(u8 spriteId)
+{
+ return gSprites[spriteId].data[7];
+}
+
+void sub_80871C8(u8 spriteId)
+{
+ struct Sprite * sprite;
+ sprite = &gSprites[spriteId];
+ sprite->callback = sub_80872F0;
+ sprite->pos1.x = 0x78;
+ sprite->pos1.y = 0x00;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */);
+ sprite->data[6] = 0x40;
+}
+
+void sub_8087204(u8 a0, u8 a1)
+{
+ gSprites[a0].data[6] = a1;
+}
+
+const union AffineAnimCmd gUnknown_83CC19C[] = {
+ AFFINEANIMCMD_FRAME( 8, 8, 226, 0),
+ AFFINEANIMCMD_FRAME(28, 28, 0, 30),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gUnknown_83CC1B4[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 64, 0),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 22),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gUnknown_83CC1CC[] = {
+ gUnknown_83CC19C,
+ gUnknown_83CC1B4
+};
+
+void sub_8087220(struct Sprite * sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = gUnknown_83CC1CC;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 0);
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ sprite->pos1.x = 0x80;
+ else
+ sprite->pos1.x = 0x76;
+ sprite->pos1.y = -0x30;
+ sprite->data[0]++;
+ sprite->data[1] = 0x40;
+ sprite->data[2] = 0x100;
+ }
+ sprite->data[1] += (sprite->data[2] >> 8);
+ sprite->pos2.x = Cos(sprite->data[1], 0x78);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] < 0x800)
+ {
+ sprite->data[2] += 0x60;
+ }
+ if (sprite->data[1] > 0x81)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ }
+ }
+}
+
+void sub_80872F0(struct Sprite * sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[6] != MAX_SPRITES)
+ {
+ struct Sprite * sprite1 = &gSprites[sprite->data[6]];
+ sprite1->coordOffsetEnabled = 0;
+ sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ sprite1->pos2.x = 0;
+ sprite1->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ sprite->data[7] = 1;
+ }
+}
+
+void sub_8087364(struct Sprite * sprite)
+{
+ if (sprite->data[7] == 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = gUnknown_83CC1CC;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, 1);
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ sprite->pos1.x = 0x70;
+ else
+ sprite->pos1.x = 0x64;
+ sprite->pos1.y = -0x20;
+ sprite->data[0]++;
+ sprite->data[1] = 0xf0;
+ sprite->data[2] = 0x800;
+ sprite->data[4] = 0x80;
+ }
+ sprite->data[1] += sprite->data[2] >> 8;
+ sprite->data[3] += sprite->data[2] >> 8;
+ sprite->data[1] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[1], 0x20);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] > 0x100)
+ {
+ sprite->data[2] -= sprite->data[4];
+ }
+ if (sprite->data[4] < 0x100)
+ {
+ sprite->data[4] += 24;
+ }
+ if (sprite->data[2] < 0x100)
+ {
+ sprite->data[2] = 0x100;
+ }
+ if (sprite->data[3] >= 60)
+ {
+ sprite->data[7]++;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->invisible = TRUE;
+ }
+ }
+}
+
+void sub_8087458(u8 spriteId)
+{
+ sub_80871C8(spriteId);
+ gSprites[spriteId].callback = sub_8087364;
+}
+
+void Task_FldEffFlyIn(u8 taskId);
+void FlyInEffect_1(struct Task * task);
+void FlyInEffect_2(struct Task * task);
+void FlyInEffect_3(struct Task * task);
+void FlyInEffect_4(struct Task * task);
+void FlyInEffect_5(struct Task * task);
+void FlyInEffect_6(struct Task * task);
+void FlyInEffect_7(struct Task * task);
+void sub_80878C0(struct Sprite * sprite);
+
+void (*const sFlyInEffectFuncs[])(struct Task * task) = {
+ FlyInEffect_1,
+ FlyInEffect_2,
+ FlyInEffect_3,
+ FlyInEffect_4,
+ FlyInEffect_5,
+ FlyInEffect_6,
+ FlyInEffect_7
+};
+
+u32 FldEff_FlyIn(void)
+{
+ CreateTask(Task_FldEffFlyIn, 0xfe);
+ return 0;
+}
+
+void Task_FldEffFlyIn(u8 taskId)
+{
+ sFlyInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void FlyInEffect_1(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent))
+ {
+ task->data[0]++;
+ task->data[2] = 33;
+ task->data[15] = gPlayerAvatar.flags;
+ gPlayerAvatar.preventStep = TRUE;
+ SetPlayerAvatarStateMask(0x01);
+ if (task->data[15] & 0x08)
+ {
+ sub_80DC44C(objectEvent->mapobj_unk_1A, 0);
+ }
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2));
+ CameraObjectReset2();
+ ObjectEventTurn(objectEvent, DIR_WEST);
+ StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16);
+ objectEvent->invisible = FALSE;
+ task->data[1] = sub_8087168();
+ sub_80871C8(task->data[1]);
+ sub_8087204(task->data[1], objectEvent->spriteId);
+ StartSpriteAnim(&gSprites[task->data[1]], gSaveBlock2Ptr->playerGender * 2 + 2);
+ sub_80877FC(&gSprites[task->data[1]], 1);
+ gSprites[task->data[1]].callback = sub_8087828;
+ }
+}
+
+void FlyInEffect_2(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * sprite;
+ sub_80878C0(&gSprites[task->data[1]]);
+ if (task->data[2] == 0 || (--task->data[2]) == 0)
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ sprite = &gSprites[objectEvent->spriteId];
+ sub_8087204(task->data[1], 0x40);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[2] = 0;
+ }
+}
+
+void FlyInEffect_3(struct Task * task)
+{
+ s16 gUnknown_83CC1F0[18] = {
+ -2,
+ -4,
+ -5,
+ -6,
+ -7,
+ -8,
+ -8,
+ -8,
+ -7,
+ -7,
+ -6,
+ -5,
+ -3,
+ -2,
+ 0,
+ 2,
+ 4,
+ 8
+ };
+ struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId];
+ sprite->pos2.y = gUnknown_83CC1F0[task->data[2]];
+ if ((++task->data[2]) >= 18)
+ {
+ task->data[0]++;
+ }
+}
+
+void FlyInEffect_4(struct Task * task)
+{
+ struct ObjectEvent * objectEvent;
+ struct Sprite * sprite;
+ if (sub_80871AC(task->data[1]))
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ sprite = &gSprites[objectEvent->spriteId];
+ objectEvent->inanimate = 0;
+ sub_805F724(objectEvent, objectEvent->currentCoords.x, objectEvent->currentCoords.y);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->coordOffsetEnabled = 1;
+ sub_805CB70();
+ ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
+ task->data[0]++;
+ }
+}
+
+void FlyInEffect_5(struct Task * task)
+{
+ if (ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gPlayerAvatar.objectEventId]))
+ {
+ task->data[0]++;
+ sub_8087458(task->data[1]);
+ }
+}
+
+void FlyInEffect_6(struct Task * task)
+{
+ if (sub_80871AC(task->data[1]))
+ {
+ DestroySprite(&gSprites[task->data[1]]);
+ task->data[0]++;
+ task->data[1] = 0x10;
+ }
+}
+
+void FlyInEffect_7(struct Task * task)
+{
+ u8 state;
+ struct ObjectEvent * objectEvent;
+ if ((--task->data[1]) == 0)
+ {
+ objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ state = 0;
+ if (task->data[15] & 0x08)
+ {
+ state = 2;
+ sub_80DC44C(objectEvent->mapobj_unk_1A, 1);
+ }
+ ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(state));
+ ObjectEventTurn(objectEvent, DIR_SOUTH);
+ gPlayerAvatar.flags = task->data[15];
+ gPlayerAvatar.preventStep = FALSE;
+ FieldEffectActiveListRemove(FLDEFF_FLY_IN);
+ DestroyTask(FindTaskIdByFunc(Task_FldEffFlyIn));
+ }
+}
+
+const union AffineAnimCmd gUnknown_83CC214[] = {
+ AFFINEANIMCMD_FRAME(24, 24, 0, 1),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+const union AffineAnimCmd gUnknown_83CC224[] = {
+ AFFINEANIMCMD_FRAME(512, 512, 0, 1),
+ AFFINEANIMCMD_FRAME(-16, -16, 0, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+const union AffineAnimCmd *const gUnknown_83CC23C[] = {
+ gUnknown_83CC214,
+ gUnknown_83CC224
+};
+
+void sub_80877FC(struct Sprite * sprite, u8 affineAnimId)
+{
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ sprite->affineAnims = gUnknown_83CC23C;
+ InitSpriteAffineAnim(sprite);
+ StartSpriteAffineAnim(sprite, affineAnimId);
+}
+
+void sub_8087828(struct Sprite * sprite)
+{
+ struct Sprite * sprite2;
+ sprite->pos2.x = Cos(sprite->data[2], 0xB4);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] += 2;
+ sprite->data[2] &= 0xFF;
+ if (sprite->data[6] != MAX_SPRITES)
+ {
+ sprite2 = &gSprites[sprite->data[6]];
+ sprite2->coordOffsetEnabled = FALSE;
+ sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x;
+ sprite2->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
+ sprite2->pos2.x = 0;
+ sprite2->pos2.y = 0;
+ }
+ if (sprite->data[2] >= 0x80)
+ {
+ sprite->data[7] = 1;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ }
+}
+
+void sub_80878C0(struct Sprite * sprite)
+{
+ if (sprite->oam.affineMode != ST_OAM_AFFINE_OFF)
+ {
+ if (gOamMatrices[sprite->oam.matrixNum].a == 0x100 || gOamMatrices[sprite->oam.matrixNum].d == 0x100)
+ {
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, ST_OAM_AFFINE_OFF);
+ StartSpriteAnim(sprite, 0);
+ sprite->callback = sub_80872F0;
+ }
+ }
+}