summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_effect.s138
-rw-r--r--data/field_effect.s6
-rw-r--r--include/field_control_avatar.h1
-rw-r--r--src/field_effect.c56
4 files changed, 57 insertions, 144 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index 7ebfd7a77..4d6b6984a 100644
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -5,144 +5,6 @@
.text
- @ These are leftovers from RS
- thumb_func_start FldEff_UseDive
-FldEff_UseDive: @ 8084E24
- push {r4,lr}
- ldr r4, _08084E54 @ =Task_Dive
- adds r0, r4, 0
- movs r1, 0xFF
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08084E58 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r3, _08084E5C @ =gFieldEffectArguments
- ldr r2, [r3]
- strh r2, [r1, 0x26]
- ldr r2, [r3, 0x4]
- strh r2, [r1, 0x24]
- bl _call_via_r4
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08084E54: .4byte Task_Dive
-_08084E58: .4byte gTasks
-_08084E5C: .4byte gFieldEffectArguments
- thumb_func_end FldEff_UseDive
-
- thumb_func_start Task_Dive
-Task_Dive: @ 8084E60
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _08084E90 @ =sDiveFieldEffectFuncPtrs
- ldr r2, _08084E94 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_08084E72:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _08084E72
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08084E90: .4byte sDiveFieldEffectFuncPtrs
-_08084E94: .4byte gTasks
- thumb_func_end Task_Dive
-
- thumb_func_start dive_1_lock
-dive_1_lock: @ 8084E98
- ldr r2, _08084EA8 @ =gPlayerAvatar
- movs r1, 0x1
- strb r1, [r2, 0x6]
- ldrh r1, [r0, 0x8]
- adds r1, 0x1
- strh r1, [r0, 0x8]
- movs r0, 0
- bx lr
- .align 2, 0
-_08084EA8: .4byte gPlayerAvatar
- thumb_func_end dive_1_lock
-
- thumb_func_start dive_2_unknown
-dive_2_unknown: @ 8084EAC
- push {r4,lr}
- adds r4, r0, 0
- bl ScriptContext2_Enable
- ldr r1, _08084ED0 @ =gFieldEffectArguments
- movs r2, 0x26
- ldrsh r0, [r4, r2]
- str r0, [r1]
- movs r0, 0x3B
- bl FieldEffectStart
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08084ED0: .4byte gFieldEffectArguments
- thumb_func_end dive_2_unknown
-
- thumb_func_start dive_3_unknown
-dive_3_unknown: @ 8084ED4
- push {lr}
- sub sp, 0x8
- mov r1, sp
- adds r1, 0x2
- mov r0, sp
- bl PlayerGetDestCoords
- movs r0, 0x6
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _08084F18
- ldr r2, _08084F20 @ =gObjectEvents
- ldr r0, _08084F24 @ =gPlayerAvatar
- ldrb r1, [r0, 0x5]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- ldrb r1, [r0, 0x1E]
- mov r0, sp
- bl dive_warp
- ldr r0, _08084F28 @ =Task_Dive
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- movs r0, 0x2C
- bl FieldEffectActiveListRemove
-_08084F18:
- movs r0, 0
- add sp, 0x8
- pop {r1}
- bx r1
- .align 2, 0
-_08084F20: .4byte gObjectEvents
-_08084F24: .4byte gPlayerAvatar
-_08084F28: .4byte Task_Dive
- thumb_func_end dive_3_unknown
-
thumb_func_start StartLavaridgeGymB1FWarp
StartLavaridgeGymB1FWarp: @ 8084F2C
push {lr}
diff --git a/data/field_effect.s b/data/field_effect.s
index d2b02436f..596084514 100644
--- a/data/field_effect.s
+++ b/data/field_effect.s
@@ -7,12 +7,6 @@
.align 2
.align 2
-sDiveFieldEffectFuncPtrs:: @ 83CC098 dataptr
- .4byte dive_1_lock
- .4byte dive_2_unknown
- .4byte dive_3_unknown
-
- .align 2
sLavaridgeGymB1FWarpEffectFuncs:: @ 83CC0A4 dataptr
.4byte LavaridgeGymB1FWarpEffect_1
.4byte LavaridgeGymB1FWarpEffect_2
diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h
index 57a2fab66..a9ddd4b5c 100644
--- a/include/field_control_avatar.h
+++ b/include/field_control_avatar.h
@@ -8,5 +8,6 @@ extern u32 gUnknown_3005078;
void RestartWildEncounterImmunitySteps(void);
void ClearPoisonStepCounter(void);
void SetCableClubWarp(void);
+void dive_warp(struct MapPosition * pos, u16 behavior);
#endif //GUARD_FIELD_CONTROL_AVATAR_H
diff --git a/src/field_effect.c b/src/field_effect.c
index ff1e41146..c848a43c5 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -5,6 +5,7 @@
#include "event_data.h"
#include "event_object_movement.h"
#include "field_camera.h"
+#include "field_control_avatar.h"
#include "field_effect.h"
#include "field_effect_scripts.h"
#include "field_fadetransition.h"
@@ -1611,3 +1612,58 @@ bool8 waterfall_4_wait_player_move_probably(struct Task * task, struct ObjectEve
FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);
return FALSE;
}
+
+void Task_Dive(u8 taskId);
+bool8 dive_1_lock(struct Task * task);
+bool8 dive_2_unknown(struct Task * task);
+bool8 dive_3_unknown(struct Task * task);
+
+bool8 (*const sDiveFieldEffectFuncPtrs[])(struct Task * task) = {
+ dive_1_lock,
+ dive_2_unknown,
+ dive_3_unknown
+};
+
+u32 FldEff_UseDive(void)
+{
+ u8 taskId = CreateTask(Task_Dive, 0xFF);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ gTasks[taskId].data[14] = gFieldEffectArguments[1];
+ Task_Dive(taskId);
+ return 0;
+}
+
+void Task_Dive(u8 taskId)
+{
+ while (sDiveFieldEffectFuncPtrs[gTasks[taskId].data[0]](&gTasks[taskId]))
+ ;
+}
+
+bool8 dive_1_lock(struct Task * task)
+{
+ gPlayerAvatar.preventStep = TRUE;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 dive_2_unknown(struct Task * task)
+{
+ ScriptContext2_Enable();
+ gFieldEffectArguments[0] = task->data[15];
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 dive_3_unknown(struct Task * task)
+{
+ struct MapPosition pos;
+ PlayerGetDestCoords(&pos.x, &pos.y);
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ dive_warp(&pos, gObjectEvents[gPlayerAvatar.objectEventId].mapobj_unk_1E);
+ DestroyTask(FindTaskIdByFunc(Task_Dive));
+ FieldEffectActiveListRemove(FLDEFF_USE_DIVE);
+ }
+ return FALSE;
+}