diff options
| author | Max Roncace <me@caseif.net> | 2026-03-11 06:07:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-11 03:07:19 -0700 |
| commit | 8a333fc7c9e6d1228135a1296e7960f709a432ce (patch) | |
| tree | d64d2893964f0b1867403b6a3c595690822b2f5b /src/d/actor/d_a_e_yr.cpp | |
| parent | 0b0fdd1f60193d1e3e610326cc2cf2a7b558d366 (diff) | |
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
Diffstat (limited to 'src/d/actor/d_a_e_yr.cpp')
| -rw-r--r-- | src/d/actor/d_a_e_yr.cpp | 192 |
1 files changed, 104 insertions, 88 deletions
diff --git a/src/d/actor/d_a_e_yr.cpp b/src/d/actor/d_a_e_yr.cpp index d1851d303a..180c3762b8 100644 --- a/src/d/actor/d_a_e_yr.cpp +++ b/src/d/actor/d_a_e_yr.cpp @@ -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; @@ -1102,6 +1107,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) { @@ -1303,6 +1312,9 @@ static void e_yr_horse_move(e_yr_class* i_this) { } break; + default: + (void)0; + break; } if (unkFlag1) { @@ -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; } |
