diff options
-rwxr-xr-x | asm/field_effect.s | 204 | ||||
-rwxr-xr-x | src/field_effect.c | 74 |
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; +} |