summaryrefslogtreecommitdiff
path: root/src/f_pc/f_pc_manager.cpp
blob: 13d62304181609ea84bd7f2e3b5b0a668dc313e5 (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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
//
// Generated By: dol2asm
// Translation Unit: f_pc/f_pc_manager
//

#include "f_pc/f_pc_manager.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "f_pc/f_pc_base.h"
#include "f_pc/f_pc_create_iter.h"
#include "f_pc/f_pc_creator.h"
#include "f_pc/f_pc_delete_tag.h"
#include "f_pc/f_pc_deletor.h"
#include "f_pc/f_pc_draw.h"
#include "f_pc/f_pc_executor.h"
#include "f_pc/f_pc_fstcreate_req.h"
#include "f_pc/f_pc_layer.h"
#include "f_pc/f_pc_layer_iter.h"
#include "f_pc/f_pc_layer_tag.h"
#include "f_pc/f_pc_line.h"
#include "f_pc/f_pc_line_iter.h"
#include "f_pc/f_pc_line_tag.h"
#include "f_pc/f_pc_method.h"
#include "f_pc/f_pc_node_req.h"
#include "f_pc/f_pc_pause.h"
#include "f_pc/f_pc_priority.h"
#include "f_pc/f_pc_profile.h"

#include "SSystem/SComponent/c_API_graphic.h"
#include "d/com/d_com_inf_game.h"
#include "m_Do/m_Do_audio.h"

//
// Types:
//

struct dShutdownErrorMsg_c {
    /* 8009D790 */ static bool execute();
};

struct dDvdErrorMsg_c {
    /* 8009D354 */ static u8 execute();
};

//
// Forward References:
//

extern "C" void fpcM_Draw__FPv();
extern "C" static void fpcM_DrawIterater__FPFPvPv_i();
extern "C" void fpcM_Execute__FPv();
extern "C" void fpcM_Delete__FPv();
extern "C" void fpcM_IsCreating__FUi();
extern "C" void fpcM_Management__FPFv_vPFv_v();
extern "C" void fpcM_Init__Fv();
extern "C" void fpcM_FastCreate__FsPFPv_iPvPv();
extern "C" void fpcM_IsPause__FPvUc();
extern "C" void fpcM_PauseEnable__FPvUc();
extern "C" void fpcM_PauseDisable__FPvUc();
extern "C" void fpcM_JudgeInLayer__FUiPFPvPv_PvPv();

//
// External References:
//

extern "C" void fpcCtIt_JudgeInLayer__FUiPFPvPv_PvPv();
extern "C" void fpcCt_IsCreatingByID__FUi();
extern "C" void fpcCt_Handler__Fv();
extern "C" void fpcDt_Handler__Fv();
extern "C" void fpcDt_Delete__FPv();
extern "C" void fpcEx_Execute__FP18base_process_class();
extern "C" void fpcEx_Handler__FPFPvPv_i();
extern "C" void fpcLy_RootLayer__Fv();
extern "C" void fpcLy_CurrentLayer__Fv();
extern "C" void fpcLy_Layer__FUi();
extern "C" void fpcLy_Create__FP11layer_classPvP15node_list_classi();
extern "C" void fpcLyIt_OnlyHere__FP11layer_classPFPvPv_iPv();
extern "C" void fpcLyIt_Judge__FP11layer_classPFPvPv_PvPv();
extern "C" void fpcLn_Create__Fv();
extern "C" void fpcPi_Handler__Fv();
extern "C" void fpcPause_IsEnable__FPvUc();
extern "C" void fpcPause_Enable__FPvUc();
extern "C" void fpcPause_Disable__FPvUc();
extern "C" void fpcDw_Execute__FP18base_process_class();
extern "C" void fpcDw_Handler__FPFPFPvPv_i_iPFPvPv_i();
extern "C" void fpcFCtRq_Request__FP11layer_classsPFPvPv_iPvPv();
extern "C" void drawSimpleModel__14dComIfG_play_cFv();
extern "C" void stopTime__11dLib_time_cFv();
extern "C" void startTime__11dLib_time_cFv();
extern "C" void peekData__13dDlst_peekZ_cFv();
extern "C" void execute__14dDvdErrorMsg_cFv();
extern "C" void execute__19dShutdownErrorMsg_cFv();
extern "C" void cAPIGph_Painter__Fv();
extern "C" void MtxInit__Fv();
extern "C" void pauseAllGameSound__10Z2SoundMgrFb();
extern "C" void stopPatternedRumble__Q210JUTGamePad7CRumbleFs();
extern "C" void _savegpr_28();
extern "C" void _restgpr_28();
extern "C" extern u8 m_gamePad__8mDoCPd_c[16];
extern "C" extern u8 struct_80450D38;

//
// Declarations:
//

/* 80450D38-80450D40 0008+00 s=0 e=1 z=0  None .sbss      None */
u8 struct_80450D38;

s8 data_80450D39;

/* 800220A0-800220C0 0020+00 s=1 e=1 z=0  None .text      fpcM_Draw__FPv */
void fpcM_Draw(void* pProc) {
    fpcDw_Execute((base_process_class*)pProc);
}

/* 800220C0-800220F8 0038+00 s=1 e=0 z=0  None .text      fpcM_DrawIterater__FPFPvPv_i */
s32 fpcM_DrawIterater(fpcM_DrawIteraterFunc pFunc) {
    return fpcLyIt_OnlyHere(fpcLy_RootLayer(), (fpcLyIt_OnlyHereFunc)pFunc, NULL);
}

/* 800220F8-80022118 0020+00 s=1 e=0 z=1  None .text      fpcM_Execute__FPv */
s32 fpcM_Execute(void* pProc) {
    return fpcEx_Execute((base_process_class*)pProc);
}

/* 80022118-80022138 0020+00 s=0 e=7 z=0  None .text      fpcM_Delete__FPv */
s32 fpcM_Delete(void* pProc) {
    return fpcDt_Delete((base_process_class*)pProc);
}

/* 80022138-80022158 0020+00 s=0 e=6 z=43  None .text      fpcM_IsCreating__FUi */
BOOL fpcM_IsCreating(unsigned int pID) {
    return fpcCt_IsCreatingByID(pID);
}

/* 80022158-800222B8 0160+00 s=0 e=1 z=0  None .text      fpcM_Management__FPFv_vPFv_v */
void fpcM_Management(fpcM_ManagementFunc func1, fpcM_ManagementFunc func2) {
    MtxInit();
    dComIfGd_peekZdata();

    if (!dShutdownErrorMsg_c::execute()) {
        if (data_80450D39 == 0) {
            struct_80450D38 = 0;
            data_80450D39 = 1;
        }

        if (!dDvdErrorMsg_c::execute()) {
            if (struct_80450D38 != 0) {
                dLib_time_c::startTime();
                Z2GetSoundMgr()->pauseAllGameSound(false);
                struct_80450D38 = 0;
            }

            cAPIGph_Painter();

            if (!dPa_control_c::isStatus(1)) {
                fpcDt_Handler();
            } else {
                dPa_control_c::offStatus(1);
            }

            fpcPi_Handler();
            fpcCt_Handler();

            if (func1 != NULL) {
                func1();
            }

            fpcEx_Handler((fpcLnIt_QueueFunc)fpcM_Execute);
            fpcDw_Handler((fpcDw_HandlerFuncFunc)fpcM_DrawIterater, (fpcDw_HandlerFunc)fpcM_Draw);

            if (func2 != NULL) {
                func2();
            }

            dComIfGp_drawSimpleModel();
        } else if (struct_80450D38 == 0) {
            dLib_time_c::stopTime();
            Z2GetSoundMgr()->pauseAllGameSound(true);
            mDoCPd_c::stopMotorWaveHard(0);
            struct_80450D38 = 1;
        }
    }
}

/* ############################################################################################## */
/* 803F4DB0-803F4DDC 002C+00 s=1 e=0 z=0  None .bss       rootlayer$3716 */
static layer_class rootlayer;

/* 803F4DDC-803F4E58 0078+04 s=1 e=0 z=0  None .bss       queue$3717 */
static node_list_class queue[10];

/* 800222B8-800222F4 003C+00 s=0 e=1 z=0  None .text      fpcM_Init__Fv */
void fpcM_Init(void) {
    fpcLy_Create(&rootlayer, NULL, queue, 10);
    fpcLn_Create();
}

/* 800222F4-80022348 0054+00 s=0 e=3 z=0  None .text      fpcM_FastCreate__FsPFPv_iPvPv */
base_process_class* fpcM_FastCreate(s16 pProcTypeID, FastCreateReqFunc param_2, void* param_3,
                                    void* pData) {
    return fpcFCtRq_Request(fpcLy_CurrentLayer(), pProcTypeID, (fstCreateFunc)param_2, param_3,
                            pData);
}

/* 80022348-8002236C 0024+00 s=0 e=1 z=0  None .text      fpcM_IsPause__FPvUc */
s32 fpcM_IsPause(void* pProc, u8 param_2) {
    return fpcPause_IsEnable((base_process_class*)pProc, param_2 & 0xFF);
}

/* 8002236C-80022390 0024+00 s=0 e=1 z=0  None .text      fpcM_PauseEnable__FPvUc */
void fpcM_PauseEnable(void* pProc, u8 param_2) {
    fpcPause_Enable((process_node_class*)pProc, param_2 & 0xFF);
}

/* 80022390-800223B4 0024+00 s=0 e=1 z=0  None .text      fpcM_PauseDisable__FPvUc */
void fpcM_PauseDisable(void* pProc, u8 param_2) {
    fpcPause_Disable((process_node_class*)pProc, param_2 & 0xFF);
}

/* 800223B4-80022428 0074+00 s=0 e=1 z=0  None .text      fpcM_JudgeInLayer__FUiPFPvPv_PvPv */
void* fpcM_JudgeInLayer(unsigned int pLayerID, fpcCtIt_JudgeFunc pFunc, void* pUserData) {
    layer_class* layer = fpcLy_Layer(pLayerID);
    if (layer != NULL) {
        void* ret = fpcCtIt_JudgeInLayer(pLayerID, pFunc, pUserData);
        if (ret == NULL) {
            ret = fpcLyIt_Judge(layer, pFunc, pUserData);
        }
        return ret;
    } else {
        return NULL;
    }
}