diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_anim_sound_tasks.c | 4 | ||||
-rw-r--r-- | src/battle_transition.c | 6 | ||||
-rw-r--r-- | src/event_object_lock.c | 4 | ||||
-rw-r--r-- | src/list_menu.c | 8 | ||||
-rw-r--r-- | src/palette.c | 2 | ||||
-rw-r--r-- | src/rock.c | 2 | ||||
-rw-r--r-- | src/scrcmd.c | 4 | ||||
-rw-r--r-- | src/script_movement.c | 226 |
8 files changed, 241 insertions, 15 deletions
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index d74b743e8..f2740a1a5 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -178,7 +178,7 @@ void sub_80DD148(u8 taskId) gTasks[taskId].data[2] = pan; if (species != SPECIES_NONE) { - if (gBattleAnimArgs[1] == TASK_NONE) + if (gBattleAnimArgs[1] == TAIL_SENTINEL) PlayCry3(species, pan, 9); else PlayCry3(species, pan, 7); @@ -199,7 +199,7 @@ static void sub_80DD270(u8 taskId) { ++gTasks[taskId].data[9]; } - else if (gTasks[taskId].data[0] == TASK_NONE) + else if (gTasks[taskId].data[0] == TAIL_SENTINEL) { if (!IsCryPlaying()) { diff --git a/src/battle_transition.c b/src/battle_transition.c index 463a3d930..b33d72f15 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -644,7 +644,7 @@ static bool8 BT_Phase1Blink(struct Task *task) static bool8 BT_WaitForPhase1(struct Task *task) { - if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TASK_NONE) + if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TAIL_SENTINEL) { ++task->tState; return TRUE; @@ -665,7 +665,7 @@ static bool8 BT_Phase2LaunchAnimTask(struct Task *task) static bool8 BT_WaitForPhase2(struct Task *task) { task->tTransitionDone = FALSE; - if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TASK_NONE) + if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TAIL_SENTINEL) task->tTransitionDone = TRUE; return FALSE; } @@ -3432,7 +3432,7 @@ static void BT_CreatePhase1SubTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkT static bool8 BT_IsPhase1Done(void) { - if (FindTaskIdByFunc(BT_Phase1SubTask) == TASK_NONE) + if (FindTaskIdByFunc(BT_Phase1SubTask) == TAIL_SENTINEL) return TRUE; else return FALSE; diff --git a/src/event_object_lock.c b/src/event_object_lock.c index 2bb9736aa..02f0557f2 100644 --- a/src/event_object_lock.c +++ b/src/event_object_lock.c @@ -87,7 +87,7 @@ void sub_80696C0(void) { u8 objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]); - sub_80974D8(); + ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); } @@ -98,7 +98,7 @@ void UnionRoom_UnlockPlayerAndChatPartner(void) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); objectEventId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objectEventId]); - sub_80974D8(); + ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); } diff --git a/src/list_menu.c b/src/list_menu.c index bd1d2699e..21ef40fbe 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -256,7 +256,7 @@ void DestroyListMenuTask(u8 listTaskId, u16 *cursorPos, u16 *itemsAbove) if (itemsAbove != NULL) *itemsAbove = list->itemsAbove; - if (list->taskId != TASK_NONE) + if (list->taskId != TAIL_SENTINEL) ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2); DestroyTask(listTaskId); @@ -346,7 +346,7 @@ static u8 ListMenuInitInternal(const struct ListMenuTemplate *listMenuTemplate, list->itemsAbove = itemsAbove; list->unk_1C = 0; list->unk_1D = 0; - list->taskId = TASK_NONE; + list->taskId = TAIL_SENTINEL; list->unk_1F = 0; gListMenuOverride.cursorPal = list->template.cursorPal; gListMenuOverride.fillValue = list->template.fillValue; @@ -418,12 +418,12 @@ static void ListMenuDrawCursor(struct ListMenu *list) case 1: break; case 2: - if (list->taskId == TASK_NONE) + if (list->taskId == TAIL_SENTINEL) list->taskId = ListMenuAddCursorObject(list, 0); ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0); break; case 3: - if (list->taskId == TASK_NONE) + if (list->taskId == TAIL_SENTINEL) list->taskId = ListMenuAddCursorObject(list, 1); ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1); break; diff --git a/src/palette.c b/src/palette.c index 6609c9baa..04638f6d1 100644 --- a/src/palette.c +++ b/src/palette.c @@ -948,7 +948,7 @@ void sub_8071898(void) while (TRUE) { taskId = FindTaskIdByFunc(sub_80718B8); - if (taskId == TASK_NONE) + if (taskId == TAIL_SENTINEL) break; DestroyTask(taskId); } diff --git a/src/rock.c b/src/rock.c index 082f3b655..3ec9cec04 100644 --- a/src/rock.c +++ b/src/rock.c @@ -704,7 +704,7 @@ static void sub_80B4F78(struct Sprite *sprite) { u8 taskId = FindTaskIdByFunc(sub_80B4D00); - if (taskId != TASK_NONE) + if (taskId != TAIL_SENTINEL) --gTasks[taskId].data[11]; DestroySprite(sprite); } diff --git a/src/scrcmd.c b/src/scrcmd.c index 389bf0cc2..77b87aaa8 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1238,7 +1238,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) HideFieldMessageBox(); playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); - sub_80974D8(); + ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); return FALSE; } @@ -1252,7 +1252,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); playerObjectId = GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); - sub_80974D8(); + ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); return FALSE; } diff --git a/src/script_movement.c b/src/script_movement.c new file mode 100644 index 000000000..7503e8f44 --- /dev/null +++ b/src/script_movement.c @@ -0,0 +1,226 @@ +#include "global.h" +#include "task.h" +#include "util.h" +#include "event_object_movement.h" +#include "constants/event_objects.h" +#include "constants/event_object_movement.h" + +static EWRAM_DATA const u8 (*sMovementScripts[OBJECT_EVENTS_COUNT]) = {}; + +static void ScriptMovement_StartMoveObjects(u8 priority); +static u8 GetMoveObjectsTaskId(void); +static u8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript); +static u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId); +static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId); +static void ScriptMovement_MoveObjects(u8 taskId); +static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript); +static void ScriptMovement_UnfreezeActiveObjects(u8 taskId); +static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript); + +bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) +{ + u8 objEventId; + if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId)) + return TRUE; + + if (!FuncIsActiveTask(ScriptMovement_MoveObjects)) + ScriptMovement_StartMoveObjects(50); + return ScriptMovement_TryAddNewMovement(GetMoveObjectsTaskId(), objEventId, movementScript); +} + +bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 objEventId; + u8 taskId; + u8 moveScrId; + if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objEventId)) + return TRUE; + taskId = GetMoveObjectsTaskId(); + moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId); + if (moveScrId == OBJECT_EVENTS_COUNT) + return TRUE; + return IsMovementScriptFinished(taskId, moveScrId); +} + +void ScriptMovement_UnfreezeObjectEvents(void) +{ + u8 taskId = GetMoveObjectsTaskId(); + if (taskId != TAIL_SENTINEL) + { + ScriptMovement_UnfreezeActiveObjects(taskId); + DestroyTask(taskId); + } +} + +void ScriptMovement_StartMoveObjects(u8 priority) +{ + u8 i; + u8 taskId = CreateTask(ScriptMovement_MoveObjects, priority); + for (i = 1; i < NUM_TASK_DATA; i++) + { + gTasks[taskId].data[i] = -1; + } +} + +u8 GetMoveObjectsTaskId(void) +{ + return FindTaskIdByFunc(ScriptMovement_MoveObjects); +} + +bool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 *movementScript) +{ + u8 moveScrId; + + moveScrId = GetMovementScriptIdFromObjectEventId(taskId, objEventId); + if (moveScrId != OBJECT_EVENTS_COUNT) + { + if (IsMovementScriptFinished(taskId, moveScrId) == FALSE) + { + return TRUE; + } + else + { + ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript); + return FALSE; + } + } + moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER); + if (moveScrId == OBJECT_EVENTS_COUNT) + { + return TRUE; + } + else + { + ScriptMovement_AddNewMovement(taskId, moveScrId, objEventId, movementScript); + return FALSE; + } +} + +u8 GetMovementScriptIdFromObjectEventId(u8 taskId, u8 objEventId) +{ + u8 i; + u8 *moveScriptId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < OBJECT_EVENTS_COUNT; i++, moveScriptId++) + { + if (*moveScriptId == objEventId) + return i; + } + return OBJECT_EVENTS_COUNT; +} + +void LoadObjectEventIdPtrFromMovementScript(u8 taskId, u8 moveScrId, u8 **pObjEventId) +{ + u8 i; + + *pObjEventId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < moveScrId; i++, (*pObjEventId)++) + ; +} + +void SetObjectEventIdAtMovementScript(u8 taskId, u8 moveScrId, u8 objEventId) +{ + u8 *ptr; + + LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr); + *ptr = objEventId; +} + +void LoadObjectEventIdFromMovementScript(u8 taskId, u8 moveScrId, u8 *objEventId) +{ + u8 *ptr; + + LoadObjectEventIdPtrFromMovementScript(taskId, moveScrId, &ptr); + *objEventId = *ptr; +} + + +static void ClearMovementScriptFinished(u8 taskId, u8 moveScrId) +{ + u16 mask = ~gBitTable[moveScrId]; + + gTasks[taskId].data[0] &= mask; +} + +static void SetMovementScriptFinished(u8 taskId, u8 moveScrId) +{ + gTasks[taskId].data[0] |= gBitTable[moveScrId]; +} + +static bool8 IsMovementScriptFinished(u8 taskId, u8 moveScrId) +{ + u16 moveScriptFinished = (u16)gTasks[taskId].data[0] & gBitTable[moveScrId]; + + if (moveScriptFinished != 0) + return TRUE; + else + return FALSE; +} + +static void SetMovementScript(u8 moveScrId, const u8 *movementScript) +{ + sMovementScripts[moveScrId] = movementScript; +} + +static const u8 *GetMovementScript(u8 moveScrId) +{ + return sMovementScripts[moveScrId]; +} + +static void ScriptMovement_AddNewMovement(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript) +{ + ClearMovementScriptFinished(taskId, moveScrId); + SetMovementScript(moveScrId, movementScript); + SetObjectEventIdAtMovementScript(taskId, moveScrId, objEventId); +} + +static void ScriptMovement_UnfreezeActiveObjects(u8 taskId) +{ + u8 *pObjEventId; + u8 i; + + pObjEventId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < OBJECT_EVENTS_COUNT; i++, pObjEventId++) + { + if (*pObjEventId != 0xFF) + UnfreezeObjectEvent(&gObjectEvents[*pObjEventId]); + } +} + +static void ScriptMovement_MoveObjects(u8 taskId) +{ + u8 i; + u8 objEventId; + + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { + LoadObjectEventIdFromMovementScript(taskId, i, &objEventId); + if (objEventId != 0xFF) + ScriptMovement_TakeStep(taskId, i, objEventId, GetMovementScript(i)); + } +} + +static void ScriptMovement_TakeStep(u8 taskId, u8 moveScrId, u8 objEventId, const u8 *movementScript) +{ + u8 nextMoveActionId; + + if (IsMovementScriptFinished(taskId, moveScrId) == TRUE) + return; + if (ObjectEventIsSpecialAnimActive(&gObjectEvents[objEventId]) + && !ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId])) + return; + + nextMoveActionId = *movementScript; + if (nextMoveActionId == MOVEMENT_ACTION_STEP_END) + { + SetMovementScriptFinished(taskId, moveScrId); + FreezeObjectEvent(&gObjectEvents[objEventId]); + } + else + { + if (!ObjectEventSetHeldMovement(&gObjectEvents[objEventId], nextMoveActionId)) + { + movementScript++; + SetMovementScript(moveScrId, movementScript); + } + } +} |