summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xasm/field_effect.s204
-rwxr-xr-xsrc/field_effect.c74
2 files changed, 74 insertions, 204 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index 1b4fb59fc..df8affab5 100755
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -6,210 +6,6 @@
.text
- thumb_func_start FldEff_UseWaterfall
-FldEff_UseWaterfall: @ 8086F2C
- push {r4,lr}
- ldr r4, _08086F58 @ =sub_8086F64
- adds r0, r4, 0
- movs r1, 0xFF
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _08086F5C @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- ldr r2, _08086F60 @ =gUnknown_0202FF84
- ldr r2, [r2]
- strh r2, [r1, 0xA]
- bl _call_via_r4
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08086F58: .4byte sub_8086F64
-_08086F5C: .4byte gTasks
-_08086F60: .4byte gUnknown_0202FF84
- thumb_func_end FldEff_UseWaterfall
-
- thumb_func_start sub_8086F64
-sub_8086F64: @ 8086F64
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _08086FA0 @ =gUnknown_0839F31C
- ldr r2, _08086FA4 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_08086F76:
- movs r0, 0x8
- ldrsh r2, [r4, r0]
- lsls r2, 2
- adds r2, r5
- ldr r0, _08086FA8 @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- lsls r1, r0, 3
- adds r1, r0
- lsls r1, 2
- ldr r0, _08086FAC @ =gMapObjects
- adds r1, r0
- ldr r2, [r2]
- adds r0, r4, 0
- bl _call_via_r2
- lsls r0, 24
- cmp r0, 0
- bne _08086F76
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08086FA0: .4byte gUnknown_0839F31C
-_08086FA4: .4byte gTasks
-_08086FA8: .4byte gPlayerAvatar
-_08086FAC: .4byte gMapObjects
- thumb_func_end sub_8086F64
-
- thumb_func_start sub_8086FB0
-sub_8086FB0: @ 8086FB0
- push {r4,lr}
- adds r4, r0, 0
- bl ScriptContext2_Enable
- ldr r1, _08086FCC @ =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
-_08086FCC: .4byte gPlayerAvatar
- thumb_func_end sub_8086FB0
-
- thumb_func_start waterfall_1_do_anim_probably
-waterfall_1_do_anim_probably: @ 8086FD0
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- bl ScriptContext2_Enable
- adds r0, r5, 0
- bl FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive
- lsls r0, 24
- cmp r0, 0
- bne _08087000
- adds r0, r5, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- ldr r1, _08087008 @ =gUnknown_0202FF84
- 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]
-_08087000:
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08087008: .4byte gUnknown_0202FF84
- thumb_func_end waterfall_1_do_anim_probably
-
- thumb_func_start waterfall_2_wait_anim_finish_probably
-waterfall_2_wait_anim_finish_probably: @ 808700C
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x6
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _08087026
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
- b _08087028
-_08087026:
- movs r0, 0
-_08087028:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end waterfall_2_wait_anim_finish_probably
-
- thumb_func_start sub_8087030
-sub_8087030: @ 8087030
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r1, 0
- movs r0, 0x2
- bl GetSimpleGoAnimId
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl FieldObjectSetSpecialAnim
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8087030
-
- thumb_func_start sub_8087058
-sub_8087058: @ 8087058
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r1, 0
- adds r0, r4, 0
- bl FieldObjectClearAnimIfSpecialAnimFinished
- lsls r0, 24
- cmp r0, 0
- bne _0808706E
- movs r0, 0
- b _080870AA
-_0808706E:
- ldrb r0, [r4, 0x1E]
- bl MetatileBehavior_IsWaterfall
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- bne _080870A4
- bl ScriptContext2_Disable
- ldr r0, _0808709C @ =gPlayerAvatar
- strb r4, [r0, 0x6]
- ldr r0, _080870A0 @ =sub_8086F64
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- movs r0, 0x2B
- bl FieldEffectActiveListRemove
- movs r0, 0
- b _080870AA
- .align 2, 0
-_0808709C: .4byte gPlayerAvatar
-_080870A0: .4byte sub_8086F64
-_080870A4:
- movs r0, 0x3
- strh r0, [r5, 0x8]
- movs r0, 0x1
-_080870AA:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8087058
-
thumb_func_start FldEff_UseDive
FldEff_UseDive: @ 80870B0
push {r4,lr}
diff --git a/src/field_effect.c b/src/field_effect.c
index f3319169f..7c1c3f282 100755
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -17,6 +17,7 @@
#include "field_player_avatar.h"
#include "field_map_obj_helpers.h"
#include "field_map_obj.h"
+#include "metatile_behavior.h"
#include "field_camera.h"
#include "field_effect.h"
@@ -1343,3 +1344,76 @@ bool8 sub_8086ED4(struct Task *task)
}
return FALSE;
}
+
+void sub_8086F64(u8);
+extern const bool8 (*gUnknown_0839F31C[5])(struct Task *, struct MapObject *);
+
+bool8 FldEff_UseWaterfall(void)
+{
+ u8 taskId;
+ taskId = CreateTask(sub_8086F64, 0xff);
+ gTasks[taskId].data[1] = gUnknown_0202FF84[0];
+ sub_8086F64(taskId);
+ return FALSE;
+}
+
+void sub_8086F64(u8 taskId)
+{
+ while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId]));
+}
+
+bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject)
+{
+ ScriptContext2_Enable();
+ gPlayerAvatar.unk6 = 1;
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject)
+{
+ ScriptContext2_Enable();
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject))
+ {
+ FieldObjectClearAnimIfSpecialAnimFinished(mapObject);
+ gUnknown_0202FF84[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 MapObject *mapObject)
+{
+ if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
+ {
+ return FALSE;
+ }
+ task->data[0]++;
+ return TRUE;
+}
+
+bool8 sub_8087030(struct Task *task, struct MapObject *mapObject)
+{
+ FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH));
+ task->data[0]++;
+ return FALSE;
+}
+
+bool8 sub_8087058(struct Task *task, struct MapObject *mapObject)
+{
+ if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
+ {
+ return FALSE;
+ }
+ if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E))
+ {
+ task->data[0] = 3;
+ return TRUE;
+ }
+ ScriptContext2_Disable();
+ gPlayerAvatar.unk6 = 0;
+ DestroyTask(FindTaskIdByFunc(sub_8086F64));
+ FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL);
+ return FALSE;
+}