diff --git a/configure.py b/configure.py index 968532f02..21e8e4b21 100755 --- a/configure.py +++ b/configure.py @@ -1806,7 +1806,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_vmsms"), ActorRel(Matching, "d_a_obj_volcano"), ActorRel(NonMatching, "d_a_obj_vtil"), - ActorRel(NonMatching, "d_a_obj_vyasi"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_vyasi"), ActorRel(Matching, "d_a_obj_xfuta"), ActorRel(Matching, "d_a_obj_zouK"), ActorRel(Matching, "d_a_oship"), diff --git a/include/d/actor/d_a_obj_vyasi.h b/include/d/actor/d_a_obj_vyasi.h index c774df22c..5eae10b88 100644 --- a/include/d/actor/d_a_obj_vyasi.h +++ b/include/d/actor/d_a_obj_vyasi.h @@ -2,6 +2,7 @@ #define D_A_OBJ_VYASI_H #include "f_op/f_op_actor.h" +#include "d/d_a_obj.h" #include "d/d_cc_d.h" #include "SSystem/SComponent/c_phase.h" @@ -11,29 +12,34 @@ class J3DNode; namespace daObjVyasi { static BOOL JointNodeCallBack(J3DNode*, int); - + class Act_c : public fopAc_ac_c { public: - void is_switch() const {} - - void SetStopJointAnimation(J3DAnmTransformKey*, float, float); - void PlayStopJointAnimation(); + virtual ~Act_c() { + } + + BOOL is_switch() const { + return fopAcM_isSwitch(const_cast(this), daObj::PrmAbstract(this, 8, 0)); + } + + BOOL SetStopJointAnimation(J3DAnmTransformKey*, float, float); + BOOL PlayStopJointAnimation(); void set_first_process(); void set_collision(); - void process_none_init(); + BOOL process_none_init(); void process_none_main(); - void process_sag_init(); + BOOL process_sag_init(); void process_sag_main(); - void process_sagWind_init(); + BOOL process_sagWind_init(); void process_sagWind_main(); - void process_toNormal_init(); + BOOL process_toNormal_init(); void process_toNormal_main(); - void process_normal_init(); + BOOL process_normal_init(); void process_normal_main(); - void process_init(int); + BOOL process_init(int); void process_main(); - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + static BOOL solidHeapCB(fopAc_ac_c*); + bool create_heap(); cPhs_State _create(); bool _delete(); void set_mtx(); @@ -42,39 +48,43 @@ namespace daObjVyasi { void leaf_scale_main(); bool _execute(); bool _draw(); - + + static char const M_arcname[]; + public: - /* 0x0290 */ u8 m0290[0x0294 - 0x0290]; - /* 0x0294 */ s16 m0294[14]; - /* 0x02B0 */ s16 m02B0[14]; + /* 0x0294 */ s16 mAnimWave[14]; + /* 0x02B0 */ s16 mAnimDir[14]; /* 0x02CC */ Quaternion mJointQuat[14]; - /* 0x03AC */ csXyz m03AC[14]; - /* 0x0400 */ cXyz m0400[14]; - /* 0x04A8 */ f32 m04A8; - /* 0x04AC */ f32 m04AC; - /* 0x04B0 */ f32 m04B0; + /* 0x03AC */ csXyz mJointAngle[14]; + /* 0x0400 */ cXyz mJointPos[14]; + /* 0x04A8 */ cXyz mLeafScale; /* 0x04B4 */ request_of_phase_process_class mPhs; - /* 0x04BC */ Mtx m04BC; + /* 0x04BC */ Mtx mMtx; /* 0x04EC */ mDoExt_McaMorf* mpMorf; - /* 0x04F0 */ J3DAnmTransformKey* mpBckData; + /* 0x04F0 */ J3DAnmTransformKey* M_bck_data; /* 0x04F4 */ cXyz mEkszsPos; /* 0x0500 */ s16 mEkszsRotY; - /* 0x0502 */ u8 m0502[0x0504 - 0x0502]; - /* 0x0504 */ f32 m0504; - /* 0x0508 */ u8 m0508[0x0524 - 0x0508]; - /* 0x0524 */ s16 m0524[15]; - /* 0x0542 */ u8 m0542[0x0544 - 0x0542]; + /* 0x0502 */ u8 pad_0x502[0x0504 - 0x0502]; + /* 0x0504 */ f32 mSagRatio; + /* 0x0508 */ s16 mWavePhase[14]; + /* 0x0524 */ s16 mWaveSpeed[14]; + /* 0x0540 */ u8 pad_0x540[0x0544 - 0x0540]; /* 0x0544 */ s16 mNormalCounter; - /* 0x0546 */ u8 m0546[0x0584 - 0x0546]; + /* 0x0546 */ u8 pad_0x546[0x0548 - 0x0546]; + /* 0x0548 */ dCcD_Stts mStts; /* 0x0584 */ dCcD_Cyl mCyl; - /* 0x06B4 */ u8 m06B4[0x19C4 - 0x06B4]; - /* 0x19C4 */ int m19C4; + /* 0x06B4 */ dCcD_Stts mCpsStts[5]; + /* 0x07E0 */ dCcD_Cps mCps[5]; + /* 0x0DF8 */ cM3dGCpsS field_0xDF8[5]; + /* 0x0E84 */ dCcD_Stts field_0xE84[8]; + /* 0x1064 */ dCcD_Sph field_0x1064[8]; + /* 0x19C4 */ int mAnmPlaying; /* 0x19C8 */ int mState; - /* 0x19CC */ f32 m19CC; - /* 0x19D0 */ s16 m19D0; - /* 0x19D2 */ u8 m19D2[0x19D4 - 0x19D2]; - /* 0x19D4 */ f32 m19D4; - }; + /* 0x19CC */ f32 field_0x19CC; + /* 0x19D0 */ s16 field_0x19D0; + /* 0x19D2 */ u8 pad_0x19D2[0x19D4 - 0x19D2]; + /* 0x19D4 */ f32 mWindScale; + }; // Size: 0x19D8 }; #endif /* D_A_OBJ_VYASI_H */ diff --git a/src/d/actor/d_a_obj_vyasi.cpp b/src/d/actor/d_a_obj_vyasi.cpp index 9168fe163..b3303b86d 100644 --- a/src/d/actor/d_a_obj_vyasi.cpp +++ b/src/d/actor/d_a_obj_vyasi.cpp @@ -5,10 +5,51 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_vyasi.h" +#include "d/d_a_obj.h" #include "d/d_cc_d.h" +#include "d/d_kankyo_wether.h" +#include "d/d_lib.h" +#include "res/Object/Vyasi.h" +#include "SSystem/SComponent/c_lib.h" namespace daObjVyasi { +namespace { +struct Attr_c { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ s16 field_0x20; + /* 0x22 */ s16 field_0x22; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ u8 pad[0x84 - 0x30]; +}; // Size: 0x84 + +static Attr_c const L_attr = { + 1.0f, 79.0f, 250.0f, 0.0f, 0.0f, 0.0f, 0.4f, 1.5f, 2, 0, 700.0f, 1700.0f, 1700.0f, {}, +}; + +inline Attr_c const& attr() { + return L_attr; +} +} // namespace + +enum { + STATE_NONE = 0, + STATE_SAG, + STATE_SAG_WIND, + STATE_TO_NORMAL, + STATE_NORMAL, + STATE_MAX, +}; + static const dCcD_SrcCyl M_cyl_src = { // dCcD_SrcGObjInf { @@ -100,142 +141,482 @@ static const dCcD_SrcSph M_sph_src = { }}, }; +static u8 joint_kind_table[14] = { 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; + }; // namespace daObjVyasi - /* 000000EC-0000015C .text SetStopJointAnimation__Q210daObjVyasi5Act_cFP18J3DAnmTransformKeyff */ -void daObjVyasi::Act_c::SetStopJointAnimation(J3DAnmTransformKey*, float, float) { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::SetStopJointAnimation(J3DAnmTransformKey* i_key, float i_speed, float i_morf) { + if (i_key != NULL) { + mpMorf->setAnm(i_key, 0, i_morf, i_speed, 0.0f, -1.0f, NULL); + mAnmPlaying = 1; + return TRUE; + } + return FALSE; } /* 0000015C-00000194 .text PlayStopJointAnimation__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::PlayStopJointAnimation() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::PlayStopJointAnimation() { + if (mpMorf->play(NULL, 0, 0) == 0) { + return TRUE; + } + return FALSE; } /* 00000194-0000021C .text set_first_process__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::set_first_process() { - /* Nonmatching */ + process_init(is_switch() ? STATE_NORMAL : STATE_SAG); + mNormalCounter = 0; + mWindScale = 1.0f; + shape_angle.y += 0x8000; } /* 0000021C-000005B8 .text set_collision__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::set_collision() { - /* Nonmatching */ + if (mCyl.ChkTgHit()) { + mCyl.GetTgHitObj(); + daObj::HitSeStart(¤t.pos, fopAcM_GetRoomNo(this), &mCyl, 7); + daObj::HitEff_kikuzu(this, &mCyl); + dKy_Sound_set(current.pos, 4, fopAcM_GetID(this), 100); + mCyl.ClrTgHit(); + } else { + mCyl.SetR(79.0f); + mCyl.SetH(250.0f); + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + } + + for (int i = 0; i < 5; i++) { + if (mCps[i].ChkTgHit()) { + mCps[i].GetTgHitObj(); + daObj::HitSeStart(¤t.pos, fopAcM_GetRoomNo(this), &mCps[i], 7); + dKy_Sound_set(current.pos, 4, fopAcM_GetID(this), 100); + mCps[i].ClrTgHit(); + } else { + int k = i + 1; + field_0xDF8[i].mStart = mJointPos[i]; + field_0xDF8[i].mEnd = mJointPos[k]; + field_0xDF8[i].mRadius = 47.4f; + mCps[i].cM3dGCps::Set(field_0xDF8[i]); + dComIfG_Ccsp()->Set(&mCps[i]); + } + } + + for (int i = 0; i < 8; i += 2) { + int idx = i >> 1; + int j = idx + 1; + int k = idx + 2; + + cXyz delta((mJointPos[k].x - mJointPos[j].x) * 0.33333f, (mJointPos[k].y - mJointPos[j].y) * 0.33333f, (mJointPos[k].z - mJointPos[j].z) * 0.33333f); + + cXyz pos; + pos.x = mJointPos[j].x + delta.x; + pos.y = mJointPos[j].y + delta.y; + pos.z = mJointPos[j].z + delta.z; + field_0x1064[i].SetC(pos); + field_0x1064[i].SetR(47.4f); + dComIfG_Ccsp()->Set(&field_0x1064[i]); + + pos.x = mJointPos[j].x + delta.x * 2.0f; + pos.y = mJointPos[j].y + delta.y * 2.0f; + pos.z = mJointPos[j].z + delta.z * 2.0f; + field_0x1064[i + 1].SetC(pos); + field_0x1064[i + 1].SetR(47.4f); + dComIfG_Ccsp()->Set(&field_0x1064[i + 1]); + } } /* 000005F4-000009B8 .text JointNodeCallBack__10daObjVyasiFP7J3DNodei */ -BOOL daObjVyasi::JointNodeCallBack(J3DNode*, int) { - /* Nonmatching */ +BOOL daObjVyasi::JointNodeCallBack(J3DNode* i_node, int i_calcTiming) { + J3DModel* model = j3dSys.getModel(); + s32 jntNo = ((J3DJoint*)i_node)->getJntNo(); + Act_c* i_this = (Act_c*)model->getUserArea(); + if (i_calcTiming == J3DNodeCBCalcTiming_In) { + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + Mtx mtx; + MTXCopy(model->getAnmMtx(jntNo), mtx); + cXyz trans(mtx[0][3], mtx[1][3], mtx[2][3]); + mtx[0][3] = mtx[1][3] = mtx[2][3] = 0.0f; + + mDoMtx_stack_c::transS(trans); + mDoMtx_stack_c::quatM(&i_this->mJointQuat[jntNo]); + mDoMtx_stack_c::concat(mtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + + csXyz angles_table[14] = { + csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), + csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), + }; + + csXyz angle = angles_table[jntNo]; + angle += i_this->mJointAngle[jntNo]; + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + mDoMtx_stack_c::ZXYrotM(angle); + + if (joint_kind_table[jntNo] == 0) { + mDoMtx_stack_c::scaleM(i_this->mLeafScale.x, i_this->mLeafScale.y, i_this->mLeafScale.z); + } + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + cXyz src(0.0f, 0.0f, 0.0f); + cMtx_multVec(mDoMtx_stack_c::get(), &src, &i_this->mJointPos[jntNo]); + } + return TRUE; } /* 000009F4-000009FC .text process_none_init__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::process_none_init() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_none_init() { + return TRUE; } /* 000009FC-00000A00 .text process_none_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_none_main() { - /* Nonmatching */ + return; } /* 00000A00-00000A64 .text process_sag_init__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::process_sag_init() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_sag_init() { + if (SetStopJointAnimation(M_bck_data, 1.0f, 0.0f) != 0) { + mpMorf->setPlaySpeed(0.0f); + return TRUE; + } + return FALSE; } /* 00000A64-00000AD8 .text process_sag_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_sag_main() { - /* Nonmatching */ + fopAc_ac_c* actor = fopAcM_SearchByName(fpcNm_Obj_Ekskz_e); + if (actor != NULL) { + mEkszsPos = actor->current.pos; + mEkszsRotY = actor->shape_angle.y; + process_init(STATE_SAG_WIND); + } } /* 00000AD8-00000CC0 .text process_sagWind_init__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::process_sagWind_init() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_sagWind_init() { + if (SetStopJointAnimation(M_bck_data, 1.0f, 3.0f)) { + f32 dist = mEkszsPos.abs(current.pos); + dist = cLib_maxLimit(dist, 2800.0f); + dist = cLib_minLimit(dist, 1000.0f); + + mSagRatio = (dist - 2800.0f) / -1800.0f; + f32 amp = 5000.0f + 7000.0f * mSagRatio; + + for (int i = 0; i < 14; i++) { + if (joint_kind_table[i] == 0) { + if (!(i & 1)) { + mWaveSpeed[i] = amp + cM_rndF(2000.0f); + } else { + mWaveSpeed[i] = -(amp + cM_rndF(2000.0f)); + } + } else { + mWaveSpeed[i] = 0.5f * amp; + } + } + mpMorf->setPlaySpeed(0.0f); + return TRUE; + } + return FALSE; } /* 00000CC0-00000D20 .text process_sagWind_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_sagWind_main() { - /* Nonmatching */ + if (is_switch()) { + process_init(STATE_TO_NORMAL); + } } /* 00000D20-00000D54 .text process_toNormal_init__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::process_toNormal_init() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_toNormal_init() { + return SetStopJointAnimation(M_bck_data, 1.0f, 0.0f); } /* 00000D54-00000E10 .text process_toNormal_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_toNormal_main() { - /* Nonmatching */ + if (mAnmPlaying == 0) { + if (std::fabsf(field_0x19CC) <= 0.1f && process_init(STATE_NORMAL)) { + field_0x19CC = 0.0f; + mWindScale = 0.0f; + mNormalCounter = 2; + } + field_0x19CC *= 0.85f; + field_0x19D0 += 0x3000; + } else { + field_0x19CC = -1792.0f * mSagRatio; + field_0x19D0 = 0; + } } /* 00000E10-00000E74 .text process_normal_init__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::process_normal_init() { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_normal_init() { + if (SetStopJointAnimation(M_bck_data, -1.0f, 0.0f)) { + mpMorf->setPlaySpeed(0.0f); + return TRUE; + } + return FALSE; } /* 00000E74-00000ED0 .text process_normal_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_normal_main() { - /* Nonmatching */ + if (mNormalCounter == 0 || mNormalCounter == 1) { + mNormalCounter++; + } + cLib_addCalc(&mWindScale, 1.0f, 0.01f, 1.0f, 0.007f); } +char const daObjVyasi::Act_c::M_arcname[] = "Vyasi"; + /* 00000ED0-00000FE4 .text process_init__Q210daObjVyasi5Act_cFi */ -void daObjVyasi::Act_c::process_init(int) { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::process_init(int i_idx) { + typedef BOOL (daObjVyasi::Act_c::*initProc)(); + static initProc init_table[] = { + &daObjVyasi::Act_c::process_none_init, &daObjVyasi::Act_c::process_sag_init, &daObjVyasi::Act_c::process_sagWind_init, + &daObjVyasi::Act_c::process_toNormal_init, &daObjVyasi::Act_c::process_normal_init, + }; + + if (i_idx >= 0 && i_idx < STATE_MAX && (this->*init_table[i_idx])()) { + mState = i_idx; + return TRUE; + } + return FALSE; } /* 00000FE4-000010C8 .text process_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::process_main() { - /* Nonmatching */ + typedef void (daObjVyasi::Act_c::*mainProc)(); + static mainProc main_table[] = { + &daObjVyasi::Act_c::process_none_main, &daObjVyasi::Act_c::process_sag_main, &daObjVyasi::Act_c::process_sagWind_main, + &daObjVyasi::Act_c::process_toNormal_main, &daObjVyasi::Act_c::process_normal_main, + }; + + if (mState >= 0 && mState < STATE_MAX) { + (this->*main_table[mState])(); + } } /* 000010C8-000010EC .text solidHeapCB__Q210daObjVyasi5Act_cFP10fopAc_ac_c */ -void daObjVyasi::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjVyasi::Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((daObjVyasi::Act_c*)i_this)->create_heap(); } /* 000010EC-00001290 .text create_heap__Q210daObjVyasi5Act_cFv */ -void daObjVyasi::Act_c::create_heap() { - /* Nonmatching */ +bool daObjVyasi::Act_c::create_heap() { + J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_VYASI_BDL_VYASI_e); + JUT_ASSERT(1146, mdl_data != NULL); + + M_bck_data = (J3DAnmTransformKey*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_VYASI_BCK_VYASI_e); + JUT_ASSERT(1151, M_bck_data != NULL); + + if (M_bck_data != NULL && mdl_data != NULL) { + mpMorf = new mDoExt_McaMorf(mdl_data, NULL, NULL, M_bck_data, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, 1, NULL, 0, 0x11000002); + } + return M_bck_data != NULL && mpMorf != NULL && mpMorf->getModel() != NULL; } /* 00001290-000016E0 .text _create__Q210daObjVyasi5Act_cFv */ cPhs_State daObjVyasi::Act_c::_create() { - /* Nonmatching */ + fopAcM_ct(this, daObjVyasi::Act_c); + + cPhs_State res = dComIfG_resLoad(&mPhs, M_arcname); + if (res == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, solidHeapCB, 0)) { + set_first_process(); + set_mtx(); + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -2000.0f, 0.0f, -2000.0f, 2000.0f, 2000.0f, 2000.0f); + fopAcM_setCullSizeFar(this, 2.0f); + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(M_cyl_src); + mCyl.SetStts(&mStts); + mCyl.SetTgVec((cXyz&)cXyz::Zero); + mCyl.OnTgNoHitMark(); + + for (int i = 0; i < 5; i++) { + mCpsStts[i].Init(100, 0xFF, this); + mCps[i].Set(M_cps_src); + mCps[i].SetStts(&mCpsStts[i]); + field_0xDF8[i].mStart = current.pos; + field_0xDF8[i].mEnd = current.pos; + field_0xDF8[i].mRadius = 100.0f; + } + + for (int i = 0; i < 8; i++) { + field_0xE84[i].Init(100, 0xFF, this); + field_0x1064[i].Set(M_sph_src); + field_0x1064[i].SetStts(&field_0xE84[i]); + mCyl.SetTgVec((cXyz&)cXyz::Zero); + mCyl.OnTgNoHitMark(); + } + + J3DModel* model = mpMorf->getModel(); + J3DModelData* modelData = model->getModelData(); + model->setUserArea((uintptr_t)this); + for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) { + modelData->getJointNodePointer(i)->setCallBack(JointNodeCallBack); + } + + for (u16 i = 0; i < 14; i++) { + mJointQuat[i] = ZeroQuat; + } + + mLeafScale.set(1.0f, 1.0f, 1.0f); + } else { + res = cPhs_ERROR_e; + } + } + return res; } /* 00001D8C-00001DBC .text _delete__Q210daObjVyasi5Act_cFv */ bool daObjVyasi::Act_c::_delete() { - /* Nonmatching */ + dComIfG_resDeleteDemo(&mPhs, M_arcname); + return true; } /* 00001DBC-00001E5C .text set_mtx__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::set_mtx() { - /* Nonmatching */ + mpMorf->getModel()->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), mMtx); } /* 00001E5C-000025A8 .text calc_dif_angle__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::calc_dif_angle() { - /* Nonmatching */ + for (int i = 0; i < 14; i++) { + csXyz target(0, 0, 0); + s16 step = 2; + if (mState == STATE_SAG_WIND) { + if (joint_kind_table[i] == 2) { + f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]); + target.set(20.0f * ratio, 40.0f * ratio, 40.0f * ratio); + } else if (joint_kind_table[i] == 1) { + f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]); + target.set(120.0f * ratio, 180.0f * ratio, 220.0f * ratio); + + if (i == 1) { + target.z += (s16)(-3200.0f + 3200.0f * mSagRatio); + } + } else if (joint_kind_table[i] == 0) { + static csXyz sag_offset_angle[14] = { + csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, 0), + csXyz(0, 0, 0), csXyz(0, 0, 5000), csXyz(0, 0, 0), csXyz(0, 0, 0), csXyz(0, 0, -5000), csXyz(0, 0, -7000), csXyz(0, 0, -2700), + }; + f32 ratio = mSagRatio * cM_ssin(mWavePhase[i]); + target.set(700.0f * ratio, 1700.0f * ratio, 1700.0f * ratio); + + target.x += sag_offset_angle[i].x; + target.y += sag_offset_angle[i].y; + target.z += sag_offset_angle[i].z; + step = 1; + } + } else if (mState == STATE_TO_NORMAL) { + if (mAnmPlaying == 0 && (i == 0 || i == 1 || i == 6)) { + target.z = field_0x19CC * cM_ssin(field_0x19D0); + } + } + + cLib_addCalcAngleS2(&mJointAngle[i].x, target.x, step, 0x4000); + cLib_addCalcAngleS2(&mJointAngle[i].y, target.y, step, 0x4000); + cLib_addCalcAngleS2(&mJointAngle[i].z, target.z, step, 0x4000); + + if (joint_kind_table[i] == 0) { + mWavePhase[i] += (s16)(1.5f * mWaveSpeed[i]); + } else { + mWavePhase[i] += mWaveSpeed[i]; + } + } } /* 000025A8-00002880 .text quaternion_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::quaternion_main() { - /* Nonmatching */ + for (int i = 0; i < 14; i++) { + Quaternion quat; + quat = ZeroQuat; + + if (mState == STATE_NORMAL && joint_kind_table[i] == 0) { + cXyz up(0.0f, 1.0f, 0.0f); + cMtx_YrotS(*calc_mtx, -current.angle.y); + + cXyz windDir; + MtxPosition(dKyw_get_wind_vec(), &windDir); + + f32 windPow = dKyw_get_wind_pow(); + cXyz dir = up.outprod(windDir); + s16 angle = 1400.0f * windPow * mWindScale; + f32 sin = cM_ssin(angle); + + Quaternion windQuat; + windQuat.x = sin * dir.x; + windQuat.y = sin * dir.y; + windQuat.z = sin * dir.z; + windQuat.w = cM_scos(angle); + + s16 target = 360.0f * windPow * mWindScale; + target = target > 0xDC ? 0xDC : target; + cLib_addCalcAngleS2(&mAnimDir[i], target, 4, 0x20); + s32 add = (2048.0f * windPow * mWindScale) + cM_rndFX(256.0f); + mAnimWave[i] += add; + f32 w = cM_ssin(mAnimDir[i]); + + Quaternion animQuat; + animQuat.x = w * cM_ssin(mAnimWave[i]); + animQuat.y = 0.0f; + animQuat.z = w * cM_ssin(mAnimWave[i]); + animQuat.w = cM_scos(mAnimDir[i]); + mDoMtx_quatMultiply(&windQuat, &animQuat, &quat); + } + + if (mNormalCounter == 1) { + mJointQuat[i] = quat; + } else { + mDoMtx_quatSlerp(&mJointQuat[i], &quat, &mJointQuat[i], 0.4f); + } + } } /* 00002880-00002938 .text leaf_scale_main__Q210daObjVyasi5Act_cFv */ void daObjVyasi::Act_c::leaf_scale_main() { - /* Nonmatching */ + cXyz scale(1.0f, 1.0f, 1.0f); + if (mState == STATE_SAG_WIND) { + scale.x = 0.35000002f * mSagRatio + 1.0f; + scale.y = -0.5f * mSagRatio + 1.0f; + scale.z = scale.y; + } + cLib_addCalc2(&mLeafScale.x, scale.x, 0.5f, 0.5f); + cLib_addCalc2(&mLeafScale.y, scale.y, 0.5f, 0.5f); + cLib_addCalc2(&mLeafScale.z, scale.z, 0.5f, 0.5f); } /* 00002938-000029BC .text _execute__Q210daObjVyasi5Act_cFv */ bool daObjVyasi::Act_c::_execute() { - /* Nonmatching */ + if (mState != STATE_NONE) { + mAnmPlaying = PlayStopJointAnimation(); + process_main(); + set_collision(); + quaternion_main(); + calc_dif_angle(); + leaf_scale_main(); + set_mtx(); + fopAcM_rollPlayerCrash(this, 79.0f, 7); + } + return true; } /* 000029BC-00002A6C .text _draw__Q210daObjVyasi5Act_cFv */ bool daObjVyasi::Act_c::_draw() { - /* Nonmatching */ + if (mState != STATE_NONE) { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr); + dComIfGd_setListBG(); + mpMorf->updateDL(); + dComIfGd_setList(); + } + return true; } namespace daObjVyasi {