1#ifndef SEAD_TASKBASE_H_
2#define SEAD_TASKBASE_H_
3
4#include <container/seadTList.h>
5#include <container/seadTreeNode.h>
6#include <framework/seadHeapPolicies.h>
7#include <framework/seadTaskID.h>
8#include <heap/seadDisposer.h>
9#include <prim/seadBitFlag.h>
10#include <prim/seadDelegateEventSlot.h>
11#include <prim/seadNamable.h>
12#include <prim/seadRuntimeTypeInfo.h>
13#include <thread/seadDelegateThread.h>
14
15namespace sead
16{
17class FaderTaskBase;
18class MethodTreeNode;
19class TaskEvent;
20class TaskMgr;
21class TaskParameter;
22
23class TaskBase : public TTreeNode<TaskBase*>, public IDisposer, public INamable
24{
25 SEAD_RTTI_BASE(TaskBase)
26
27public:
28 typedef TListNode<TaskBase*> ListNode;
29 typedef TList<TaskBase*> List;
30
31public:
32 enum State
33 {
34 cCreated = 0,
35 cPrepare = 1,
36 cPrepareDone = 2,
37 cSleep = 3,
38 cRunning = 4,
39 cDying = 5,
40 cDestroyable = 6,
41 cDead = 7
42 };
43
44 enum Tag
45 {
46 cSystem = 0,
47 cApp = 1
48 };
49
50 struct CreateArg
51 {
52 typedef void (*SingletonFunc)(TaskBase*);
53
54 TaskClassID factory;
55 HeapPolicies heap_policies;
56 TaskBase* parent;
57 TaskParameter* parameter;
58 FaderTaskBase* fader;
59 TaskBase* src_task;
60 TaskBase** created_task;
61 DelegateEvent<TaskBase*>::Slot* create_callback;
62 TaskUserID user_id;
63 Tag tag;
64 SingletonFunc instance_cb;
65 };
66
67public:
68 explicit TaskBase(const TaskConstructArg& arg);
69 TaskBase(const TaskConstructArg& arg, const char* name);
70 virtual ~TaskBase();
71
72 virtual void pauseCalc(bool b) = 0;
73 virtual void pauseDraw(bool b) = 0;
74 virtual void pauseCalcRec(bool b) = 0;
75 virtual void pauseDrawRec(bool b) = 0;
76 virtual void pauseCalcChild(bool b);
77 virtual void pauseDrawChild(bool b);
78
79 virtual void prepare();
80 virtual void enterCommon();
81 virtual void enter();
82 virtual void exit();
83 virtual void onEvent(const TaskEvent&);
84 virtual void attachCalcImpl() = 0;
85 virtual void attachDrawImpl() = 0;
86 virtual void detachCalcImpl() = 0;
87 virtual void detachDrawImpl() = 0;
88 virtual const RuntimeTypeInfo::Interface* getCorrespondingMethodTreeMgrTypeInfo() const = 0;
89 virtual MethodTreeNode* getMethodTreeNode(s32 method_type) = 0;
90 virtual void onDestroy();
91
92 DelegateThread* getFramework() const; // seems to return mTaskMgr->mPrepareThread;
93
94 TaskParameter* mParameter;
95 BitFlag32 mInternalFlag;
96 ListNode mTaskListNode;
97 HeapArray mHeapArray;
98 TaskMgr* mTaskMgr;
99 State mState;
100 Tag mTag;
101 TaskClassID mClassID;
102};
103
104} // namespace sead
105
106#endif // SEAD_TASKBASE_H_
107