More debug fixes for 99% TUs (#3122)

* d_a_e_hp debug code 100%

* d_a_npc_chin debug improvements

* d_a_npc_du debug code 100%

* d_a_npc_cdn3 debug code 100%

* d_a_e_rdy GCN symbol fixes

* d_a_kago debug code 100%

* d_a_e_oc debug code 100%

* d_a_e_yr debug code almost matching

* d_a_e_bg debug code 100%

* d_a_ykgr debug code 100%

* d_a_tag_hjump debug data fixes

* d_a_tag_attack_item debug data fixes

* d_a_e_df debug code 100%

* d_a_e_sh debug code 100%

* d_a_L7op_demo_dr debug code 100%

* d_a_L7low_dr debug code 100%

* d_a_e_sm2 debug code 100%

* d_a_movie_player debug code 100%

* d_a_e_st debug code 100%

* d_a_npc_aru debug code 100%

* d_a_e_yg debug code 100%

* d_a_door_spiral debug code 100%

* d_a_bg debug code 100% (still has .data issues)

* d_a_e_dn debug code 100%

* d_a_tag_attention debug code 100%

* d_a_e_bd debug code 100%

* d_a_tag_camera debug .rodata fix

* d_a_obj_movebox debug code 100% (array dtors are mismapped)

* d_a_mg_rod debug improvements

* d_a_e_rd debug symbol fixes
This commit is contained in:
Max Roncace
2026-03-11 06:07:19 -04:00
committed by GitHub
parent 0b0fdd1f60
commit 8a333fc7c9
75 changed files with 1673 additions and 1225 deletions
+104 -88
View File
@@ -16,8 +16,8 @@ public:
e_yrHIO_c() {
mInvulnerable = 0;
mStationary = 0;
field_0x8 = 20.0f;
field_0xc = 2500.0f;
field_0x0c = 20.0f;
mTurningRadius = 2500.0f;
mModelScale = 1.0f;
mAttackAMinTime = 2000;
mAttackAMaxTime = 2500;
@@ -51,68 +51,68 @@ public:
virtual ~e_yrHIO_c() {}
#if DEBUG
void genMessage(JORMContext*);
virtual void genMessage(JORMContext*);
#endif
/* 0x04 */ u8 mInvulnerable;
/* 0x05 */ u8 mStationary;
/* 0x06 */ u8 mSuddenAttack;
/* 0x08 */ f32 field_0x8;
/* 0x0C */ f32 field_0xc;
/* 0x06 */ u8 mInvulnerable;
/* 0x07 */ u8 mStationary;
/* 0x08 */ u8 mSuddenAttack;
/* 0x0C */ f32 field_0x0c;
/* 0x10 */ f32 mTurningRadius;
/* 0x14 */ f32 mModelScale;
/* 0x18 */ s16 mAttackAMinTime;
/* 0x1A */ s16 mAttackAMaxTime;
/* 0x1C */ s16 mAttackBMinTime;
/* 0x1E */ s16 mAttackBMaxTime;
/* 0x20 */ f32 mAttackMoveSpeed;
/* 0x24 */ f32 mAttackFrequency;
/* 0x28 */ f32 mFlyPlaybackSpeed;
/* 0x2C */ f32 mHoveringPlaybackSpeed;
/* 0x30 */ f32 mAttackPlaybackSpeed;
/* 0x34 */ s16 mChanceTime;
/* 0x38 */ f32 field_0x38;
/* 0x3C */ f32 mChancePlaybackSpeed;
/* 0x40 */ s16 field_0x40;
/* 0x44 */ f32 field_0x44;
/* 0x48 */ f32 field_0x48;
/* 0x4C */ f32 field_0x4c;
/* 0x50 */ s16 mBrakeStartDist;
/* 0x54 */ f32 field_0x54;
/* 0x58 */ f32 mLargeDamage;
/* 0x5C */ f32 mSmallDamage;
/* 0x60 */ s16 mHitOccurrenceFrame;
/* 0x64 */ f32 mDetectDistSky;
/* 0x68 */ f32 mDetectDistGround;
/* 0x6C */ s16 mDetectAngleSky;
/* 0x6E */ s16 mDetectAngleGround;
/* 0x70 */ f32 mDetectHeightSky;
/* 0x74 */ f32 mDetectHeightGround;
/* 0x14 */ f32 field_0x14;
/* 0x18 */ f32 mModelScale;
/* 0x1C */ s16 mAttackAMinTime;
/* 0x1E */ s16 mAttackAMaxTime;
/* 0x20 */ s16 mAttackBMinTime;
/* 0x22 */ s16 mAttackBMaxTime;
/* 0x24 */ f32 mAttackMoveSpeed;
/* 0x28 */ f32 mAttackFrequency;
/* 0x2C */ f32 mFlyPlaybackSpeed;
/* 0x30 */ f32 mHoveringPlaybackSpeed;
/* 0x34 */ f32 mAttackPlaybackSpeed;
/* 0x38 */ s16 mChanceTime;
/* 0x3C */ f32 field_0x38;
/* 0x40 */ f32 mChancePlaybackSpeed;
/* 0x44 */ s16 field_0x40;
/* 0x48 */ f32 field_0x44;
/* 0x4C */ f32 field_0x48;
/* 0x50 */ f32 field_0x4c;
/* 0x54 */ s16 mBrakeStartDist;
/* 0x58 */ f32 field_0x54;
/* 0x5C */ f32 mLargeDamage;
/* 0x60 */ f32 mSmallDamage;
/* 0x64 */ s16 mHitOccurrenceFrame;
/* 0x68 */ f32 mDetectDistSky;
/* 0x6C */ f32 mDetectDistGround;
/* 0x70 */ s16 mDetectAngleSky;
/* 0x72 */ s16 mDetectAngleGround;
/* 0x74 */ f32 mDetectHeightSky;
/* 0x78 */ f32 mDetectHeightGround;
};
#if DEBUG
void e_yrHIO_c::genMessage(JORMContext* ctx) {
// "Kagarok"
ctx->genLabel("\u3000闇カーゴロック", 0x80000001);
ctx->genLabel(" 闇カーゴロック", 0x80000001);
ctx->genCheckBox("不死身", &mInvulnerable, 0x1);
ctx->genCheckBox("静止", &mStationary, 0x1);
ctx->genCheckBox("いきなり攻撃", &mSuddenAttack, 0x1);
ctx->genSlider("旋回半径", &mTurningRadius, 0.0, 10000.0f);
ctx->genSlider("モデルスケール", &mModelScale, 0.0, 10.0f);
ctx->genSlider("旋回半径", &mTurningRadius, 0.0f, 10000.0f);
ctx->genSlider("モデルスケール", &mModelScale, 0.0f, 10.0f);
ctx->genSlider("A攻時間(最短)", &mAttackAMinTime, 0, 15000);
ctx->genSlider("A攻時間(最長)", &mAttackAMaxTime, 0, 15000);
ctx->genSlider("B攻時間(最短)", &mAttackBMinTime, 0, 15000);
ctx->genSlider("B攻時間(最長)", &mAttackBMaxTime, 0, 15000);
ctx->genSlider("攻撃移動速度", &mAttackMoveSpeed, 0.0, 2.0f);
ctx->genSlider("攻撃頻度", &mAttackFrequency, 0.0, 10.0f);
ctx->genSlider("fly再生速度", &mFlyPlaybackSpeed, 0.0, 3.0f);
ctx->genSlider("hovering再生速度", &mHoveringPlaybackSpeed, 0.0, 3.0f);
ctx->genSlider("atack再生速度", &mAttackPlaybackSpeed, 0.0, 3.0f);
ctx->genSlider("chance再生速度", &mChancePlaybackSpeed, 0.0, 3.0f);
ctx->genSlider("攻撃移動速度", &mAttackMoveSpeed, 0.0f, 2.0f);
ctx->genSlider("攻撃頻度", &mAttackFrequency, 0.0f, 10.0f);
ctx->genSlider("fly再生速度", &mFlyPlaybackSpeed, 0.0f, 3.0f);
ctx->genSlider("hovering再生速度", &mHoveringPlaybackSpeed, 0.0f, 3.0f);
ctx->genSlider("atack再生速度", &mAttackPlaybackSpeed, 0.0f, 3.0f);
ctx->genSlider("chance再生速度", &mChancePlaybackSpeed, 0.0f, 3.0f);
ctx->genSlider("chance時間", &mChanceTime, 0, 200);
ctx->genSlider("brake開始距離", &mBrakeStartDist, 0, 3000);
ctx->genSlider("大ダメージ力", &mLargeDamage, 0.0, 150.0f);
ctx->genSlider("小ダメージ力", &mSmallDamage, 0.0, 150.0f);
ctx->genSlider("大ダメージ力", &mLargeDamage, 0.0f, 150.0f);
ctx->genSlider("小ダメージ力", &mSmallDamage, 0.0f, 150.0f);
ctx->genSlider("HIT発生フレーム", &mHitOccurrenceFrame, 0, 5);
ctx->genSlider("プ認距離(空)", &mDetectDistSky, 0.0f, 10000.0f);
ctx->genSlider("プ認高さ(空)", &mDetectHeightSky, 0.0f, 5000.0f);
@@ -299,7 +299,7 @@ static int e_yr_player_view_check(e_yr_class* i_this) {
if (vDistToPlayer < detectHeight) {
s16 r28 = actor->current.angle.y - i_this->field_0xe84 - i_this->mYawToPlayer;
if (r28 < 0) {
r28 = -r28;
r28 = r28 * -1;
}
if ((u16)r28 < detectAngle) {
return 1;
@@ -311,7 +311,7 @@ static int e_yr_player_view_check(e_yr_class* i_this) {
static void path_check(e_yr_class* i_this) {
static u8 check_index[255];
if (i_this->field_0x6ec != 0) {
if (i_this->ppd != 0) {
dPnt* point;
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->mEnemy;
@@ -322,8 +322,8 @@ static void path_check(e_yr_class* i_this) {
unkXyz1 = actor->current.pos;
unkXyz1.y += 100.0f;
point = i_this->field_0x6ec->m_points;
for (s32 i = 0; i < i_this->field_0x6ec->m_num; i++, point++) {
point = i_this->ppd->m_points;
for (s32 i = 0; i < i_this->ppd->m_num; i++, point++) {
unkXyz2.x = point->m_position.x;
unkXyz2.y = point->m_position.y + 100.0f;
unkXyz2.z = point->m_position.z;
@@ -343,8 +343,8 @@ static void path_check(e_yr_class* i_this) {
f32 unkFloat1 = 0.0f;
bool unkFlag1 = false;
for (s32 i = 0; i < 100; i++, unkFloat1 += 50.0f) {
point = i_this->field_0x6ec->m_points;
for (s32 j = 0; j < i_this->field_0x6ec->m_num; j++, point++) {
point = i_this->ppd->m_points;
for (s32 j = 0; j < i_this->ppd->m_num; j++, point++) {
if (check_index[j] != 0) {
xDist = actor->current.pos.x - point->m_position.x;
yDist = actor->current.pos.y - point->m_position.y;
@@ -352,8 +352,8 @@ static void path_check(e_yr_class* i_this) {
if (JMAFastSqrt(xDist * xDist + yDist * yDist + zDist * zDist) < unkFloat1) {
i_this->field_0x6ea = j - (s32)i_this->field_0x6eb;
if (i_this->field_0x6ea >= (s8)i_this->field_0x6ec->m_num) {
i_this->field_0x6ea = i_this->field_0x6ec->m_num;
if (i_this->field_0x6ea >= (s8)i_this->ppd->m_num) {
i_this->field_0x6ea = i_this->ppd->m_num;
} else {
if (i_this->field_0x6ea < 0) {
i_this->field_0x6ea = 0;
@@ -396,10 +396,11 @@ static void daE_Yr_shadowDraw(e_yr_class* i_this) {
cXyz unkXyz1;
unkXyz1.set(actor->current.pos.x, actor->current.pos.y + 150.0f + BREG_F(18),
actor->current.pos.z);
i_this->mShadowKey = dComIfGd_setShadow(i_this->mShadowKey, 1, model, &unkXyz1,
800.0f + BREG_F(19), 40.0f + BREG_F(17), actor->current.pos.y,
i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd, &actor->tevStr,
0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
i_this->mShadowKey =
dComIfGd_setShadow(i_this->mShadowKey, 1, model, &unkXyz1,
800.0f + BREG_F(19), 40.0f + BREG_F(17), actor->current.pos.y,
i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd, &i_this->mEnemy.tevStr,
0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
}
static int daE_Yr_Draw(e_yr_class* i_this) {
@@ -435,18 +436,18 @@ static void e_yr_pos_move(e_yr_class* i_this) {
f32 zDiff = i_this->field_0x680.z - actor->current.pos.z;
s16 yaw = cM_atan2s(xDiff, zDiff);
s16 pitch = -cM_atan2s(yDiff, JMAFastSqrt(xDiff * xDiff + zDiff * zDiff));
s16 angleY = actor->current.angle.y;
s16 curAngleY = actor->current.angle.y;
cLib_addCalcAngleS2(&actor->current.angle.y, yaw, 10 + TREG_S(3), i_this->field_0x69c * i_this->field_0x694);
angleY = (angleY - actor->current.angle.y) * 0x20;
s16 targetAngleY = (curAngleY - actor->current.angle.y) * 0x20;
s16 limit = 5500 + TREG_S(1);
if (angleY > limit) {
angleY = limit;
} else if (angleY < -limit) {
angleY = -limit;
if (targetAngleY > limit) {
targetAngleY = limit;
} else if (targetAngleY < -limit) {
targetAngleY = -limit;
}
cLib_addCalcAngleS2(&actor->current.angle.z, angleY, 10 + TREG_S(3),
cLib_addCalcAngleS2(&actor->current.angle.z, targetAngleY, 10 + TREG_S(3),
i_this->field_0x69c * i_this->field_0x694 * 0.5f);
cLib_addCalcAngleS2(&actor->current.angle.x, pitch, 10 + TREG_S(3),
@@ -512,8 +513,10 @@ static void e_yr_path_move(e_yr_class* i_this) {
s32 frame;
switch (i_this->field_0x67c) {
case 0:
frame = i_this->mpMorfSO->getFrame();
case 0: {
// this case uses a different stack address than others in debug -
// it seems plausible that the frame variable was inadvertently shadowed here
s32 frame = i_this->mpMorfSO->getFrame();
if (actor->current.pos.y > i_this->field_0x680.y &&
frame == 9 + TREG_S(0))
{
@@ -522,6 +525,7 @@ static void e_yr_path_move(e_yr_class* i_this) {
}
break;
}
case 1:
if (actor->current.pos.y <= (i_this->field_0x680).y) {
i_this->field_0x67c = 0;
@@ -531,6 +535,7 @@ static void e_yr_path_move(e_yr_class* i_this) {
break;
case 10:
default:
(void)0;
break;
}
@@ -542,18 +547,18 @@ static void e_yr_path_move(e_yr_class* i_this) {
switch (i_this->field_0x67d) {
case 0: {
i_this->field_0x6ea += i_this->field_0x6eb;
if (i_this->field_0x6ea >= (s8)i_this->field_0x6ec->m_num) {
if (dPath_ChkClose(i_this->field_0x6ec)) {
if (i_this->field_0x6ea >= (s8)i_this->ppd->m_num) {
if (dPath_ChkClose(i_this->ppd)) {
i_this->field_0x6ea = 0;
} else {
i_this->field_0x6eb = -1;
i_this->field_0x6ea = i_this->field_0x6ec->m_num - 2;
i_this->field_0x6ea = i_this->ppd->m_num - 2;
}
s32 nextId = i_this->field_0x6ec->m_nextID;
s32 nextId = i_this->ppd->m_nextID;
if (nextId != 0xffff) {
i_this->field_0x6ec = dPath_GetRoomPath(nextId, fopAcM_GetRoomNo(actor));
JUT_ASSERT(0x451, i_this->field_0x6ec != NULL);
i_this->ppd = dPath_GetRoomPath(nextId, fopAcM_GetRoomNo(actor));
JUT_ASSERT(0x451, i_this->ppd != NULL);
}
} else {
if (i_this->field_0x6ea < 0) {
@@ -565,7 +570,7 @@ static void e_yr_path_move(e_yr_class* i_this) {
case -1: {
i_this->field_0x67d = 1;
point = i_this->field_0x6ec->m_points;
point = i_this->ppd->m_points;
point = &point[i_this->field_0x6ea];
if (i_this->field_0x6f0 != 0) {
@@ -623,7 +628,7 @@ static void e_yr_path_move(e_yr_class* i_this) {
}
if (dist < 10.0f * TREG_F(10) + 300.0f) {
i_this->field_0x67d = 0;
point = i_this->field_0x6ec->m_points;
point = i_this->ppd->m_points;
point = &point[i_this->field_0x6ea];
if (point->mArg0 == 5) {
i_this->field_0x66c = 1;
@@ -682,11 +687,11 @@ static void e_yr_path_move(e_yr_class* i_this) {
unkChar1 = 1;
if (i_this->field_0x6a4[2] == 0) {
i_this->field_0x6ea++;
if (i_this->field_0x6ea >= i_this->field_0x6ec->m_num) {
if (i_this->field_0x6ea >= i_this->ppd->m_num) {
i_this->field_0x6ea = 0;
}
point = i_this->field_0x6ec->m_points;
point = i_this->ppd->m_points;
point = &point[i_this->field_0x6ea];
i_this->field_0x680.x = point->m_position.x;
i_this->field_0x680.y = point->m_position.y;
@@ -719,7 +724,7 @@ static void e_yr_path_move(e_yr_class* i_this) {
zDiff = i_this->field_0x680.z - actor->current.pos.z;
if (JMAFastSqrt(xDiff * xDiff + zDiff * zDiff) < 50.0f) {
i_this->field_0x67d = 22;
point = i_this->field_0x6ec->m_points;
point = i_this->ppd->m_points;
point = &point[i_this->field_0x6ea];
if (point->mArg0 == 3) {
i_this->field_0x6a4[2] = cM_rndF(50.0f) + 50.0f;
@@ -806,9 +811,9 @@ static void e_yr_auto_move(e_yr_class* i_this) {
case 0:
if (i_this->field_0x6a4[1] == 0) {
xDiff =
actor->home.pos.x + cM_rndFX(l_e_yrHIO.field_0xc) - actor->current.pos.x;
actor->home.pos.x + cM_rndFX(l_e_yrHIO.mTurningRadius) - actor->current.pos.x;
zDiff =
actor->home.pos.z + cM_rndFX(l_e_yrHIO.field_0xc) - actor->current.pos.z;
actor->home.pos.z + cM_rndFX(l_e_yrHIO.mTurningRadius) - actor->current.pos.z;
if (JMAFastSqrt(xDiff * xDiff + zDiff * zDiff) > 200.0f) {
i_this->field_0x6a4[1] = cM_rndF(150.0f) + 50.0f;
@@ -1101,6 +1106,9 @@ static void e_yr_atack_move(e_yr_class* i_this) {
cLib_addCalc2(&actor->current.pos.y, i_this->mAcch.GetGroundH() + 100.0f + TREG_F(17), 0.05f, 5.0f);
break;
default:
(void)0;
break;
}
}
@@ -1164,6 +1172,7 @@ static void e_yr_horse_move(e_yr_class* i_this) {
f32 horseSpeed = dComIfGp_getHorseActor()->speedF;
if (horseSpeed > 60.0f) {
int dummy; // force stack pointer into r31 for debug
horseSpeed = 60.0f;
} else {
if (horseSpeed < 30.0f) {
@@ -1302,6 +1311,9 @@ static void e_yr_horse_move(e_yr_class* i_this) {
i_this->field_0x6a4[3] = cM_rndF(100.0f) + 60.0f;
}
break;
default:
(void)0;
break;
}
@@ -1526,12 +1538,12 @@ static void e_yr_wait_move(e_yr_class* i_this) {
}
static void e_yr_su_wait_move(e_yr_class* i_this) {
s32 old_0x6e0;
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->mEnemy;
fopAc_ac_c* playerActor = dComIfGp_getPlayer(0);
daPy_py_c* player = (daPy_py_c*)playerActor;
s32 old_0x6e0;
cXyz unkXyz1;
cXyz unkXyz2;
@@ -1934,8 +1946,7 @@ static void ground_angle_set(e_yr_class* i_this) {
dBgS_GndChk gndChk;
f32 unkFloat1 = 75.0f;
model = i_this->mpMorfSO->getModel();
MTXCopy(model->getAnmMtx(0), *calc_mtx);
MTXCopy(i_this->mpMorfSO->getModel()->getAnmMtx(0), *calc_mtx);
unkXyz1.set(0.0f, 0.0f, 0.0f);
MtxPosition(&unkXyz1, &unkXyz3);
@@ -2009,9 +2020,12 @@ static void ground_angle_set(e_yr_class* i_this) {
cLib_addCalcAngleS2(&i_this->field_0x6f8.z, unkShort1, 1, 0x400);
}
static int daE_Yr_Execute(e_yr_class* i_this) {
// stripped function, inferred from its local static variable (which is not stripped)
static inline void wing_smoke_set(e_yr_class* i_this) {
static s32 wing_j[4] = {12, 13, 17, 18};
}
static int daE_Yr_Execute(e_yr_class* i_this) {
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->mEnemy;
fopAc_ac_c* playerActor = dComIfGp_getPlayer(0);
@@ -2456,6 +2470,8 @@ static int daE_Yr_Create(fopAc_ac_c* i_this) {
fopAcM_ct(i_this, e_yr_class);
if (loadResult == cPhs_COMPLEATE_e) {
int dummy; // force stack pointer into r31 for debug
// "It won't reset because it's already been defeated"
OS_REPORT("PARAM %x\n", fopAcM_GetParam(i_this));
@@ -2485,8 +2501,8 @@ static int daE_Yr_Create(fopAc_ac_c* i_this) {
i_this->home.pos = i_this->current.pos;
if (yr->field_0x666 != 0xff) {
yr->field_0x6ec = dPath_GetRoomPath(yr->field_0x666, fopAcM_GetRoomNo(i_this));
if (yr->field_0x6ec == 0) {
yr->ppd = dPath_GetRoomPath(yr->field_0x666, fopAcM_GetRoomNo(i_this));
if (yr->ppd == 0) {
return cPhs_ERROR_e;
}