summaryrefslogtreecommitdiff
path: root/include/f/f_base.h
blob: 296fca1ea65ddfd2ad299f46f9a9359ec86db324 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#ifndef F_BASE_H
#define F_BASE_H

// This file is adapted from
// https://github.com/NSMBW-Community/NSMBW-Decomp/blob/master/include/dol/framework/f_base.hpp and the Skyward Sword
// Ghidra database. Comments and docs can be seen above. stripped in this file for easier looking

#include "c/c_list.h"
#include "common.h"
#include "egg/core/eggFrmHeap.h"
#include "f/f_base_id.h"
#include "f/f_helper_unk.h"
#include "f/f_list_mg.h"
#include "f/f_manager.h"
#include "f/f_profile.h"

// Ghidra: fBase
//   size: 0x64
// official name
class fBase_c {
public:
    /* 0x00 */ fBaseID_e mID;
    /* 0x04 */ u32 mParams;
    /* 0x08 */ ProfileName mProfileName;
    /* 0x0A */ u8 mLifecycleState;
    /* 0x0B */ bool mDeleteRequest;
    /* 0x0C */ s8 mUpdateRequest;
    /* 0x0D */ bool mCreateRequest;
    /* 0x0E */ u8 mGroupType;
    /* 0x0F */ u8 mProcControl;
    /* 0x10 */ fManager_c mManager;
    /* 0x50 */ fBaHelper_c *mpHelper;
    /* 0x54 */ cListMg_c mActorList;
    /* 0x5C */ EGG::FrmHeap *mpHeap;
    /* 0x60 */ // vtable
public:
    enum UPDATE_STATUS_e {
        UPDATING,
        UPDATE_REQUEST,
        UPDATE_FORCE,
    };
    enum LIFECYCLE_e {
        WAITING_FOR_CREATE,
        ACTIVE,
        TO_BE_DELETED,
    };
    enum GROUP_TYPE_e {
        OTHER,
        SCENE,
        ACTOR,
        STAGE,
    };
    enum MAIN_STATE_e {
        CANCELED,
        ERROR,
        SUCCESS,
        WAITING
    };
    enum PACK_RESULT_e {
        NOT_READY,
        SUCCEEDED,
        FAILED,
    };
    enum PROC_DISABLE_e {
        ROOT_DISABLE_EXECUTE = 1,
        DISABLE_EXECUTE = 2,
        ROOT_DISABLE_DRAW = 4,
        DISABLE_DRAW = 8
    };

    int getID() const {
        return mID;
    }

    bool checkProcControl(u8 procControl) const {
        return (mProcControl & procControl) != 0;
    }
    void setProcControl(u8 procControl) {
        mProcControl |= procControl;
    }
    void unsetProcControl(u8 procControl) {
        mProcControl &= ~procControl;
    }

    void setParams() {
        mID = m_rootUniqueID;
        mParams = m_tmpCtData.params;
        mProfileName = m_tmpCtData.prof_name;
        mGroupType = m_tmpCtData.group_type;
    }

    u32 getFromParams(u8 shift, u32 mask) {
        return (mParams >> shift) & mask;
    }
    f32 getFromParams(u8 shift, u32 mask, f32 scale) {
        return ((mParams >> shift) & mask) * scale;
    }

public:
    fBase_c();
    static void *operator new(size_t);
    static void operator delete(void *);

public:
    /* vt 0x08 */ virtual int create();
    /* vt 0x0C */ virtual int preCreate();
    /* vt 0x10 */ virtual void postCreate(MAIN_STATE_e state);
    /* vt 0x14 */ virtual int doDelete();
    /* vt 0x18 */ virtual int preDelete();
    /* vt 0x1C */ virtual void postDelete(MAIN_STATE_e state);
    /* vt 0x20 */ virtual int execute();
    /* vt 0x24 */ virtual int preExecute();
    /* vt 0x28 */ virtual void postExecute(MAIN_STATE_e state);
    /* vt 0x2C */ virtual int draw();
    /* vt 0x30 */ virtual int preDraw();
    /* vt 0x34 */ virtual void postDraw(MAIN_STATE_e state);
    /* vt 0x38 */ virtual void deleteReady();
    /* vt 0x3C */ virtual bool entryFrmHeap(size_t size, EGG::Heap *parentHeap);
    /* vt 0x40 */ virtual bool entryFrmHeapNonAdjust(size_t size, EGG::Heap *parentHeap);
    /* vt 0x44 */ virtual bool createHeap();
    /* vt 0x48 */ virtual ~fBase_c();

public:
    int commonPack(int (fBase_c::*doFunc)(), int (fBase_c::*preFunc)(), void (fBase_c::*postFunc)(MAIN_STATE_e));
    int createPack();
    int deletePack();
    int executePack();
    int drawPack();
    int connectProc();
    void deleteRequest();
    void forceUpdate();
    static fBase_c *getConnectRoot();
    static fBase_c *getConnectTreeNext(fBase_c *);
    fBase_c *getConnectParent() const;
    fBase_c *getConnectChild() const;
    fBase_c *getConnectBrNext() const;
    void updateExecutePriority(u16 priority);
    bool setConnectChild(fBase_c *child);
    void runCreate();
    fBase_c *getChildProcessCreateState() const;
    bool checkChildProcessCreateState() const;

public:
    static void setTmpCtData(ProfileName profName, fTrNdBa_c *connectParent, u32 param, u8 groupType);
    static fBase_c *fBase_make(ProfileName profName, fTrNdBa_c *connectParent, u32 param, u8 groupType);
    static fBase_c *createRoot(ProfileName profName, u32 param, u8 groupType);
    static fBase_c *createChild(ProfileName profName, fBase_c *parent, u32 param, u8 groupType);

public:
    static fLiMgBa_c m_forceExecuteList;
    static int (*sLoadAsyncCallback)();
    static void (*sUnloadCallback)();

private:
    static fBaseID_e m_rootUniqueID;

    struct ConstructData {
        ProfileName prof_name;
        fTrNdBa_c *connect_parent;
        u32 params;
        u8 group_type;
    };

    static ConstructData m_tmpCtData;

    friend class fManager_c;
    friend class fLiNdBa_c;
    friend class fTrMgBa_c;
};

#endif