From 89ccf4c7ef3dee9fd488eac19ccc2f62c920c28a Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Sat, 29 Nov 2025 15:11:21 -0500 Subject: [PATCH] d_a_bg debug work + matching for retail (#2890) --- configure.py | 2 +- include/d/actor/d_a_bg.h | 1 + include/d/actor/d_a_suspend.h | 3 +- include/d/d_bg_parts.h | 14 +++++++ include/d/d_stage.h | 56 +++++++++++++++---------- src/d/actor/d_a_bg.cpp | 79 ++++++++++++++++++++++++----------- src/d/d_bg_parts.cpp | 18 ++++++++ 7 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 include/d/d_bg_parts.h diff --git a/configure.py b/configure.py index a7970856031..317dd967cad 100755 --- a/configure.py +++ b/configure.py @@ -1576,7 +1576,7 @@ config.libs = [ }, Rel("f_pc_profile_lst", [Object(Matching, "f_pc/f_pc_profile_lst.cpp")]), ActorRel(MatchingFor(ALL_GCN), "d_a_andsw"), - ActorRel(NonMatching, "d_a_bg"), + ActorRel(MatchingFor(ALL_GCN), "d_a_bg"), ActorRel(MatchingFor(ALL_GCN), "d_a_bg_obj"), ActorRel(MatchingFor(ALL_GCN), "d_a_dmidna"), ActorRel(MatchingFor(ALL_GCN), "d_a_door_dbdoor00"), diff --git a/include/d/actor/d_a_bg.h b/include/d/actor/d_a_bg.h index 3f8431bd347..ec59849c76a 100644 --- a/include/d/actor/d_a_bg.h +++ b/include/d/actor/d_a_bg.h @@ -55,6 +55,7 @@ public: /* 804588C4 */ inline int draw(); /* 8045906C */ inline int create(); inline int execute(); + inline int isDelete(); private: /* 0x568 */ u8 field_0x568[0x570 - 0x568]; diff --git a/include/d/actor/d_a_suspend.h b/include/d/actor/d_a_suspend.h index fc4657a3e71..a19b8d8eabf 100644 --- a/include/d/actor/d_a_suspend.h +++ b/include/d/actor/d_a_suspend.h @@ -58,8 +58,7 @@ public: /* 804D5118 */ int create(); static void reset(int roomNo) { - room_c* room = (room_c*)mRoom; // tmp - room[roomNo].reset(); + mRoom[roomNo].reset(); } u32 getScale() { return fopAcM_GetParam(this) >> 0x1E; } diff --git a/include/d/d_bg_parts.h b/include/d/d_bg_parts.h new file mode 100644 index 00000000000..e1dee278002 --- /dev/null +++ b/include/d/d_bg_parts.h @@ -0,0 +1,14 @@ +#ifndef D_D_BG_PARTS +#define D_D_BG_PARTS + +#include "f_op/f_op_actor.h" + +class dBgp_c { +public: + int registBg(fopAc_ac_c*); + void draw(fopAc_ac_c*); + int execute(bool); + void releaseBg(); +}; + +#endif /* D_D_BG_PARTS */ diff --git a/include/d/d_stage.h b/include/d/d_stage.h index a9df8d063fc..94b9d0dc3c6 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -2,6 +2,7 @@ #define D_D_STAGE_H #include "SSystem/SComponent/c_lib.h" +#include "d/d_bg_parts.h" #include "d/d_kankyo.h" #include "d/d_kankyo_data.h" #include "f_op/f_op_actor_mng.h" @@ -1019,7 +1020,7 @@ public: /* 0x68 */ int mVrboxcolNumInfo; }; // Size: 0x6C -class dBgW_base; +class dBgW_Base; class dStage_roomStatus_c { public: @@ -1032,7 +1033,7 @@ public: /* 0x3F8 */ s8 mMemBlockID; /* 0x3F9 */ u8 mRegionNo; /* 0x3FC */ int mProcID; - /* 0x400 */ dBgW_base* mpBgW; + /* 0x400 */ dBgW_Base* mpBgW; int getZoneNo() const { return mZoneNo; } }; // Size: 0x404 @@ -1090,6 +1091,13 @@ public: /* 80024954 */ static bool resetArchiveBank(int); /* 80024DB0 */ static void SetTimePass(int i_TimePass) { m_time_pass = i_TimePass; } /* 8025BAAC */ static void setZoneNo(int, int); + static dBgp_c* getBgp(int i_roomNo) { +#ifdef DEBUG + // NONMATCHING +#else + return NULL; +#endif + } static BOOL GetTimePass() { return m_time_pass; } static s8 getStayNo() { return mStayNo; } @@ -1120,6 +1128,26 @@ public: static void setStatusProcID(int i_roomNo, fpc_ProcID i_id) { mStatus[i_roomNo].mProcID = i_id; } static int getStatusProcID(int i_roomNo) { return mStatus[i_roomNo].mProcID; } static void setRegionNo(int i_roomNo, u8 i_regionNo) { mStatus[i_roomNo].mRegionNo = i_regionNo; } + + u8 checkStatusFlag(int i_roomNo, u8 flag) const { + return cLib_checkBit(mStatus[i_roomNo].mFlag, flag); + } + + void onStatusFlag(int i_roomNo, u8 flag) { + JUT_ASSERT(2691, 0 <= i_roomNo && i_roomNo < 64); + return cLib_onBit(mStatus[i_roomNo].mFlag, flag); + } + + void offStatusFlag(int i_roomNo, u8 flag) { + JUT_ASSERT(2695, 0 <= i_roomNo && i_roomNo < 64); + return cLib_offBit(mStatus[i_roomNo].mFlag, flag); + } + + static void setFileList2(int i_roomNo, dStage_FileList2_dt_c* list) { + JUT_ASSERT(2711, 0 <= i_roomNo && i_roomNo < 64); + mStatus[i_roomNo].mRoomDt.setFileList2Info(list); + } + static void setZoneCount(int i_roomNo, int count) { JUT_ASSERT(2737, 0 <= i_roomNo && i_roomNo < 64); mStatus[i_roomNo].mZoneCount = count; @@ -1130,27 +1158,9 @@ public: mStatus[i_roomNo].mMemBlockID = i_blockID; } - static void setFileList2(int i_roomNo, dStage_FileList2_dt_c* list) { - JUT_ASSERT(2711, 0 <= i_roomNo && i_roomNo < 64); - mStatus[i_roomNo].mRoomDt.setFileList2Info(list); - } - - static void setBgW(int param_0, dBgW_base* i_bgw) { - mStatus[param_0].mpBgW = i_bgw; - } - - u8 checkStatusFlag(int i_roomNo, u8 flag) const { - return cLib_checkBit(mStatus[i_roomNo].mFlag, flag); - } - - void offStatusFlag(int i_roomNo, u8 flag) { - JUT_ASSERT(2695, 0 <= i_roomNo && i_roomNo < 64); - return cLib_offBit(mStatus[i_roomNo].mFlag, flag); - } - - void onStatusFlag(int i_roomNo, u8 flag) { - JUT_ASSERT(2691, 0 <= i_roomNo && i_roomNo < 64); - return cLib_onBit(mStatus[i_roomNo].mFlag, flag); + static void setBgW(int i_roomNo, dBgW_Base* i_bgw) { + JUT_ASSERT(2778, 0 <= i_roomNo && i_roomNo < 64); + mStatus[i_roomNo].mpBgW = i_bgw; } static JKRExpHeap* getMemoryBlockHeap(int i_no) { return mMemoryBlock[i_no]; } diff --git a/src/d/actor/d_a_bg.cpp b/src/d/actor/d_a_bg.cpp index dc836e4af54..1dc9e70e4d5 100644 --- a/src/d/actor/d_a_bg.cpp +++ b/src/d/actor/d_a_bg.cpp @@ -61,8 +61,7 @@ int daBg_btkAnm_c::create(J3DModelData* i_modelData, J3DAnmTextureSRTKey* i_btk, J3DAnmTextureSRTKey* btk = mpBtk->getBtkAnm(); for (u16 i = 0; i < btk->getUpdateMaterialNum(); i++) { - u16 id = btk->getUpdateMaterialID(i); - if (!createMatAnm(i_modelData, id)) { + if (!createMatAnm(i_modelData, btk->getUpdateMaterialID(i))) { return 0; } } @@ -96,15 +95,13 @@ int daBg_brkAnm_c::create(J3DModelData* i_modelData, J3DAnmTevRegKey* i_brk, int J3DAnmTevRegKey* brk = mpBrk->getBrkAnm(); for (u16 i = 0; i < brk->getCRegUpdateMaterialNum(); i++) { - u16 id = brk->getCRegUpdateMaterialID(i); - if (!createMatAnm(i_modelData, id)) { + if (!createMatAnm(i_modelData, brk->getCRegUpdateMaterialID(i))) { return 0; } } for (u16 i = 0; i < brk->getKRegUpdateMaterialNum(); i++) { - u16 id = brk->getKRegUpdateMaterialID(i); - if (!createMatAnm(i_modelData, id)) { + if (!createMatAnm(i_modelData, brk->getKRegUpdateMaterialID(i))) { return 0; } } @@ -140,7 +137,7 @@ int daBg_c::createHeap() { int roomNo = fopAcM_GetParam(this); daBg_Part* bgPart = mBgParts; - for (int i = 0; i < 6; bgPart++, i++) { + for (int i = 0; i < 6; i++) { J3DModelData* modelData = (J3DModelData*)dComIfG_getStageRes(arcName, l_modelName[i]); if (modelData == NULL) { modelData = (J3DModelData*)dComIfG_getStageRes(arcName, l_modelName2[i]); @@ -188,10 +185,11 @@ int daBg_c::createHeap() { } for (u16 j = 0; j < modelData->getMaterialNum(); j++) { + const char* name; JUTNameTab* nametab = modelData->getMaterialName(); J3DMaterial* material = modelData->getMaterialNodePointer(j); - const char* name = nametab->getName(j); + name = nametab->getName(j); if (name[3] == 'M' && name[4] == 'A') { if (!memcmp(&name[5], "00", 2)) { @@ -216,6 +214,8 @@ int daBg_c::createHeap() { dKy_tevstr_init(bgPart->tevstr, roomNo, 0xFF); } + + bgPart++; } cBgD_t* dzb = (cBgD_t*)dComIfG_getStageRes(arcName, "room.dzb"); @@ -230,7 +230,7 @@ int daBg_c::createHeap() { return 0; } - dStage_roomControl_c::setBgW(roomNo, (dBgW_base*)mpBgW); + dStage_roomControl_c::setBgW(roomNo, (dBgW_Base*)mpBgW); mpBgW->SetPriority(dBgW_Base::PRIORITY_0); } else { void* kcl = dComIfG_getStageRes(arcName, "room.kcl"); @@ -258,6 +258,11 @@ int daBg_c::createHeap() { daBg_c::~daBg_c() { int roomNo = fopAcM_GetParam(this); + dBgp_c* bgp = dStage_roomControl_c::getBgp(roomNo); + if (bgp != NULL) { + bgp->releaseBg(); + } + if (heap != NULL && mpBgW != NULL) { dComIfG_Bgsp().Release((dBgW_Base*)mpBgW); dStage_roomControl_c::setBgW(roomNo, NULL); @@ -280,7 +285,6 @@ static int daBg_Draw(daBg_c* i_this) { } /* 804588C4-80458F38 000D44 0674+00 1/1 0/0 0/0 .text draw__6daBg_cFv */ -// NONMATCHING - just regalloc + some reorder issues int daBg_c::draw() { dScnKy_env_light_c* kankyo = dKy_getEnvlight(); @@ -300,7 +304,7 @@ int daBg_c::draw() { mDoLib_clipper::changeFar(1000000.0f); J3DModelData* modelData; - for (int i = 0; i < 6; bgPart++, i++) { + for (int i = 0; i < 6; i++) { sp8 = 0; spA = 0; sp9 = 0; @@ -327,7 +331,8 @@ int daBg_c::draw() { for (u16 j = 0; j < modelData->getShapeNum(); j++) { J3DShape* shape = modelData->getShapeNodePointer(j); - if (mDoLib_clipper::clip(j3dSys.getViewMtx(), shape->getMin(), shape->getMax())) { + if (mDoLib_clipper::clip(j3dSys.getViewMtx(), (Vec*)shape->getMin(), + (Vec*)shape->getMax())) { shape->hide(); } else { shape->show(); @@ -360,7 +365,7 @@ int daBg_c::draw() { field_0x5f0 = 0; } - /* Main Event - Get shadow crystal (can now transform) */ + /* Main Event - Get shadow crystal (can now transform) */ if (dComIfGs_isEventBit(dSv_event_flag_c::M_077)) { field_0x5f0 = 9; } @@ -371,16 +376,18 @@ int daBg_c::draw() { field_0x5f1 = 0; } } else if (!memcmp(&name[3], "MA09", 4)) { - bgPart->btk_speed = 1.0f - (1.0f - g_env_light.mWaterSurfaceShineRate) * 0.9f; + bgPart->btk_speed = + 1.0f - (1.0f - g_env_light.mWaterSurfaceShineRate) * 0.9f; } else if (!memcmp(&name[3], "MA05", 4)) { bgPart->tevstr->Material_id |= (u8)j; } if (!strcmp(dComIfGp_getStartStageName(), "F_SP127") || - !strcmp(dComIfGp_getStartStageName(), "R_SP127")) { + !strcmp(dComIfGp_getStartStageName(), "R_SP127")) + { if (!memcmp(&name[3], "MA00_Enkei_Tree_Color", 21) || - !memcmp(&name[3], "MA00_Gake", 9) || - !memcmp(&name[3], "MA00_Kusa", 9)) { + !memcmp(&name[3], "MA00_Gake", 9) || !memcmp(&name[3], "MA00_Kusa", 9)) + { J3DGXColorS10 colorS10; J3DGXColor color; @@ -408,12 +415,12 @@ int daBg_c::draw() { break; } - #ifdef DEBUG - s16 sp56 = 0xFF; +#ifdef DEBUG + sp50.a = 0xFF; if (g_kankyoHIO.navy.fish_pond_colreg_adjust_ON) { sp50 = g_kankyoHIO.navy.fish_pond_colreg_c0; } - #endif +#endif f32 var_f31 = bgPart->tevstr->AmbCol.r / 10.0f; var_f31 *= var_f31; @@ -451,11 +458,18 @@ int daBg_c::draw() { mDoExt_modelEntryDL(bg_model); dComIfGd_setListBG(); } + + bgPart++; } dComIfGd_setList(); g_env_light.settingTevStruct(0x10, NULL, dComIfGp_roomControl_getTevStr(roomNo)); + dBgp_c* bgp = dStage_roomControl_c::getBgp(roomNo); + if (bgp != NULL) { + bgp->draw(this); + } + return 1; } @@ -465,7 +479,8 @@ int daBg_c::execute() { for (int i = 0; i < 6; i++) { if (bgPart->btk != NULL) { if (field_0x5f1 != 0) { - bgPart->btk->playspeed((field_0x5f1 - 1) / 100.0f); + f32 speed = (field_0x5f1 - 1) / 100.0f; + bgPart->btk->playspeed(speed); } if (bgPart->btk_speed >= 0.0f) { @@ -489,9 +504,13 @@ static int daBg_Execute(daBg_c* i_this) { return i_this->execute(); } +int daBg_c::isDelete() { + return 1; +} + /* 8045901C-80459024 00149C 0008+00 1/0 0/0 0/0 .text daBg_IsDelete__FP6daBg_c */ static int daBg_IsDelete(daBg_c* i_this) { - return 1; + return i_this->isDelete(); } /* 80459024-8045904C 0014A4 0028+00 1/0 0/0 0/0 .text daBg_Delete__FP6daBg_c */ @@ -512,6 +531,7 @@ int daBg_c::create() { int roomNo = fopAcM_GetParam(this); field_0x5f0 = 0; field_0x5f1 = 0; + dBgp_c* bgp = dStage_roomControl_c::getBgp(roomNo); if (this->heap == NULL) { fopAcM_ct(this, daBg_c); @@ -539,7 +559,6 @@ int daBg_c::create() { } daBg_Part* bgPart = mBgParts; - J3DModelData* modelData; for (int i = 0; i < 6; i++) { if (bgPart->model != NULL) { J3DModelData* modelData = bgPart->model->getModelData(); @@ -555,13 +574,15 @@ int daBg_c::create() { bgPart++; } + J3DModelData* modelData; f32 transX; f32 transY; s16 angle; if (dComIfGp_getMapTrans(roomNo, &transX, &transY, &angle)) { daBg_Part* bgPart = mBgParts; + J3DModel* model; for (int i = 0; i < 6; i++) { - J3DModel* model = bgPart->model; + model = bgPart->model; if (model != NULL) { mDoMtx_stack_c::transS(transX, 0.0f, transY); @@ -598,6 +619,16 @@ int daBg_c::create() { dKy_tevstr_c* tevstr = dComIfGp_roomControl_getTevStr(roomNo); dKy_tevstr_init(tevstr, roomNo, 0xFF); + + if (bgp != NULL) { + bgp->registBg(this); + } + } + + if (bgp != NULL) { + if (!bgp->execute(false)) { + return cPhs_INIT_e; + } } dComIfGp_roomControl_onStatusFlag(roomNo, 0x10); diff --git a/src/d/d_bg_parts.cpp b/src/d/d_bg_parts.cpp index a68c6a9643c..581766df8e2 100644 --- a/src/d/d_bg_parts.cpp +++ b/src/d/d_bg_parts.cpp @@ -2,6 +2,24 @@ #include "JSystem/J3DGraphAnimator/J3DAnimation.h" +int dBgp_c::registBg(fopAc_ac_c* i_actor) { + // NONMATCHING + return 0; +} + +void dBgp_c::draw(fopAc_ac_c* i_actor) { + // NONMATCHING +} + +int dBgp_c::execute(bool param_0) { + // NONMATCHING + return 0; +} + +void dBgp_c::releaseBg() { + // NONMATCHING +} + static void dummy() { ((J3DAnmTextureSRTKey*)0)->getUpdateMaterialID(0); ((J3DAnmTextureSRTKey*)0)->getUpdateMaterialNum();