summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-28 14:14:34 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-28 14:14:34 -0500
commitfb56341fe4fedeeca53b17fc693b4b3dd7824ff2 (patch)
tree4bb969ea461216bcc639a001a867c5630091559e
parent8f42b7b56d887b6bca517499a841c259652af372 (diff)
Escape Rope field effect
-rw-r--r--asm/field_effect.s745
-rw-r--r--data/field_effect.s13
-rw-r--r--include/overworld.h1
-rw-r--r--src/field_effect.c246
4 files changed, 247 insertions, 758 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index 7e95d422c..ae5af2898 100644
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -5,751 +5,6 @@
.text
- thumb_func_start FldEff_PopOutOfAsh
-FldEff_PopOutOfAsh: @ 80855A0
- push {r4,lr}
- ldr r4, _080855F8 @ =gFieldEffectArguments
- adds r1, r4, 0x4
- adds r0, r4, 0
- movs r2, 0x8
- movs r3, 0x8
- bl sub_8063BC4
- ldr r0, _080855FC @ =gFieldEffectObjectTemplatePointers
- adds r0, 0x80
- ldr r0, [r0]
- movs r2, 0
- ldrsh r1, [r4, r2]
- movs r3, 0x4
- ldrsh r2, [r4, r3]
- ldrb r3, [r4, 0x8]
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08085600 @ =gSprites
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- adds r2, r1
- movs r1, 0x3
- ldrb r3, [r4, 0xC]
- ands r3, r1
- lsls r3, 2
- ldrb r4, [r2, 0x5]
- movs r1, 0xD
- negs r1, r1
- ands r1, r4
- orrs r1, r3
- strb r1, [r2, 0x5]
- adds r2, 0x3E
- ldrb r1, [r2]
- movs r3, 0x2
- orrs r1, r3
- strb r1, [r2]
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080855F8: .4byte gFieldEffectArguments
-_080855FC: .4byte gFieldEffectObjectTemplatePointers
-_08085600: .4byte gSprites
- thumb_func_end FldEff_PopOutOfAsh
-
- thumb_func_start SpriteCB_PopOutOfAsh
-SpriteCB_PopOutOfAsh: @ 8085604
- push {lr}
- adds r2, r0, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _0808561C
- adds r0, r2, 0
- movs r1, 0x31
- bl FieldEffectStop
-_0808561C:
- pop {r0}
- bx r0
- thumb_func_end SpriteCB_PopOutOfAsh
-
- thumb_func_start StartEscapeRopeFieldEffect
-StartEscapeRopeFieldEffect: @ 8085620
- push {lr}
- bl ScriptContext2_Enable
- bl FreezeObjectEvents
- ldr r0, _08085638 @ =Task_DoEscapeRopeFieldEffect
- movs r1, 0x50
- bl CreateTask
- pop {r0}
- bx r0
- .align 2, 0
-_08085638: .4byte Task_DoEscapeRopeFieldEffect
- thumb_func_end StartEscapeRopeFieldEffect
-
- thumb_func_start Task_DoEscapeRopeFieldEffect
-Task_DoEscapeRopeFieldEffect: @ 808563C
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08085664 @ =gEscapeRopeFieldEffectFuncs
- ldr r2, _08085668 @ =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
-_08085664: .4byte gEscapeRopeFieldEffectFuncs
-_08085668: .4byte gTasks
- thumb_func_end Task_DoEscapeRopeFieldEffect
-
- thumb_func_start EscapeRopeFieldEffect_Step0
-EscapeRopeFieldEffect_Step0: @ 808566C
- push {r4,r5,lr}
- adds r4, r0, 0
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- movs r5, 0
- strh r0, [r4, 0x8]
- movs r0, 0x40
- strh r0, [r4, 0x22]
- bl GetPlayerFacingDirection
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x24]
- strh r5, [r4, 0x26]
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end EscapeRopeFieldEffect_Step0
-
- thumb_func_start EscapeRopeFieldEffect_Step1
-EscapeRopeFieldEffect_Step1: @ 8085690
- push {r4-r6,lr}
- adds r5, r0, 0
- ldr r0, _080856D4 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _080856D8 @ =gObjectEvents
- adds r6, r0, r1
- adds r4, r5, 0
- adds r4, 0x8
- adds r1, r5, 0
- adds r1, 0xA
- adds r2, r5, 0
- adds r2, 0xC
- adds r0, r6, 0
- bl sub_808576C
- ldrh r1, [r4, 0x6]
- movs r2, 0x6
- ldrsh r0, [r4, r2]
- cmp r0, 0x3B
- bgt _080856DC
- adds r0, r1, 0x1
- strh r0, [r4, 0x6]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x14
- bne _08085702
- movs r0, 0x27
- bl PlaySE
- b _08085702
- .align 2, 0
-_080856D4: .4byte gPlayerAvatar
-_080856D8: .4byte gObjectEvents
-_080856DC:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _08085702
- adds r1, r5, 0
- adds r1, 0x12
- adds r2, r5, 0
- adds r2, 0x14
- adds r0, r6, 0
- bl sub_80857F0
- cmp r0, 0
- bne _08085702
- bl TryFadeOutOldMapMusic
- bl WarpFadeOutScreen
- movs r0, 0x1
- strh r0, [r4, 0x8]
-_08085702:
- movs r2, 0x8
- ldrsh r0, [r4, r2]
- cmp r0, 0x1
- bne _08085750
- ldr r0, _08085758 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08085750
- bl BGMusicStopped
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08085750
- ldrh r1, [r5, 0x26]
- lsls r1, 24
- lsrs r1, 24
- adds r0, r6, 0
- bl ObjectEventSetDirection
- bl sub_80555E0
- bl WarpIntoMap
- ldr r1, _0808575C @ =gFieldCallback
- ldr r0, _08085760 @ =FieldCallback_EscapeRopeExit
- str r0, [r1]
- ldr r0, _08085764 @ =CB2_LoadMap
- bl SetMainCallback2
- ldr r0, _08085768 @ =Task_DoEscapeRopeFieldEffect
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_08085750:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08085758: .4byte gPaletteFade
-_0808575C: .4byte gFieldCallback
-_08085760: .4byte FieldCallback_EscapeRopeExit
-_08085764: .4byte CB2_LoadMap
-_08085768: .4byte Task_DoEscapeRopeFieldEffect
- thumb_func_end EscapeRopeFieldEffect_Step1
-
- thumb_func_start sub_808576C
-sub_808576C: @ 808576C
- push {r4-r7,lr}
- adds r4, r0, 0
- adds r6, r1, 0
- adds r5, r2, 0
- bl ObjectEventIsMovementOverridden
- lsls r0, 24
- cmp r0, 0
- beq _0808578A
- adds r0, r4, 0
- bl ObjectEventClearHeldMovementIfFinished
- lsls r0, 24
- cmp r0, 0
- beq _080857E4
-_0808578A:
- ldrh r1, [r6]
- movs r2, 0
- ldrsh r0, [r6, r2]
- cmp r0, 0
- beq _0808579E
- subs r0, r1, 0x1
- strh r0, [r6]
- lsls r0, 16
- cmp r0, 0
- bne _080857E4
-_0808579E:
- ldr r7, _080857E0 @ =gUnknown_83CC0E8
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- adds r0, r7
- ldrb r0, [r0]
- bl GetFaceDirectionMovementAction
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl ObjectEventSetHeldMovement
- ldrh r1, [r5]
- movs r2, 0
- ldrsh r0, [r5, r2]
- cmp r0, 0xB
- bgt _080857C8
- adds r0, r1, 0x1
- strh r0, [r5]
-_080857C8:
- movs r0, 0
- ldrsh r1, [r5, r0]
- movs r0, 0xC
- asrs r0, r1
- strh r0, [r6]
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- adds r0, r7
- ldrb r0, [r0]
- b _080857EA
- .align 2, 0
-_080857E0: .4byte gUnknown_83CC0E8
-_080857E4:
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
-_080857EA:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_808576C
-
- thumb_func_start sub_80857F0
-sub_80857F0: @ 80857F0
- push {r4-r7,lr}
- adds r7, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- ldrb r0, [r7, 0x4]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _08085818 @ =gSprites
- adds r4, r1, r0
- movs r1, 0
- ldrsh r0, [r5, r1]
- cmp r0, 0x1
- beq _08085830
- cmp r0, 0x1
- bgt _0808581C
- cmp r0, 0
- beq _08085826
- b _0808589A
- .align 2, 0
-_08085818: .4byte gSprites
-_0808581C:
- cmp r0, 0x2
- beq _08085878
- cmp r0, 0x3
- beq _08085896
- b _0808589A
-_08085826:
- bl CameraObjectReset2
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_08085830:
- ldrh r0, [r4, 0x26]
- subs r0, 0x8
- strh r0, [r4, 0x26]
- ldrh r0, [r6]
- subs r0, 0x8
- strh r0, [r6]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x10
- negs r1, r1
- cmp r0, r1
- bgt _0808589A
- ldrb r0, [r7, 0x3]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r7, 0x3]
- ldrb r1, [r4, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- orrs r0, r2
- strb r0, [r4, 0x5]
- adds r1, r4, 0
- adds r1, 0x43
- movs r0, 0
- strb r0, [r1]
- adds r2, r4, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0x3F
- ands r0, r1
- strb r0, [r2]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _0808589A
-_08085878:
- ldrh r0, [r4, 0x26]
- subs r0, 0x8
- strh r0, [r4, 0x26]
- ldrh r0, [r6]
- subs r0, 0x8
- strh r0, [r6]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x58
- negs r1, r1
- cmp r0, r1
- bgt _0808589A
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_08085896:
- movs r0, 0
- b _0808589C
-_0808589A:
- movs r0, 0x1
-_0808589C:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80857F0
-
- thumb_func_start sub_80858A4
-sub_80858A4: @ 80858A4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r6, r0, 0
- adds r5, r1, 0
- adds r7, r2, 0
- mov r9, r3
- ldr r0, [sp, 0x20]
- mov r10, r0
- ldrb r0, [r6, 0x4]
- lsls r1, r0, 4
- adds r1, r0
- lsls r1, 2
- ldr r0, _080858D8 @ =gSprites
- adds r4, r1, r0
- movs r1, 0
- ldrsh r0, [r5, r1]
- cmp r0, 0x1
- beq _08085948
- cmp r0, 0x1
- bgt _080858DC
- cmp r0, 0
- beq _080858E6
- b _080859C2
- .align 2, 0
-_080858D8: .4byte gSprites
-_080858DC:
- cmp r0, 0x2
- beq _0808599C
- cmp r0, 0x3
- beq _080859BE
- b _080859C2
-_080858E6:
- bl CameraObjectReset2
- movs r2, 0x58
- negs r2, r2
- adds r0, r2, 0
- strh r0, [r7]
- ldrh r0, [r4, 0x26]
- subs r0, 0x58
- movs r3, 0
- strh r0, [r4, 0x26]
- ldrb r0, [r4, 0x5]
- lsls r0, 28
- lsrs r0, 30
- mov r1, r9
- strh r0, [r1]
- movs r2, 0x43
- adds r2, r4
- mov r8, r2
- ldrb r0, [r2]
- mov r1, r10
- strh r0, [r1]
- movs r2, 0x42
- adds r2, r4
- mov r12, r2
- ldrb r0, [r2]
- lsrs r0, 6
- ldr r1, [sp, 0x24]
- strh r0, [r1]
- ldrb r0, [r6, 0x3]
- movs r2, 0x4
- orrs r0, r2
- strb r0, [r6, 0x3]
- ldrb r1, [r4, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- orrs r0, r2
- strb r0, [r4, 0x5]
- mov r2, r8
- strb r3, [r2]
- mov r0, r12
- ldrb r1, [r0]
- movs r0, 0x3F
- ands r0, r1
- mov r1, r12
- strb r0, [r1]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_08085948:
- ldrh r0, [r4, 0x26]
- adds r0, 0x4
- strh r0, [r4, 0x26]
- ldrh r0, [r7]
- adds r0, 0x4
- strh r0, [r7]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x10
- negs r1, r1
- cmp r0, r1
- blt _080859C2
- movs r0, 0x3
- mov r2, r9
- ldrb r1, [r2]
- ands r1, r0
- lsls r1, 2
- ldrb r2, [r4, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0x5]
- mov r1, r10
- ldrh r0, [r1]
- adds r1, r4, 0
- adds r1, 0x43
- strb r0, [r1]
- ldr r2, [sp, 0x24]
- ldrb r1, [r2]
- adds r3, r4, 0
- adds r3, 0x42
- lsls r1, 6
- ldrb r2, [r3]
- movs r0, 0x3F
- ands r0, r2
- orrs r0, r1
- strb r0, [r3]
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
- b _080859C2
-_0808599C:
- ldrh r0, [r4, 0x26]
- adds r0, 0x4
- strh r0, [r4, 0x26]
- ldrh r0, [r7]
- adds r0, 0x4
- strh r0, [r7]
- lsls r0, 16
- cmp r0, 0
- blt _080859C2
- movs r0, 0x1E
- bl PlaySE
- bl CameraObjectReset1
- ldrh r0, [r5]
- adds r0, 0x1
- strh r0, [r5]
-_080859BE:
- movs r0, 0
- b _080859C4
-_080859C2:
- movs r0, 0x1
-_080859C4:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80858A4
-
- thumb_func_start FieldCallback_EscapeRopeExit
-FieldCallback_EscapeRopeExit: @ 80859D4
- push {lr}
- bl Overworld_PlaySpecialMapMusic
- bl WarpFadeInScreen
- bl sub_8111CF0
- bl ScriptContext2_Enable
- bl FreezeObjectEvents
- ldr r1, _08085A14 @ =gFieldCallback
- movs r0, 0
- str r0, [r1]
- ldr r2, _08085A18 @ =gObjectEvents
- ldr r0, _08085A1C @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- ldrb r1, [r0, 0x1]
- movs r2, 0x20
- orrs r1, r2
- strb r1, [r0, 0x1]
- ldr r0, _08085A20 @ =Task_DoEscapeRopeExitFieldEffect
- movs r1, 0
- bl CreateTask
- pop {r0}
- bx r0
- .align 2, 0
-_08085A14: .4byte gFieldCallback
-_08085A18: .4byte gObjectEvents
-_08085A1C: .4byte gPlayerAvatar
-_08085A20: .4byte Task_DoEscapeRopeExitFieldEffect
- thumb_func_end FieldCallback_EscapeRopeExit
-
- thumb_func_start Task_DoEscapeRopeExitFieldEffect
-Task_DoEscapeRopeExitFieldEffect: @ 8085A24
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08085A4C @ =sEscapeRopeExitEffectFuncs
- ldr r2, _08085A50 @ =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
-_08085A4C: .4byte sEscapeRopeExitEffectFuncs
-_08085A50: .4byte gTasks
- thumb_func_end Task_DoEscapeRopeExitFieldEffect
-
- thumb_func_start EscapeRopeExitFieldEffect_Step0
-EscapeRopeExitFieldEffect_Step0: @ 8085A54
- push {r4,lr}
- adds r4, r0, 0
- bl IsWeatherNotFadingIn
- lsls r0, 24
- cmp r0, 0
- beq _08085A78
- movs r0, 0x28
- bl PlaySE
- bl GetPlayerFacingDirection
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_08085A78:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end EscapeRopeExitFieldEffect_Step0
-
- thumb_func_start EscapeRopeExitFieldEffect_Step1
-EscapeRopeExitFieldEffect_Step1: @ 8085A80
- push {r4-r7,lr}
- sub sp, 0x8
- adds r4, r0, 0
- adds r5, r4, 0
- adds r5, 0x8
- ldr r0, _08085AD4 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085AD8 @ =gObjectEvents
- adds r6, r0, r1
- adds r1, r4, 0
- adds r1, 0xA
- adds r2, r4, 0
- adds r2, 0xC
- adds r3, r4, 0
- adds r3, 0xE
- adds r0, r5, 0
- adds r0, 0x8
- str r0, [sp]
- adds r0, r4, 0
- adds r0, 0x12
- str r0, [sp, 0x4]
- adds r0, r6, 0
- bl sub_80858A4
- adds r7, r0, 0
- ldrb r1, [r6, 0x1]
- movs r0, 0x21
- negs r0, r0
- ands r0, r1
- strb r0, [r6, 0x1]
- ldrh r1, [r5, 0xC]
- movs r2, 0xC
- ldrsh r0, [r5, r2]
- cmp r0, 0x7
- bgt _08085ADC
- adds r0, r1, 0x1
- strh r0, [r5, 0xC]
- b _08085B10
- .align 2, 0
-_08085AD4: .4byte gPlayerAvatar
-_08085AD8: .4byte gObjectEvents
-_08085ADC:
- movs r2, 0xE
- ldrsh r0, [r5, r2]
- cmp r0, 0
- bne _08085B10
- adds r0, r1, 0x1
- strh r0, [r5, 0xC]
- adds r1, r4, 0
- adds r1, 0x1A
- adds r2, r4, 0
- adds r2, 0x1C
- adds r0, r6, 0
- bl sub_808576C
- lsls r0, 24
- lsrs r1, r0, 24
- strh r1, [r5, 0x10]
- movs r2, 0xC
- ldrsh r0, [r5, r2]
- cmp r0, 0x31
- ble _08085B10
- movs r2, 0x1E
- ldrsh r0, [r5, r2]
- cmp r1, r0
- bne _08085B10
- movs r0, 0x1
- strh r0, [r5, 0xE]
-_08085B10:
- cmp r7, 0
- bne _08085B58
- movs r0, 0x10
- ldrsh r1, [r5, r0]
- movs r2, 0x1E
- ldrsh r0, [r5, r2]
- cmp r1, r0
- bne _08085B58
- adds r0, r6, 0
- bl ObjectEventCheckHeldMovementStatus
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08085B58
- ldrb r1, [r6, 0x1]
- movs r0, 0x21
- negs r0, r0
- ands r0, r1
- strb r0, [r6, 0x1]
- ldrb r1, [r6, 0x3]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- strb r0, [r6, 0x3]
- bl ScriptContext2_Disable
- bl UnfreezeObjectEvents
- ldr r0, _08085B60 @ =Task_DoEscapeRopeExitFieldEffect
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_08085B58:
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08085B60: .4byte Task_DoEscapeRopeExitFieldEffect
- thumb_func_end EscapeRopeExitFieldEffect_Step1
-
thumb_func_start CreateTeleportFieldEffectTask
CreateTeleportFieldEffectTask: @ 8085B64
push {lr}
diff --git a/data/field_effect.s b/data/field_effect.s
index c3fd0f35f..baa7625a7 100644
--- a/data/field_effect.s
+++ b/data/field_effect.s
@@ -7,19 +7,6 @@
.align 2
.align 2
-gEscapeRopeFieldEffectFuncs:: @ 83CC0E0 dataptr
- .4byte EscapeRopeFieldEffect_Step0
- .4byte EscapeRopeFieldEffect_Step1
-
-gUnknown_83CC0E8:: @ 83CC0E8 data8
- .byte 0x01, 0x03, 0x04, 0x02, 0x01
-
- .align 2
-sEscapeRopeExitEffectFuncs:: @ 83CC0F0 dataptr
- .4byte EscapeRopeExitFieldEffect_Step0
- .4byte EscapeRopeExitFieldEffect_Step1
-
- .align 2
sTeleportEffectFuncs:: @ 83CC0F8 dataptr
.4byte TeleportFieldEffectTask1
.4byte TeleportFieldEffectTask2
diff --git a/include/overworld.h b/include/overworld.h
index 90c11443f..d613b5f41 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -82,6 +82,7 @@ void sub_8084DD4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
void sub_8084E2C(s8, s8, s8, s8, s8);
void sub_8084E80(s8, s8, s8, s8, s8);
void sub_8084EBC(s16, s16);
+void sub_80555E0(void);
void player_avatar_init_params_reset(void);
diff --git a/src/field_effect.c b/src/field_effect.c
index 81ba91b1c..4886a4729 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1983,3 +1983,249 @@ bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *objectEv
}
return FALSE;
}
+
+u8 FldEff_PopOutOfAsh(void)
+{
+ u8 spriteId;
+ sub_8063BC4((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
+ gSprites[spriteId].coordOffsetEnabled = 1;
+ return spriteId;
+}
+
+void SpriteCB_PopOutOfAsh(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH);
+ }
+}
+
+void Task_DoEscapeRopeFieldEffect(u8 taskId);
+void EscapeRopeFieldEffect_Step0(struct Task * task);
+void EscapeRopeFieldEffect_Step1(struct Task * task);
+u8 sub_808576C(struct ObjectEvent * playerObj, s16 *a1p, s16 *a2p);
+bool32 sub_80857F0(struct ObjectEvent * playerObj, s16 *a1p, s16 *a2p);
+void FieldCallback_EscapeRopeExit(void);
+void Task_DoEscapeRopeExitFieldEffect(u8 taskId);
+void EscapeRopeExitFieldEffect_Step0(struct Task * task);
+void EscapeRopeExitFieldEffect_Step1(struct Task * task);
+
+void (*const gEscapeRopeFieldEffectFuncs[])(struct Task * task) = {
+ EscapeRopeFieldEffect_Step0,
+ EscapeRopeFieldEffect_Step1
+};
+
+const u8 gUnknown_83CC0E8[] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_WEST] = DIR_NORTH,
+ [DIR_NORTH] = DIR_EAST,
+ [DIR_EAST] = DIR_SOUTH,
+};
+
+void (*const sEscapeRopeExitEffectFuncs[])(struct Task * task) = {
+ EscapeRopeExitFieldEffect_Step0,
+ EscapeRopeExitFieldEffect_Step1
+};
+
+void StartEscapeRopeFieldEffect(void)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CreateTask(Task_DoEscapeRopeFieldEffect, 80);
+}
+
+void Task_DoEscapeRopeFieldEffect(u8 taskId)
+{
+ gEscapeRopeFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void EscapeRopeFieldEffect_Step0(struct Task * task)
+{
+ task->data[0]++;
+ task->data[13] = 64;
+ task->data[14] = GetPlayerFacingDirection();
+ task->data[15] = 0;
+}
+
+void EscapeRopeFieldEffect_Step1(struct Task * task)
+{
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ s16 *data = task->data;
+ sub_808576C(playerObj, &task->data[1], &task->data[2]);
+ if (data[3] < 60)
+ {
+ data[3]++;
+ if (data[3] == 20)
+ {
+ PlaySE(SE_TK_WARPIN);
+ }
+ }
+ else if (data[4] == 0 && !sub_80857F0(playerObj, &task->data[5], &task->data[6]))
+ {
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ data[4] = 1;
+ }
+ if (data[4] == 1 && !gPaletteFade.active && BGMusicStopped() == TRUE)
+ {
+ ObjectEventSetDirection(playerObj, task->data[15]);
+ sub_80555E0();
+ WarpIntoMap();
+ gFieldCallback = FieldCallback_EscapeRopeExit;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(FindTaskIdByFunc(Task_DoEscapeRopeFieldEffect));
+ }
+}
+
+
+u8 sub_808576C(struct ObjectEvent * playerObj, s16 *delay_p, s16 *stage_p)
+{
+ if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))
+ {
+ if (*delay_p != 0 && --(*delay_p) != 0)
+ return playerObj->facingDirection;
+ ObjectEventSetHeldMovement(playerObj, GetFaceDirectionMovementAction(gUnknown_83CC0E8[playerObj->facingDirection]));
+ if (*stage_p < 12)
+ (*stage_p)++;
+ *delay_p = 12 >> (*stage_p); // 12 >> 4 = 0
+ return gUnknown_83CC0E8[playerObj->facingDirection];
+ }
+ return playerObj->facingDirection;
+}
+
+bool32 sub_80857F0(struct ObjectEvent * playerObj, s16 *state_p, s16 *y_p)
+{
+ struct Sprite * sprite = &gSprites[playerObj->spriteId];
+ switch (*state_p)
+ {
+ case 0:
+ CameraObjectReset2();
+ (*state_p)++;
+ // fallthrough
+ case 1:
+ sprite->pos2.y -= 8;
+ (*y_p) -= 8;
+ if (*y_p <= -16)
+ {
+ playerObj->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ (*state_p)++;
+ }
+ break;
+ case 2:
+ sprite->pos2.y -= 8;
+ (*y_p) -= 8;
+ if (*y_p <= -88)
+ {
+ (*state_p)++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool32 sub_80858A4(struct ObjectEvent * playerObj, s16 *state_p, s16 *y_p, s16 *priority_p, s16 *subpriority_p, s16 *subspriteMode_p)
+{
+ struct Sprite * sprite = &gSprites[playerObj->spriteId];
+ switch (*state_p)
+ {
+ case 0:
+ CameraObjectReset2();
+ *y_p = -88;
+ sprite->pos2.y -= 88;
+ *priority_p = sprite->oam.priority;
+ *subpriority_p = sprite->subpriority;
+ *subspriteMode_p = sprite->subspriteMode;
+ playerObj->fixedPriority = TRUE;
+ sprite->oam.priority = 1;
+ sprite->subpriority = 0;
+ sprite->subspriteMode = SUBSPRITES_OFF;
+ (*state_p)++;
+ // fallthrough
+ case 1:
+ sprite->pos2.y += 4;
+ (*y_p) += 4;
+ if (*y_p >= -16)
+ {
+ sprite->oam.priority = *priority_p;
+ sprite->subpriority = *subpriority_p;
+ sprite->subspriteMode = *subspriteMode_p;
+ (*state_p)++;
+ }
+ break;
+ case 2:
+ sprite->pos2.y += 4;
+ (*y_p) += 4;
+ if (*y_p >= 0)
+ {
+ PlaySE(SE_TK_KASYA);
+ CameraObjectReset1();
+ (*state_p)++;
+ return FALSE;
+ }
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void FieldCallback_EscapeRopeExit(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ CreateTask(Task_DoEscapeRopeExitFieldEffect, 0);
+}
+
+void Task_DoEscapeRopeExitFieldEffect(u8 taskId)
+{
+ sEscapeRopeExitEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void EscapeRopeExitFieldEffect_Step0(struct Task * task)
+{
+ if (IsWeatherNotFadingIn())
+ {
+ PlaySE(SE_TK_WARPOUT);
+ task->data[15] = GetPlayerFacingDirection();
+ task->data[0]++;
+ }
+}
+
+void EscapeRopeExitFieldEffect_Step1(struct Task * task)
+{
+ s16 *data = task->data;
+ struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
+ bool32 finished = sub_80858A4(playerObj, &data[1], &data[2], &data[3], &data[4], &data[5]);
+ playerObj->invisible = FALSE;
+ if (data[6] < 8)
+ data[6]++;
+ else if (data[7] == 0)
+ {
+ data[6]++;
+ data[8] = sub_808576C(playerObj, &data[9], &data[10]);
+ if (data[6] >= 50 && data[8] == data[15])
+ data[7] = 1;
+ }
+ if (!finished && data[8] == data[15] && ObjectEventCheckHeldMovementStatus(playerObj) == TRUE)
+ {
+ playerObj->invisible = FALSE;
+ playerObj->fixedPriority = FALSE;
+ ScriptContext2_Disable();
+ UnfreezeObjectEvents();
+ DestroyTask(FindTaskIdByFunc(Task_DoEscapeRopeExitFieldEffect));
+ }
+}