diff options
Diffstat (limited to 'src/script_movement.c')
-rw-r--r-- | src/script_movement.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/src/script_movement.c b/src/script_movement.c new file mode 100644 index 000000000..9fee9e060 --- /dev/null +++ b/src/script_movement.c @@ -0,0 +1,232 @@ +#include "global.h" +#include "script_movement.h" +#include "event_object_movement.h" +#include "task.h" +#include "util.h" + +// static functions +static void sub_80D33AC(u8); +static u8 sub_80D33F4(void); +static bool8 sub_80D3408(u8, u8, const u8 *); +static u8 sub_80D3474(u8, u8); +static bool8 sub_80D3584(u8, u8); +static void sub_80D35DC(u8, u8, u8, const u8 *); +static void UnfreezeObjects(u8); +static void sub_80D3660(u8); +static void sub_80A2490(u8, u8, u8, const u8 *); + +// EWRAM_DATA +static EWRAM_DATA const u8 *gUnknown_02039D90[16] = {0}; + +// text +bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) +{ + u8 eventObjId; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjId)) + return TRUE; + if (!FuncIsActiveTask(sub_80D3660)) + sub_80D33AC(50); + return sub_80D3408(sub_80D33F4(), eventObjId, movementScript); +} + +bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank) +{ + u8 eventObjId; + u8 r4; + u8 r1; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &eventObjId)) + return TRUE; + r4 = sub_80D33F4(); + r1 = sub_80D3474(r4, eventObjId); + if (r1 == 16) + return TRUE; + return sub_80D3584(r4, r1); +} + +void sub_80D338C(void) +{ + u8 taskId; + + taskId = sub_80D33F4(); + if (taskId != 0xFF) + { + UnfreezeObjects(taskId); + DestroyTask(taskId); + } +} + + +static void sub_80D33AC(u8 priority) +{ + u8 taskId; + u8 i; + + taskId = CreateTask(sub_80D3660, priority); + for (i = 1; i < 16; i++) + gTasks[taskId].data[i] = 0xFFFF; +} + +static u8 sub_80D33F4(void) +{ + return FindTaskIdByFunc(sub_80D3660); +} + +static bool8 sub_80D3408(u8 taskId, u8 eventObjId, const u8 *movementScript) +{ + u8 r4; + + r4 = sub_80D3474(taskId, eventObjId); + if (r4 != 16) + { + if (sub_80D3584(taskId, r4) == 0) + { + return TRUE; + } + else + { + sub_80D35DC(taskId, r4, eventObjId, movementScript); + return FALSE; + } + } + r4 = sub_80D3474(taskId, 0xFF); + if (r4 == 16) + { + return TRUE; + } + else + { + sub_80D35DC(taskId, r4, eventObjId, movementScript); + return FALSE; + } +} + +static u8 sub_80D3474(u8 taskId, u8 b) +{ + u8 *ptr; + u8 i; + + ptr = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, ptr++) + { + if (*ptr == b) + return i; + } + return 16; +} + +static void sub_80D34B0(u8 taskId, u8 b, u8 **c) +{ + u8 i; + + *c = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < b; i++, (*c)++) + ; +} + +static void sub_80D34E4(u8 taskId, u8 b, u8 c) +{ + u8 *ptr; + + sub_80D34B0(taskId, b, &ptr); + *ptr = c; //what is this supposed to do? +} + +static void sub_80D3508(u8 taskId, u8 b, u8 *c) +{ + u8 *ptr; + + sub_80D34B0(taskId, b, &ptr); + *c = *ptr; +} + +static void sub_80D352C(u8 a, u8 b) +{ + u16 var = ~gBitTable[b]; + + gTasks[a].data[0] &= var; +} + +static void sub_80D355C(u8 taskId, u8 b) +{ + gTasks[taskId].data[0] |= gBitTable[b]; +} + +static bool8 sub_80D3584(u8 taskId, u8 b) +{ + u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; + + if (var != 0) + return TRUE; + else + return FALSE; +} + +static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript) +{ + gUnknown_02039D90[a] = movementScript; +} + +static const u8 *sub_80D35CC(u8 a) +{ + return gUnknown_02039D90[a]; +} + +static void sub_80D35DC(u8 taskId, u8 b, u8 eventObjId, const u8 *movementScript) +{ + sub_80D352C(taskId, b); + npc_obj_offscreen_culling_and_flag_update(b, movementScript); + sub_80D34E4(taskId, b, eventObjId); +} + +static void UnfreezeObjects(u8 taskId) +{ + u8 *pEventObjId; + u8 i; + + pEventObjId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, pEventObjId++) + { + if (*pEventObjId != 0xFF) + UnfreezeEventObject(&gEventObjects[*pEventObjId]); + } +} + +static void sub_80D3660(u8 taskId) +{ + u8 i; + u8 var; + + for (i = 0; i < 16; i++) + { + sub_80D3508(taskId, i, &var); + if (var != 0xFF) + sub_80A2490(taskId, i, var, sub_80D35CC(i)); + } +} + +static void sub_80A2490(u8 taskId, u8 b, u8 eventObjId, const u8 *d) +{ + u8 var; + + if (EventObjectIsHeldMovementActive(&gEventObjects[eventObjId]) + && !EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId])) + return; + + var = *d; + if (var == 0xFE) + { + sub_80D355C(taskId, b); + FreezeEventObject(&gEventObjects[eventObjId]); + } + else + { + if (!EventObjectSetHeldMovement(&gEventObjects[eventObjId], var)) + { + d++; + npc_obj_offscreen_culling_and_flag_update(b, d); + } + } +} + |