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 /src | |
parent | 1779aedbf0e321188ff239095a3e20f38cf22575 (diff) |
Waterfall field effect
Diffstat (limited to 'src')
-rw-r--r-- | src/field_effect.c | 83 |
1 files changed, 83 insertions, 0 deletions
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; +} |