diff options
-rw-r--r-- | asm/field_effect.s | 138 | ||||
-rw-r--r-- | data/field_effect.s | 6 | ||||
-rw-r--r-- | include/field_control_avatar.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 56 |
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; +} |