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