From 78e8b01174ae77c59b1c33aa66efd99a2a7dbae9 Mon Sep 17 00:00:00 2001 From: theo3 Date: Sun, 1 Jan 2023 22:48:53 -0800 Subject: [PATCH] d_a_obj_catdoor first pass --- .../a/obj/d_a_obj_catdoor/d_a_obj_catdoor.cpp | 345 +++++++++--------- tools/decompctx.py | 2 +- 2 files changed, 182 insertions(+), 165 deletions(-) diff --git a/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.cpp b/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.cpp index 12ebca70150..768f5300957 100644 --- a/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.cpp +++ b/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.cpp @@ -4,105 +4,151 @@ // #include "rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "SSystem/SComponent/c_phase.h" +#include "d/bg/d_bg_w.h" +#include "d/com/d_com_inf_game.h" #include "dol2asm.h" #include "dolphin/types.h" +#include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" -// -// Types: -// +extern const char* l_arcName; +static int createSolidHeap(fopAc_ac_c* i_this); -struct request_of_phase_process_class {}; - -struct cXyz {}; - -struct mDoMtx_stack_c { - /* 8000CCC8 */ void push(); - /* 8000CD14 */ void pop(); - /* 8000CD64 */ void transS(cXyz const&); - /* 8000CD9C */ void transM(f32, f32, f32); - - static u8 now[48]; +struct daObjCatDoor_Door_c { + /* 0x00 */ J3DModel* pmodel; + /* 0x04 */ dBgW bgw; + /* 0xe0 */ Mtx mtx; + /* 0xf4 */ s16 angle; }; -struct fopAc_ac_c { - /* 80018B64 */ fopAc_ac_c(); - /* 80018C8C */ ~fopAc_ac_c(); -}; +class daObjCatDoor_c : public fopAc_ac_c { +public: + daObjCatDoor_c() {} + ~daObjCatDoor_c() { + if (mDoor1.bgw.ChkUsed()) { + dComIfG_Bgsp().Release(&mDoor1.bgw); + } + if (mDoor2.bgw.ChkUsed()) { + dComIfG_Bgsp().Release(&mDoor2.bgw); + } + dComIfG_resDelete(&mPhaseReq, l_arcName); + } -struct daObjCatDoor_c { - /* 80BC42B8 */ void attr() const; + /* 80BC42B8 */ const s16* attr() const; /* 80BC43F4 */ void initBaseMtx(); /* 80BC4454 */ void setBaseMtx(); /* 80BC4560 */ void calcOpen(); + u8 getSwitchNo() { return fopAcM_GetParam(this); } + + int createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4); + + ASSERT(modelData != NULL); + mDoor1.pmodel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + mDoor2.pmodel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + if (mDoor1.pmodel == NULL || mDoor2.pmodel == NULL) { + return 0; + } + + cBgD_t* cbgd = (cBgD_t*)dComIfG_getObjectRes(l_arcName, 7); + if (mDoor1.bgw.Set(cbgd, 1, &mDoor1.mtx)) { + return 0; + } + + cBgD_t* cbgd2 = (cBgD_t*)dComIfG_getObjectRes(l_arcName, 7); + if (mDoor2.bgw.Set(cbgd2, 1, &mDoor2.mtx)) { + return 0; + } + + return 1; + } + + int draw() { + g_env_light.settingTevStruct(0x10, ¤t.pos, &mTevStr); + + fopAc_ac_c* p1 = static_cast(this); + g_env_light.setLightTevColorType_MAJI(mDoor1.pmodel, &p1->mTevStr); + g_env_light.setLightTevColorType_MAJI(mDoor2.pmodel, &p1->mTevStr); + + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mDoor1.pmodel); + mDoExt_modelUpdateDL(mDoor2.pmodel); + dComIfGd_setList(); + return 1; + } + + int execute() { + if (dComIfGs_isSwitch(fopAcM_GetParam(this) & 0xFF, fopAcM_GetHomeRoomNo(this)) || + mRotSpeed == 0) { + return 1; + } + calcOpen(); + setBaseMtx(); + return 1; + } + + int create() { + if (!fopAcM_CheckCondition(this, 8)) { + new (this) daObjCatDoor_c(); + fopAcM_OnCondition(this, 8); + } + + int phase_state = dComIfG_resLoad(&mPhaseReq, l_arcName); + if (phase_state != cPhs_COMPLEATE_e) { + return phase_state; + } + + if (!fopAcM_entrySolidHeap(this, createSolidHeap, 0x2520)) { + return cPhs_ERROR_e; + } + + create_init(); + return phase_state; + } + + void create_init() { + ASSERT(getSwitchNo() != 0xff); + fopAcM_setCullSizeBox(this, -200.0f, 0.0f, -20.0f, 200.0f, 260.0f, 100.0f); + if (i_fopAcM_isSwitch(this, getSwitchNo())) { + mDoor1.angle = 0x8800; + mDoor2.angle = 0x7800; + } else { + mDoor1.bgw.SetCrrFunc(NULL); + mDoor1.bgw.SetRoomId(fopAcM_GetRoomNo(this)); + dComIfG_Bgsp().Regist(&mDoor1.bgw, this); + mDoor2.bgw.SetCrrFunc(NULL); + mDoor2.bgw.SetRoomId(fopAcM_GetRoomNo(this)); + dComIfG_Bgsp().Regist(&mDoor2.bgw, this); + } + initBaseMtx(); + } + +private: + /* 0x568 */ request_of_phase_process_class mPhaseReq; + /* 0x570 */ daObjCatDoor_Door_c mDoor1; + /* 0x660 */ daObjCatDoor_Door_c mDoor2; + /* 0x760 */ Mtx mMtx; + /* 0x790 */ s16 mRotSpeed; + +public: static u32 const M_attr; }; -struct dSv_info_c { - /* 80035200 */ void onSwitch(int, int); - /* 80035360 */ void isSwitch(int, int) const; -}; - -struct dKy_tevstr_c {}; - -struct J3DModelData {}; - -struct dScnKy_env_light_c { - /* 801A37C4 */ void settingTevStruct(int, cXyz*, dKy_tevstr_c*); - /* 801A4DA0 */ void setLightTevColorType_MAJI(J3DModelData*, dKy_tevstr_c*); -}; - -struct dRes_info_c {}; - -struct dRes_control_c { - /* 8003C2EC */ void getRes(char const*, s32, dRes_info_c*, int); -}; - -struct dBgW_Base {}; - -struct dBgW { - /* 8007B970 */ dBgW(); - /* 8007B9C0 */ void Move(); -}; - -struct dBgS { - /* 80074A08 */ void Regist(dBgW_Base*, fopAc_ac_c*); -}; - -struct cBgW_BgId { - /* 802681D4 */ void ChkUsed() const; -}; - -struct cBgD_t {}; - -struct cBgW { - /* 8007933C */ ~cBgW(); - /* 80079F38 */ void Set(cBgD_t*, u32, f32 (*)[3][4]); -}; - -struct cBgS { - /* 80074250 */ void Release(dBgW_Base*); -}; - -struct J3DModel {}; - // // Forward References: // -extern "C" void attr__14daObjCatDoor_cCFv(); extern "C" static void createSolidHeap__FP10fopAc_ac_c(); extern "C" void initBaseMtx__14daObjCatDoor_cFv(); -extern "C" void setBaseMtx__14daObjCatDoor_cFv(); -extern "C" void calcOpen__14daObjCatDoor_cFv(); extern "C" static void daObjCatDoor_Draw__FP14daObjCatDoor_c(); -extern "C" static void daObjCatDoor_Execute__FP14daObjCatDoor_c(); +extern "C" static int daObjCatDoor_Execute__FP14daObjCatDoor_c(); extern "C" static bool daObjCatDoor_IsDelete__FP14daObjCatDoor_c(); extern "C" static void daObjCatDoor_Delete__FP14daObjCatDoor_c(); extern "C" static void daObjCatDoor_Create__FP10fopAc_ac_c(); extern "C" u32 const M_attr__14daObjCatDoor_c; -extern "C" extern char const* const d_a_obj_catdoor__stringBase0; -extern "C" extern void* g_profile_Obj_CatDoor[12]; // // External References: @@ -134,18 +180,13 @@ extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); extern "C" void ChkUsed__9cBgW_BgIdCFv(); extern "C" void cLib_chaseS__FPsss(); -extern "C" void PSMTXCopy(); extern "C" void _savegpr_25(); extern "C" void _savegpr_29(); extern "C" void _restgpr_25(); extern "C" void _restgpr_29(); extern "C" extern void* g_fopAc_Method[8]; -extern "C" extern void* g_fpcLf_Method[5 + 1 /* padding */]; extern "C" extern void* __vt__4dBgW[65]; extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" extern u8 g_env_light[4880]; -extern "C" extern u8 j3dSys[284]; // // Declarations: @@ -157,118 +198,86 @@ SECTION_RODATA u32 const daObjCatDoor_c::M_attr = 0x001E0578; COMPILER_STRIP_GATE(0x80BC49B4, &daObjCatDoor_c::M_attr); /* 80BC42B8-80BC42C4 000078 000C+00 1/1 0/0 1/1 .text attr__14daObjCatDoor_cCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daObjCatDoor_c::attr() const { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/attr__14daObjCatDoor_cCFv.s" +const s16* daObjCatDoor_c::attr() const { + return (const s16*)&daObjCatDoor_c::M_attr; } -#pragma pop - -/* ############################################################################################## */ -/* 80BC49D8-80BC49D8 000024 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80BC49D8 = "CatDoor"; -#pragma pop /* 80BC49E0-80BC49E4 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ -SECTION_DATA static void* l_arcName = (void*)&d_a_obj_catdoor__stringBase0; +static const char* l_arcName = "CatDoor"; /* 80BC42C4-80BC43F4 000084 0130+00 1/1 0/0 0/0 .text createSolidHeap__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void createSolidHeap(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/createSolidHeap__FP10fopAc_ac_c.s" +static int createSolidHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } -#pragma pop /* 80BC43F4-80BC4454 0001B4 0060+00 1/1 0/0 0/0 .text initBaseMtx__14daObjCatDoor_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daObjCatDoor_c::initBaseMtx() { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/initBaseMtx__14daObjCatDoor_cFv.s" +void daObjCatDoor_c::initBaseMtx() { + mCullMtx = mMtx; + mDoMtx_stack_c::transS(current.pos); + mDoMtx_YrotM(mDoMtx_stack_c::get(), shape_angle.y); + PSMTXCopy(mDoMtx_stack_c::get(), mMtx); + setBaseMtx(); } -#pragma pop - -/* ############################################################################################## */ -/* 80BC49B8-80BC49BC 000004 0004+00 0/1 0/0 0/0 .rodata @3712 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3712 = -97.0f; -COMPILER_STRIP_GATE(0x80BC49B8, &lit_3712); -#pragma pop - -/* 80BC49BC-80BC49C0 000008 0004+00 0/1 0/0 0/0 .rodata @3713 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3713 = 97.0f; -COMPILER_STRIP_GATE(0x80BC49BC, &lit_3713); -#pragma pop - -/* 80BC49C0-80BC49C4 00000C 0004+00 0/2 0/0 0/0 .rodata @3714 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3714[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x80BC49C0, &lit_3714); -#pragma pop /* 80BC4454-80BC4560 000214 010C+00 2/2 0/0 1/1 .text setBaseMtx__14daObjCatDoor_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daObjCatDoor_c::setBaseMtx() { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/setBaseMtx__14daObjCatDoor_cFv.s" +void daObjCatDoor_c::setBaseMtx() { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_YrotM(mDoMtx_stack_c::get(), shape_angle.y); + for (int i = 0; i < 2; i++) { + daObjCatDoor_Door_c* door = i == 0 ? &mDoor1 : &mDoor2; + f32 xOff = i == 0 ? -97.0f : 97.0f; + s16 rot = i == 0 ? door->angle : s16(door->angle + 0x8000); + mDoMtx_stack_c::push(); + mDoMtx_stack_c::transM(xOff, 0.0, 0.0); + mDoMtx_YrotM(mDoMtx_stack_c::get(), (s16)rot); + mDoMtx_copy(mDoMtx_stack_c::get(), door->pmodel->mBaseTransformMtx); + mDoMtx_copy(mDoMtx_stack_c::get(), door->mtx); + door->bgw.Move(); + mDoMtx_stack_c::pop(); + } } -#pragma pop /* 80BC4560-80BC4628 000320 00C8+00 1/1 0/0 0/0 .text calcOpen__14daObjCatDoor_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daObjCatDoor_c::calcOpen() { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/calcOpen__14daObjCatDoor_cFv.s" +void daObjCatDoor_c::calcOpen() { + s16 prev = mRotSpeed; + int res = cLib_chaseS(&mRotSpeed, 0, *attr()); + for (int i = 0; i < 2; i++) { + daObjCatDoor_Door_c* door = i == 0 ? &mDoor1 : &mDoor2; + if (i == 0) { + door->angle -= mRotSpeed; + } else { + door->angle += mRotSpeed; + } + } + + if (prev != 0 && res != 0) { + i_fopAcM_onSwitch(this, getSwitchNo()); + } } -#pragma pop /* 80BC4628-80BC46EC 0003E8 00C4+00 1/0 0/0 0/0 .text daObjCatDoor_Draw__FP14daObjCatDoor_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daObjCatDoor_Draw(daObjCatDoor_c* param_0) { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Draw__FP14daObjCatDoor_c.s" +static int daObjCatDoor_Draw(daObjCatDoor_c* i_this) { + return static_cast(i_this)->draw(); } -#pragma pop /* 80BC46EC-80BC4760 0004AC 0074+00 1/0 0/0 0/0 .text daObjCatDoor_Execute__FP14daObjCatDoor_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daObjCatDoor_Execute(daObjCatDoor_c* param_0) { - nofralloc -#include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Execute__FP14daObjCatDoor_c.s" +static int daObjCatDoor_Execute(daObjCatDoor_c* i_this) { + return static_cast(i_this)->execute(); } -#pragma pop /* 80BC4760-80BC4768 000520 0008+00 1/0 0/0 0/0 .text daObjCatDoor_IsDelete__FP14daObjCatDoor_c */ -static bool daObjCatDoor_IsDelete(daObjCatDoor_c* param_0) { +static bool daObjCatDoor_IsDelete(daObjCatDoor_c* i_this) { return true; } /* 80BC4768-80BC4848 000528 00E0+00 1/0 0/0 0/0 .text daObjCatDoor_Delete__FP14daObjCatDoor_c */ +#ifdef NONMATCHING // ~dBgW is not inlined +static int daObjCatDoor_Delete(daObjCatDoor_c* i_this) { + fopAcM_GetID(i_this); + i_this->~daObjCatDoor_c(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -277,6 +286,7 @@ static asm void daObjCatDoor_Delete(daObjCatDoor_c* param_0) { #include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Delete__FP14daObjCatDoor_c.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80BC49C4-80BC49C8 000010 0004+00 0/1 0/0 0/0 .rodata @3860 */ @@ -316,6 +326,12 @@ COMPILER_STRIP_GATE(0x80BC49D4, &lit_3864); /* 80BC4848-80BC49AC 000608 0164+00 1/0 0/0 0/0 .text daObjCatDoor_Create__FP10fopAc_ac_c */ +#ifdef NONMATCHING // inverted conditional branch +static void daObjCatDoor_Create(fopAc_ac_c* i_this) { + fopAcM_GetID(i_this); + static_cast(i_this)->create(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -324,6 +340,7 @@ static asm void daObjCatDoor_Create(fopAc_ac_c* param_0) { #include "asm/rel/d/a/obj/d_a_obj_catdoor/d_a_obj_catdoor/daObjCatDoor_Create__FP10fopAc_ac_c.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80BC49E4-80BC4A04 -00001 0020+00 1/0 0/0 0/0 .data l_daObjCatDoor_Method */ diff --git a/tools/decompctx.py b/tools/decompctx.py index abf997e91fa..ba22ef47961 100644 --- a/tools/decompctx.py +++ b/tools/decompctx.py @@ -39,7 +39,7 @@ def import_c_file(in_file) -> str: defines.add(guard_match[1]) print("Processing file", in_file) include_match = include_pattern.match(line.strip()) - if include_match: + if include_match and not include_match[1].endswith(".s"): out_text += f"/* \"{in_file}\" line {idx} \"{include_match[1]}\" */\n" out_text += import_h_file(include_match[1], os.path.dirname(in_file)) out_text += f"/* end \"{include_match[1]}\" */\n"