summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-28 10:19:34 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-28 10:19:34 -0500
commitc117bc6864b951c1f6ea124aa8176e64ad25f5c8 (patch)
treee3b77992551c7c834c72a76c16e59fd557f12f7f
parent1779aedbf0e321188ff239095a3e20f38cf22575 (diff)
Waterfall field effect
-rw-r--r--asm/field_effect.s204
-rw-r--r--data/field_effect.s8
-rw-r--r--include/event_object_movement.h1
-rw-r--r--src/field_effect.c83
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;
+}