From ae9fa8922a52ccbff29891024aeafd1aed2d0400 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Fri, 5 Dec 2025 21:46:58 -0500 Subject: [PATCH] Work on weak function ordering (#2917) * Fix functionvalue weak func order * Add script to help diffing weak function order * Improve alink weak func order (44 -> 15) * Improve m_Do_ext weak order (12 -> 7) * Remove old hack * Fix d_a_tbox weak func order * Fix d_a_npc_ks weak func order * Fix error when trying to diff weak func order for ShieldD due to hidden function alignment gap symbols --- configure.py | 6 +- include/JSystem/JGadget/search.h | 4 +- .../JSystem/JStudio/JStudio/functionvalue.h | 6 - include/d/actor/d_a_alink.h | 177 +++++++++--------- include/d/actor/d_a_player.h | 8 + include/d/actor/d_a_tbox.h | 30 +-- include/d/d_com_inf_game.h | 12 -- include/d/d_msg_object.h | 2 - include/m_Do/m_Do_ext.h | 2 +- src/d/actor/d_a_obj_crvhahen.cpp | 1 + src/d/actor/d_a_obj_ornament_cloth.cpp | 3 +- src/d/actor/d_a_obj_stopper2.cpp | 1 + src/d/actor/d_a_tag_yami.cpp | 1 + src/d/actor/d_a_tbox.cpp | 29 +++ src/d/d_msg_object.cpp | 2 - tools/utilities/weak_order_diff.py | 109 +++++++++++ 16 files changed, 248 insertions(+), 145 deletions(-) create mode 100755 tools/utilities/weak_order_diff.py diff --git a/configure.py b/configure.py index cb1fac63abf..0c08a075b95 100755 --- a/configure.py +++ b/configure.py @@ -964,7 +964,7 @@ config.libs = [ [ Object(MatchingFor(ALL_GCN), "JSystem/JStudio/JStudio/ctb.cpp"), Object(MatchingFor(ALL_GCN, "Shield", "ShieldD"), "JSystem/JStudio/JStudio/ctb-data.cpp"), - Object(Equivalent, "JSystem/JStudio/JStudio/functionvalue.cpp"), # weak func order + Object(MatchingFor(ALL_GCN), "JSystem/JStudio/JStudio/functionvalue.cpp"), Object(MatchingFor(ALL_GCN), "JSystem/JStudio/JStudio/fvb.cpp"), Object(MatchingFor(ALL_GCN, "Shield"), "JSystem/JStudio/JStudio/fvb-data.cpp"), Object(MatchingFor(ALL_GCN, "Shield"), "JSystem/JStudio/JStudio/fvb-data-parse.cpp"), @@ -1720,7 +1720,7 @@ config.libs = [ ActorRel(MatchingFor(ALL_GCN), "d_a_tag_msg"), ActorRel(MatchingFor(ALL_GCN), "d_a_tag_push"), ActorRel(MatchingFor(ALL_GCN), "d_a_tag_telop"), - ActorRel(Equivalent, "d_a_tbox"), # weak func order + ActorRel(MatchingFor(ALL_GCN), "d_a_tbox"), ActorRel(MatchingFor(ALL_GCN), "d_a_tbox2"), ActorRel(MatchingFor(ALL_GCN), "d_a_vrbox"), ActorRel(NonMatching, "d_a_vrbox2"), @@ -2009,7 +2009,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_kn"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_knj"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_kolinb"), - ActorRel(Equivalent, "d_a_npc_ks"), # weak func order + ActorRel(MatchingFor(ALL_GCN), "d_a_npc_ks"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_kyury"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_len"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_lf"), diff --git a/include/JSystem/JGadget/search.h b/include/JSystem/JGadget/search.h index e4c5c538b71..c53045668aa 100644 --- a/include/JSystem/JGadget/search.h +++ b/include/JSystem/JGadget/search.h @@ -111,14 +111,14 @@ inline Iterator findUpperBound_binary_end(Iterator first, Iterator last, const T } template -Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val, Predicate p) { +inline Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val, Predicate p) { return current == last || p(val, *current) ? findUpperBound_binary_end(first, current, val, p) : findUpperBound_binary_begin(current, last, val, p); } template -Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val) { +inline Iterator findUpperBound_binary_current(Iterator first, Iterator last, Iterator current, const T& val) { return findUpperBound_binary_current(first, last, current, val, std::less()); } diff --git a/include/JSystem/JStudio/JStudio/functionvalue.h b/include/JSystem/JStudio/JStudio/functionvalue.h index 69309a42199..a8724f54962 100644 --- a/include/JSystem/JStudio/JStudio/functionvalue.h +++ b/include/JSystem/JStudio/JStudio/functionvalue.h @@ -157,7 +157,6 @@ private: class TFunctionValue_constant : public TFunctionValue { public: TFunctionValue_constant(); - virtual ~TFunctionValue_constant() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); @@ -195,7 +194,6 @@ public: const TFunctionValue_composite::TData&, f64); TFunctionValue_composite(); - virtual ~TFunctionValue_composite() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); @@ -232,7 +230,6 @@ class TFunctionValue_transition : public TFunctionValue, public TFunctionValueAttribute_interpolate { public: TFunctionValue_transition(); - virtual ~TFunctionValue_transition() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); @@ -264,7 +261,6 @@ public: typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list&, const TIndexData_&); TFunctionValue_list(); - virtual ~TFunctionValue_list() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); @@ -380,7 +376,6 @@ public: typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list_parameter&, f64); TFunctionValue_list_parameter(); - virtual ~TFunctionValue_list_parameter() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); @@ -499,7 +494,6 @@ public: }; TFunctionValue_hermite(); - virtual ~TFunctionValue_hermite() {} virtual u32 getType() const; virtual TFunctionValueAttributeSet getAttributeSet(); diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index 064f8587d31..a010fcca58d 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -6839,7 +6839,18 @@ public: BOOL checkCutHeadProc() const { return mProcID == PROC_CUT_HEAD; } fopAc_ac_c* getRideActor() { return mRideAcKeep.getActor(); } - virtual cXyz* getMidnaAtnPos() const { return (cXyz*)&mMidnaAtnPos; } + virtual bool checkAcceptDungeonWarpAlink(int) { return checkAcceptWarp(); } + virtual daSpinner_c* getSpinnerActor() { + daSpinner_c* spinnerActor; + if (!checkSpinnerRide()) { + spinnerActor = NULL; + } else { + spinnerActor = (daSpinner_c*)mRideAcKeep.getActor(); + } + return (daSpinner_c*)spinnerActor; + } + virtual s16 getSumouCounter() const { return mProcVar2.field_0x300c; } + virtual s16 checkSumouWithstand() const { return mProcVar3.field_0x300e; } virtual void setMidnaMsgNum(fopAc_ac_c* param_0, u16 pMsgNum) { mMidnaMsgNum = pMsgNum; mMidnaMsg = (daTagMmsg_c*)param_0; @@ -6847,7 +6858,6 @@ public: virtual MtxP getModelMtx() { return mpLinkModel->getBaseTRMtx(); } virtual MtxP getInvMtx() { return mInvMtx; } virtual cXyz* getShadowTalkAtnPos() { return &field_0x375c; } - virtual f32 getGroundY() { return mLinkAcch.GetGroundH(); } virtual MtxP getLeftItemMatrix(); virtual MtxP getRightItemMatrix(); virtual MtxP getLeftHandMatrix(); @@ -6859,9 +6869,27 @@ public: if (mHeldItemModel != NULL && checkBottleItem(mEquipItem)) { return mHeldItemModel->getBaseTRMtx(); } - return NULL; } + + virtual MtxP getHeadMtx() { + return mpLinkModel->getAnmMtx(field_0x30b4); + } + virtual f32 getGroundY() { return mLinkAcch.GetGroundH(); } + virtual f32 getBaseAnimeFrameRate() const { return mUnderFrameCtrl[0].getRate(); } + virtual fpc_ProcID getAtnActorID() const { return mAtnActorID; } + virtual fpc_ProcID getItemID() const { return mItemAcKeep.getID(); } + virtual fpc_ProcID getGrabActorID() const { + if (mEquipItem == 0x102) { + return mItemAcKeep.getID(); + } else { + return mGrabItemAcKeep.getID(); + } + } + virtual void setForcePutPos(cXyz const& pPutPos) { + mForcePutPos = pPutPos; + onEndResetFlg1(ERFLG1_UNK_2000); + } virtual BOOL checkPlayerGuard() const; virtual u32 checkPlayerFly() const { return checkModeFlg(MODE_SWIMMING | MODE_ROPE_WALK | MODE_VINE_CLIMB | MODE_UNK_800 | @@ -6929,26 +6957,17 @@ public: } virtual BOOL checkGrassWhistle() const { return mProcID == PROC_GRASS_WHISTLE_WAIT; } virtual BOOL checkBoarRun() const { return mProcID == PROC_BOAR_RUN; } - virtual f32 getBaseAnimeFrameRate() const { return mUnderFrameCtrl[0].getRate(); } + virtual BOOL checkHorseRideNotReady() const { + return checkHorseRide() && mProcID != PROC_HORSE_RIDE && mProcID != PROC_HORSE_GETOFF; + } + virtual f32 getSearchBallScale() const { return mSearchBallScale; } + virtual int checkFastShotTime() { return mFastShotTime; } virtual f32 getBaseAnimeFrame() const; virtual void setAnimeFrame(f32); virtual BOOL checkWolfLock(fopAc_ac_c*) const; virtual bool cancelWolfLock(fopAc_ac_c*); - virtual fpc_ProcID getAtnActorID() const { return mAtnActorID; } - virtual fpc_ProcID getItemID() const { return mItemAcKeep.getID(); } - virtual fpc_ProcID getGrabActorID() const { - if (mEquipItem == 0x102) { - return mItemAcKeep.getID(); - } else { - return mGrabItemAcKeep.getID(); - } - } virtual BOOL exchangeGrabActor(fopAc_ac_c*); virtual BOOL setForceGrab(fopAc_ac_c*, int, int); - virtual void setForcePutPos(cXyz const& pPutPos) { - mForcePutPos = pPutPos; - onEndResetFlg1(ERFLG1_UNK_2000); - } virtual u32 checkPlayerNoDraw(); virtual void voiceStart(u32); virtual void seStartOnlyReverb(u32); @@ -6957,10 +6976,6 @@ public: virtual void setGrabCollisionOffset(f32, f32, cBgS_PolyInfo*); virtual void onFrollCrashFlg(u8, int); virtual MtxP getModelJointMtx(u16); - virtual MtxP getHeadMtx() { - return mpLinkModel->getAnmMtx(field_0x30b4); - ; - } virtual bool setHookshotCarryOffset(fpc_ProcID, cXyz const*); virtual BOOL checkCutJumpCancelTurn() const { return (mProcID == PROC_CUT_JUMP || mProcID == PROC_CUT_JUMP_LAND) && field_0x3198 != 2; @@ -6977,9 +6992,6 @@ public: virtual bool setThrowDamage(short, f32, f32, int, int, int); virtual bool checkSetNpcTks(cXyz*, int, int); virtual int setRollJump(f32, f32, short); - virtual void playerStartCollisionSE(u32 param_0, u32 param_1) { - mZ2Link.startCollisionSE(param_0, param_1); - } virtual void cancelDungeonWarpReadyNeck() { if (mProcID != PROC_DUNGEON_WARP_READY) { return; @@ -7004,21 +7016,7 @@ public: virtual u32 checkCanoeRide() const; virtual u32 checkBoardRide() const; virtual u32 checkSpinnerRide() const; - virtual daSpinner_c* getSpinnerActor() { - daSpinner_c* spinnerActor; - if (!checkSpinnerRide()) { - spinnerActor = NULL; - } else { - spinnerActor = (daSpinner_c*)mRideAcKeep.getActor(); - } - return (daSpinner_c*)spinnerActor; - } - virtual BOOL checkHorseRideNotReady() const { - return checkHorseRide() && mProcID != PROC_HORSE_RIDE && mProcID != PROC_HORSE_GETOFF; - } virtual bool checkArrowChargeEnd() const; - virtual f32 getSearchBallScale() const { return mSearchBallScale; } - virtual int checkFastShotTime() { return mFastShotTime; } virtual bool checkNoEquipItem() const { return mEquipItem == fpcNm_ITEM_NONE; } virtual bool checkKandelaarSwing(int) const; virtual s16 getBoardCutTurnOffsetAngleY() const { @@ -7028,6 +7026,31 @@ public: return 0; } virtual cXyz* getMagneBootsTopVec() { return &mMagneBootsTopVec; } + virtual void setCargoCarry(fopAc_ac_c* p_actor) { + mSpecialMode = SMODE_CARGO_CARRY; + mCargoCarryAcKeep.setData(p_actor); + } + virtual void setGoronSideMove(fopAc_ac_c* p_actor) { + mSpecialMode = SMODE_GORON_THROW; + mCargoCarryAcKeep.setData(p_actor); + } + virtual void setSumouReady(fopAc_ac_c* p_actor) { + mSpecialMode = SMODE_SUMO_READY; + mCargoCarryAcKeep.setData(p_actor); + mDemo.setDemoMode(1); + } + virtual void setSumouPushBackDirection(short param_0) { + if (mProcID != PROC_SUMOU_MOVE) { + return; + } + mProcVar4.field_0x3010 = param_0; + } + virtual void setSumouLoseHeadUp() { + if (mProcID != PROC_SUMOU_WIN_LOSE) { + return; + } + mSpecialMode = SMODE_SUMO_LOSE; + } virtual cXyz* getKandelaarFlamePos(); virtual bool checkUseKandelaar(int); virtual void setDkCaught(fopAc_ac_c*); @@ -7045,6 +7068,24 @@ public: } mProcVar4.field_0x3010 = angle; } + virtual void setSumouGraspCancelCount(int param_0) { + if (mProcID != PROC_SUMOU_MOVE) { + return; + } + mProcVar2.field_0x300c = param_0; + } + virtual bool checkItemSwordEquip() const { return mEquipItem == 0x103; } + virtual f32 getSinkShapeOffset() const { return mSinkShapeOffset; } + virtual BOOL checkSinkDead() const { return field_0x2fbd == 0xFF; } + virtual BOOL checkCutJumpMode() const { return mProcID == PROC_CUT_JUMP; } + virtual s16 getGiantPuzzleAimAngle() const { return mProcVar2.mPuzzleAimAngle; } + virtual u8 getSwordChangeWaitTimer() const { return mSwordChangeWaitTimer; } + virtual BOOL checkMetamorphose() const { + return mProcID == PROC_METAMORPHOSE && mProcVar1.field_0x300a == 0; + } + virtual BOOL checkWolfDownAttackPullOut() const { return mProcID == PROC_WOLF_DOWN_AT_LAND; } + virtual cXyz* getMidnaAtnPos() const { return (cXyz*)&mMidnaAtnPos; } + virtual bool checkCopyRodEquip() const { return mEquipItem == fpcNm_ITEM_COPY_ROD; } virtual void setKandelaarMtx(f32 (*)[4], int, int); virtual bool getStickAngleFromPlayerShape(short*) const; virtual bool checkSpinnerPathMove(); @@ -7059,44 +7100,13 @@ public: return mProcID == PROC_CANOE_FISHING_GET && mProcVar3.field_0x300e == 1; } virtual u8 checkBeeChildDrink() const { return field_0x2fd3; } + virtual Z2WolfHowlMgr* getWolfHowlMgrP() { return &mZ2WolfHowlMgr; } + virtual BOOL checkWolfHowlSuccessAnime() const { + return checkUnderMove0BckNoArcWolf(WANM_HOWL_SUCCESS); + } virtual void skipPortalObjWarp(); virtual BOOL checkTreasureRupeeReturn(int) const; - virtual void setSumouReady(fopAc_ac_c* p_actor) { - mSpecialMode = SMODE_SUMO_READY; - mCargoCarryAcKeep.setData(p_actor); - mDemo.setDemoMode(1); - } - virtual bool checkAcceptDungeonWarpAlink(int) { return checkAcceptWarp(); } - virtual s16 getSumouCounter() const { return mProcVar2.field_0x300c; } - virtual s16 checkSumouWithstand() const { return mProcVar3.field_0x300e; } virtual void cancelGoronThrowEvent(); - virtual void setSumouGraspCancelCount(int param_0) { - if (mProcID != PROC_SUMOU_MOVE) { - return; - } - mProcVar2.field_0x300c = param_0; - } - virtual void setSumouPushBackDirection(short param_0) { - if (mProcID != PROC_SUMOU_MOVE) { - return; - } - mProcVar4.field_0x3010 = param_0; - } - virtual void setSumouLoseHeadUp() { - if (mProcID != PROC_SUMOU_WIN_LOSE) { - return; - } - mSpecialMode = SMODE_SUMO_LOSE; - } - virtual s16 getGiantPuzzleAimAngle() const { return mProcVar2.mPuzzleAimAngle; } - virtual void setGoronSideMove(fopAc_ac_c* p_actor) { - mSpecialMode = SMODE_GORON_THROW; - mCargoCarryAcKeep.setData(p_actor); - } - virtual void setCargoCarry(fopAc_ac_c* p_actor) { - mSpecialMode = SMODE_CARGO_CARRY; - mCargoCarryAcKeep.setData(p_actor); - } virtual cXyz* getHookshotTopPos(); virtual bool checkHookshotReturnMode() const; virtual bool checkHookshotShootReturnMode() const; @@ -7124,27 +7134,16 @@ public: virtual bool checkDragonHangRide() const { return mProcID == PROC_BOSS_BODY_HANG && field_0x32cc != 0; } + virtual void playerStartCollisionSE(u32 param_0, u32 param_1) { + mZ2Link.startCollisionSE(param_0, param_1); + } virtual void changeDragonActor(fopAc_ac_c*); virtual u8 getClothesChangeWaitTimer() const { return mClothesChangeWaitTimer; } virtual u8 getShieldChangeWaitTimer() const { return mShieldChangeWaitTimer; } - virtual u8 getSwordChangeWaitTimer() const { return mSwordChangeWaitTimer; } - virtual BOOL checkMetamorphose() const { - return mProcID == PROC_METAMORPHOSE && mProcVar1.field_0x300a == 0; - } - virtual BOOL checkWolfDownAttackPullOut() const { return mProcID == PROC_WOLF_DOWN_AT_LAND; } virtual BOOL checkBootsOrArmorHeavy() const; virtual fpc_ProcID getBottleOpenAppearItem() const; - virtual bool checkItemSwordEquip() const { return mEquipItem == 0x103; } - virtual f32 getSinkShapeOffset() const { return mSinkShapeOffset; } - virtual BOOL checkSinkDead() const { return field_0x2fbd == 0xFF; } virtual BOOL checkHorseStart() { return checkHorseStart(getLastSceneMode(), getStartMode()); } - virtual Z2WolfHowlMgr* getWolfHowlMgrP() { return &mZ2WolfHowlMgr; } - virtual BOOL checkWolfHowlSuccessAnime() const { - return checkUnderMove0BckNoArcWolf(WANM_HOWL_SUCCESS); - } virtual BOOL checkCopyRodTopUse(); - virtual bool checkCopyRodEquip() const { return mEquipItem == fpcNm_ITEM_COPY_ROD; } - virtual BOOL checkCutJumpMode() const { return mProcID == PROC_CUT_JUMP; } static BOOL checkDebugMoveInput() { if (mDoCPd_c::isConnect(PAD_3)) { @@ -8271,4 +8270,8 @@ static fopAc_ac_c* daAlink_searchCanoe(fopAc_ac_c* param_0, void* param_1); static void* daAlink_searchBoar(fopAc_ac_c* param_0, void* param_1); static fopAc_ac_c* daAlink_searchLightBall(fopAc_ac_c* p_actor, void* param_1); +inline daAlink_c* daAlink_getAlinkActorClass() { + return (daAlink_c*)g_dComIfG_gameInfo.play.getPlayerPtr(LINK_PTR); +} + #endif /* D_A_D_A_ALINK_H */ diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 2203d7af0d3..37cb8ec0370 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -1257,4 +1257,12 @@ public: int daPy_addCalcShort(s16* param_0, s16 param_1, s16 param_2, s16 param_3, s16 param_4); +inline daPy_py_c* daPy_getPlayerActorClass() { + return (daPy_py_c*)dComIfGp_getPlayer(0); +} + +inline daPy_py_c* daPy_getLinkPlayerActorClass() { + return dComIfGp_getLinkPlayer(); +} + #endif /* D_A_D_A_PLAYER_H */ diff --git a/include/d/actor/d_a_tbox.h b/include/d/actor/d_a_tbox.h index d6577a84938..0e8feaa653c 100644 --- a/include/d/actor/d_a_tbox.h +++ b/include/d/actor/d_a_tbox.h @@ -5,6 +5,7 @@ #include "d/d_cc_d.h" #include "d/d_bg_s_acch.h" #include "d/d_bg_s_movebg_actor.h" +#include "d/d_kankyo.h" #include "f_op/f_op_actor_mng.h" #include "m_Do/m_Do_hostIO.h" @@ -197,33 +198,4 @@ private: STATIC_ASSERT(sizeof(daTbox_c) == 0xA30); -class daTbox_HIO_c : public mDoHIO_entry_c { -public: - daTbox_HIO_c(); - virtual ~daTbox_HIO_c() {} - - void genMessage(JORMContext*); - - /* 0x04 */ u8 mItemNo; - /* 0x05 */ u8 mUseDebugItemNo; - /* 0x06 */ u8 mClearSwitch; - /* 0x07 */ u8 mDemoType; - /* 0x08 */ u8 mDebugLightColorEnabled; - /* 0x09 */ u8 mTimerDisplay; - /* 0x0A */ u8 mCheckDisplay; - /* 0x0B */ u8 mSaveOff; - /* 0x0C */ f32 mGravity; - /* 0x10 */ cXyz mLightOffset; - /* 0x1C */ s16 mLightColorR; - /* 0x1E */ s16 mLightColorG; - /* 0x20 */ s16 mLightColorB; - /* 0x24 */ f32 mLightPower; - /* 0x28 */ f32 mFluctuationRate; - /* 0x2C */ f32 mEnvColorInfluence; - /* 0x30 */ s16 mFluctuationSpeed; - /* 0x32 */ u8 mForPlacementCheck; -}; - -STATIC_ASSERT(sizeof(daTbox_HIO_c) == 0x34); - #endif /* D_A_TBOX_H */ diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index befe038a36c..88263a5cb82 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -4430,16 +4430,4 @@ inline void dComIfGd_set3DlineMatDark(mDoExt_3DlineMat_c* param_0) { g_dComIfG_gameInfo.drawlist.set3DlineMatDark(param_0); } -inline daPy_py_c* daPy_getLinkPlayerActorClass() { - return dComIfGp_getLinkPlayer(); -} - -inline daPy_py_c* daPy_getPlayerActorClass() { - return (daPy_py_c*)dComIfGp_getPlayer(0); -} - -inline daAlink_c* daAlink_getAlinkActorClass() { - return (daAlink_c*)g_dComIfG_gameInfo.play.getPlayerPtr(LINK_PTR); -} - #endif /* D_COM_D_COM_INF_GAME_H */ diff --git a/include/d/d_msg_object.h b/include/d/d_msg_object.h index 7154d5d2843..65c205d6da8 100644 --- a/include/d/d_msg_object.h +++ b/include/d/d_msg_object.h @@ -744,8 +744,6 @@ public: /* 0x35C */ dMsgObject_HowlHIO_c mHowlHIO; }; -#ifndef DISABLE_MSG_OBJECT_EXTERN extern dMsgObject_HIO_c g_MsgObject_HIO_c; -#endif #endif /* D_MSG_D_MSG_OBJECT_H */ diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 751ece4b002..73556c5075e 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -174,7 +174,7 @@ public: private: /* 0x14 */ J3DAnmTransform* mAnm; - /* 0x18 */ J3DMtxCalc* mpMtxCalc; + /* 0x18 */ J3DMtxCalcAnimation, J3DMtxCalcJ3DSysInitMaya>* mpMtxCalc; }; // Size: 0x1C STATIC_ASSERT(sizeof(mDoExt_bckAnm) == 0x1C); diff --git a/src/d/actor/d_a_obj_crvhahen.cpp b/src/d/actor/d_a_obj_crvhahen.cpp index 10adfceebf1..b63be7ae671 100644 --- a/src/d/actor/d_a_obj_crvhahen.cpp +++ b/src/d/actor/d_a_obj_crvhahen.cpp @@ -6,6 +6,7 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_crvhahen.h" +#include "d/actor/d_a_player.h" static const char* l_arcName = "CrvFence"; diff --git a/src/d/actor/d_a_obj_ornament_cloth.cpp b/src/d/actor/d_a_obj_ornament_cloth.cpp index 8161298b191..cc7b57f1e55 100644 --- a/src/d/actor/d_a_obj_ornament_cloth.cpp +++ b/src/d/actor/d_a_obj_ornament_cloth.cpp @@ -6,6 +6,7 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_ornament_cloth.h" +#include "d/actor/d_a_player.h" #include "d/d_a_obj.h" enum J_Necktie_RES_File_ID { @@ -192,7 +193,7 @@ void daObjOnCloth_c::checkPlayerMove() { field_0x650[attr().delayedVibrationFrame - 1] = 0.0f; if (!(fopAcM_searchPlayerDistanceXZ2(this) > attr().playerReactionDist * attr().playerReactionDist)) { - f32 fVar2 = fopAcM_GetSpeedF((fopAc_ac_c*)daPy_getPlayerActorClass()); + f32 fVar2 = fopAcM_GetSpeedF(daPy_getPlayerActorClass()); if (fVar2 > attr().playerReactionSpeed) { field_0x650[attr().delayedVibrationFrame - 1] = fVar2; } diff --git a/src/d/actor/d_a_obj_stopper2.cpp b/src/d/actor/d_a_obj_stopper2.cpp index 6713215f5ad..97641f7e7e6 100644 --- a/src/d/actor/d_a_obj_stopper2.cpp +++ b/src/d/actor/d_a_obj_stopper2.cpp @@ -6,6 +6,7 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_stopper2.h" +#include "d/actor/d_a_player.h" static char* l_arcName = "Stop00"; diff --git a/src/d/actor/d_a_tag_yami.cpp b/src/d/actor/d_a_tag_yami.cpp index 5c7a6631372..8708b8d395a 100644 --- a/src/d/actor/d_a_tag_yami.cpp +++ b/src/d/actor/d_a_tag_yami.cpp @@ -7,6 +7,7 @@ #include "d/actor/d_a_tag_yami.h" #include "d/d_com_inf_game.h" +#include "d/actor/d_a_player.h" const static dCcD_SrcCyl l_sph_src = { { diff --git a/src/d/actor/d_a_tbox.cpp b/src/d/actor/d_a_tbox.cpp index 6aeefbf433d..34b58119721 100644 --- a/src/d/actor/d_a_tbox.cpp +++ b/src/d/actor/d_a_tbox.cpp @@ -43,6 +43,35 @@ static daTbox_ModelInfo l_modelInfo[3] = { static cXyz l_light_offset(0.0f, 35.0f, 0.0f); +class daTbox_HIO_c : public mDoHIO_entry_c { +public: + daTbox_HIO_c(); + virtual ~daTbox_HIO_c() {} + + void genMessage(JORMContext*); + + /* 0x04 */ u8 mItemNo; + /* 0x05 */ u8 mUseDebugItemNo; + /* 0x06 */ u8 mClearSwitch; + /* 0x07 */ u8 mDemoType; + /* 0x08 */ u8 mDebugLightColorEnabled; + /* 0x09 */ u8 mTimerDisplay; + /* 0x0A */ u8 mCheckDisplay; + /* 0x0B */ u8 mSaveOff; + /* 0x0C */ f32 mGravity; + /* 0x10 */ cXyz mLightOffset; + /* 0x1C */ s16 mLightColorR; + /* 0x1E */ s16 mLightColorG; + /* 0x20 */ s16 mLightColorB; + /* 0x24 */ f32 mLightPower; + /* 0x28 */ f32 mFluctuationRate; + /* 0x2C */ f32 mEnvColorInfluence; + /* 0x30 */ s16 mFluctuationSpeed; + /* 0x32 */ u8 mForPlacementCheck; +}; + +STATIC_ASSERT(sizeof(daTbox_HIO_c) == 0x34); + daTbox_HIO_c::daTbox_HIO_c() { mItemNo = 1; mUseDebugItemNo = 0; diff --git a/src/d/d_msg_object.cpp b/src/d/d_msg_object.cpp index 55e416ad75b..5f2e2d6fa5f 100644 --- a/src/d/d_msg_object.cpp +++ b/src/d/d_msg_object.cpp @@ -1,7 +1,5 @@ #include "d/dolzel.h" // IWYU pragma: keep -#define DISABLE_MSG_OBJECT_EXTERN - #include "d/d_msg_object.h" #include "d/d_msg_class.h" #include "d/d_msg_string.h" diff --git a/tools/utilities/weak_order_diff.py b/tools/utilities/weak_order_diff.py new file mode 100755 index 00000000000..fe2c786575d --- /dev/null +++ b/tools/utilities/weak_order_diff.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 + +from pathlib import Path +import re +import subprocess +from argparse import ArgumentParser + +def get_symbols(o_path: Path, diff_data: bool): + output = subprocess.check_output(["readelf", "-Ws", o_path]).decode("ascii") + symbols = [] + for line in output.split("\n")[3:]: + if line == "": + continue + words = line.split() + if len(words) == 7 and words[-1] == "UND": + continue + _, offset, size, sym_type, scope, vis, section_index, name = words + + if diff_data: + # Only diff data. + if sym_type == "FUNC": + continue + if sym_type in ["FILE", "NOTYPE", "SECTION"]: + continue + if vis == "HIDDEN": + continue + if re.search(r"^@\d+$", name): + continue + if re.search(r"^lbl_[0-9a-f]+_(?:data|bss)_[0-9a-f]+$", name): + continue + match = re.search(r"^(\S+)\$\d+$", name) + if match: + name = match.group(1) + else: + # Only diff functions. + if sym_type != "FUNC": + continue + if vis == "HIDDEN": + continue + + symbols.append((sym_type, int(section_index), int(offset, 16), name)) + + symbols.sort() + symbol_names = [sym[-1] for sym in symbols] + return symbol_names + + +def print_symbols_with_unmatched_order_for_object(relative_o_path: str, version: str, diff_data: bool): + target_o = Path("build") / version / "obj" / relative_o_path + base_o = Path("build") / version / "src" / relative_o_path + if not target_o.exists(): + rel_name = relative_o_path.split("/")[-1].split(".")[0] + target_o = Path("build") / version / rel_name / "obj" / relative_o_path + + subprocess.check_output(["ninja", base_o]) + + target_symbols = get_symbols(target_o, diff_data) + base_symbols = get_symbols(base_o, diff_data) + target_symbols_set = set(target_symbols) + base_symbols = [sym for sym in base_symbols if sym in target_symbols_set] + base_idx = 0 + matched_count = 0 + unmatched_count = 0 + for target_sym in target_symbols: + if base_idx == len(base_symbols): + base_sym = None + else: + base_sym = base_symbols[base_idx] + + if target_sym == base_sym: + base_idx += 1 + matched_count += 1 + else: + base_idx = base_symbols.index(target_sym) + base_idx += 1 + unmatched_count += 1 + print(target_sym) + + print("====================================") + print("Number of order differences:", unmatched_count) + + +def main(): + parser = ArgumentParser(description="Print differences in weak function order for an object.") + parser.add_argument( + "o_path", + type=str, + default="d/actor/d_a_alink.o", + nargs='?', + help="""relative path to the object file to diff (e.g. d/actor/d_a_alink.o).""", + ) + parser.add_argument( + "-v", + "--version", + type=str, + default="GZ2E01", + help="version to build", + ) + parser.add_argument( + "--data", + action="store_true", + help="""diffs data instead of functions.""", + ) + args = parser.parse_args() + + print_symbols_with_unmatched_order_for_object(args.o_path, args.version, args.data) + +if __name__ == "__main__": + main()