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), "JSystem/JStudio/JStudio/ctb.cpp"),
Object(MatchingFor(ALL_GCN, "Shield", "ShieldD"), "JSystem/JStudio/JStudio/ctb-data.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), "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.cpp"),
Object(MatchingFor(ALL_GCN, "Shield"), "JSystem/JStudio/JStudio/fvb-data-parse.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_msg"),
ActorRel(MatchingFor(ALL_GCN), "d_a_tag_push"), ActorRel(MatchingFor(ALL_GCN), "d_a_tag_push"),
ActorRel(MatchingFor(ALL_GCN), "d_a_tag_telop"), 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_tbox2"),
ActorRel(MatchingFor(ALL_GCN), "d_a_vrbox"), ActorRel(MatchingFor(ALL_GCN), "d_a_vrbox"),
ActorRel(NonMatching, "d_a_vrbox2"), ActorRel(NonMatching, "d_a_vrbox2"),
@ -2009,7 +2009,7 @@ config.libs = [
ActorRel(NonMatching, "d_a_npc_kn"), ActorRel(NonMatching, "d_a_npc_kn"),
ActorRel(MatchingFor(ALL_GCN), "d_a_npc_knj"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_knj"),
ActorRel(MatchingFor(ALL_GCN), "d_a_npc_kolinb"), 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_kyury"),
ActorRel(MatchingFor(ALL_GCN), "d_a_npc_len"), ActorRel(MatchingFor(ALL_GCN), "d_a_npc_len"),
ActorRel(MatchingFor(ALL_GCN), "d_a_npc_lf"), 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> 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) ? return current == last || p(val, *current) ?
findUpperBound_binary_end(first, current, val, p) : findUpperBound_binary_end(first, current, val, p) :
findUpperBound_binary_begin(current, last, val, p); findUpperBound_binary_begin(current, last, val, p);
} }
template <typename Iterator, typename T> 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>()); return findUpperBound_binary_current(first, last, current, val, std::less<T>());
} }

View File

@ -157,7 +157,6 @@ private:
class TFunctionValue_constant : public TFunctionValue { class TFunctionValue_constant : public TFunctionValue {
public: public:
TFunctionValue_constant(); TFunctionValue_constant();
virtual ~TFunctionValue_constant() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();
@ -195,7 +194,6 @@ public:
const TFunctionValue_composite::TData&, f64); const TFunctionValue_composite::TData&, f64);
TFunctionValue_composite(); TFunctionValue_composite();
virtual ~TFunctionValue_composite() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();
@ -232,7 +230,6 @@ class TFunctionValue_transition : public TFunctionValue,
public TFunctionValueAttribute_interpolate { public TFunctionValueAttribute_interpolate {
public: public:
TFunctionValue_transition(); TFunctionValue_transition();
virtual ~TFunctionValue_transition() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();
@ -264,7 +261,6 @@ public:
typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list&, const TIndexData_&); typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list&, const TIndexData_&);
TFunctionValue_list(); TFunctionValue_list();
virtual ~TFunctionValue_list() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();
@ -380,7 +376,6 @@ public:
typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list_parameter&, f64); typedef f64 (*update_INTERPOLATE)(const TFunctionValue_list_parameter&, f64);
TFunctionValue_list_parameter(); TFunctionValue_list_parameter();
virtual ~TFunctionValue_list_parameter() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();
@ -499,7 +494,6 @@ public:
}; };
TFunctionValue_hermite(); TFunctionValue_hermite();
virtual ~TFunctionValue_hermite() {}
virtual u32 getType() const; virtual u32 getType() const;
virtual TFunctionValueAttributeSet getAttributeSet(); virtual TFunctionValueAttributeSet getAttributeSet();

View File

@ -6839,7 +6839,18 @@ public:
BOOL checkCutHeadProc() const { return mProcID == PROC_CUT_HEAD; } BOOL checkCutHeadProc() const { return mProcID == PROC_CUT_HEAD; }
fopAc_ac_c* getRideActor() { return mRideAcKeep.getActor(); } 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) { virtual void setMidnaMsgNum(fopAc_ac_c* param_0, u16 pMsgNum) {
mMidnaMsgNum = pMsgNum; mMidnaMsgNum = pMsgNum;
mMidnaMsg = (daTagMmsg_c*)param_0; mMidnaMsg = (daTagMmsg_c*)param_0;
@ -6847,7 +6858,6 @@ public:
virtual MtxP getModelMtx() { return mpLinkModel->getBaseTRMtx(); } virtual MtxP getModelMtx() { return mpLinkModel->getBaseTRMtx(); }
virtual MtxP getInvMtx() { return mInvMtx; } virtual MtxP getInvMtx() { return mInvMtx; }
virtual cXyz* getShadowTalkAtnPos() { return &field_0x375c; } virtual cXyz* getShadowTalkAtnPos() { return &field_0x375c; }
virtual f32 getGroundY() { return mLinkAcch.GetGroundH(); }
virtual MtxP getLeftItemMatrix(); virtual MtxP getLeftItemMatrix();
virtual MtxP getRightItemMatrix(); virtual MtxP getRightItemMatrix();
virtual MtxP getLeftHandMatrix(); virtual MtxP getLeftHandMatrix();
@ -6859,9 +6869,27 @@ public:
if (mHeldItemModel != NULL && checkBottleItem(mEquipItem)) { if (mHeldItemModel != NULL && checkBottleItem(mEquipItem)) {
return mHeldItemModel->getBaseTRMtx(); return mHeldItemModel->getBaseTRMtx();
} }
return NULL; 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 BOOL checkPlayerGuard() const;
virtual u32 checkPlayerFly() const { virtual u32 checkPlayerFly() const {
return checkModeFlg(MODE_SWIMMING | MODE_ROPE_WALK | MODE_VINE_CLIMB | MODE_UNK_800 | 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 checkGrassWhistle() const { return mProcID == PROC_GRASS_WHISTLE_WAIT; }
virtual BOOL checkBoarRun() const { return mProcID == PROC_BOAR_RUN; } 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 f32 getBaseAnimeFrame() const;
virtual void setAnimeFrame(f32); virtual void setAnimeFrame(f32);
virtual BOOL checkWolfLock(fopAc_ac_c*) const; virtual BOOL checkWolfLock(fopAc_ac_c*) const;
virtual bool cancelWolfLock(fopAc_ac_c*); 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 exchangeGrabActor(fopAc_ac_c*);
virtual BOOL setForceGrab(fopAc_ac_c*, int, int); virtual BOOL setForceGrab(fopAc_ac_c*, int, int);
virtual void setForcePutPos(cXyz const& pPutPos) {
mForcePutPos = pPutPos;
onEndResetFlg1(ERFLG1_UNK_2000);
}
virtual u32 checkPlayerNoDraw(); virtual u32 checkPlayerNoDraw();
virtual void voiceStart(u32); virtual void voiceStart(u32);
virtual void seStartOnlyReverb(u32); virtual void seStartOnlyReverb(u32);
@ -6957,10 +6976,6 @@ public:
virtual void setGrabCollisionOffset(f32, f32, cBgS_PolyInfo*); virtual void setGrabCollisionOffset(f32, f32, cBgS_PolyInfo*);
virtual void onFrollCrashFlg(u8, int); virtual void onFrollCrashFlg(u8, int);
virtual MtxP getModelJointMtx(u16); virtual MtxP getModelJointMtx(u16);
virtual MtxP getHeadMtx() {
return mpLinkModel->getAnmMtx(field_0x30b4);
;
}
virtual bool setHookshotCarryOffset(fpc_ProcID, cXyz const*); virtual bool setHookshotCarryOffset(fpc_ProcID, cXyz const*);
virtual BOOL checkCutJumpCancelTurn() const { virtual BOOL checkCutJumpCancelTurn() const {
return (mProcID == PROC_CUT_JUMP || mProcID == PROC_CUT_JUMP_LAND) && field_0x3198 != 2; 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 setThrowDamage(short, f32, f32, int, int, int);
virtual bool checkSetNpcTks(cXyz*, int, int); virtual bool checkSetNpcTks(cXyz*, int, int);
virtual int setRollJump(f32, f32, short); virtual int setRollJump(f32, f32, short);
virtual void playerStartCollisionSE(u32 param_0, u32 param_1) {
mZ2Link.startCollisionSE(param_0, param_1);
}
virtual void cancelDungeonWarpReadyNeck() { virtual void cancelDungeonWarpReadyNeck() {
if (mProcID != PROC_DUNGEON_WARP_READY) { if (mProcID != PROC_DUNGEON_WARP_READY) {
return; return;
@ -7004,21 +7016,7 @@ public:
virtual u32 checkCanoeRide() const; virtual u32 checkCanoeRide() const;
virtual u32 checkBoardRide() const; virtual u32 checkBoardRide() const;
virtual u32 checkSpinnerRide() 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 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 checkNoEquipItem() const { return mEquipItem == fpcNm_ITEM_NONE; }
virtual bool checkKandelaarSwing(int) const; virtual bool checkKandelaarSwing(int) const;
virtual s16 getBoardCutTurnOffsetAngleY() const { virtual s16 getBoardCutTurnOffsetAngleY() const {
@ -7028,6 +7026,31 @@ public:
return 0; return 0;
} }
virtual cXyz* getMagneBootsTopVec() { return &mMagneBootsTopVec; } 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 cXyz* getKandelaarFlamePos();
virtual bool checkUseKandelaar(int); virtual bool checkUseKandelaar(int);
virtual void setDkCaught(fopAc_ac_c*); virtual void setDkCaught(fopAc_ac_c*);
@ -7045,6 +7068,24 @@ public:
} }
mProcVar4.field_0x3010 = angle; 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 void setKandelaarMtx(f32 (*)[4], int, int);
virtual bool getStickAngleFromPlayerShape(short*) const; virtual bool getStickAngleFromPlayerShape(short*) const;
virtual bool checkSpinnerPathMove(); virtual bool checkSpinnerPathMove();
@ -7059,44 +7100,13 @@ public:
return mProcID == PROC_CANOE_FISHING_GET && mProcVar3.field_0x300e == 1; return mProcID == PROC_CANOE_FISHING_GET && mProcVar3.field_0x300e == 1;
} }
virtual u8 checkBeeChildDrink() const { return field_0x2fd3; } 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 void skipPortalObjWarp();
virtual BOOL checkTreasureRupeeReturn(int) const; 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 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 cXyz* getHookshotTopPos();
virtual bool checkHookshotReturnMode() const; virtual bool checkHookshotReturnMode() const;
virtual bool checkHookshotShootReturnMode() const; virtual bool checkHookshotShootReturnMode() const;
@ -7124,27 +7134,16 @@ public:
virtual bool checkDragonHangRide() const { virtual bool checkDragonHangRide() const {
return mProcID == PROC_BOSS_BODY_HANG && field_0x32cc != 0; 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 void changeDragonActor(fopAc_ac_c*);
virtual u8 getClothesChangeWaitTimer() const { return mClothesChangeWaitTimer; } virtual u8 getClothesChangeWaitTimer() const { return mClothesChangeWaitTimer; }
virtual u8 getShieldChangeWaitTimer() const { return mShieldChangeWaitTimer; } 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 BOOL checkBootsOrArmorHeavy() const;
virtual fpc_ProcID getBottleOpenAppearItem() 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 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 checkCopyRodTopUse();
virtual bool checkCopyRodEquip() const { return mEquipItem == fpcNm_ITEM_COPY_ROD; }
virtual BOOL checkCutJumpMode() const { return mProcID == PROC_CUT_JUMP; }
static BOOL checkDebugMoveInput() { static BOOL checkDebugMoveInput() {
if (mDoCPd_c::isConnect(PAD_3)) { 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 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); 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 */ #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); 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 */ #endif /* D_A_D_A_PLAYER_H */

View File

@ -5,6 +5,7 @@
#include "d/d_cc_d.h" #include "d/d_cc_d.h"
#include "d/d_bg_s_acch.h" #include "d/d_bg_s_acch.h"
#include "d/d_bg_s_movebg_actor.h" #include "d/d_bg_s_movebg_actor.h"
#include "d/d_kankyo.h"
#include "f_op/f_op_actor_mng.h" #include "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_hostIO.h" #include "m_Do/m_Do_hostIO.h"
@ -197,33 +198,4 @@ private:
STATIC_ASSERT(sizeof(daTbox_c) == 0xA30); 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 */ #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); 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 */ #endif /* D_COM_D_COM_INF_GAME_H */

View File

@ -744,8 +744,6 @@ public:
/* 0x35C */ dMsgObject_HowlHIO_c mHowlHIO; /* 0x35C */ dMsgObject_HowlHIO_c mHowlHIO;
}; };
#ifndef DISABLE_MSG_OBJECT_EXTERN
extern dMsgObject_HIO_c g_MsgObject_HIO_c; extern dMsgObject_HIO_c g_MsgObject_HIO_c;
#endif
#endif /* D_MSG_D_MSG_OBJECT_H */ #endif /* D_MSG_D_MSG_OBJECT_H */

View File

@ -174,7 +174,7 @@ public:
private: private:
/* 0x14 */ J3DAnmTransform* mAnm; /* 0x14 */ J3DAnmTransform* mAnm;
/* 0x18 */ J3DMtxCalc* mpMtxCalc; /* 0x18 */ J3DMtxCalcAnimation<J3DMtxCalcAnimationAdaptorDefault<J3DMtxCalcCalcTransformMaya>, J3DMtxCalcJ3DSysInitMaya>* mpMtxCalc;
}; // Size: 0x1C }; // Size: 0x1C
STATIC_ASSERT(sizeof(mDoExt_bckAnm) == 0x1C); STATIC_ASSERT(sizeof(mDoExt_bckAnm) == 0x1C);

View File

@ -6,6 +6,7 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_crvhahen.h" #include "d/actor/d_a_obj_crvhahen.h"
#include "d/actor/d_a_player.h"
static const char* l_arcName = "CrvFence"; static const char* l_arcName = "CrvFence";

View File

@ -6,6 +6,7 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_ornament_cloth.h" #include "d/actor/d_a_obj_ornament_cloth.h"
#include "d/actor/d_a_player.h"
#include "d/d_a_obj.h" #include "d/d_a_obj.h"
enum J_Necktie_RES_File_ID { enum J_Necktie_RES_File_ID {
@ -192,7 +193,7 @@ void daObjOnCloth_c::checkPlayerMove() {
field_0x650[attr().delayedVibrationFrame - 1] = 0.0f; field_0x650[attr().delayedVibrationFrame - 1] = 0.0f;
if (!(fopAcM_searchPlayerDistanceXZ2(this) > attr().playerReactionDist * attr().playerReactionDist)) { 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) { if (fVar2 > attr().playerReactionSpeed) {
field_0x650[attr().delayedVibrationFrame - 1] = fVar2; field_0x650[attr().delayedVibrationFrame - 1] = fVar2;
} }

View File

@ -6,6 +6,7 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_stopper2.h" #include "d/actor/d_a_obj_stopper2.h"
#include "d/actor/d_a_player.h"
static char* l_arcName = "Stop00"; static char* l_arcName = "Stop00";

View File

@ -7,6 +7,7 @@
#include "d/actor/d_a_tag_yami.h" #include "d/actor/d_a_tag_yami.h"
#include "d/d_com_inf_game.h" #include "d/d_com_inf_game.h"
#include "d/actor/d_a_player.h"
const static dCcD_SrcCyl l_sph_src = { 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); 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() { daTbox_HIO_c::daTbox_HIO_c() {
mItemNo = 1; mItemNo = 1;
mUseDebugItemNo = 0; mUseDebugItemNo = 0;

View File

@ -1,7 +1,5 @@
#include "d/dolzel.h" // IWYU pragma: keep #include "d/dolzel.h" // IWYU pragma: keep
#define DISABLE_MSG_OBJECT_EXTERN
#include "d/d_msg_object.h" #include "d/d_msg_object.h"
#include "d/d_msg_class.h" #include "d/d_msg_class.h"
#include "d/d_msg_string.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()