summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xasm/field_effect.s137
-rwxr-xr-xsrc/field_effect.c48
2 files changed, 48 insertions, 137 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index df8affab5..24300044f 100755
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -6,143 +6,6 @@
.text
- thumb_func_start FldEff_UseDive
-FldEff_UseDive: @ 80870B0
- push {r4,lr}
- ldr r4, _080870E0 @ =Task_Dive
- adds r0, r4, 0
- movs r1, 0xFF
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080870E4 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r3, _080870E8 @ =gUnknown_0202FF84
- 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
-_080870E0: .4byte Task_Dive
-_080870E4: .4byte gTasks
-_080870E8: .4byte gUnknown_0202FF84
- thumb_func_end FldEff_UseDive
-
- thumb_func_start Task_Dive
-Task_Dive: @ 80870EC
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _0808711C @ =gUnknown_0839F330
- ldr r2, _08087120 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080870FE:
- 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 _080870FE
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0808711C: .4byte gUnknown_0839F330
-_08087120: .4byte gTasks
- thumb_func_end Task_Dive
-
- thumb_func_start sub_8087124
-sub_8087124: @ 8087124
- ldr r2, _08087134 @ =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
-_08087134: .4byte gPlayerAvatar
- thumb_func_end sub_8087124
-
- thumb_func_start dive_2_unknown
-dive_2_unknown: @ 8087138
- push {r4,lr}
- adds r4, r0, 0
- bl ScriptContext2_Enable
- ldr r1, _0808715C @ =gUnknown_0202FF84
- 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
-_0808715C: .4byte gUnknown_0202FF84
- thumb_func_end dive_2_unknown
-
- thumb_func_start dive_3_unknown
-dive_3_unknown: @ 8087160
- 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 _080871A4
- ldr r2, _080871AC @ =gMapObjects
- ldr r0, _080871B0 @ =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, _080871B4 @ =Task_Dive
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- movs r0, 0x2C
- bl FieldEffectActiveListRemove
-_080871A4:
- movs r0, 0
- add sp, 0x8
- pop {r1}
- bx r1
- .align 2, 0
-_080871AC: .4byte gMapObjects
-_080871B0: .4byte gPlayerAvatar
-_080871B4: .4byte Task_Dive
- thumb_func_end dive_3_unknown
-
thumb_func_start sub_80871B8
sub_80871B8: @ 80871B8
push {lr}
diff --git a/src/field_effect.c b/src/field_effect.c
index 7c1c3f282..af6f5a36a 100755
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1417,3 +1417,51 @@ bool8 sub_8087058(struct Task *task, struct MapObject *mapObject)
FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);
return FALSE;
}
+
+void Task_Dive(u8);
+extern const bool8 (*gUnknown_0839F330[3])(struct Task *);
+extern int dive_warp(struct MapPosition *, u16);
+
+bool8 FldEff_UseDive(void)
+{
+ u8 taskId;
+ taskId = CreateTask(Task_Dive, 0xff);
+ gTasks[taskId].data[15] = gUnknown_0202FF84[0];
+ gTasks[taskId].data[14] = gUnknown_0202FF84[1];
+ Task_Dive(taskId);
+ return FALSE;
+}
+
+void Task_Dive(u8 taskId)
+{
+ while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId]));
+}
+
+bool8 sub_8087124(struct Task *task)
+{
+ gPlayerAvatar.unk6 = 1;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 dive_2_unknown(struct Task *task)
+{
+ ScriptContext2_Enable();
+ gUnknown_0202FF84[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 mapPosition;
+ PlayerGetDestCoords(&mapPosition.x, &mapPosition.y);
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E);
+ DestroyTask(FindTaskIdByFunc(Task_Dive));
+ FieldEffectActiveListRemove(FLDEFF_USE_DIVE);
+ }
+ return FALSE;
+}