summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-28 14:26:54 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-28 14:26:54 -0500
commit410aaa00ff6bb8d0e9dae755b60e216be24b9660 (patch)
tree973607a45fe544614c9bd2f03908cb83ce2e0ccd
parentfb56341fe4fedeeca53b17fc693b4b3dd7824ff2 (diff)
Teleport field effect
-rw-r--r--asm/field_effect.s599
-rw-r--r--data/field_effect.s16
-rw-r--r--include/overworld.h1
-rw-r--r--src/field_effect.c265
4 files changed, 236 insertions, 645 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index ae5af2898..825682f09 100644
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -5,605 +5,6 @@
.text
- thumb_func_start CreateTeleportFieldEffectTask
-CreateTeleportFieldEffectTask: @ 8085B64
- push {lr}
- ldr r0, _08085B74 @ =Task_DoTeleportFieldEffect
- movs r1, 0
- bl CreateTask
- pop {r0}
- bx r0
- .align 2, 0
-_08085B74: .4byte Task_DoTeleportFieldEffect
- thumb_func_end CreateTeleportFieldEffectTask
-
- thumb_func_start Task_DoTeleportFieldEffect
-Task_DoTeleportFieldEffect: @ 8085B78
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08085BA0 @ =sTeleportEffectFuncs
- ldr r2, _08085BA4 @ =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
-_08085BA0: .4byte sTeleportEffectFuncs
-_08085BA4: .4byte gTasks
- thumb_func_end Task_DoTeleportFieldEffect
-
- thumb_func_start TeleportFieldEffectTask1
-TeleportFieldEffectTask1: @ 8085BA8
- push {r4,lr}
- adds r4, r0, 0
- bl ScriptContext2_Enable
- bl FreezeObjectEvents
- bl CameraObjectReset2
- bl GetPlayerFacingDirection
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0x26]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end TeleportFieldEffectTask1
-
- thumb_func_start TeleportFieldEffectTask2
-TeleportFieldEffectTask2: @ 8085BD0
- push {r4,r5,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldr r1, _08085C54 @ =gUnknown_83CC108
- mov r0, sp
- movs r2, 0x5
- bl memcpy
- ldr r0, _08085C58 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085C5C @ =gObjectEvents
- adds r5, r0, r1
- ldrh r1, [r4, 0xA]
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- cmp r0, 0
- beq _08085C02
- subs r0, r1, 0x1
- strh r0, [r4, 0xA]
- lsls r0, 16
- cmp r0, 0
- bne _08085C1C
-_08085C02:
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- add r0, sp
- ldrb r1, [r0]
- adds r0, r5, 0
- bl ObjectEventTurn
- movs r0, 0x8
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- strh r0, [r4, 0xC]
-_08085C1C:
- movs r1, 0xC
- ldrsh r0, [r4, r1]
- cmp r0, 0x7
- ble _08085C4A
- movs r2, 0x26
- ldrsh r1, [r4, r2]
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- cmp r1, r0
- bne _08085C4A
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x4
- strh r0, [r4, 0xA]
- movs r0, 0x8
- strh r0, [r4, 0xC]
- movs r0, 0x1
- strh r0, [r4, 0xE]
- movs r0, 0x27
- bl PlaySE
-_08085C4A:
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08085C54: .4byte gUnknown_83CC108
-_08085C58: .4byte gPlayerAvatar
-_08085C5C: .4byte gObjectEvents
- thumb_func_end TeleportFieldEffectTask2
-
- thumb_func_start TeleportFieldEffectTask3
-TeleportFieldEffectTask3: @ 8085C60
- push {r4,r5,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldr r1, _08085D24 @ =gUnknown_83CC108
- mov r0, sp
- movs r2, 0x5
- bl memcpy
- ldr r2, _08085D28 @ =gPlayerAvatar
- ldrb r1, [r2, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085D2C @ =gObjectEvents
- adds r3, r0, r1
- ldrb r1, [r2, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085D30 @ =gSprites
- adds r5, r0, r1
- ldrh r0, [r4, 0xA]
- subs r0, 0x1
- strh r0, [r4, 0xA]
- lsls r0, 16
- cmp r0, 0
- bgt _08085CAA
- movs r0, 0x4
- strh r0, [r4, 0xA]
- ldrb r0, [r3, 0x18]
- lsls r0, 28
- lsrs r0, 28
- add r0, sp
- ldrb r1, [r0]
- adds r0, r3, 0
- bl ObjectEventTurn
-_08085CAA:
- ldrh r0, [r5, 0x22]
- ldrh r1, [r4, 0xE]
- subs r0, r1
- strh r0, [r5, 0x22]
- ldrh r1, [r4, 0xE]
- ldrh r2, [r4, 0x10]
- adds r0, r1, r2
- strh r0, [r4, 0x10]
- ldrh r0, [r4, 0xC]
- subs r0, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- cmp r0, 0
- bgt _08085CD6
- movs r0, 0x4
- strh r0, [r4, 0xC]
- lsls r0, r1, 16
- asrs r0, 16
- cmp r0, 0x7
- bgt _08085CD6
- lsls r0, r1, 1
- strh r0, [r4, 0xE]
-_08085CD6:
- movs r1, 0x10
- ldrsh r0, [r4, r1]
- cmp r0, 0x8
- ble _08085D04
- ldrb r1, [r5, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r5, 0x5]
- adds r2, r5, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0xC0
- ands r0, r1
- cmp r0, 0
- beq _08085D04
- movs r0, 0x3F
- ands r0, r1
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r2]
-_08085D04:
- movs r2, 0x10
- ldrsh r0, [r4, r2]
- cmp r0, 0xA7
- ble _08085D1A
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- bl TryFadeOutOldMapMusic
- bl WarpFadeOutScreen
-_08085D1A:
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08085D24: .4byte gUnknown_83CC108
-_08085D28: .4byte gPlayerAvatar
-_08085D2C: .4byte gObjectEvents
-_08085D30: .4byte gSprites
- thumb_func_end TeleportFieldEffectTask3
-
- thumb_func_start TeleportFieldEffectTask4
-TeleportFieldEffectTask4: @ 8085D34
- push {lr}
- ldr r0, _08085D74 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _08085D70
- bl BGMusicStopped
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08085D70
- bl copy_saved_warp3_bank_and_enter_x_to_warp1
- bl WarpIntoMap
- ldr r0, _08085D78 @ =CB2_LoadMap
- bl SetMainCallback2
- ldr r1, _08085D7C @ =gFieldCallback
- ldr r0, _08085D80 @ =FieldCallback_TeleportIn
- str r0, [r1]
- ldr r0, _08085D84 @ =Task_DoTeleportFieldEffect
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_08085D70:
- pop {r0}
- bx r0
- .align 2, 0
-_08085D74: .4byte gPaletteFade
-_08085D78: .4byte CB2_LoadMap
-_08085D7C: .4byte gFieldCallback
-_08085D80: .4byte FieldCallback_TeleportIn
-_08085D84: .4byte Task_DoTeleportFieldEffect
- thumb_func_end TeleportFieldEffectTask4
-
- thumb_func_start FieldCallback_TeleportIn
-FieldCallback_TeleportIn: @ 8085D88
- push {lr}
- bl Overworld_PlaySpecialMapMusic
- bl WarpFadeInScreen
- bl sub_8111CF0
- bl ScriptContext2_Enable
- bl FreezeObjectEvents
- ldr r1, _08085DCC @ =gFieldCallback
- movs r0, 0
- str r0, [r1]
- ldr r2, _08085DD0 @ =gObjectEvents
- ldr r0, _08085DD4 @ =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]
- bl CameraObjectReset2
- ldr r0, _08085DD8 @ =Task_DoTeleportInFieldEffect
- movs r1, 0
- bl CreateTask
- pop {r0}
- bx r0
- .align 2, 0
-_08085DCC: .4byte gFieldCallback
-_08085DD0: .4byte gObjectEvents
-_08085DD4: .4byte gPlayerAvatar
-_08085DD8: .4byte Task_DoTeleportInFieldEffect
- thumb_func_end FieldCallback_TeleportIn
-
- thumb_func_start Task_DoTeleportInFieldEffect
-Task_DoTeleportInFieldEffect: @ 8085DDC
- push {lr}
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r3, _08085E04 @ =sTeleportInEffectFuncs
- ldr r2, _08085E08 @ =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
-_08085E04: .4byte sTeleportInEffectFuncs
-_08085E08: .4byte gTasks
- thumb_func_end Task_DoTeleportInFieldEffect
-
- thumb_func_start TeleportInFieldEffectTask1
-TeleportInFieldEffectTask1: @ 8085E0C
- push {r4-r6,lr}
- adds r6, r0, 0
- bl IsWeatherNotFadingIn
- lsls r0, 24
- cmp r0, 0
- beq _08085E82
- ldr r5, _08085E88 @ =gPlayerAvatar
- ldrb r0, [r5, 0x4]
- lsls r2, r0, 4
- adds r2, r0
- lsls r2, 2
- ldr r0, _08085E8C @ =gSprites
- adds r2, r0
- adds r0, r2, 0
- adds r0, 0x29
- movs r4, 0
- ldrsb r4, [r0, r4]
- lsls r0, r4, 17
- negs r0, r0
- ldrh r1, [r2, 0x22]
- ldr r3, _08085E90 @ =gSpriteCoordOffsetY
- adds r1, r4
- ldrh r3, [r3]
- adds r1, r3
- asrs r0, 16
- adds r0, r1
- negs r0, r0
- strh r0, [r2, 0x26]
- ldr r3, _08085E94 @ =gObjectEvents
- ldrb r0, [r5, 0x5]
- lsls r1, r0, 3
- adds r1, r0
- lsls r1, 2
- adds r1, r3
- ldrb r3, [r1, 0x1]
- movs r0, 0x21
- negs r0, r0
- ands r0, r3
- strb r0, [r1, 0x1]
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
- movs r0, 0x8
- strh r0, [r6, 0xA]
- movs r0, 0x1
- strh r0, [r6, 0xC]
- adds r2, 0x42
- ldrb r0, [r2]
- lsrs r0, 6
- strh r0, [r6, 0x24]
- bl GetPlayerFacingDirection
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r6, 0x26]
- movs r0, 0x27
- bl PlaySE
-_08085E82:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08085E88: .4byte gPlayerAvatar
-_08085E8C: .4byte gSprites
-_08085E90: .4byte gSpriteCoordOffsetY
-_08085E94: .4byte gObjectEvents
- thumb_func_end TeleportInFieldEffectTask1
-
- thumb_func_start TeleportInFieldEffectTask2
-TeleportInFieldEffectTask2: @ 8085E98
- push {r4-r7,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldr r1, _08085F00 @ =gUnknown_83CC108
- mov r0, sp
- movs r2, 0x5
- bl memcpy
- ldr r2, _08085F04 @ =gPlayerAvatar
- ldrb r1, [r2, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085F08 @ =gObjectEvents
- adds r6, r0, r1
- ldrb r1, [r2, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08085F0C @ =gSprites
- adds r5, r0, r1
- ldrh r0, [r4, 0xA]
- ldrh r1, [r5, 0x26]
- adds r0, r1
- strh r0, [r5, 0x26]
- lsls r0, 16
- asrs r0, 16
- movs r1, 0x8
- negs r1, r1
- cmp r0, r1
- blt _08085F10
- ldrh r1, [r4, 0x22]
- movs r2, 0x22
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _08085F36
- adds r0, r1, 0x1
- strh r0, [r4, 0x22]
- ldrb r0, [r6]
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r6]
- ldrh r1, [r4, 0x24]
- adds r3, r5, 0
- adds r3, 0x42
- lsls r1, 6
- ldrb r2, [r3]
- movs r0, 0x3F
- ands r0, r2
- orrs r0, r1
- strb r0, [r3]
- b _08085F36
- .align 2, 0
-_08085F00: .4byte gUnknown_83CC108
-_08085F04: .4byte gPlayerAvatar
-_08085F08: .4byte gObjectEvents
-_08085F0C: .4byte gSprites
-_08085F10:
- ldrb r1, [r5, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r5, 0x5]
- adds r2, r5, 0
- adds r2, 0x42
- ldrb r1, [r2]
- movs r0, 0xC0
- ands r0, r1
- cmp r0, 0
- beq _08085F36
- movs r0, 0x3F
- ands r0, r1
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r2]
-_08085F36:
- ldrh r2, [r5, 0x26]
- movs r3, 0x26
- ldrsh r1, [r5, r3]
- movs r0, 0x30
- negs r0, r0
- cmp r1, r0
- blt _08085F5A
- ldrh r1, [r4, 0xA]
- movs r3, 0xA
- ldrsh r0, [r4, r3]
- cmp r0, 0x1
- ble _08085F5A
- movs r0, 0x1
- ands r0, r2
- cmp r0, 0
- bne _08085F5A
- subs r0, r1, 0x1
- strh r0, [r4, 0xA]
-_08085F5A:
- ldrh r0, [r4, 0xC]
- subs r0, 0x1
- movs r7, 0
- strh r0, [r4, 0xC]
- lsls r0, 16
- cmp r0, 0
- bne _08085F7C
- movs r0, 0x4
- strh r0, [r4, 0xC]
- ldrb r0, [r6, 0x18]
- lsls r0, 28
- lsrs r0, 28
- add r0, sp
- ldrb r1, [r0]
- adds r0, r6, 0
- bl ObjectEventTurn
-_08085F7C:
- movs r1, 0x26
- ldrsh r0, [r5, r1]
- cmp r0, 0
- blt _08085F92
- strh r7, [r5, 0x26]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
- strh r0, [r4, 0xA]
- strh r7, [r4, 0xC]
-_08085F92:
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end TeleportInFieldEffectTask2
-
- thumb_func_start TeleportInFieldEffectTask3
-TeleportInFieldEffectTask3: @ 8085F9C
- push {r4,r5,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldr r1, _08086018 @ =gUnknown_83CC108
- mov r0, sp
- movs r2, 0x5
- bl memcpy
- ldr r0, _0808601C @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _08086020 @ =gObjectEvents
- adds r5, r0, r1
- ldrh r0, [r4, 0xA]
- subs r0, 0x1
- strh r0, [r4, 0xA]
- lsls r0, 16
- cmp r0, 0
- bne _08086010
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- add r0, sp
- ldrb r1, [r0]
- adds r0, r5, 0
- bl ObjectEventTurn
- movs r0, 0x8
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x4
- ble _08086010
- movs r0, 0x24
- ldrsh r1, [r4, r0]
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- cmp r1, r0
- bne _08086010
- bl ScriptContext2_Disable
- bl CameraObjectReset1
- bl UnfreezeObjectEvents
- ldr r0, _08086024 @ =Task_DoTeleportInFieldEffect
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_08086010:
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08086018: .4byte gUnknown_83CC108
-_0808601C: .4byte gPlayerAvatar
-_08086020: .4byte gObjectEvents
-_08086024: .4byte Task_DoTeleportInFieldEffect
- thumb_func_end TeleportInFieldEffectTask3
-
thumb_func_start FldEff_FieldMoveShowMon
FldEff_FieldMoveShowMon: @ 8086028
push {r4,lr}
diff --git a/data/field_effect.s b/data/field_effect.s
index baa7625a7..3629040b3 100644
--- a/data/field_effect.s
+++ b/data/field_effect.s
@@ -7,22 +7,6 @@
.align 2
.align 2
-sTeleportEffectFuncs:: @ 83CC0F8 dataptr
- .4byte TeleportFieldEffectTask1
- .4byte TeleportFieldEffectTask2
- .4byte TeleportFieldEffectTask3
- .4byte TeleportFieldEffectTask4
-
-gUnknown_83CC108:: @ 83CC108 data8
- .byte 0x01, 0x03, 0x04, 0x02, 0x01
-
- .align 2
-sTeleportInEffectFuncs:: @ 83CC110 dataptr
- .4byte TeleportInFieldEffectTask1
- .4byte TeleportInFieldEffectTask2
- .4byte TeleportInFieldEffectTask3
-
- .align 2
sShowMonOutdoorsEffectFuncs:: @ 83CC11C dataptr
.4byte ShowMonEffect_Outdoors_1
.4byte ShowMonEffect_Outdoors_2
diff --git a/include/overworld.h b/include/overworld.h
index d613b5f41..51e94fe63 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -83,6 +83,7 @@ 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 copy_saved_warp3_bank_and_enter_x_to_warp1(void);
void player_avatar_init_params_reset(void);
diff --git a/src/field_effect.c b/src/field_effect.c
index 4886a4729..6657265dd 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1265,16 +1265,6 @@ bool8 (*const sEscalatorWarpFieldEffectFuncs[])(struct Task * task) = {
EscalatorWarpEffect_6
};
-bool8 (*const sEscalatorWarpInFieldEffectFuncs[])(struct Task * task) = {
- EscalatorWarpInEffect_1,
- EscalatorWarpInEffect_2,
- EscalatorWarpInEffect_3,
- EscalatorWarpInEffect_4,
- EscalatorWarpInEffect_5,
- EscalatorWarpInEffect_6,
- EscalatorWarpInEffect_7
-};
-
void StartEscalatorWarp(u8 metatileBehavior, u8 priority)
{
u8 taskId = CreateTask(Task_EscalatorWarpFieldEffect, priority);
@@ -1400,6 +1390,16 @@ void Escalator_TransitionToWarpInEffect(void)
}
}
+bool8 (*const sEscalatorWarpInFieldEffectFuncs[])(struct Task * task) = {
+ EscalatorWarpInEffect_1,
+ EscalatorWarpInEffect_2,
+ EscalatorWarpInEffect_3,
+ EscalatorWarpInEffect_4,
+ EscalatorWarpInEffect_5,
+ EscalatorWarpInEffect_6,
+ EscalatorWarpInEffect_7
+};
+
void FieldCB_EscalatorWarpIn(void)
{
Overworld_PlaySpecialMapMusic();
@@ -1691,13 +1691,6 @@ bool8 (*const sLavaridgeGymB1FWarpEffectFuncs[])(struct Task * task, struct Obje
LavaridgeGymB1FWarpEffect_6
};
-bool8 (*const sLavaridgeGymB1FWarpExitEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = {
- LavaridgeGymB1FWarpExitEffect_1,
- LavaridgeGymB1FWarpExitEffect_2,
- LavaridgeGymB1FWarpExitEffect_3,
- LavaridgeGymB1FWarpExitEffect_4
-};
-
void StartLavaridgeGymB1FWarp(u8 priority)
{
CreateTask(Task_LavaridgeGymB1FWarp, priority);
@@ -1810,6 +1803,13 @@ bool8 LavaridgeGymB1FWarpEffect_6(struct Task * task, struct ObjectEvent * objec
return FALSE;
}
+bool8 (*const sLavaridgeGymB1FWarpExitEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = {
+ LavaridgeGymB1FWarpExitEffect_1,
+ LavaridgeGymB1FWarpExitEffect_2,
+ LavaridgeGymB1FWarpExitEffect_3,
+ LavaridgeGymB1FWarpExitEffect_4
+};
+
void FieldCB_LavaridgeGymB1FWarpExit(void)
{
Overworld_PlaySpecialMapMusic();
@@ -2017,19 +2017,6 @@ void (*const gEscapeRopeFieldEffectFuncs[])(struct Task * task) = {
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();
@@ -2080,6 +2067,13 @@ void EscapeRopeFieldEffect_Step1(struct Task * task)
}
}
+const u8 gUnknown_83CC0E8[] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_WEST] = DIR_NORTH,
+ [DIR_NORTH] = DIR_EAST,
+ [DIR_EAST] = DIR_SOUTH,
+};
u8 sub_808576C(struct ObjectEvent * playerObj, s16 *delay_p, s16 *stage_p)
{
@@ -2132,6 +2126,11 @@ bool32 sub_80857F0(struct ObjectEvent * playerObj, s16 *state_p, s16 *y_p)
return TRUE;
}
+void (*const sEscapeRopeExitEffectFuncs[])(struct Task * task) = {
+ EscapeRopeExitFieldEffect_Step0,
+ EscapeRopeExitFieldEffect_Step1
+};
+
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];
@@ -2229,3 +2228,209 @@ void EscapeRopeExitFieldEffect_Step1(struct Task * task)
DestroyTask(FindTaskIdByFunc(Task_DoEscapeRopeExitFieldEffect));
}
}
+
+void Task_DoTeleportFieldEffect(u8 taskId);
+void TeleportFieldEffectTask1(struct Task * task);
+void TeleportFieldEffectTask2(struct Task * task);
+void TeleportFieldEffectTask3(struct Task * task);
+void TeleportFieldEffectTask4(struct Task * task);
+void FieldCallback_TeleportIn(void);
+void Task_DoTeleportInFieldEffect(u8 taskId);
+void TeleportInFieldEffectTask1(struct Task * task);
+void TeleportInFieldEffectTask2(struct Task * task);
+void TeleportInFieldEffectTask3(struct Task * task);
+
+void (*const sTeleportEffectFuncs[])(struct Task *) = {
+ TeleportFieldEffectTask1,
+ TeleportFieldEffectTask2,
+ TeleportFieldEffectTask3,
+ TeleportFieldEffectTask4
+};
+
+void CreateTeleportFieldEffectTask(void)
+{
+ CreateTask(Task_DoTeleportFieldEffect, 0);
+}
+
+void Task_DoTeleportFieldEffect(u8 taskId)
+{
+ sTeleportEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void TeleportFieldEffectTask1(struct Task *task)
+{
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ CameraObjectReset2();
+ task->data[15] = GetPlayerFacingDirection();
+ task->data[0]++;
+}
+
+void TeleportFieldEffectTask2(struct Task *task)
+{
+ u8 spinDirections[5] = {
+ [DIR_NONE] = DIR_SOUTH,
+ [DIR_SOUTH] = DIR_WEST,
+ [DIR_WEST] = DIR_NORTH,
+ [DIR_NORTH] = DIR_EAST,
+ [DIR_EAST] = DIR_SOUTH
+ };
+ struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if (task->data[1] == 0 || (--task->data[1]) == 0)
+ {
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ task->data[1] = 8;
+ task->data[2]++;
+ }
+ if (task->data[2] > 7 && task->data[15] == objectEvent->facingDirection)
+ {
+ task->data[0]++;
+ task->data[1] = 4;
+ task->data[2] = 8;
+ task->data[3] = 1;
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+void TeleportFieldEffectTask3(struct Task *task)
+{
+ u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+ struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((--task->data[1]) <= 0)
+ {
+ task->data[1] = 4;
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ }
+ sprite->pos1.y -= task->data[3];
+ task->data[4] += task->data[3];
+ if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8))
+ {
+ task->data[3] <<= 1;
+ }
+ if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != SUBSPRITES_OFF))
+ {
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ if (task->data[4] >= 0xa8)
+ {
+ task->data[0]++;
+ TryFadeOutOldMapMusic();
+ WarpFadeOutScreen();
+ }
+}
+
+void TeleportFieldEffectTask4(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ if (BGMusicStopped() == TRUE)
+ {
+ copy_saved_warp3_bank_and_enter_x_to_warp1();
+ WarpIntoMap();
+ SetMainCallback2(CB2_LoadMap);
+ gFieldCallback = FieldCallback_TeleportIn;
+ DestroyTask(FindTaskIdByFunc(Task_DoTeleportFieldEffect));
+ }
+ }
+}
+
+void (*const sTeleportInEffectFuncs[])(struct Task *) = {
+ TeleportInFieldEffectTask1,
+ TeleportInFieldEffectTask2,
+ TeleportInFieldEffectTask3
+};
+
+void FieldCallback_TeleportIn(void)
+{
+ Overworld_PlaySpecialMapMusic();
+ WarpFadeInScreen();
+ sub_8111CF0();
+ ScriptContext2_Enable();
+ FreezeObjectEvents();
+ gFieldCallback = NULL;
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = TRUE;
+ CameraObjectReset2();
+ CreateTask(Task_DoTeleportInFieldEffect, 0);
+}
+
+void Task_DoTeleportInFieldEffect(u8 taskId)
+{
+ sTeleportInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
+}
+
+void TeleportInFieldEffectTask1(struct Task *task)
+{
+ struct Sprite *sprite;
+ s16 centerToCornerVecY;
+ if (IsWeatherNotFadingIn())
+ {
+ sprite = &gSprites[gPlayerAvatar.spriteId];
+ centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
+ sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY);
+ gObjectEvents[gPlayerAvatar.objectEventId].invisible = FALSE;
+ task->data[0]++;
+ task->data[1] = 8;
+ task->data[2] = 1;
+ task->data[14] = sprite->subspriteMode;
+ task->data[15] = GetPlayerFacingDirection();
+ PlaySE(SE_TK_WARPIN);
+ }
+}
+
+void TeleportInFieldEffectTask2(struct Task *task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
+ if ((sprite->pos2.y += task->data[1]) >= -8)
+ {
+ if (task->data[13] == 0)
+ {
+ task->data[13]++;
+ objectEvent->triggerGroundEffectsOnMove = 1;
+ sprite->subspriteMode = task->data[14];
+ }
+ } else
+ {
+ sprite->oam.priority = 1;
+ if (sprite->subspriteMode != SUBSPRITES_OFF)
+ {
+ sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
+ }
+ }
+ if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1))
+ {
+ task->data[1]--;
+ }
+ if ((--task->data[2]) == 0)
+ {
+ task->data[2] = 4;
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ }
+ if (sprite->pos2.y >= 0)
+ {
+ sprite->pos2.y = 0;
+ task->data[0]++;
+ task->data[1] = 1;
+ task->data[2] = 0;
+ }
+}
+
+void TeleportInFieldEffectTask3(struct Task *task)
+{
+ u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
+ if ((--task->data[1]) == 0)
+ {
+ ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]);
+ task->data[1] = 8;
+ if ((++task->data[2]) > 4 && task->data[14] == objectEvent->facingDirection)
+ {
+ ScriptContext2_Disable();
+ CameraObjectReset1();
+ UnfreezeObjectEvents();
+ DestroyTask(FindTaskIdByFunc(Task_DoTeleportInFieldEffect));
+ }
+ }
+}