summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLagoLunatic <LagoLunatic@users.noreply.github.com>2025-12-05 21:46:58 -0500
committerGitHub <noreply@github.com>2025-12-05 18:46:58 -0800
commitae9fa8922a52ccbff29891024aeafd1aed2d0400 (patch)
treee91656e2d22eda43eb02828d9c0e99e0f91951ae
parente6b1f3a4f2ffd7403d4949d0875f7827cd2846f2 (diff)
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
-rwxr-xr-xconfigure.py6
-rw-r--r--include/JSystem/JGadget/search.h4
-rw-r--r--include/JSystem/JStudio/JStudio/functionvalue.h6
-rw-r--r--include/d/actor/d_a_alink.h177
-rw-r--r--include/d/actor/d_a_player.h8
-rw-r--r--include/d/actor/d_a_tbox.h30
-rw-r--r--include/d/d_com_inf_game.h12
-rw-r--r--include/d/d_msg_object.h2
-rw-r--r--include/m_Do/m_Do_ext.h2
-rw-r--r--src/d/actor/d_a_obj_crvhahen.cpp1
-rw-r--r--src/d/actor/d_a_obj_ornament_cloth.cpp3
-rw-r--r--src/d/actor/d_a_obj_stopper2.cpp1
-rw-r--r--src/d/actor/d_a_tag_yami.cpp1
-rw-r--r--src/d/actor/d_a_tbox.cpp29
-rw-r--r--src/d/d_msg_object.cpp2
-rwxr-xr-xtools/utilities/weak_order_diff.py109
16 files changed, 248 insertions, 145 deletions
diff --git a/configure.py b/configure.py
index cb1fac63ab..0c08a075b9 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 e4c5c538b7..c53045668a 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 <typename Iterator, typename T, typename Predicate>
-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 <typename Iterator, typename T>
-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<T>());
}
diff --git a/include/JSystem/JStudio/JStudio/functionvalue.h b/include/JSystem/JStudio/JStudio/functionvalue.h
index 69309a4219..a8724f5496 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 064f8587d3..a010fcca58 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 2203d7af0d..37cb8ec037 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 d6577a8493..0e8feaa653 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 befe038a36..88263a5cb8 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 7154d5d284..65c205d6da 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 751ece4b00..73556c5075 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<J3DMtxCalcAnimationAdaptorDefault<J3DMtxCalcCalcTransformMaya>, 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 10adfceebf..b63be7ae67 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 8161298b19..cc7b57f1e5 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 6713215f5a..97641f7e7e 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 5c7a663137..8708b8d395 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 6aeefbf433..34b5811972 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 55e416ad75..5f2e2d6fa5 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 0000000000..fe2c786575
--- /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()