From 5dc86158bc15a2f7d7d499d38d388be1d997e750 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 27 Sep 2025 18:35:11 -0400 Subject: [PATCH] Fix most vtable issues (#2706) --- configure.py | 16 +++++------ include/JSystem/J2DGraph/J2DAnimation.h | 6 ++--- include/d/actor/d_a_npc_fguard.h | 2 +- include/d/d_event_debug.h | 10 ++++--- include/d/d_file_select.h | 3 +++ include/d/d_shop_system.h | 2 -- src/d/d_drawlist.cpp | 3 --- src/d/d_file_select.cpp | 14 +++++----- src/d/d_menu_option.cpp | 20 -------------- src/d/d_menu_save.cpp | 27 ------------------- src/d/d_msg_scrn_3select.cpp | 3 --- src/d/d_select_cursor.cpp | 35 ------------------------- src/d/d_shop_system.cpp | 5 +--- 13 files changed, 27 insertions(+), 119 deletions(-) diff --git a/configure.py b/configure.py index 183c0a5643d..ed83dac8ab9 100755 --- a/configure.py +++ b/configure.py @@ -607,13 +607,13 @@ config.libs = [ Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_event_data.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_event_manager.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_event_lib.cpp"), # debug weak func order - Object(Equivalent, "d/d_event_debug.cpp"), # RTTI & vtable padding + Object(Equivalent, "d/d_event_debug.cpp"), # RTTI Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_simple_model.cpp"), Object(NonMatching, "d/d_particle.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_particle_name.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_particle_copoly.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_path.cpp"), - Object(Equivalent, "d/d_drawlist.cpp"), # missing vtable + Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_drawlist.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_kankyo_data.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_kankyo_wether.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_kankyo_rain.cpp"), @@ -667,12 +667,12 @@ config.libs = [ Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/actor/d_a_player.cpp"), Object(NonMatching, "d/d_camera.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_envse.cpp"), - Object(Equivalent, "d/d_file_select.cpp"), # issue with J2DAnmTransform::getTransform + Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_file_select.cpp"), Object(NonMatching, "d/d_file_sel_warning.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_file_sel_info.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_bright_check.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_scope.cpp"), - Object(Equivalent, "d/d_select_cursor.cpp"), # vtable padding + Object(Equivalent, "d/d_select_cursor.cpp"), # vtable order Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_select_icon.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_shop_camera.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_shop_item_ctrl.cpp"), @@ -731,7 +731,7 @@ config.libs = [ Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_msg_string_base.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_msg_string.cpp"), Object(NonMatching, "d/d_msg_flow.cpp"), - Object(Equivalent, "d/d_name.cpp"), # missing vtable padding + Object(MatchingFor("GZ2E01"), "d/d_name.cpp"), Object(NonMatching, "d/d_npc_lib.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_ovlp_fade.cpp"), Object(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d/d_ovlp_fade2.cpp"), @@ -1830,7 +1830,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_drainSol"), ActorRel(NonMatching, "d_a_npc_du"), ActorRel(NonMatching, "d_a_npc_fairy"), - ActorRel(Equivalent, "d_a_npc_fguard"), # vtable order + ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_npc_fguard"), ActorRel(NonMatching, "d_a_npc_gnd"), ActorRel(NonMatching, "d_a_npc_gra"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_npc_grc", extra_cflags=[DANPCF_C_HACK]), @@ -1934,7 +1934,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bbox"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bed"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bemos"), - ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bhbridge"), # vtable order + ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bhbridge"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bk_leaf"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bky_rock"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_bmWindow"), @@ -2095,7 +2095,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_magLift"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_magLiftRot"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_maki"), - ActorRel(Equivalent, "d_a_obj_master_sword"), #weak function and vtable order + ActorRel(Equivalent, "d_a_obj_master_sword"), # weak function and vtable order (dBgS_AcchCir/dBgS_ObjAcch) ActorRel(NonMatching, "d_a_obj_mato"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_mhole"), ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_mie"), diff --git a/include/JSystem/J2DGraph/J2DAnimation.h b/include/JSystem/J2DGraph/J2DAnimation.h index 8820f36b058..e29ddd0e176 100644 --- a/include/JSystem/J2DGraph/J2DAnimation.h +++ b/include/JSystem/J2DGraph/J2DAnimation.h @@ -31,9 +31,7 @@ public: mFrameMax = 0; } /* 80053C94 */ virtual ~J2DAnmBase() {} - // this is supposed to be inline, but doing so causes problems - // with where the vtable is placed in the final framework.dol - /* 800569B0 */ virtual void searchUpdateMaterialID(J2DScreen*); + /* 800569B0 */ virtual void searchUpdateMaterialID(J2DScreen*) {} s16 getFrameMax() const { return mFrameMax; } void setFrame(f32 frame) { mFrame = frame; } @@ -158,7 +156,7 @@ public: mKind = KIND_TRANSFORM; } /* 80184370 */ virtual ~J2DAnmTransform() {} - /* 80191130 */ virtual void getTransform(u16, J3DTransformInfo*) const; // {} (should be inline) + /* 80191130 */ virtual void getTransform(u16, J3DTransformInfo*) const {} /* 0x10 */ f32* mScaleValues; /* 0x14 */ s16* mRotationValues; diff --git a/include/d/actor/d_a_npc_fguard.h b/include/d/actor/d_a_npc_fguard.h index 07f2de72ab6..62070df13bf 100644 --- a/include/d/actor/d_a_npc_fguard.h +++ b/include/d/actor/d_a_npc_fguard.h @@ -18,7 +18,7 @@ public: /* 809BA53C */ void initPosAngle(Vec&, s16); /* 809BA584 */ cPhs__Step create(); /* 809BA730 */ void create_init(); - /* 809BAA80 */ virtual ~daNpcFgd_c(); + /* 809BAA80 */ inline virtual ~daNpcFgd_c(); int getType() { return fopAcM_GetParam(this) & 0xFF; } int getObjNum() { return (fopAcM_GetParam(this) >> 8) & 0xFF; } diff --git a/include/d/d_event_debug.h b/include/d/d_event_debug.h index 5c8b8337ee0..4c6a8776af5 100644 --- a/include/d/d_event_debug.h +++ b/include/d/d_event_debug.h @@ -41,7 +41,7 @@ struct dEvDb_flag_base_c { struct dEvM_play_HIO_c : public JORReflexible { dEvM_play_HIO_c(); - ~dEvM_play_HIO_c() {} + virtual ~dEvM_play_HIO_c() {} /* 0x04 */ s16 mTargetEvent; /* 0x06 */ s16 mEventIdx; @@ -71,7 +71,7 @@ STATIC_ASSERT(sizeof(dEvM_play_HIO_c) == 0xC); struct dEvM_reg_HIO_c : public JORReflexible { dEvM_reg_HIO_c(); - ~dEvM_reg_HIO_c() {} + virtual ~dEvM_reg_HIO_c() {} /* 0x04 */ dEvDb_flag_base_c* mFlagTables; /* 0x08 */ u8 field_0x008; @@ -92,7 +92,7 @@ STATIC_ASSERT(sizeof(dEvM_reg_HIO_c) == 0xC); struct dEvM_bit_HIO_c : public JORReflexible { dEvM_bit_HIO_c(); - ~dEvM_bit_HIO_c() {} + virtual ~dEvM_bit_HIO_c() {} /* 0x04 */ dEvDb_flag_base_c* mFlagTables; /* 0x08 */ u8 field_0x008; @@ -113,6 +113,7 @@ STATIC_ASSERT(sizeof(dEvM_bit_HIO_c) == 0xC); struct dEvM_root_bit_HIO_c : public JORReflexible { dEvM_root_bit_HIO_c() {} + virtual ~dEvM_root_bit_HIO_c() {} dEvM_bit_HIO_c mBit[100]; dEvDb_flag_base_c* mFlagTables; @@ -124,6 +125,7 @@ STATIC_ASSERT(sizeof(dEvM_root_bit_HIO_c) == 0x4B8); struct dEvM_root_reg_HIO_c : public JORReflexible { dEvM_root_reg_HIO_c() {} + virtual ~dEvM_root_reg_HIO_c() {} dEvM_reg_HIO_c mReg[100]; dEvDb_flag_base_c* mFlagTables; @@ -135,7 +137,7 @@ STATIC_ASSERT(sizeof(dEvM_root_reg_HIO_c) == 0x4B8); struct dEvM_HIO_c : public JORReflexible { dEvM_HIO_c(); - ~dEvM_HIO_c() {} + virtual ~dEvM_HIO_c() {} /* 0x004 */ s8 field_0x004; /* 0x005 */ u8 m_EVdata_output; diff --git a/include/d/d_file_select.h b/include/d/d_file_select.h index 38808c21a5d..ce5b3f1d201 100644 --- a/include/d/d_file_select.h +++ b/include/d/d_file_select.h @@ -125,6 +125,9 @@ public: /* 0x000D */ u8 field_0x000d; /* 0x000E */ u8 field_0x000e[2]; /* 0x0010 */ float field_0x0010[3]; +#if VERSION == VERSION_GCN_PAL + u8 temp_padding[0x1D]; +#endif /* 0x001C */ u8 field_0x001c; /* 0x001D */ u8 field_0x001d; /* 0x001E */ u8 field_0x001e; diff --git a/include/d/d_shop_system.h b/include/d/d_shop_system.h index 049e0744ec0..bc941e26d5f 100644 --- a/include/d/d_shop_system.h +++ b/include/d/d_shop_system.h @@ -111,8 +111,6 @@ public: /* 8019AB84 */ bool checkRightTrigger(STControl*); /* 8019ABA8 */ bool dpdMove(); - void dummyWeakOrder(); // fake, used to fix weak function order in d_shop_system.cpp - /* 801974E4 */ virtual ~dShopSystem_c(); /* 8019ACF0 */ virtual bool getResName2(int) { return false; } /* 8019ACE0 */ virtual int beforeStartSeqAction(dMsgFlow_c*, int) { return 1; } diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 2932f7c642c..25ef94fe335 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -943,16 +943,13 @@ static void dummy_misc() { J2DPane* pane; J2DPicture* picture; J2DAnmBase* anmBase; - J2DAnmColor* anmColor; delete anmBase; - delete anmColor; picture->setBlack(JUtility::TColor(0, 0, 0, 0)); picture->setWhite(JUtility::TColor(0, 0, 0, 0)); pane->getTypeID(); pane->makeMatrix(0.0f, 0.0f); pane->calcMtx(); screen->clearAnmTransform(); - anmColor->searchUpdateMaterialID(screen); } /* 80053CDC-80053CEC 04E61C 0010+00 0/0 2/2 0/0 .text init__8cM_rnd_cFiii */ diff --git a/src/d/d_file_select.cpp b/src/d/d_file_select.cpp index 50b7ef09a8b..363ca34c519 100644 --- a/src/d/d_file_select.cpp +++ b/src/d/d_file_select.cpp @@ -2870,8 +2870,13 @@ void dFile_select_c::setSaveData() { /* 8018D0E4-8018D25C 187A24 0178+00 20/20 0/0 0/0 .text headerTxtSet__14dFile_select_cFUsUcUc */ void dFile_select_c::headerTxtSet(u16 param_1, u8 param_2, u8 param_3) { static f32 fontsize[2] = {21.0f, 27.0f}; +#if VERSION == VERSION_GCN_JPN + static f32 linespace[2] = {22.0f, 20.0f}; + static f32 charspace[2] = {2.0f, 3.0f}; +#else static f32 linespace[2] = {21.0f, 20.0f}; static f32 charspace[2] = {0.0f, 0.0f}; +#endif u8 uVar1 = field_0x021c ^ 1; if (param_3 != 0) { @@ -3322,7 +3327,7 @@ void dFile_select_c::MemCardStatCheck() { field_0x0280 = false; field_0x0284 = NULL; field_0x0273 = 2; - field_0x0290 = &dFile_select_c::noFileSpaceDispInit; + field_0x0290 = &dFile_select_c::noSaveSelDispInit; field_0x0274 = 3; break; case 8: @@ -3361,11 +3366,7 @@ void dFile_select_c::MemCardStatCheck() { field_0x0280 = false; field_0x0284 = NULL; field_0x0273 = 2; - #if (VERSION == VERSION_GCN_JPN) || (VERSION == VERSION_WII_JPN) field_0x0290 = &dFile_select_c::noFileSpaceDispInit; - #else - field_0x0290 = &dFile_select_c::noSaveSelDispInit; - #endif field_0x0274 = 18; break; case 2: @@ -4358,6 +4359,3 @@ void dFile_select3D_c::toItem3Dpos(f32 param_0, f32 param_1, f32 param_2, cXyz* void dFile_select3D_c::calcViewMtx(Mtx param_0) { cMtx_lookAt(param_0, &cXyz(0.0f, 0.0f, -1000.0f), &cXyz::Zero, &cXyz(0.0f, 1.0f, 0.0f), 0); } - -// Fakematch, should be defined in header but it gets put in the wrong TU -void J2DAnmTransform::getTransform(u16, J3DTransformInfo*) const {} diff --git a/src/d/d_menu_option.cpp b/src/d/d_menu_option.cpp index bd7357eb00d..a20b1bc9581 100644 --- a/src/d/d_menu_option.cpp +++ b/src/d/d_menu_option.cpp @@ -61,26 +61,6 @@ static calibrationFunc calibration_process[] = { &dMenu_Option_c::calibration_close2_move, }; -// Unclear why this is created -#pragma push -#pragma force_active on -#if VERSION == VERSION_GCN_JPN -static u8 calibration_padding[0x24 /* padding */] = { - /* padding */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#else -static u8 calibration_padding[0x24 /* padding */] = { - /* padding */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#endif -#pragma pop - enum SelectType { #if VERSION == VERSION_GCN_JPN SelectType0_JPN, diff --git a/src/d/d_menu_save.cpp b/src/d/d_menu_save.cpp index 2d6b5a62aa4..b4662add8ab 100644 --- a/src/d/d_menu_save.cpp +++ b/src/d/d_menu_save.cpp @@ -80,33 +80,6 @@ dMs_HIO_c::dMs_HIO_c() { field_0xf = 0; } -// Need 0x24 bytes of padding with no symbol between dDlst_MenuSaveExplain_c::__vtable and dMs_HIO_c::__vtable -// This is likely caused by the vtable of an abstract base class getting put there and then stripped out. -// Not sure which abstract base class could go there though, so we simulate it with some dummy classes for now. -class dummy_abstract_class { -public: - virtual void virt_func_0() = 0; - virtual void virt_func_1() = 0; - virtual void virt_func_2() = 0; - virtual void virt_func_3() = 0; - virtual void virt_func_4() = 0; - virtual void virt_func_5() = 0; - virtual void virt_func_6() = 0; -}; -class dummy_child_class : dummy_abstract_class { - virtual void virt_func_0(); - virtual void virt_func_1(); - virtual void virt_func_2(); - virtual void virt_func_3(); - virtual void virt_func_4(); - virtual void virt_func_5(); - virtual void virt_func_6(); -}; -static dummy_child_class dummy() { - dummy_child_class temp; - return temp; -} - /* 801EF6A0-801EF7AC 1E9FE0 010C+00 0/0 3/3 0/0 .text __ct__12dMenu_save_cFv */ dMenu_save_c::dMenu_save_c() { mpScrnExplain = NULL; diff --git a/src/d/d_msg_scrn_3select.cpp b/src/d/d_msg_scrn_3select.cpp index c1534f217f6..12d64987b65 100644 --- a/src/d/d_msg_scrn_3select.cpp +++ b/src/d/d_msg_scrn_3select.cpp @@ -1021,9 +1021,6 @@ void dMsgScrn3Select_c::selectTrans() { } } -// following data are unused so unsure how this data is properly setup -static u32 unkdata[9] = {0}; - /* 8023B870-8023B914 2361B0 00A4+00 7/7 0/0 0/0 .text selectAnimeTransform__17dMsgScrn3Select_cFi */ void dMsgScrn3Select_c::selectAnimeTransform(int i_sel) { diff --git a/src/d/d_select_cursor.cpp b/src/d/d_select_cursor.cpp index 3571e029d89..0fb1c32192a 100644 --- a/src/d/d_select_cursor.cpp +++ b/src/d/d_select_cursor.cpp @@ -566,38 +566,3 @@ void dSelect_cursor_c::setBckAnimation(J2DAnmTransformKey* param_0) { void dSelect_cursor_c::moveCenter(J2DPane* i_pane, f32 i_x, f32 i_y) { i_pane->translate(i_x,i_y); } - -// Need 0x30 bytes of padding with no symbol between btk2_name$3688 and dSelect_cursor_c::__vtable -// This is likely caused by the vtables of abstract base classes (likely from dolzel.pch) getting -// put there and then stripped out. -// Not sure which abstract base classes could go there though, so we simulate it with some dummy -// classes for now. -class dummy_abstract_class { -public: - virtual void virt_func_0() = 0; - virtual void virt_func_1() = 0; - virtual void virt_func_2() = 0; - virtual void virt_func_3() = 0; - virtual void virt_func_4() = 0; - virtual void virt_func_5() = 0; - virtual void virt_func_6() = 0; - virtual void virt_func_7() = 0; - virtual void virt_func_8() = 0; - virtual void virt_func_9() = 0; -}; -class dummy_child_class : dummy_abstract_class { - virtual void virt_func_0(); - virtual void virt_func_1(); - virtual void virt_func_2(); - virtual void virt_func_3(); - virtual void virt_func_4(); - virtual void virt_func_5(); - virtual void virt_func_6(); - virtual void virt_func_7(); - virtual void virt_func_8(); - virtual void virt_func_9(); -}; -static dummy_child_class dummy() { - dummy_child_class temp; - return temp; -} diff --git a/src/d/d_shop_system.cpp b/src/d/d_shop_system.cpp index 6c7769c8b44..f7917145c96 100644 --- a/src/d/d_shop_system.cpp +++ b/src/d/d_shop_system.cpp @@ -1615,13 +1615,10 @@ int dShopSystem_c::getFlowNodeNum() { return num; } -// fake, used to fix weak function order -void dShopSystem_c::dummyWeakOrder() { +static void dummy() { static const char* bck_str = ".bck"; static const char* btp_str = ".btp"; static const char* btk_str = ".btk"; - - getResName2(0); } /* 8019AB1C-8019AB24 19545C 0008+00 0/0 0/0 8/8 .text setSellItemMax__13dShopSystem_cFUc