add debug functionality + close to linking hozelda (#2804)

This commit is contained in:
roeming
2025-11-14 19:10:46 -05:00
committed by GitHub
parent 7da5a0371a
commit bdb67c2a29
4 changed files with 98 additions and 49 deletions
@@ -13,3 +13,4 @@ d/actor/d_a_hozelda.cpp:
.text start:0x00000080 end:0x000035AC
.rodata start:0x00000000 end:0x000000E4
.data start:0x00000000 end:0x000005DC
.bss start:0x00000000 end:0x00000004
+27 -3
View File
@@ -21,7 +21,7 @@ public:
/* 80848D54 */ virtual ~daHoZelda_matAnm_c() {}
/* 80845EDC */ virtual void calc(J3DMaterial*) const;
static bool getEyeMoveFlg() { return mEyeMoveFlg; }
static u8 getEyeMoveFlg() { return mEyeMoveFlg; }
static void offEyeMoveFlg() { mEyeMoveFlg = false; }
static void onEyeMoveFlg() { mEyeMoveFlg = true; }
@@ -29,7 +29,7 @@ public:
static void setMorfFrame(u8 i_frame) { mMorfFrame = i_frame; }
static void decMorfFrame() { cLib_calcTimer<u8>(&mMorfFrame); }
static bool mEyeMoveFlg;
static u8 mEyeMoveFlg;
static u8 mMorfFrame;
/* 0x0F4 */ f32 field_0xf4;
@@ -38,10 +38,34 @@ public:
/* 0x100 */ f32 mNowOffsetY;
};
struct daHoZelda_hio_c1 {
/* 0x0 */ s16 bow_search_y_angle;
/* 0x2 */ s16 bow_start_angle;
/* 0x4 */ s16 bow_end_angle;
/* 0x6 */ s16 field_0x6;
/* 0x8 */ f32 bow_start_distance;
/* 0xC */ f32 bow_end_distance;
};
struct daHoZelda_hio_c0 {
static daHoZelda_hio_c1 const m;
};
class daHoZelda_hio_c : public JORReflexible {
public:
daHoZelda_hio_c() {}
daHoZelda_hio_c() {
#if DEBUG
mParameters = daHoZelda_hio_c0::m;
#endif
}
/* 0x4 */ s8 mID;
#if DEBUG
void genMessage(JORMContext*);
virtual ~daHoZelda_hio_c() {}
/* 0x8 */ daHoZelda_hio_c1 mParameters;
#endif
};
/**
+1 -1
View File
@@ -935,7 +935,7 @@ public:
BOOL checkSpecialHorseRide() { return checkNoResetFlg2(daPy_FLG2(FLG2_HORSE_ZELDA | FLG2_UNK_1000000 | FLG2_BOAR_SINGLE_BATTLE)); }
BOOL checkBoardNoFootAngle() const { return checkResetFlg1(RFLG1_UNK_40); }
bool checkGrabThrow() const { return checkResetFlg0(RFLG0_GRAB_THROW); }
bool checkMidnaAtnPos() const { return checkNoResetFlg1(FLG1_MIDNA_ATN_POS); }
BOOL checkMidnaAtnPos() const { return checkNoResetFlg1(FLG1_MIDNA_ATN_POS); }
bool checkMidnaHairAtnPos() const { return checkNoResetFlg1(FLG1_MIDNA_HAIR_ATN_POS); }
bool checkAttentionLock() const { return checkResetFlg0(RFLG0_UNK_10000); }
BOOL checkFishingRodUseStart() const { return checkResetFlg1(RFLG1_UNK_80); }
+69 -45
View File
@@ -10,20 +10,29 @@
#include "d/actor/d_a_b_gnd.h"
#include "d/actor/d_a_arrow.h"
struct daHoZelda_hio_c1 {
/* 0x0 */ s16 bow_search_y_angle;
/* 0x2 */ s16 bow_start_angle;
/* 0x4 */ s16 bow_end_angle;
/* 0x8 */ f32 bow_start_distance;
/* 0xC */ f32 bow_end_distance;
};
struct daHoZelda_hio_c0 {
static daHoZelda_hio_c1 const m;
};
#if DEBUG
#define HIO mpHIO->mParameters
#else
#define HIO daHoZelda_hio_c0::m
#endif
/* 80848E3C-80848E44 000000 0008+00 15/15 0/0 0/0 .rodata l_arcName */
static const char l_arcName[] = "HoZelda";
#if DEBUG
void daHoZelda_hio_c::genMessage(JORMContext* context) {
context->genSlider("弓サーチY角度", &mParameters.bow_search_y_angle, 0, 0x7fff, 0, NULL, -1, -1, 0x200, 0x18);
context->genSlider("弓開始角度", &mParameters.bow_start_angle, 0, 0x7fff, 0, NULL, -1, -1, 0x200, 0x18);
context->genSlider("弓開始距離", &mParameters.bow_start_distance, 0.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
context->genSlider("弓終了角度", &mParameters.bow_end_angle, 0, 0x7fff, 0, NULL, -1, -1, 0x200, 0x18);
context->genSlider("弓終了距離", &mParameters.bow_end_distance, 0.0f, 10000.0f, 0, NULL, -1, -1, 0x200, 0x18);
}
#endif
/* 80845E98-80845EAC 000078 0014+00 1/1 0/0 0/0 .text daHoZelda_searchGanon__FP10fopAc_ac_cPv */
static void* daHoZelda_searchGanon(fopAc_ac_c* i_actor, void* i_data) {
(void)i_data;
if (fopAcM_GetName(i_actor) == PROC_B_GND) {
return i_actor;
}
@@ -31,20 +40,18 @@ static void* daHoZelda_searchGanon(fopAc_ac_c* i_actor, void* i_data) {
return NULL;
}
/* 80848E3C-80848E44 000000 0008+00 15/15 0/0 0/0 .rodata l_arcName */
static char const l_arcName[8] = "HoZelda";
/* 80848E44-80848E54 000008 0010+00 0/5 0/0 0/0 .rodata m__16daHoZelda_hio_c0 */
const daHoZelda_hio_c1 daHoZelda_hio_c0::m = {
0x38E,
0x2AAA,
0x4000,
0,
3500.0f,
4000.0f,
};
#if VERSION != VERSION_GCN_PAL
bool daHoZelda_matAnm_c::mEyeMoveFlg;
u8 daHoZelda_matAnm_c::mEyeMoveFlg;
u8 daHoZelda_matAnm_c::mMorfFrame;
#endif
@@ -66,82 +73,80 @@ void daHoZelda_matAnm_c::calc(J3DMaterial* i_material) const {
for (u32 i = 0; i < 8; i++) {
if (getTexMtxAnm(i).getAnmFlag()) {
J3DTexMtxInfo& texmtx = i_material->getTexGenBlock()->getTexMtx(i)->getTexMtxInfo();
J3DTextureSRTInfo& texmtx = i_material->getTexGenBlock()->getTexMtx(i)->getTexMtxInfo().mSRT;
if (mMorfFrame != 0) {
f32 var_f31 = 1.0f / (mMorfFrame + 1);
texmtx.mSRT.mTranslationX = field_0xf4 * (1.0f - var_f31) + texmtx.mSRT.mTranslationX * var_f31;
texmtx.mSRT.mTranslationY = field_0xf8 * (1.0f - var_f31) + texmtx.mSRT.mTranslationY * var_f31;
texmtx.mTranslationX = field_0xf4 * (1.0f - var_f31) + texmtx.mTranslationX * var_f31;
texmtx.mTranslationY = field_0xf8 * (1.0f - var_f31) + texmtx.mTranslationY * var_f31;
} else if (mEyeMoveFlg) {
texmtx.mSRT.mTranslationX = mNowOffsetX;
texmtx.mSRT.mTranslationY = mNowOffsetY;
texmtx.mTranslationX = mNowOffsetX;
texmtx.mTranslationY = mNowOffsetY;
}
const_cast<f32&>(field_0xf4) = texmtx.mSRT.mTranslationX;
const_cast<f32&>(field_0xf8) = texmtx.mSRT.mTranslationY;
const_cast<f32&>(field_0xf4) = texmtx.mTranslationX;
const_cast<f32&>(field_0xf8) = texmtx.mTranslationY;
}
}
}
/* 80846000-8084642C 0001E0 042C+00 1/1 0/0 0/0 .text createHeap__11daHoZelda_cFv */
int daHoZelda_c::createHeap() {
BOOL daHoZelda_c::createHeap() {
mpZeldaModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes(l_arcName, 0x23), 0, 0x11020284);
if (mpZeldaModel == NULL) {
return 0;
return FALSE;
}
for (int i = 0; i < 2; i++) {
mpMatAnm[i] = new daHoZelda_matAnm_c();
if (mpMatAnm[i] == NULL) {
return 0;
return FALSE;
}
}
J3DTransformInfo* transinfo_buf = new J3DTransformInfo[47];
if (transinfo_buf == NULL) {
return 0;
return FALSE;
}
Quaternion* quat_buf = new Quaternion[47];
if (quat_buf == NULL) {
return 0;
return FALSE;
}
field_0x5c4 = new mDoExt_MtxCalcOldFrame(transinfo_buf, quat_buf);
if (field_0x5c4 == NULL) {
return 0;
return FALSE;
}
field_0x5a8 = new mDoExt_MtxCalcAnmBlendTblOld(field_0x5c4, 3, mAnmRatioPack);
if (field_0x5a8 == NULL) {
return 0;
return FALSE;
}
void* res = dComIfG_getObjectRes(l_arcName, 0x2F);
if (!mEyeBtp.init(mpZeldaModel->getModelData(), (J3DAnmTexPattern*)res, 1, 2, 1.0f, 0, -1)) {
return 0;
if (!mEyeBtp.init(mpZeldaModel->getModelData(), (J3DAnmTexPattern*)dComIfG_getObjectRes(l_arcName, 0x2F), 1, 2, 1.0f, 0, -1)) {
return FALSE;
}
res = dComIfG_getObjectRes(l_arcName, 0x26);
if (!mEyeBtk.init(mpZeldaModel->getModelData(), (J3DAnmTextureSRTKey*)res, 1, 0, 1.0f, 0, -1)) {
return 0;
if (!mEyeBtk.init(mpZeldaModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, 0x26), 1, 0, 1.0f, 0, -1)) {
return FALSE;
}
mpBowModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes(l_arcName, 0x20), 0x80000, 0x11000084);
if (mpBowModel == NULL) {
return 0;
return FALSE;
}
if (!mBowBck.init((J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 0xC), 1, 0, 1.0f, 0, -1, false)) {
return 0;
return FALSE;
}
mpHIO = new daHoZelda_hio_c();
if (mpHIO == NULL) {
return 0;
return FALSE;
}
return 1;
return TRUE;
}
/* 808466F8-80846718 0008D8 0020+00 1/1 0/0 0/0 .text daHoZelda_createHeap__FP10fopAc_ac_c */
@@ -197,7 +202,8 @@ void daHoZelda_c::modelCallBack(u16 i_jntNo) {
}
/* 8084696C-808469B0 000B4C 0044+00 1/1 0/0 0/0 .text daHoZelda_modelCallBack__FP8J3DJointi */
static int daHoZelda_modelCallBack(J3DJoint* i_joint, int param_1) {
static int daHoZelda_modelCallBack(J3DJoint* i_joint2, int param_1) {
J3DJoint* i_joint = i_joint2;
u16 jnt_no = i_joint->getJntNo();
daHoZelda_c* hozelda = (daHoZelda_c*)j3dSys.getModel()->getUserArea();
@@ -239,6 +245,10 @@ int daHoZelda_c::create() {
mpMatAnm[0]->init();
mpMatAnm[1]->init();
#if DEBUG
mpHIO->mID = mDoHIO_createChild("馬上ゼルダ", mpHIO);
#endif
setSingleAnime(0x1C, 1.0f, 0.0f, -1, -1.0f);
resetUpperAnime();
mBowAnmID = 0xC;
@@ -260,6 +270,11 @@ static int daHoZelda_Create(fopAc_ac_c* i_this) {
/* 80846DB0-80846F24 000F90 0174+00 1/1 0/0 0/0 .text __dt__11daHoZelda_cFv */
daHoZelda_c::~daHoZelda_c() {
#if DEBUG
if (mpHIO) {
mDoHIO_deleteChild(mpHIO->mID);
}
#endif
dComIfG_resDelete(&mPhase, l_arcName);
daHorse_c* horse = dComIfGp_getHorseActor();
@@ -424,8 +439,8 @@ void daHoZelda_c::animePlay() {
/* 80847574-808475F0 001754 007C+00 2/2 0/0 0/0 .text setEyeBtp__11daHoZelda_cFUs */
void daHoZelda_c::setEyeBtp(u16 i_resNo) {
void* btp = dComIfG_getObjectRes(l_arcName, i_resNo);
mEyeBtp.init(mpZeldaModel->getModelData(), (J3DAnmTexPattern*)btp, 1, -1, 1.0f, 0, -1);
mEyeBtp.init(mpZeldaModel->getModelData(),
(J3DAnmTexPattern*)dComIfG_getObjectRes(l_arcName, i_resNo), 1, -1, 1.0f, 0, -1);
}
/* 808475F0-80847670 0017D0 0080+00 2/2 0/0 0/0 .text setEyeBtk__11daHoZelda_cFUsUc */
@@ -491,7 +506,7 @@ void daHoZelda_c::setAnm() {
}
if (anm_idx[0] == 0xE && field_0x6da == 0 && !mDamageInit && field_0x6dd == 0 && player->checkHorseRide() && ganondorf != NULL && ganondorf->checkPiyo() != 1 &&
((gnd_seen_angleY < daHoZelda_hio_c0::m.bow_start_angle && gnd_lockon) || (mBowMode != 0 && gnd_seen_angleY < daHoZelda_hio_c0::m.bow_end_angle && (gnd_lockon || mArrowAcKeep.getActor() != NULL))))
((gnd_seen_angleY < HIO.bow_start_angle && gnd_lockon) || (mBowMode != 0 && gnd_seen_angleY < HIO.bow_end_angle && (gnd_lockon || mArrowAcKeep.getActor() != NULL))))
{
mBowMode = 1;
} else {
@@ -853,8 +868,8 @@ void daHoZelda_c::setNeckAngle() {
angle_x_target = var_r27;
angle_y_target = var_r26;
var_r27 += (spA - spE);
var_r26 += (sp8 - spC);
var_r27 += (s16)(spA - spE);
var_r26 += (s16)(sp8 - spC);
}
daPy_addCalcShort(&mNeckAngle.x, angle_x_target, 3, 0x1000, 0x100);
@@ -883,7 +898,16 @@ void daHoZelda_c::searchBodyAngle() {
if (sp8.abs() >= 1.0f) {
angle_x_target = cLib_minMaxLimit<s16>(sp8.atan2sY_XZ(), -0x800, 0x2000);
angle_y_target = cLib_minMaxLimit<s16>((s16)(sp8.atan2sX_Z() - shape_angle.y), -daHoZelda_hio_c0::m.bow_search_y_angle, daHoZelda_hio_c0::m.bow_search_y_angle);
#if PLATFORM_SHIELD || PLATFORM_WII
angle_y_target =
cLib_minMaxLimit<s16>(sp8.atan2sX_Z() - shape_angle.y, -HIO.bow_search_y_angle,
(s16)HIO.bow_search_y_angle);
#else
// needs to load HIO.bow_search_y_angle before calling sp8.atan2sX_Z()
int ang1 = (s16)-HIO.bow_search_y_angle;
int ang2 = (s16)HIO.bow_search_y_angle;
angle_y_target = cLib_minMaxLimit<s16>(sp8.atan2sX_Z() - shape_angle.y, ang1, ang2);
#endif
}
}