diff options
Diffstat (limited to 'src/f_pc/f_pc_node.cpp')
| -rw-r--r-- | src/f_pc/f_pc_node.cpp | 221 |
1 files changed, 77 insertions, 144 deletions
diff --git a/src/f_pc/f_pc_node.cpp b/src/f_pc/f_pc_node.cpp index 406444b6be..5d60fd2a3b 100644 --- a/src/f_pc/f_pc_node.cpp +++ b/src/f_pc/f_pc_node.cpp @@ -6,80 +6,7 @@ #include "f_pc/f_pc_node.h" #include "dol2asm.h" #include "dolphin/types.h" - -// -// Types: -// - -struct process_node_class {}; - -struct process_method_class {}; - -struct nodedraw_method_class {}; - -struct node_list_class {}; - -struct layer_class {}; - -// -// Forward References: -// - -void fpcNd_DrawMethod(nodedraw_method_class*, void*); -static void fpcNd_Draw(process_node_class*); -static void fpcNd_Execute(process_node_class*); -static void fpcNd_IsCreatingFromUnder(void*); -void fpcNd_IsDeleteTiming(process_node_class*); -static void fpcNd_IsDelete(process_node_class*); -static void fpcNd_Delete(process_node_class*); -static void fpcNd_Create(process_node_class*); - -extern "C" void fpcNd_DrawMethod__FP21nodedraw_method_classPv(); -extern "C" static void fpcNd_Draw__FP18process_node_class(); -extern "C" static void fpcNd_Execute__FP18process_node_class(); -extern "C" static void fpcNd_IsCreatingFromUnder__FPv(); -extern "C" void fpcNd_IsDeleteTiming__FP18process_node_class(); -extern "C" static void fpcNd_IsDelete__FP18process_node_class(); -extern "C" static void fpcNd_Delete__FP18process_node_class(); -extern "C" static void fpcNd_Create__FP18process_node_class(); -extern "C" extern void* g_fpcNd_Method[5 + 1 /* padding */]; -extern "C" extern u8 g_fpcNd_type[4 + 4 /* padding */]; - -// -// External References: -// - -void fpcBs_Is_JustOfType(int, int); -void fpcBs_MakeOfType(int*); -void fpcLy_IsDeletingMesg(layer_class*); -void fpcLy_IsCreatingMesg(layer_class*); -void fpcLy_SetCurrentLayer(layer_class*); -void fpcLy_CurrentLayer(); -void fpcLy_Delete(layer_class*); -void fpcLy_Create(layer_class*, void*, node_list_class*, int); -void fpcLyIt_Judge(layer_class*, void* (*)(void*, void*), void*); -void fpcMtd_Method(int (*)(void*), void*); -void fpcMtd_Execute(process_method_class*, void*); -void fpcMtd_IsDelete(process_method_class*, void*); -void fpcMtd_Delete(process_method_class*, void*); -void fpcMtd_Create(process_method_class*, void*); - -extern "C" void fpcBs_Is_JustOfType__Fii(); -extern "C" void fpcBs_MakeOfType__FPi(); -extern "C" void fpcLy_IsDeletingMesg__FP11layer_class(); -extern "C" void fpcLy_IsCreatingMesg__FP11layer_class(); -extern "C" void fpcLy_SetCurrentLayer__FP11layer_class(); -extern "C" void fpcLy_CurrentLayer__Fv(); -extern "C" void fpcLy_Delete__FP11layer_class(); -extern "C" void fpcLy_Create__FP11layer_classPvP15node_list_classi(); -extern "C" void fpcLyIt_Judge__FP11layer_classPFPvPv_PvPv(); -extern "C" void fpcMtd_Method__FPFPv_iPv(); -extern "C" void fpcMtd_Execute__FP20process_method_classPv(); -extern "C" void fpcMtd_IsDelete__FP20process_method_classPv(); -extern "C" void fpcMtd_Delete__FP20process_method_classPv(); -extern "C" void fpcMtd_Create__FP20process_method_classPv(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_29(); +#include "f_pc/f_pc_layer_iter.h" // // Declarations: @@ -87,106 +14,112 @@ extern "C" void _restgpr_29(); /* 800224F0-80022514 0024+00 s=1 e=1 z=0 None .text fpcNd_DrawMethod__FP21nodedraw_method_classPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void fpcNd_DrawMethod(nodedraw_method_class* param_0, void* param_1) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_DrawMethod__FP21nodedraw_method_classPv.s" +s32 fpcNd_DrawMethod(nodedraw_method_class* pNodeMethod, void* pData) { + return fpcMtd_Method(pNodeMethod->mNodedrawFunc, pData); } -#pragma pop /* 80022514-80022580 006C+00 s=1 e=0 z=0 None .text fpcNd_Draw__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_Draw(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_Draw__FP18process_node_class.s" +s32 fpcNd_Draw(process_node_class* pProcNode) { + s32 uVar2 = 0x0; + if (pProcNode->mUnk0 == 0) { + layer_class* uVar1 = fpcLy_CurrentLayer(); + fpcLy_SetCurrentLayer(&pProcNode->mLayer); + uVar2 = fpcNd_DrawMethod(pProcNode->mpNodeMtd, pProcNode); + fpcLy_SetCurrentLayer(uVar1); + } + return uVar2; } -#pragma pop /* 80022580-800225DC 005C+00 s=1 e=0 z=0 None .text fpcNd_Execute__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_Execute(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_Execute__FP18process_node_class.s" +s32 fpcNd_Execute(process_node_class* pProcNode) { + s32 ret; + layer_class* uVar1 = fpcLy_CurrentLayer(); + fpcLy_SetCurrentLayer(&pProcNode->mLayer); + ret = fpcMtd_Execute(&pProcNode->mpNodeMtd->mBase, pProcNode); + fpcLy_SetCurrentLayer(uVar1); + return ret; } -#pragma pop /* ############################################################################################## */ /* 80450D40-80450D48 0004+04 s=2 e=11 z=0 None .sbss g_fpcNd_type */ -u8 g_fpcNd_type[4 + 4 /* padding */]; +int g_fpcNd_type; /* 800225DC-8002265C 0080+00 s=1 e=0 z=0 None .text fpcNd_IsCreatingFromUnder__FPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_IsCreatingFromUnder(void* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_IsCreatingFromUnder__FPv.s" +void* fpcNd_IsCreatingFromUnder(void* pProcNodeV) { + layer_class* layer; + process_node_class* pProcNode = static_cast<process_node_class*>(pProcNodeV); + if (pProcNode != NULL && + fpcBs_Is_JustOfType(g_fpcNd_type, pProcNode->mBase.mSubType) != FALSE) { + layer = &pProcNode->mLayer; + if (fpcLy_IsCreatingMesg(layer) == 0x0) { + return (process_node_class*)fpcLyIt_Judge( + layer, (fpcLyIt_JudgeFunc)fpcNd_IsCreatingFromUnder, NULL); + } else { + return pProcNode; + } + } else { + return NULL; + } } -#pragma pop /* ############################################################################################## */ /* 804505E0-804505E8 0004+04 s=1 e=0 z=0 None .sdata g_fpcNd_IsCheckOfDeleteTiming */ -SECTION_SDATA static u32 g_fpcNd_IsCheckOfDeleteTiming[1 + 1 /* padding */] = { - 0x00000001, - /* padding */ - 0x00000000, -}; +static s32 g_fpcNd_IsCheckOfDeleteTiming = 1; /* 8002265C-8002269C 0040+00 s=0 e=2 z=0 None .text fpcNd_IsDeleteTiming__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void fpcNd_IsDeleteTiming(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_IsDeleteTiming__FP18process_node_class.s" +s32 fpcNd_IsDeleteTiming(process_node_class* pProcNode) { + if (g_fpcNd_IsCheckOfDeleteTiming == 0x1 && fpcNd_IsCreatingFromUnder(pProcNode) != NULL) { + return 0; + } else { + return 1; + } } -#pragma pop /* 8002269C-800226C4 0028+00 s=1 e=0 z=0 None .text fpcNd_IsDelete__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_IsDelete(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_IsDelete__FP18process_node_class.s" +s32 fpcNd_IsDelete(process_node_class* pProcNode) { + return fpcMtd_IsDelete(&pProcNode->mpNodeMtd->mBase, pProcNode); } -#pragma pop /* 800226C4-80022728 0064+00 s=1 e=0 z=0 None .text fpcNd_Delete__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_Delete(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_Delete__FP18process_node_class.s" +s32 fpcNd_Delete(process_node_class* pProcNode) { + if ((fpcLy_IsDeletingMesg(&pProcNode->mLayer) == 0x0) && + fpcMtd_Delete(&pProcNode->mpNodeMtd->mBase, pProcNode) == 0x1) { + pProcNode->mBase.mSubType = 0x0; + return fpcLy_Delete(&pProcNode->mLayer); + } else { + return 0; + } } -#pragma pop /* 80022728-800227C4 009C+00 s=1 e=0 z=0 None .text fpcNd_Create__FP18process_node_class */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm static void fpcNd_Create(process_node_class* param_0) { - nofralloc -#include "asm/f_pc/f_pc_node/fpcNd_Create__FP18process_node_class.s" +s32 fpcNd_Create(process_node_class* pProcNode1) { + // this cast looks like a fake match, but it doesn't match without the cast, naive approach + // swaps r31 and r30 most likely it gets casted to another unknown struct + process_node_class* pProcNode = (process_node_class*)pProcNode1; + layer_class* uVar2; + s32 uVar3; + if (pProcNode->mBase.mInitState == 0) { + node_process_profile_definition* pProcProfileDef = + (node_process_profile_definition*)pProcNode->mBase.mpProf; + pProcNode->mBase.mSubType = fpcBs_MakeOfType(&g_fpcNd_type); + pProcNode->mpNodeMtd = pProcProfileDef->mNDrwMthCls; + fpcLy_Create(&pProcNode->mLayer, pProcNode, pProcNode->mLayerNodeLists, 0x10); + pProcNode->mUnk0 = 0; + } + uVar2 = fpcLy_CurrentLayer(); + fpcLy_SetCurrentLayer(&pProcNode->mLayer); + uVar3 = fpcMtd_Create(&pProcNode->mpNodeMtd->mBase, pProcNode); + fpcLy_SetCurrentLayer(uVar2); + return uVar3; } -#pragma pop /* ############################################################################################## */ /* 803A3A20-803A3A38 0014+04 s=0 e=9 z=0 None .data g_fpcNd_Method */ -SECTION_DATA void* g_fpcNd_Method[5 + 1 /* padding */] = { - (void*)fpcNd_Create__FP18process_node_class, - (void*)fpcNd_Delete__FP18process_node_class, - (void*)fpcNd_Execute__FP18process_node_class, - (void*)fpcNd_IsDelete__FP18process_node_class, - (void*)fpcNd_Draw__FP18process_node_class, - /* padding */ - NULL, +nodedraw_method_class g_fpcNd_Method = { + (process_method_func)fpcNd_Create, + (process_method_func)fpcNd_Delete, + (process_method_func)fpcNd_Execute, + (process_method_func)fpcNd_IsDelete, + (process_method_func)fpcNd_Draw, }; |
