Port script_movement
This commit is contained in:
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user