diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 10:19:34 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 10:19:34 -0500 |
commit | c117bc6864b951c1f6ea124aa8176e64ad25f5c8 (patch) | |
tree | e3b77992551c7c834c72a76c16e59fd557f12f7f | |
parent | 1779aedbf0e321188ff239095a3e20f38cf22575 (diff) |
Waterfall field effect
-rw-r--r-- | asm/field_effect.s | 204 | ||||
-rw-r--r-- | data/field_effect.s | 8 | ||||
-rw-r--r-- | include/event_object_movement.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 83 |
4 files changed, 84 insertions, 212 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index a331a0882..7ebfd7a77 100644 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -5,210 +5,6 @@ .text - thumb_func_start FldEff_UseWaterfall -FldEff_UseWaterfall: @ 8084CA0 - push {r4,lr} - ldr r4, _08084CCC @ =Task_UseWaterfall - adds r0, r4, 0 - movs r1, 0xFF - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08084CD0 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldr r2, _08084CD4 @ =gFieldEffectArguments - ldr r2, [r2] - strh r2, [r1, 0xA] - bl _call_via_r4 - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08084CCC: .4byte Task_UseWaterfall -_08084CD0: .4byte gTasks -_08084CD4: .4byte gFieldEffectArguments - thumb_func_end FldEff_UseWaterfall - - thumb_func_start Task_UseWaterfall -Task_UseWaterfall: @ 8084CD8 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - ldr r5, _08084D14 @ =sUseWaterfallFieldEffectFuncs - ldr r2, _08084D18 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r4, r1, r2 -_08084CEA: - movs r0, 0x8 - ldrsh r2, [r4, r0] - lsls r2, 2 - adds r2, r5 - ldr r0, _08084D1C @ =gPlayerAvatar - ldrb r0, [r0, 0x5] - lsls r1, r0, 3 - adds r1, r0 - lsls r1, 2 - ldr r0, _08084D20 @ =gObjectEvents - adds r1, r0 - ldr r2, [r2] - adds r0, r4, 0 - bl _call_via_r2 - lsls r0, 24 - cmp r0, 0 - bne _08084CEA - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08084D14: .4byte sUseWaterfallFieldEffectFuncs -_08084D18: .4byte gTasks -_08084D1C: .4byte gPlayerAvatar -_08084D20: .4byte gObjectEvents - thumb_func_end Task_UseWaterfall - - thumb_func_start waterfall_0_setup -waterfall_0_setup: @ 8084D24 - push {r4,lr} - adds r4, r0, 0 - bl ScriptContext2_Enable - ldr r1, _08084D40 @ =gPlayerAvatar - movs r0, 0x1 - strb r0, [r1, 0x6] - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08084D40: .4byte gPlayerAvatar - thumb_func_end waterfall_0_setup - - thumb_func_start waterfall_1_do_anim_probably -waterfall_1_do_anim_probably: @ 8084D44 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - bl ScriptContext2_Enable - adds r0, r5, 0 - bl ObjectEventIsMovementOverridden - lsls r0, 24 - cmp r0, 0 - bne _08084D74 - adds r0, r5, 0 - bl ObjectEventClearHeldMovementIfFinished - ldr r1, _08084D7C @ =gFieldEffectArguments - movs r2, 0xA - ldrsh r0, [r4, r2] - str r0, [r1] - movs r0, 0x3B - bl FieldEffectStart - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08084D74: - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08084D7C: .4byte gFieldEffectArguments - thumb_func_end waterfall_1_do_anim_probably - - thumb_func_start waterfall_2_wait_anim_finish_probably -waterfall_2_wait_anim_finish_probably: @ 8084D80 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x6 - bl FieldEffectActiveListContains - lsls r0, 24 - cmp r0, 0 - bne _08084D9A - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - movs r0, 0x1 - b _08084D9C -_08084D9A: - movs r0, 0 -_08084D9C: - pop {r4} - pop {r1} - bx r1 - thumb_func_end waterfall_2_wait_anim_finish_probably - - thumb_func_start waterfall_3_move_player_probably -waterfall_3_move_player_probably: @ 8084DA4 - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - movs r0, 0x2 - bl sub_8063F2C - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl ObjectEventSetHeldMovement - ldrh r0, [r5, 0x8] - adds r0, 0x1 - strh r0, [r5, 0x8] - movs r0, 0 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end waterfall_3_move_player_probably - - thumb_func_start waterfall_4_wait_player_move_probably -waterfall_4_wait_player_move_probably: @ 8084DCC - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - adds r0, r4, 0 - bl ObjectEventClearHeldMovementIfFinished - lsls r0, 24 - cmp r0, 0 - bne _08084DE2 - movs r0, 0 - b _08084E1E -_08084DE2: - ldrb r0, [r4, 0x1E] - bl MetatileBehavior_IsWaterfall - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _08084E18 - bl ScriptContext2_Disable - ldr r0, _08084E10 @ =gPlayerAvatar - strb r4, [r0, 0x6] - ldr r0, _08084E14 @ =Task_UseWaterfall - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask - movs r0, 0x2B - bl FieldEffectActiveListRemove - movs r0, 0 - b _08084E1E - .align 2, 0 -_08084E10: .4byte gPlayerAvatar -_08084E14: .4byte Task_UseWaterfall -_08084E18: - movs r0, 0x3 - strh r0, [r5, 0x8] - movs r0, 0x1 -_08084E1E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end waterfall_4_wait_player_move_probably - @ These are leftovers from RS thumb_func_start FldEff_UseDive FldEff_UseDive: @ 8084E24 diff --git a/data/field_effect.s b/data/field_effect.s index d6ae15de2..d2b02436f 100644 --- a/data/field_effect.s +++ b/data/field_effect.s @@ -7,14 +7,6 @@ .align 2 .align 2 -sUseWaterfallFieldEffectFuncs:: @ 83CC084 dataptr - .4byte waterfall_0_setup - .4byte waterfall_1_do_anim_probably - .4byte waterfall_2_wait_anim_finish_probably - .4byte waterfall_3_move_player_probably - .4byte waterfall_4_wait_player_move_probably - - .align 2 sDiveFieldEffectFuncPtrs:: @ 83CC098 dataptr .4byte dive_1_lock .4byte dive_2_unknown diff --git a/include/event_object_movement.h b/include/event_object_movement.h index baf66d737..ebd5b44db 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -116,6 +116,7 @@ void RfuUnionObjectToggleInvisibility(u8 objectEventId, bool32 invisible); bool32 RfuUnionObjectIsInvisible(u8 objectEventId); void RfuUnionObjectStartWarp(u8 objectEventId, u8 animNo); bool32 RfuUnionObjectIsWarping(u8 objectEventId); +u8 sub_8063F2C(u8 direction); void sub_805F378(s16 x, s16 y); diff --git a/src/field_effect.c b/src/field_effect.c index a35fbfe7f..ff1e41146 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -12,6 +12,7 @@ #include "field_weather.h" #include "fieldmap.h" #include "help_system.h" +#include "metatile_behavior.h" #include "overworld.h" #include "party_menu.h" #include "quest_log.h" @@ -1528,3 +1529,85 @@ bool8 EscalatorWarpInEffect_7(struct Task *task) } return FALSE; } + +void Task_UseWaterfall(u8 taskId); + +bool8 waterfall_0_setup(struct Task * task, struct ObjectEvent * playerObj); +bool8 waterfall_1_do_anim_probably(struct Task * task, struct ObjectEvent * playerObj); +bool8 waterfall_2_wait_anim_finish_probably(struct Task * task, struct ObjectEvent * playerObj); +bool8 waterfall_3_move_player_probably(struct Task * task, struct ObjectEvent * playerObj); +bool8 waterfall_4_wait_player_move_probably(struct Task * task, struct ObjectEvent * playerObj); + +bool8 (*const sUseWaterfallFieldEffectFuncs[])(struct Task * task, struct ObjectEvent * playerObj) = { + waterfall_0_setup, + waterfall_1_do_anim_probably, + waterfall_2_wait_anim_finish_probably, + waterfall_3_move_player_probably, + waterfall_4_wait_player_move_probably +}; + +u32 FldEff_UseWaterfall(void) +{ + u8 taskId = CreateTask(Task_UseWaterfall, 0xFF); + gTasks[taskId].data[1] = gFieldEffectArguments[0]; + Task_UseWaterfall(taskId); + return 0; +} + +void Task_UseWaterfall(u8 taskId) +{ + while (sUseWaterfallFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId])) + ; +} + +bool8 waterfall_0_setup(struct Task * task, struct ObjectEvent * playerObj) +{ + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task * task, struct ObjectEvent * playerObj) +{ + ScriptContext2_Enable(); + if (!ObjectEventIsMovementOverridden(playerObj)) + { + ObjectEventClearHeldMovementIfFinished(playerObj); + gFieldEffectArguments[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task * task, struct ObjectEvent * playerObj) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + return FALSE; + task->data[0]++; + return TRUE; +} + +bool8 waterfall_3_move_player_probably(struct Task * task, struct ObjectEvent * playerObj) +{ + ObjectEventSetHeldMovement(playerObj, sub_8063F2C(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 waterfall_4_wait_player_move_probably(struct Task * task, struct ObjectEvent * playerObj) +{ + if (!ObjectEventClearHeldMovementIfFinished(playerObj)) + return FALSE; + if (MetatileBehavior_IsWaterfall(playerObj->mapobj_unk_1E)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(FindTaskIdByFunc(Task_UseWaterfall)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} |