summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcCreateTask.h
blob: 50c1c9663ff62e693ca6192bba51ee2999c3bcbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#pragma once

#include <basis/seadTypes.h>
#include <prim/seadDelegate.h>
#include <prim/seadSafeString.h>
#include "KingSystem/ActorSystem/actBaseProcLink.h"
#include "KingSystem/ActorSystem/actInstParamPack.h"
#include "KingSystem/Map/mapMubinIter.h"
#include "KingSystem/Utils/Thread/ManagedTask.h"
#include "KingSystem/Utils/Thread/Task.h"
#include "KingSystem/Utils/Thread/TaskData.h"
#include "KingSystem/Utils/Types.h"

namespace ksys::map {
class Object;
}

namespace ksys::act {

class BaseProc;
class BaseProcHandle;
class BaseProcUnit;

struct BaseProcCreateArg {
    sead::Heap* heap;
    sead::Heap* heap2;
    sead::SafeString proc_class;
    sead::SafeString proc_name;
    map::MubinIter* mubin_iter;
    map::Object* map_object;
    InstParamPack::Buffer* params;
    BaseProcLink proc_link;
};
KSYS_CHECK_SIZE_NX150(BaseProcCreateArg, 0x58);

class BaseProcCreateTaskData : public util::TaskData {
    SEAD_RTTI_OVERRIDE(BaseProcCreateTaskData, util::TaskData)

public:
    BaseProcCreateTaskData() = default;
    virtual ~BaseProcCreateTaskData() = default;

    sead::Heap* mHeap{};
    sead::SafeString mProcClass{};
    sead::SafeString mProcName{};
    sead::IDelegate1R<BaseProcCreateArg&, BaseProc*>* mCreateDelegate{};
    BaseProcHandle* mProcHandle{};
    map::MubinIter* mMubinIter{};
    map::Object* mMapObject{};
    InstParamPack::Buffer* mParams{};
    BaseProc* mOtherProc{};
    bool mSleepAfterInit{};
};
KSYS_CHECK_SIZE_NX150(BaseProcCreateTaskData, 0x68);

class BaseProcCreateTaskRequest : public util::TaskRequest {
    SEAD_RTTI_OVERRIDE(BaseProcCreateTaskRequest, util::TaskRequest)

public:
    BaseProcCreateTaskRequest() = default;

    BaseProcCreateTaskData* mData{};
};

class BaseProcCreateTask : public util::ManagedTask {
    SEAD_RTTI_OVERRIDE(BaseProcCreateTask, util::ManagedTask)

public:
    enum class LaneId : u8 {
        _0 = 0,
        _1 = 1,
        _2 = 2,
    };

    explicit BaseProcCreateTask(sead::Heap* heap);

    void onBaseProcCreationFailed(BaseProc* proc, bool set_flag_5);

protected:
    void prepareImpl_(util::TaskRequest* req) override;

private:
    friend class BaseProcCreateTaskSelector;

    bool onTaskDelegateInvoked(void* arg);
    void doPrepare(const BaseProcCreateTaskData* data);

    sead::Heap* mHeap;
    sead::FixedSafeString<64> mClass;
    sead::FixedSafeString<64> mName;
    map::MubinIter mMubinIter;
    sead::IDelegate1R<BaseProcCreateArg&, BaseProc*>* mCreateDelegate{};
    BaseProcUnit* mUnit{};
    map::Object* mMapObject{};
    util::TaskDelegateT<BaseProcCreateTask> mTaskDelegate{
        this, &BaseProcCreateTask::onTaskDelegateInvoked};
    BaseProcLink mLink;
    f32 mDistanceToLoadSphere = -1.0;
    InstParamPack::Buffer mParams;
};
KSYS_CHECK_SIZE_NX150(BaseProcCreateTask, 0x298);

}  // namespace ksys::act