From 49d9ed5757587f24c44efe2d2170a8527e12bb71 Mon Sep 17 00:00:00 2001 From: Roland Date: Sat, 27 Dec 2025 17:42:16 -0600 Subject: [PATCH] d_a_obj_ajav - matching (#911) * initial work on d_a_obj_ajav * matched Act_c::_create and Part_c::init_data * initialized cXyz arrays * 44% matching in .text * more work on d_a_obj_ajav * 73% matching in .text * 83% matching in .text * 99% of .text matching * 100% .data matching * fakematch _execute and link d_a_obj_ajav * demo matching * initial code cleanup * named all fields in Act_c and some Part_c fields * more documentation * make a fakematch slightly less fake * fix _execute for demo * named more fields in Part_c * named most fields and parameters * finishing touches * update d_a_obj_ajav .cpp and .h * Commit review suggestions --- configure.py | 2 +- include/d/actor/d_a_obj_ajav.h | 111 +++-- src/d/actor/d_a_obj_ajav.cpp | 798 ++++++++++++++++++++++++++++++--- 3 files changed, 825 insertions(+), 86 deletions(-) diff --git a/configure.py b/configure.py index 6aae30831..c2899bffb 100755 --- a/configure.py +++ b/configure.py @@ -1681,7 +1681,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_YLzou"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_Yboil"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_adnno"), - ActorRel(NonMatching, "d_a_obj_ajav"), + ActorRel(Matching, "d_a_obj_ajav"), ActorRel(NonMatching, "d_a_obj_apzl"), ActorRel(NonMatching, "d_a_obj_ashut"), ActorRel(NonMatching, "d_a_obj_auzu"), diff --git a/include/d/actor/d_a_obj_ajav.h b/include/d/actor/d_a_obj_ajav.h index 39ea68adc..d29b5bb30 100644 --- a/include/d/actor/d_a_obj_ajav.h +++ b/include/d/actor/d_a_obj_ajav.h @@ -1,60 +1,97 @@ #ifndef D_A_OBJ_AJAV_H #define D_A_OBJ_AJAV_H +#include "d/d_bg_w.h" +#include "d/d_cc_d.h" +#include "d/d_com_inf_game.h" #include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" namespace daObjAjav { - static void daObjAjav_make_splash(cXyz, float); - static void check_angle(short*, short); - static void daObjAjav_limit_angle(short*, short); - static void daObjAjav_get_rot_speed(cXyz, cXyz, short); + static void daObjAjav_make_splash(cXyz, f32); + static BOOL check_angle(s16*, s16); + static void daObjAjav_limit_angle(s16*, s16); + static csXyz daObjAjav_get_rot_speed(cXyz, cXyz, s16); class Act_c; class Part_c { public: - void checkExeProc(void (daObjAjav::Part_c::*)(daObjAjav::Act_c*)) {} - void draw(daObjAjav::Act_c*) {} - void execute(daObjAjav::Act_c*) {} - void setDrawProc(void (daObjAjav::Part_c::*)(daObjAjav::Act_c*)) {} - void setExeProc(void (daObjAjav::Part_c::*)(daObjAjav::Act_c*)) {} - void set_se_pos(cXyz) {} + typedef void(Part_c::*daObjAjavPartCallback)(daObjAjav::Act_c*); + public: + bool checkExeProc(daObjAjavPartCallback i_proc) { return mExeProc == i_proc; } + void draw(daObjAjav::Act_c* i_actor) { (this->*mDrawProc)(i_actor); } + void execute(daObjAjav::Act_c* i_actor) { (this->*mExeProc)(i_actor); } + void setDrawProc(daObjAjavPartCallback i_drawProc) { mDrawProc = i_drawProc; } + void setExeProc(daObjAjavPartCallback i_exeProc) { mExeProc = i_exeProc; } + inline void set_se_pos(cXyz i_pos); // weak but not inlined - void make_hamon(cXyz, float); + void make_hamon(cXyz, f32); void no_proc(daObjAjav::Act_c*); void init_data(cXyz, cXyz, dKy_tevstr_c*, cXyz*); - void set_mdl_area(const char*, int, unsigned long); + BOOL set_mdl_area(const char*, int, u32); void init_mtx(cXyz, csXyz, cXyz); void set_flaw_mtx(cXyz, csXyz); void set_fall_mtx(cXyz, csXyz); - void fall_init(cXyz, csXyz, short, unsigned short); + void fall_init(cXyz, csXyz, s16, u16); void fall_0(daObjAjav::Act_c*); void fall_1(daObjAjav::Act_c*); void flaw(daObjAjav::Act_c*); void draw_normal(daObjAjav::Act_c*); void draw_flashing(daObjAjav::Act_c*); + void draw_flashing_shy(daObjAjav::Act_c*); void draw_flashing_normal(daObjAjav::Act_c*); void draw_shy(daObjAjav::Act_c*); - void make_fall_rock(int); - }; - + void make_fall_rock(BOOL); + public: + /* 0x00 */ cXyz mCenterPos; + /* 0x0C */ cXyz mCenterToOriginTrans; + /* 0x18 */ cXyz mRockDisplacement; + /* 0x24 */ cXyz mRockDisplacementRate; + /* 0x30 */ cXyz mFlawPos; + /* 0x3C */ csXyz mAccumulatedRotation; + /* 0x42 */ csXyz mRotationSpeed; + /* 0x48 */ cXyz mSePos; + /* 0x54 */ u16 mTimerTrigger; + /* 0x56 */ u16 mTimer; // also used as a vertical velocity in fall_1 + /* 0x58 */ s16 mAngleLimit; + /* 0x5A */ bool mbHasSplashed; + /* 0x5B */ u8 mB8[0x6C - 0x5B]; + /* 0x6C */ cXyz mRockParticlePos; + /* 0x78 */ J3DModel* mpModel; + /* 0x7C */ dKy_tevstr_c* mpTevStr; + /* 0x80 */ daObjAjavPartCallback mExeProc; + /* 0x8C */ daObjAjavPartCallback mDrawProc; + }; // Size: 0x98 + + class Act_c : public fopAc_ac_c { public: - void check_ev() {} - void check_sw() {} - void on_sw() {} + enum { + STATUS_MAX = 4 + }; + public: + BOOL check_ev() { return dComIfGs_isEventBit(dSv_event_flag_c::ENDLESS_NIGHT); } + BOOL check_sw(int sw_no) { return dComIfGs_isSwitch(sw_no, fopAcM_GetHomeRoomNo(this)); } + void on_sw(int sw_no) { dComIfGs_onSwitch(sw_no, fopAcM_GetHomeRoomNo(this)); } - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + // Fake inline method to match _execute, this isn't in the debug maps but is needed + // in the call to set_hamon. + // The stone is 6 fragments arranged in a 3x2 (row x col) grid, so + // this gets the starting index of the n'th row. + int get_rock_row() { return M_status << 1; } + + static BOOL solidHeapCB(fopAc_ac_c*); + BOOL create_heap(); cPhs_State _create(); bool _delete(); void init_mtx(); void set_tex(); void set_co_offset(); - void check_all_wait(); - void check_end(); + BOOL check_all_wait(); + BOOL check_end(); void to_broken(); - void damage_part(); + BOOL damage_part(); void make_shot_rock(); void make_hamon2(cXyz, float); void set_hamon(float); @@ -62,8 +99,30 @@ namespace daObjAjav { bool _draw(); public: - /* Place member variables here */ - }; + static const char M_arcname[]; + public: + /* 0x290 */ u32 mSwNo; + /* 0x294 */ request_of_phase_process_class mPhs; + /* 0x29C */ dCcD_Stts mSphStts; + /* 0x2D8 */ dCcD_Sph mSph; + /* 0x404 */ cXyz mSphCoOffset; + /* 0x410 */ dCcD_Stts mCylStts; + /* 0x44C */ dCcD_Cyl mCyl; + /* 0x57C */ dCcD_Stts mHintCylStts[2]; + /* 0x5F4 */ dCcD_Cyl mHintCyls[2]; + /* 0x854 */ Mtx mMtx; + /* 0x884 */ u8 m884[0x890 - 0x884]; + /* 0x890 */ Part_c mRockParts[6]; + /* 0xC20 */ s16 mEventIdx; + /* 0xC22 */ u8 M_status; + /* 0xC23 */ bool mbResLoaded; + /* 0xC24 */ u8 mActionIdx; + /* 0xC25 */ u8 mC25[0xC26 - 0xC25]; + /* 0xC26 */ u16 mCutsceneEndDelay; + /* 0xC28 */ u8 mHintCylHits; + /* 0xC29 */ u8 mC29[0xC2C - 0xC29]; + /* 0xC2C */ dBgW* mpBgW; + }; // Size: 0xC30 }; #endif /* D_A_OBJ_AJAV_H */ diff --git a/src/d/actor/d_a_obj_ajav.cpp b/src/d/actor/d_a_obj_ajav.cpp index 3f6349015..7e5f61577 100644 --- a/src/d/actor/d_a_obj_ajav.cpp +++ b/src/d/actor/d_a_obj_ajav.cpp @@ -7,185 +7,865 @@ #include "d/actor/d_a_obj_ajav.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_ajav.h" + +static cXyz l_daObjAjav_co_offset[3] = { + cXyz(0.0f, 2550.0f, 200.0f), + cXyz(250.0f, 1270.0f, 200.0f), + cXyz(-290.0f, 740.0f, 200.0f) +}; + +static cXyz l_daObjAjav_offset[6] = { + cXyz(0.0f, 3000.0f, 0.0f), + cXyz(500.0f, 2400.0f, 0.0f), + cXyz(-300.0f, 1900.0f, 0.0f), + cXyz(500.0f, 1400.0f, 0.0f), + cXyz(-550.0f, 650.0f, 0.0f), + cXyz(250.0f, 400.0f, 0.0f) +}; + +static cXyz l_daObjAjav_cyl_offset[6] = { + cXyz(33.0f, 2541.0f, 220.0f), + cXyz(465.0f, 2083.0f, 220.0f), + cXyz(-137.7f, 1297.0f, 220.0f), + cXyz(530.0f, 511.0f, 220.0f), + cXyz(-124.5f, 118.0f, 220.0f), + cXyz(530.0f, 118.0f, 220.0f) +}; + +static cXyz l_daObjAjav_rock_pos_table[6] = { + cXyz(-170.0f, 3087.0f, 222.0f), + cXyz(563.0f, 2384.0f, 222.0f), + cXyz(-371.0f, 1880.0f, 222.0f), + cXyz(615.0f, 1391.0f, 222.0f), + cXyz(-494.0f, 748.0f, 222.0f), + cXyz(249.0f, 535.0f, 222.0f) +}; + +static dCcD_SrcSph l_daObjAjav_sph_data = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_BOMB, + /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_ShieldFrontRange_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + {{ + /* Center */ {0.0f, 0.0f, 0.0f}, + /* Radius */ 280.0f, + }}, +}; + +static dCcD_SrcCyl l_daObjAjav_cyl_data = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_BOMB, + /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_ShieldFrontRange_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_NoConHit_e, + /* SrcGObjCo SPrm */ 0 + }, + // cM3dGCylS + {{ + /* Center */ {0.0f, -40.0f, 0.0f}, + /* Radius */ 780.0f, + /* Height */ 3300.0f, + }}, +}; + +static dCcD_SrcCyl l_daObjAjav_hint_cyl_data = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_BOMB, + /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_ShieldFrontRange_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_NoConHit_e, + /* SrcGObjCo SPrm */ 0 + }, + // cM3dGCylS + {{ + /* Center */ {0.0f, -40.0f, 0.0f}, + /* Radius */ 780.0f, + /* Height */ 3300.0f, + }}, +}; + +static f32 l_daObjAjav_hint_cyl_h_talbe[] = {3300.0f, 2360.0f, 1050.0f}; + +static f32 l_daObjAjav_cyl_r[6] = { + 629.0f, 294.8f, 491.0f, + 216.0f, 563.0f, 85.3f +}; + +static f32 l_daObjAjav_cyl_h[6] = { + 773.0f, 458.5f, 1100.5f, + 1401.9f, 1133.0f, 451.9 +}; + +static const s32 l_daObjAjav_idx_table[6] = { + 4, 5 ,6 ,7, 8, 9 +}; + +static const char* const l_daObjAjav_ev_name[] = { + "ajav_destroy0", + "ajav_destroy1", + "ajav_uzu" +}; /* 000000EC-00000170 .text daObjAjav_make_splash__9daObjAjavF4cXyzf */ -void daObjAjav::daObjAjav_make_splash(cXyz, float) { - /* Nonmatching */ +void daObjAjav::daObjAjav_make_splash(cXyz i_splashPos, f32 i_scale) { + cXyz scale; + + i_scale /= 2000.0f; + i_scale = 4.0f + i_scale; + + scale.x = i_scale; + scale.y = 4.0f; + scale.z = scale.x; + dComIfGp_particle_set(dPa_name::ID_COMMON_003C, &i_splashPos, NULL, &scale); } /* 000001AC-00000268 .text make_hamon__Q29daObjAjav6Part_cF4cXyzf */ -void daObjAjav::Part_c::make_hamon(cXyz, float) { - /* Nonmatching */ +void daObjAjav::Part_c::make_hamon(cXyz i_hamonPos, f32 i_scale) { + cXyz scale; + + i_scale /= 2000.0f; + scale.x = 2.0f + i_scale; + scale.y = scale.x; + scale.z = scale.x; + + i_hamonPos.y += 10.0f; + + f32 water_height; + if (fopAcM_getWaterY(&i_hamonPos, &water_height) == TRUE) { + i_hamonPos.y = water_height; + } + + dComIfGp_particle_set(dPa_name::ID_COMMON_003F, &i_hamonPos, NULL, &scale); } /* 00000268-0000026C .text no_proc__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::no_proc(daObjAjav::Act_c*) { - /* Nonmatching */ + return; } /* 0000026C-000003A8 .text init_data__Q29daObjAjav6Part_cF4cXyz4cXyzP12dKy_tevstr_cP4cXyz */ -void daObjAjav::Part_c::init_data(cXyz, cXyz, dKy_tevstr_c*, cXyz*) { - /* Nonmatching */ +void daObjAjav::Part_c::init_data(cXyz i_actorPos, cXyz i_rockOffset, dKy_tevstr_c* i_tevStr, cXyz* i_rockPos) { + mCenterPos = i_rockOffset; + mCenterToOriginTrans = cXyz::Zero - mCenterPos; + mAccumulatedRotation = csXyz::Zero; + mRockDisplacement = cXyz::Zero; + mRockDisplacementRate = cXyz::Zero; + mpTevStr = i_tevStr; + mRockParticlePos = *i_rockPos + i_actorPos; + mExeProc = &Part_c::no_proc; + mDrawProc = &Part_c::draw_normal; } /* 000003A8-00000464 .text set_mdl_area__Q29daObjAjav6Part_cFPCciUl */ -void daObjAjav::Part_c::set_mdl_area(const char*, int, unsigned long) { - /* Nonmatching */ +BOOL daObjAjav::Part_c::set_mdl_area(const char* i_arcName, int i_index, u32 i_differedDlistFlag) { + J3DModelData* mdl_data; + BOOL res = FALSE; + mdl_data = (J3DModelData*) dComIfG_getObjectRes(i_arcName, i_index); + JUT_ASSERT(600, mdl_data != NULL); + + if (mdl_data != NULL) { + mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, i_differedDlistFlag); + res = TRUE; + } + + return res; } /* 00000464-0000050C .text init_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz4cXyz */ -void daObjAjav::Part_c::init_mtx(cXyz, csXyz, cXyz) { - /* Nonmatching */ +void daObjAjav::Part_c::init_mtx(cXyz i_pos, csXyz i_angle, cXyz i_scale) { + mpModel->setBaseScale(i_scale); + mDoMtx_stack_c::transS(i_pos); + mDoMtx_stack_c::ZXYrotM(i_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->calc(); } /* 0000050C-000005A8 .text set_flaw_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz */ -void daObjAjav::Part_c::set_flaw_mtx(cXyz, csXyz) { - /* Nonmatching */ +void daObjAjav::Part_c::set_flaw_mtx(cXyz i_pos, csXyz i_angle) { + mDoMtx_stack_c::transS(i_pos); + mDoMtx_stack_c::ZXYrotM(i_angle); + mDoMtx_stack_c::transM(mRockDisplacement); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->calc(); } /* 000005A8-0000067C .text set_fall_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz */ -void daObjAjav::Part_c::set_fall_mtx(cXyz, csXyz) { - /* Nonmatching */ +void daObjAjav::Part_c::set_fall_mtx(cXyz i_pos, csXyz i_angle) { + mDoMtx_stack_c::transS(i_pos); + mDoMtx_stack_c::ZXYrotM(i_angle); + mDoMtx_stack_c::transM(mRockDisplacement); + mDoMtx_stack_c::transM(mCenterPos); + mDoMtx_stack_c::ZXYrotM(mAccumulatedRotation); + mDoMtx_stack_c::transM(mCenterToOriginTrans); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->calc(); } /* 0000067C-000006E4 .text fall_init__Q29daObjAjav6Part_cF4cXyz5csXyzsUs */ -void daObjAjav::Part_c::fall_init(cXyz, csXyz, short, unsigned short) { - /* Nonmatching */ +void daObjAjav::Part_c::fall_init(cXyz i_initDispRate, csXyz i_initRotSpeed, s16 i_angleLimit, u16 i_timerTrigger) { + mRockDisplacementRate = i_initDispRate; + mRotationSpeed = i_initRotSpeed; + + mAngleLimit = i_angleLimit; + mTimerTrigger = i_timerTrigger; + mTimer = 0; + + mbHasSplashed = 0; + setExeProc(&Part_c::fall_0); } /* 000006E4-0000076C .text check_angle__9daObjAjavFPss */ -void daObjAjav::check_angle(short*, short) { - /* Nonmatching */ +BOOL daObjAjav::check_angle(s16* i_anglePtr, s16 i_angleLimit) { + BOOL rt = FALSE; + if (abs(*i_anglePtr) >= i_angleLimit) { + s16 temp = abs(*i_anglePtr) - i_angleLimit; + if (*i_anglePtr > 0) { + *i_anglePtr = i_angleLimit - temp; + } else { + *i_anglePtr = -(i_angleLimit - temp); + } + rt = TRUE; + } + return rt; } /* 0000076C-0000095C .text fall_0__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ -void daObjAjav::Part_c::fall_0(daObjAjav::Act_c*) { - /* Nonmatching */ +void daObjAjav::Part_c::fall_0(daObjAjav::Act_c* i_actor) { + cXyz temp(0.0f, -10.0f, 0.0f); + + mAccumulatedRotation += mRotationSpeed; + + if (check_angle(&mAccumulatedRotation.x, mAngleLimit)) { + mRotationSpeed.x *= -1; + } + + if (check_angle(&mAccumulatedRotation.y, mAngleLimit)) { + mRotationSpeed.y *= -1; + } + + mRockDisplacement += mRockDisplacementRate; + + mRockDisplacementRate.z *= 0.8f + (0.2f * cM_rnd()); + mTimer++; + if (mTimer == mTimerTrigger) { + temp = mRockDisplacementRate * 0.4f; + temp.y = 5.0f; + mRockDisplacementRate = temp; + + setExeProc(&Part_c::fall_1); + + mTimer = 0; + + mRotationSpeed = csXyz(mRotationSpeed * 0.3f); + mRotationSpeed.z = static_cast(cM_rnd() * -2.0f) * s16(cM_rnd() * 511.0f); + } + set_fall_mtx(i_actor->current.pos, i_actor->shape_angle); } /* 0000095C-00000B8C .text fall_1__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ -void daObjAjav::Part_c::fall_1(daObjAjav::Act_c*) { - /* Nonmatching */ +void daObjAjav::Part_c::fall_1(daObjAjav::Act_c* i_actor) { + mRockDisplacement += mRockDisplacementRate; + mRockDisplacement.y -= mTimer * 2.0f; + mAccumulatedRotation += mRotationSpeed; + + mTimer++; + + if (!mbHasSplashed) { + if (mRockDisplacement.y <= (mCenterToOriginTrans.y - 100.0f)) { + cXyz splash_pos = (i_actor->current.pos + mRockDisplacement) + mCenterPos; + splash_pos.y = 0.0f; + daObjAjav_make_splash(splash_pos, mCenterPos.y); + mbHasSplashed = true; + make_hamon(splash_pos, mCenterPos.y); + mSePos = splash_pos; + mDoAud_seStart(JA_SE_OBJ_JB_STONE_FALL, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_actor))); + } + } + + if (mRockDisplacement.y <= (mCenterToOriginTrans.y - 1000.0f)) { + setExeProc(&Part_c::no_proc); + setDrawProc(&Part_c::no_proc); + } + set_fall_mtx(i_actor->current.pos, i_actor->shape_angle); } /* 00000B8C-00000C28 .text flaw__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ -void daObjAjav::Part_c::flaw(daObjAjav::Act_c*) { - /* Nonmatching */ +void daObjAjav::Part_c::flaw(daObjAjav::Act_c* i_actor) { + mRockDisplacement += mFlawPos; + set_flaw_mtx(i_actor->current.pos, i_actor->shape_angle); + mExeProc = &Part_c::no_proc; } /* 00000C28-00000C6C .text draw_normal__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_normal(daObjAjav::Act_c*) { - /* Nonmatching */ + g_env_light.setLightTevColorType(mpModel, mpTevStr); + mDoExt_modelUpdateDL(mpModel); } /* 00000C6C-00000EA8 .text draw_flashing__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_flashing(daObjAjav::Act_c*) { - /* Nonmatching */ + u8 r, g, b; + if (mpTevStr) { + g_env_light.setLightTevColorType(mpModel, mpTevStr); + J3DMaterial* mesh = mpModel->getModelData()->getJointNodePointer(0)->getMesh(); + if (mesh) { + s16 theta = (s16)(((f32)mTimer / mTimerTrigger) * 20479.0f) + 0x3000; + f32 abs_sin_theta = std::abs(JMASSin(theta)); + + r = mesh->getTevKColor(1)->mColor.r; + g = mesh->getTevKColor(1)->mColor.g; + b = mesh->getTevKColor(1)->mColor.b; + + mesh->getTevKColor(1)->mColor.r = abs_sin_theta * 85.0f; + mesh->getTevKColor(1)->mColor.g = abs_sin_theta * 11.0f; + mesh->getTevKColor(1)->mColor.b = abs_sin_theta * 9.0f; + } + mDoExt_modelUpdateDL(mpModel); + if (mesh) { + mesh->getTevKColor(1)->mColor.r = r; + mesh->getTevKColor(1)->mColor.g = g; + mesh->getTevKColor(1)->mColor.b = b; + } + } +} + +// Unused member function +void daObjAjav::Part_c::draw_flashing_shy(daObjAjav::Act_c*) { + (void)&daObjAjav::Part_c::draw_shy; } /* 00000EA8-00000F10 .text draw_flashing_normal__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ -void daObjAjav::Part_c::draw_flashing_normal(daObjAjav::Act_c*) { - /* Nonmatching */ +void daObjAjav::Part_c::draw_flashing_normal(daObjAjav::Act_c* i_actor) { + draw_flashing(i_actor); + mTimer++; + if (mTimer == mTimerTrigger) { + setDrawProc(&Part_c::draw_normal); + } } /* 00000F10-00001090 .text draw_shy__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_shy(daObjAjav::Act_c*) { - /* Nonmatching */ + u8 r, g, b; + if (mpTevStr) { + g_env_light.setLightTevColorType(mpModel, mpTevStr); + J3DMaterial* mesh = mpModel->getModelData()->getJointNodePointer(0)->getMesh(); + if (mesh) { + r = mesh->getTevKColor(1)->mColor.r; + g = mesh->getTevKColor(1)->mColor.g; + b = mesh->getTevKColor(1)->mColor.b; + + mesh->getTevKColor(1)->mColor.r = 0x55; + mesh->getTevKColor(1)->mColor.g = 0x0B; + mesh->getTevKColor(1)->mColor.b = 0x09; + } + mDoExt_modelUpdateDL(mpModel); + if (mesh) { + mesh->getTevKColor(1)->mColor.r = r; + mesh->getTevKColor(1)->mColor.g = g; + mesh->getTevKColor(1)->mColor.b = b; + } + } } /* 00001090-00001168 .text make_fall_rock__Q29daObjAjav6Part_cFi */ -void daObjAjav::Part_c::make_fall_rock(int) { - /* Nonmatching */ +void daObjAjav::Part_c::make_fall_rock(BOOL i_increasedRate) { + JPABaseEmitter* particle_emitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8427, &mRockParticlePos); + if (particle_emitter && mpTevStr) { + if (i_increasedRate != FALSE) { + particle_emitter->setRate(20.0f); + } + g_env_light.settingTevStruct(TEV_TYPE_BG0, &mRockParticlePos, mpTevStr); + particle_emitter->setGlobalPrmColor(mpTevStr->mColorK0.r, mpTevStr->mColorK0.g, mpTevStr->mColorK0.b); + } } +const char daObjAjav::Act_c::M_arcname[] = "Ajav"; + /* 00001168-00001188 .text solidHeapCB__Q29daObjAjav5Act_cFP10fopAc_ac_c */ -void daObjAjav::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjAjav::Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((daObjAjav::Act_c*)i_this)->create_heap(); } /* 00001188-00001288 .text create_heap__Q29daObjAjav5Act_cFv */ -void daObjAjav::Act_c::create_heap() { - /* Nonmatching */ +BOOL daObjAjav::Act_c::create_heap() { + int i; + BOOL res = mRockParts[0].set_mdl_area(M_arcname, l_daObjAjav_idx_table[0], 0x11000002); + + if (res != FALSE) { + for (i = 1; i < ARRAY_SSIZE(mRockParts); i++) { + res = mRockParts[i].set_mdl_area(M_arcname, l_daObjAjav_idx_table[i], 0x15021202); + if (res == FALSE) break; + } + } + + if (res != FALSE) { + cBgD_t* cbgd_res = (cBgD_t*)dComIfG_getObjectRes(M_arcname, AJAV_DZB_AJAV); + mpBgW = dBgW_NewSet(cbgd_res, cBgW::MOVE_BG_e, &mMtx); + if (mpBgW == NULL) { + res = FALSE; + } + } + + return res; } /* 00001288-0000166C .text _create__Q29daObjAjav5Act_cFv */ cPhs_State daObjAjav::Act_c::_create() { - /* Nonmatching */ + cPhs_State rt = cPhs_ERROR_e; + + fopAcM_SetupActor(this, daObjAjav::Act_c); + + mSwNo = fopAcM_GetParam(this) & 0xFF; + mbResLoaded = false; + if (check_ev() && !check_sw(mSwNo)) { + rt = dComIfG_resLoad(&mPhs, M_arcname); + if (rt == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, Act_c::solidHeapCB, 0)) { + int i; + for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mRockParts[i].init_data(current.pos, l_daObjAjav_offset[i], &tevStr, &l_daObjAjav_rock_pos_table[i]); + } + + init_mtx(); + MTXCopy(mRockParts[5].mpModel->getBaseTRMtx(), mMtx); + set_tex(); + + mSphStts.Init(0, 0xFF, this); + mSph.SetStts(&mSphStts); + mSph.Set(l_daObjAjav_sph_data); + + mCylStts.Init(0, 0xFF, this); + mCyl.SetStts(&mCylStts); + mCyl.Set(l_daObjAjav_cyl_data); + mCyl.SetC(current.pos); + + for (i = 0; i < ARRAY_SSIZE(mHintCylStts); i++) { + mHintCylStts[i].Init(0, 0xFF, this); + mHintCyls[i].SetStts(&mHintCylStts[i]); + mHintCyls[i].Set(l_daObjAjav_hint_cyl_data); + } + + set_co_offset(); + dComIfG_Bgsp()->Regist(mpBgW, this); + + mbResLoaded = true; + mActionIdx = 0; + mHintCylHits = 0; + } else { + rt = cPhs_ERROR_e; + } + } + } + + return rt; } /* 00001B3C-00001C08 .text _delete__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_delete() { - /* Nonmatching */ + if (DEMO_SELECT(true, heap != NULL) && mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); +#if VERSION > VERSION_DEMO + mpBgW = NULL; +#endif + } + } + + if (DEMO_SELECT(mbResLoaded == 1, true)) { + dComIfG_resDelete(&mPhs, M_arcname); + } + + for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mDoAud_seDeleteObject(&mRockParts[i].mSePos); + } + return TRUE; } /* 00001C08-00001CA8 .text init_mtx__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::init_mtx() { - /* Nonmatching */ + for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mRockParts[i].init_mtx(current.pos, shape_angle, scale); + } } /* 00001CA8-00001CE4 .text set_tex__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::set_tex() { - /* Nonmatching */ + J3DModelData* model_data = mRockParts[0].mpModel->getModelData(); + J3DTexture* model_texture = model_data->getTexture(); + JUTNameTab* name_table = model_data->getTextureName(); + + for (int i = 1; i < ARRAY_SSIZE(mRockParts); i++) { + J3DModelData* model_data_i = mRockParts[i].mpModel->getModelData(); + model_data_i->setTexture(model_texture); + model_data_i->setTextureName(name_table); + } } /* 00001CE4-00001E3C .text set_co_offset__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::set_co_offset() { - /* Nonmatching */ + s32 i, j; + JUT_ASSERT(DEMO_SELECT(1173, 1172), (M_status >= 0) && (M_status < STATUS_MAX - 1)); + mSphCoOffset = l_daObjAjav_co_offset[M_status]; + mSph.SetC(current.pos + mSphCoOffset); + mCyl.SetH(l_daObjAjav_hint_cyl_h_talbe[M_status]); + + for (i = get_rock_row(), j = 0; j < ARRAY_SSIZE(mHintCyls); i++, j++) { + mHintCyls[j].SetC(current.pos + l_daObjAjav_cyl_offset[i]); + mHintCyls[j].SetR(l_daObjAjav_cyl_r[i]); + mHintCyls[j].SetH(l_daObjAjav_cyl_h[i]); + } } /* 00001E3C-00001EA0 .text daObjAjav_limit_angle__9daObjAjavFPss */ -void daObjAjav::daObjAjav_limit_angle(short*, short) { - /* Nonmatching */ +void daObjAjav::daObjAjav_limit_angle(s16* i_anglePtr, s16 i_angleLimit) { + if (abs(*i_anglePtr) > i_angleLimit) { + if (*i_anglePtr > 0) { + *i_anglePtr = i_angleLimit; + } else { + *i_anglePtr = -i_angleLimit; + } + } } /* 00001EA0-00001F54 .text daObjAjav_get_rot_speed__9daObjAjavF4cXyz4cXyzs */ -void daObjAjav::daObjAjav_get_rot_speed(cXyz, cXyz, short) { - /* Nonmatching */ +csXyz daObjAjav::daObjAjav_get_rot_speed(cXyz i_param1, cXyz i_param2, s16 i_angleLimit) { + cXyz diff = i_param1 - i_param2; + + csXyz o_rot_speed = csXyz::Zero; + o_rot_speed.x = diff.y; + o_rot_speed.y = diff.x; + + daObjAjav_limit_angle(&o_rot_speed.x, i_angleLimit); + daObjAjav_limit_angle(&o_rot_speed.y, i_angleLimit); + + return o_rot_speed; } /* 00001F54-00001FE4 .text check_all_wait__Q29daObjAjav5Act_cFv */ -void daObjAjav::Act_c::check_all_wait() { - /* Nonmatching */ +BOOL daObjAjav::Act_c::check_all_wait() { + int i; + BOOL res = TRUE; + for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + if (!mRockParts[i].checkExeProc(&Part_c::no_proc)) { + res = FALSE; + break; + } + } + return res; } /* 00001FE4-0000201C .text check_end__Q29daObjAjav5Act_cFv */ -void daObjAjav::Act_c::check_end() { - /* Nonmatching */ +BOOL daObjAjav::Act_c::check_end() { + BOOL rt = FALSE; + if (M_status == (STATUS_MAX - 1)) { + rt = check_all_wait(); + } + return rt; } /* 0000201C-000020B0 .text to_broken__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::to_broken() { - /* Nonmatching */ + mEventIdx = dComIfGp_evmng_getEventIdx(l_daObjAjav_ev_name[M_status]); + mActionIdx = 1; + if (!eventInfo.checkCommandDemoAccrpt()) { + fopAcM_orderOtherEventId(this, mEventIdx); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } } /* 000020B0-00002124 .text damage_part__Q29daObjAjav5Act_cFv */ -void daObjAjav::Act_c::damage_part() { - /* Nonmatching */ +BOOL daObjAjav::Act_c::damage_part() { + BOOL rt = FALSE; + if (M_status < STATUS_MAX - 1 && mSph.ChkTgHit()) { + to_broken(); + mSph.ClrTgHit(); + rt = TRUE; + } + return rt; } /* 00002124-000021EC .text make_shot_rock__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::make_shot_rock() { - /* Nonmatching */ + cXyz sph_center = mSph.GetC(); + JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8426, &sph_center); + if (emitter) { + g_env_light.settingTevStruct(TEV_TYPE_BG0, &sph_center, &tevStr); + emitter->setGlobalPrmColor( + tevStr.mColorK0.r, + tevStr.mColorK0.g, + tevStr.mColorK0.b + ); + } } /* 000021EC-000022F0 .text make_hamon2__Q29daObjAjav5Act_cF4cXyzf */ -void daObjAjav::Act_c::make_hamon2(cXyz, float) { - /* Nonmatching */ +void daObjAjav::Act_c::make_hamon2(cXyz i_hamonPos, f32 i_scale) { + cXyz scale; + + i_scale /= 3000.0f; + scale.x = 1.0f + i_scale; + scale.y = scale.x; + scale.z = scale.x; + + i_hamonPos.y += 10.0f; + + f32 water_height; + if (fopAcM_getWaterY(&i_hamonPos, &water_height) == TRUE) { + i_hamonPos.y = water_height; + } + + JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8454, &i_hamonPos, NULL, &scale); + + if (emitter) { + g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); + emitter->setGlobalPrmColor( + tevStr.mColorC0.r, + tevStr.mColorC0.g, + tevStr.mColorC0.b + ); + } } /* 000022F0-000024A4 .text set_hamon__Q29daObjAjav5Act_cFf */ -void daObjAjav::Act_c::set_hamon(float) { - /* Nonmatching */ +void daObjAjav::Act_c::set_hamon(f32 i_scale) { + cXyz current_pos; + cXyz base_z; + cXyz base_x; + cXyz temp_base_x; + + mDoMtx_stack_c::YrotS(current.angle.y); + mDoMtx_stack_c::multVec(&cXyz::BaseZ, &base_z); + base_z *= 1300.0f; + + mDoMtx_stack_c::YrotS(current.angle.y); + mDoMtx_stack_c::multVec(&cXyz::BaseX, &base_x); + + for (int i = 0; i < 2; i++) { + current_pos = current.pos; + + temp_base_x = base_x; + temp_base_x *= (i * -2.0f + 1.0f) * 400.0f; + + current_pos += base_z; + current_pos += temp_base_x; + + make_hamon2(current_pos, i_scale); + } } /* 000024A4-00002CF4 .text _execute__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_execute() { - /* Nonmatching */ + static cXyz flaw_pos[] = { + cXyz(0.0f, 0.0f, 0.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(0.0f, 40.0f, 0.0f), + cXyz(30.0f, 30.0f, 0.0f), + cXyz(-20.0f, 0.0f, 0.0f), + cXyz(20.0f, 0.0f, 0.0f) + }; + + cXyz init_disp_rate(12.0f, -10.0f, 55.0f); + bool stone_broken = false; + + // this bool is checked for falsehood once, set to true and then never read from again + bool useless_bool = false; + + csXyz rotation_speed; + int i, cond; + + for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mRockParts[i].set_se_pos(current.pos); + } + + switch (mActionIdx) { + case 0: + if (!damage_part()) { + for (i = 0; i < 2; i++) { + mHintCylStts[i].Move(); + if (mHintCyls[i].ChkTgHit()) { + if (!useless_bool) { + mHintCylHits++; + if (mHintCylHits >= STATUS_MAX - 1) { + to_broken(); + mHintCylHits = 0; + stone_broken = true; + } + useless_bool = true; + } + mHintCyls[i].ClrTgHit(); + } + } + if (stone_broken != true) { + mCylStts.Move(); + if (mCyl.ChkTgHit()) { + cond = get_rock_row(); + for (int j = get_rock_row(); j < (cond + 2); j++) { + mRockParts[j].make_fall_rock(TRUE); + mRockParts[j].mTimer = 0; + mRockParts[j].mTimerTrigger = 30; + mRockParts[j].setDrawProc(&Part_c::draw_flashing_normal); + } + mCyl.ClrTgHit(); + } + } + } + break; + case 1: + if (eventInfo.checkCommandDemoAccrpt()) { + cond = get_rock_row(); + for (i = get_rock_row(); i < (cond + 2); i++) { + init_disp_rate.x = 12.0f; + if ((i & 1) == 0) { + init_disp_rate.x *= -1.0f; + } + rotation_speed = daObjAjav_get_rot_speed(mSphCoOffset, mRockParts[i].mCenterPos, 0x1FF); + mRockParts[i].fall_init(init_disp_rate, rotation_speed, 0x1FF, (s16)(cM_rnd() * 9.0f) + 7); + mDoAud_seStart(JA_SE_OBJ_JB_STONE_BRK, &mRockParts[i].mSePos,0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mRockParts[i].setDrawProc(&Part_c::draw_normal); + mRockParts[i].make_fall_rock(FALSE); + } + + make_shot_rock(); + + int row = get_rock_row(); + set_hamon(mRockParts[row].mRockDisplacement.y); + + M_status++; + if (M_status < STATUS_MAX - 1) { + cond = get_rock_row(); + for (i = get_rock_row(); i < (cond + 2); i++) { + mRockParts[i].mFlawPos = flaw_pos[i]; + mRockParts[i].setExeProc(&Part_c::flaw); + } + set_co_offset(); + mActionIdx = 2; + } else { + mActionIdx = 3; + mCutsceneEndDelay = 60; + } + } else { + fopAcM_orderOtherEventId(this, mEventIdx); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } + break; + case 2: + if (dComIfGp_evmng_endCheck(mEventIdx)) { + dComIfGp_event_reset(); + if (M_status < STATUS_MAX - 1) { + mActionIdx = 0; + } else { + mActionIdx = 4; + } + } + break; + case 3: + if (check_end()) { + if (mCutsceneEndDelay == 0) { + dComIfGp_evmng_cutEnd(dComIfGp_evmng_getMyStaffId("Ajav")); + if (DEMO_SELECT(true, heap != NULL) && mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); +#if VERSION > VERSION_DEMO + mpBgW = NULL; +#endif + } + } + on_sw(mSwNo); + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + mDoAud_subBgmStop(); + mActionIdx = 2; + M_status++; + } else { + mCutsceneEndDelay--; + } + } + break; + case 4: + break; + default: + mActionIdx = 0; + break; + } + + if (M_status < STATUS_MAX - 1) { + dComIfG_Ccsp()->Set(&mSph); + dComIfG_Ccsp()->Set(&mCyl); + for (i = 0; i < 2; i++) { + dComIfG_Ccsp()->Set(&mHintCyls[i]); + } + } + + for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mRockParts[i].execute(this); + } + + if (mpBgW && mpBgW->ChkUsed()) { + mpBgW->Move(); + } + + return true; +} + +/* 00002CF4-00002D50 .text set_se_pos__Q29daObjAjav6Part_cF4cXyz */ +void daObjAjav::Part_c::set_se_pos(cXyz i_pos) { + mSePos = i_pos + mCenterPos; + mSePos += mRockDisplacement; } /* 00002D50-00002DCC .text _draw__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { + mRockParts[i].draw(this); + } + return true; } namespace daObjAjav {