diff options
-rw-r--r-- | asm/field_effect.s | 599 | ||||
-rw-r--r-- | data/field_effect.s | 16 | ||||
-rw-r--r-- | include/overworld.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 265 |
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)); + } + } +} |