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
This commit is contained in:
LagoLunatic 2025-12-05 21:46:58 -05:00 committed by GitHub
parent e6b1f3a4f2
commit ae9fa8922a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 248 additions and 145 deletions

View File

@ -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"),

View File

@ -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>());
}

View File

@ -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();

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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);

View File

@ -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";

View File

@ -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;
}

View File

@ -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";

View File

@ -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 = {
{

View File

@ -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;

View File

@ -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"

View File

@ -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()