summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actBaseProcJob.h
blob: 41debba6fce4953b151b28a6c2f9d20ee3c1f6e7 (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
#pragma once

#include <container/seadSafeArray.h>
#include <container/seadTList.h>
#include <mc/seadJob.h>
#include "KingSystem/Utils/Types.h"

namespace ksys::act {

class BaseProc;

enum class Priority {
    PlayerBefore = 0,
    Player = 2,
    PlayerAfter = 2,
    AllAfter = 3,
};

enum class JobType {
    PreCalc = 0,
    Calc1 = 1,
    Calc2 = 2,
    Calc3 = 3,
    Calc4 = 4,
    AfterMessageDispatch = 5,
    Calc3Alt = 6,
    Invalid = 7,
};

class BaseProcJobLink : public sead::TListNode<BaseProc*> {
public:
    BaseProcJobLink(BaseProc* proc, u8 priority);

    BaseProc* getProc() const { return mData; }

    u8 getPriority() const { return mPriority; }
    u8 getPriority2() const { return mPriority2; }

    void setNewPriority(u8 priority) { mNewPriority = priority; }
    void setNewPriority2(u8 priority) { mNewPriority2 = priority; }

    void loadNewPriority() { mPriority = mNewPriority; }
    void loadNewPriority2() { mPriority2 = mNewPriority2; }

    bool hasPriorityChange() const {
        return mPriority != mNewPriority || mPriority2 != mNewPriority2;
    }

private:
    u8 mPriority;
    u8 mNewPriority;
    u8 mPriority2;
    u8 mNewPriority2;
};
KSYS_CHECK_SIZE_NX150(BaseProcJobLink, 0x28);

struct BaseProcJobList {
    sead::TListNode<BaseProc*>* front() const;
    sead::TListNode<BaseProc*>* next(BaseProcJobLink* link) const;
    int size() const;

    sead::SafeArray<sead::TList<BaseProc*>, 2> lists;
};

class BaseProcJobLists {
public:
    BaseProcJobLists() = default;
    ~BaseProcJobLists() { ; }

    void pushJob(BaseProcJobLink& link);
    void eraseJob(BaseProcJobLink& link);
    sead::TListNode<BaseProc*>* getJobWithTopPriority() const;
    sead::TListNode<BaseProc*>* getNextJobWithTopPriority(BaseProcJobLink* link) const;
    sead::TListNode<BaseProc*>* getNextJob(BaseProcJobLink* link) const;
    BaseProcJobList& getList(int idx) { return mLists[idx]; }
    const BaseProcJobList& getList(int idx) const { return mLists[idx]; }

private:
    sead::SafeArray<BaseProcJobList, 8> mLists{};
};

class BaseProcJob final : public sead::Job {
public:
    BaseProcJob() = default;
    void invoke() override;

    void set(BaseProcJobLink* link, int rounds) {
        mJobLink = link;
        mRequiredCalcRounds = rounds;
    }

private:
    friend class BaseProcJobQue;

    BaseProcJobLink* mJobLink = nullptr;
    int mRequiredCalcRounds = 0;
};

}  // namespace ksys::act