diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 14:14:34 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 14:14:34 -0500 |
commit | fb56341fe4fedeeca53b17fc693b4b3dd7824ff2 (patch) | |
tree | 4bb969ea461216bcc639a001a867c5630091559e | |
parent | 8f42b7b56d887b6bca517499a841c259652af372 (diff) |
Escape Rope field effect
-rw-r--r-- | asm/field_effect.s | 745 | ||||
-rw-r--r-- | data/field_effect.s | 13 | ||||
-rw-r--r-- | include/overworld.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 246 |
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)); + } +} |