mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-30 07:22:03 -04:00
133 lines
3.5 KiB
C
133 lines
3.5 KiB
C
#include "global.h"
|
|
#include "task.h"
|
|
#include "script.h"
|
|
#include "heap.h"
|
|
|
|
struct TaskManager *Task_New(struct FieldSystem * fieldSystem, TaskFunc taskFunc, void *env)
|
|
{
|
|
struct TaskManager *taskManager = AllocFromHeapAtEnd(HEAP_ID_32, sizeof(struct TaskManager));
|
|
taskManager->prev = NULL;
|
|
taskManager->func = taskFunc;
|
|
taskManager->state = 0;
|
|
taskManager->env = env;
|
|
taskManager->unk10 = NULL;
|
|
taskManager->unk14 = NULL;
|
|
taskManager->fieldSystem = fieldSystem;
|
|
taskManager->unk1C = AllocFromHeapAtEnd(HEAP_ID_32, 4);
|
|
return taskManager;
|
|
}
|
|
|
|
void FieldSystem_CreateTask(struct FieldSystem * fieldSystem, TaskFunc taskFunc, void *env)
|
|
{
|
|
GF_ASSERT(fieldSystem->taskManager == NULL);
|
|
fieldSystem->taskManager = Task_New(fieldSystem, taskFunc, env);
|
|
}
|
|
|
|
void TaskManager_Jump(struct TaskManager *taskManager, TaskFunc taskFunc, void *env)
|
|
{
|
|
taskManager->func = taskFunc;
|
|
taskManager->state = 0;
|
|
taskManager->env = env;
|
|
if (taskManager->unk14 != NULL || taskManager->unk14 != NULL)
|
|
{
|
|
FreeToHeap(taskManager->unk14);
|
|
taskManager->unk10 = NULL;
|
|
taskManager->unk14 = NULL;
|
|
}
|
|
}
|
|
|
|
void TaskManager_Call(struct TaskManager *taskManager, TaskFunc taskFunc, void *env)
|
|
{
|
|
struct TaskManager *taskManager2 = Task_New(taskManager->fieldSystem, taskFunc, env);
|
|
taskManager2->prev = taskManager;
|
|
taskManager->fieldSystem->taskManager = taskManager2;
|
|
}
|
|
|
|
BOOL sub_02046420(struct TaskManager *taskManager)
|
|
{
|
|
if (taskManager->unk10 == NULL)
|
|
return FALSE;
|
|
while (taskManager->unk10->func(taskManager->unk10) == TRUE)
|
|
{
|
|
struct TaskManager *taskManager2 = taskManager->unk10->prev;
|
|
if (taskManager->unk10->unk14 != NULL)
|
|
FreeToHeap(taskManager->unk10->unk14);
|
|
FreeToHeap(taskManager->unk10->unk1C);
|
|
FreeToHeap(taskManager->unk10);
|
|
taskManager->unk10 = taskManager2;
|
|
if (taskManager2 == NULL)
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL sub_0204646C(struct TaskManager *taskManager)
|
|
{
|
|
return (taskManager->unk10 != NULL);
|
|
}
|
|
|
|
BOOL FieldSystem_ApplicationIsRunning(struct FieldSystem *fieldSystem)
|
|
{
|
|
return (sub_0203739C(fieldSystem) || sub_020373C4(fieldSystem));
|
|
}
|
|
|
|
void sub_0204649C(void * r0)
|
|
{
|
|
LoadOverlay_OVERLAY_05(r0);
|
|
}
|
|
|
|
BOOL sub_020464A4(void * r0)
|
|
{
|
|
return (sub_020373AC(r0) != FALSE);
|
|
}
|
|
|
|
BOOL sub_020464B8(struct TaskManager *taskManager)
|
|
{
|
|
struct FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager);
|
|
u32 * r4_2 = TaskManager_GetEnvironment(taskManager);
|
|
switch (r4_2[0])
|
|
{
|
|
case 0:
|
|
sub_020373D4(fieldSystem, (struct OverlayManagerTemplate *)r4_2[1], (void *)r4_2[2]); //FIXME: typing is wrong
|
|
r4_2[0]++;
|
|
break;
|
|
case 1:
|
|
if (!FieldSystem_ApplicationIsRunning(fieldSystem))
|
|
{
|
|
FreeToHeap(r4_2);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void sub_02046500(struct TaskManager *taskManager, u32 r5, u32 r4)
|
|
{
|
|
u32 * r2 = AllocFromHeapAtEnd(HEAP_ID_32, 3 * sizeof(u32));
|
|
r2[0] = 0;
|
|
r2[1] = r5;
|
|
r2[2] = r4;
|
|
TaskManager_Call(taskManager, sub_020464B8, r2);
|
|
}
|
|
|
|
struct FieldSystem *TaskManager_GetFieldSystem(struct TaskManager *taskManager)
|
|
{
|
|
return taskManager->fieldSystem;
|
|
}
|
|
|
|
void * TaskManager_GetEnvironment(struct TaskManager *taskManager)
|
|
{
|
|
return taskManager->env;
|
|
}
|
|
|
|
u32 * TaskManager_GetStatePtr(struct TaskManager *taskManager)
|
|
{
|
|
return &taskManager->state;
|
|
}
|
|
|
|
u32 sub_02046534(struct TaskManager *taskManager)
|
|
{
|
|
return *taskManager->unk1C;
|
|
}
|