From 5190f081c76974189b1baa940701e341ec60854d Mon Sep 17 00:00:00 2001 From: Squidysquid1 <46660298+Squidysquid1@users.noreply.github.com> Date: Sat, 24 May 2025 13:15:28 -0500 Subject: [PATCH] d_a_machine 100% (#754) * d_a_machine 83% * d_a_machine 87% * d_a_machine matching functions * 99% d_a_machine * d_a_machine 100% * Unmark as matching for demo --------- Co-authored-by: LagoLunatic --- configure.py | 2 +- include/d/actor/d_a_machine.h | 43 +++- include/d/actor/d_a_windmill.h | 2 +- src/d/actor/d_a_machine.cpp | 366 ++++++++++++++++++++++++++++++--- 4 files changed, 377 insertions(+), 36 deletions(-) diff --git a/configure.py b/configure.py index e051b7137..f535fe304 100755 --- a/configure.py +++ b/configure.py @@ -1569,7 +1569,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lbridge", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_leaflift", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_lstair"), - ActorRel(NonMatching, "d_a_machine"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_machine", extra_cflags=['-sym off']), ActorRel(NonMatching, "d_a_mant"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mbdoor"), ActorRel(NonMatching, "d_a_mgameboard"), diff --git a/include/d/actor/d_a_machine.h b/include/d/actor/d_a_machine.h index 97ebab0f9..e0093c359 100644 --- a/include/d/actor/d_a_machine.h +++ b/include/d/actor/d_a_machine.h @@ -2,17 +2,23 @@ #define D_A_MACHINE_H #include "f_op/f_op_actor.h" +#include "d/d_cc_d.h" +#include "d/d_bg_s_acch.h" +#include "m_Do/m_Do_ext.h" +#include "d/actor/d_a_windmill.h" +#include "d/d_path.h" class daMachine_c : public fopAc_ac_c { public: bool _delete(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); void path_move(); void set_next_pnt(); - void search_wind_mill(); + daWindMill_c* search_wind_mill(); void set_speed(); cPhs_State _create(); + daMachine_c(); void set_mtx(); bool _execute(); void attack(); @@ -21,8 +27,37 @@ public: void set_at(); bool _draw(); + static const char m_arcname[]; + static const f32 static_float1; + static const f32 static_float2; + public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dCcD_Stts mStts; + /* 0x2d8 */ dCcD_Sph mSph; + /* 0x404 */ dCcD_Sph field_0x404[3]; + /* 0x788 */ dCcD_Sph field_0x788; + /* 0x8b4 */ dBgS_ObjAcch field_0x84b; + /* 0xa78 */ dBgS_AcchCir field_0xa78; + /* 0xab8 */ dCcD_Cps field_0xab8; + /* 0xbf0 */ cM3dGSph field_0xbf0; + /* 0xc04 */ mDoExt_bckAnm field_0xc04; + /* 0xc14 */ u8 field_0xc14; + /* 0xc15 */ s8 field_0xc15; + /* 0xc16 */ s8 field_0xc16; + /* 0xc17 */ s8 field_0xc17; + /* 0xc18 */ dPath* field_0xc18; + /* 0xc1c */ cXyz field_0xc1c; + /* 0xc28 */ cXyz field_0xc28; + + /* 0xc34 */ u8 field_0xc34[0xc3c - 0xc34]; //Filler + + /* 0xc3c */ Mtx field_0xc3c; + /* 0xc6c */ cXyz field_0xc6c; + /* 0xc78 */ u8 field_0xc78; + + /* 0xC79 */ u8 field_0xC79[0xC94 - 0xC79]; //Filler +}; // Size: 0xc94 #endif /* D_A_MACHINE_H */ diff --git a/include/d/actor/d_a_windmill.h b/include/d/actor/d_a_windmill.h index 99e509afc..525e35533 100644 --- a/include/d/actor/d_a_windmill.h +++ b/include/d/actor/d_a_windmill.h @@ -39,7 +39,7 @@ public: /* 0x12B8 */ Mtx mMtx; /* 0x12E8 */ dCcD_Cyl mCyl; /* 0x1418 */ u8 mType; - /* 0x141A */ u16 mAngle[3]; + /* 0x141A */ s16 mAngle[3]; /* 0x1420 */ u32 mWindTagId; }; diff --git a/src/d/actor/d_a_machine.cpp b/src/d/actor/d_a_machine.cpp index 4f6affb4d..eb99b2348 100644 --- a/src/d/actor/d_a_machine.cpp +++ b/src/d/actor/d_a_machine.cpp @@ -4,118 +4,424 @@ // #include "d/actor/d_a_machine.h" +#include "d/actor/d_a_player.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_hkikai1.h" + +static dCcD_SrcSph l_sph_src_at = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_UNK800, + /* SrcObjAt Atp */ 1, + /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e | cCcD_AtSPrm_VsOther_e, + /* SrcObjTg Type */ ~AT_TYPE_BOOMERANG, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK1, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 150.0f, + }, +}; + +static dCcD_SrcSph l_sph_src_col = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_UNK800, + /* SrcObjAt Atp */ 1, + /* SrcObjAt SPrm */ cCcD_AtSPrm_VsPlayer_e | cCcD_AtSPrm_VsOther_e, + /* SrcObjTg Type */ ~AT_TYPE_BOOMERANG, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK1, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 50.0f, + }, + +}; + +const char daMachine_c::m_arcname[8] = "Hkikai1"; + +const f32 daMachine_c::static_float1 = 300.0f; +const f32 daMachine_c::static_float2 = 800.0f; /* 00000078-000000A8 .text _delete__11daMachine_cFv */ bool daMachine_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, m_arcname); + return true; } /* 000000A8-000000C8 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daMachine_c*)i_this)->CreateHeap(); } /* 000000C8-0000022C .text CreateHeap__11daMachine_cFv */ -void daMachine_c::CreateHeap() { - /* Nonmatching */ +BOOL daMachine_c::CreateHeap() { + BOOL success; + + J3DModelData * modelData = (J3DModelData *)dComIfG_getObjectRes(m_arcname, HKIKAI1_BDL_HKIKAI1); + JUT_ASSERT(0x159, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000222); + if(mpModel == NULL) { + success = false; + } else{ + J3DAnmTransform * pbck = (J3DAnmTransform *)dComIfG_getObjectRes(m_arcname, HKIKAI1_BCK_HKIKAI1); + JUT_ASSERT(0x169, pbck != NULL) + + int initRet = field_0xc04.init(modelData,pbck, true, 0,1.0f,0,-1,false); + if(initRet == NULL) + success = false; + else{ + field_0xc04.entry(mpModel->getModelData()); + success = true; + } + } + + return success; } /* 0000022C-000002A0 .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* node, int calcTiming) { + if(calcTiming == J3DNodeCBCalcTiming_In){ + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daMachine_c* i_this = (daMachine_c*)model->getUserArea(); + + if(i_this) { + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + cMtx_copy(mDoMtx_stack_c::get(), i_this->field_0xc3c); + } + } + + return TRUE; } /* 000002A0-00000520 .text CreateInit__11daMachine_cFv */ void daMachine_c::CreateInit() { - /* Nonmatching */ + scale.setall(1.5f); + + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + fopAcM_setCullSizeBox(this, -100.0f, -100.0f, -50.0f, 100.0f, 100.0f, 500.0f); + mStts.Init(255, 255, this); + mSph.Set(l_sph_src_at); + mSph.SetStts(&mStts); + + for(int i = 0; i < 3; ++i) { + field_0x404[i].Set(l_sph_src_col); + field_0x404[i].SetStts(&mStts); + } + + field_0x788.Set(l_sph_src_col); + field_0x788.SetStts(&mStts); + field_0xa78.SetWallR(50.0f); + + field_0x84b.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), + this, 1,&field_0xa78, + fopAcM_GetSpeed_p(this)); + + set_mtx(); + + mpModel->setUserArea((u32)this); + + JUTNameTab* jointName = mpModel->getModelData()->getJointName(); + for(u16 i = 0; i < mpModel->getModelData()->getJointNum(); ++i) { + if(strcmp("joint3", jointName->getName(i)) == 0) { + mpModel->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); + break; + } + } + + mpModel->calc(); + field_0xc14 = fopAcM_GetParam(this); + if (field_0xc14 != 0xff){ + field_0xc18 = dPath_GetRoomPath(field_0xc14, current.roomNo); + if(field_0xc18 != NULL){ + field_0xc16 = 1; + field_0xc15 = 1; + + dPnt* pnt = &field_0xc18->m_points[field_0xc15]; + field_0xc1c = pnt->m_position; + field_0xc28 = field_0xc1c; + + current.pos.x = field_0xc18->m_points[0].m_position.x; + current.pos.y = field_0xc18->m_points[0].m_position.y; + current.pos.z = field_0xc18->m_points[0].m_position.z; + + }else { + field_0xc14 = 0xff; + } + } } /* 00000520-00000604 .text path_move__11daMachine_cFv */ void daMachine_c::path_move() { - /* Nonmatching */ + if (field_0xc14 != 0xFF){ + cLib_chasePos(¤t.pos, field_0xc1c, speedF); + + if((field_0xc1c - current.pos).abs() < 80.0f) + set_next_pnt(); + } } /* 00000604-00000700 .text set_next_pnt__11daMachine_cFv */ void daMachine_c::set_next_pnt() { - /* Nonmatching */ + if (field_0xc14 == 0xFF) return; + + field_0xc15 += field_0xc16; + + if(dPath_ChkClose(field_0xc18) != 0) { + + if (field_0xc15 > (s8)field_0xc18->m_num - 1) { + field_0xc15 = 0; + } else if (field_0xc15 < 0) { + field_0xc15 = field_0xc18->m_num - 1; + } + } else { + if(field_0xc15 > field_0xc18->m_num - 1 ) { + field_0xc16 = -1; + field_0xc15 = field_0xc18->m_num - 2; + } else if (field_0xc15 < 0){ + field_0xc16 = 1; + field_0xc15 = 1; + } + } + + field_0xc28 = field_0xc1c; + dPnt* pnt = &field_0xc18->m_points[field_0xc15]; + field_0xc1c = pnt->m_position; } /* 00000700-00000734 .text search_wind_mill__11daMachine_cFv */ -void daMachine_c::search_wind_mill() { - /* Nonmatching */ +daWindMill_c* daMachine_c::search_wind_mill() { + return (daWindMill_c*)fopAcM_SearchByName(PROC_WINDMILL); } /* 00000734-000007F8 .text set_speed__11daMachine_cFv */ void daMachine_c::set_speed() { - /* Nonmatching */ + f32 new_speed; + daWindMill_c* windmill = search_wind_mill(); + f32 local_1; + + + if(windmill != NULL) { + new_speed = (f32)windmill->mAngle[1]/(f32)daWindMill_c::m_max_rot_speed[windmill->mType]; + + } else { + new_speed = 0.0f; + } + + local_1 = speedF; + new_speed = cLib_addCalc(&local_1, new_speed * 5.0f,0.1f,1.0f,0.5f); + speedF = local_1; + } /* 000007F8-00000898 .text _create__11daMachine_cFv */ cPhs_State daMachine_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daMachine_c); + + cPhs_State ret = dComIfG_resLoad(&mPhs, m_arcname); + if (ret == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0xb00)) { + return cPhs_ERROR_e; + }else { + CreateInit(); + } + } + + return ret; } +/* 00000898-00000AA0 .text __ct__11daMachine_cFv */ +daMachine_c::daMachine_c() {} + /* 00000F74-0000100C .text set_mtx__11daMachine_cFv */ void daMachine_c::set_mtx() { - /* Nonmatching */ + csXyz xyz = current.angle; + + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(xyz.x, xyz.y, xyz.z); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 0000100C-000010F8 .text _execute__11daMachine_cFv */ bool daMachine_c::_execute() { - /* Nonmatching */ + cXyz xyz; + set_speed(); + xyz = cXyz::Zero - current.pos; + current.angle.y = cM_atan2s(xyz.x,xyz.z); + path_move(); + attack(); + set_body(); + set_at(); + set_mtx(); + + if(speedF != 0.0f) { + fopAcM_seStart(this, JA_SE_OBJ_JAMA_MECHA_MOVE, 0); + } + + return true; } /* 000010F8-0000124C .text attack__11daMachine_cFv */ void daMachine_c::attack() { - /* Nonmatching */ + daPy_py_c* player; + + if( (player = daPy_getPlayerActorClass()) == NULL) + return; + + set_cube(); + cXyz player_pos; + cXyz xyz; + f32 unk_float = 60.0f; + + player_pos.x = player->current.pos.x; + player_pos.y = player->current.pos.y; + player_pos.z = player->current.pos.z; + player_pos.y = player_pos.y + unk_float; + + field_0xbf0.SetC(player_pos); + field_0xbf0.SetR(90.0f); + + switch (field_0xc78) { + case 0: + if(field_0xab8.Cross(&field_0xbf0,&xyz) !=0) { + field_0xc78 = 1; + return; + } + break; + case 1: + fopAcM_seStart(this, JA_SE_OBJ_JAMA_MECHA_OUT,0); + field_0xc04.setFrame(0.0f); + field_0xc04.setPlaySpeed(1.0f); + field_0xc78 += 1; + // Fall through + case 2: + if(field_0xc04.play() != 0) { + field_0xc78 = NULL; + } + break; + } } /* 0000124C-00001330 .text set_cube__11daMachine_cFv */ void daMachine_c::set_cube() { - /* Nonmatching */ + cXyz xyz1(0.0f,0.0f,350.0f); + cXyz xyz2(0.0f,0.0f,500.0f); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&xyz2, &xyz2); + mDoMtx_stack_c::multVec(&xyz1, &xyz1); + field_0xab8.GetStart() = xyz1; + field_0xab8.GetEnd() = xyz2; + field_0xab8.SetR(200.0f); } /* 00001330-0000144C .text set_body__11daMachine_cFv */ void daMachine_c::set_body() { - /* Nonmatching */ + cXyz xyz[3]; + xyz[0].set(0.0f,0.0f,75.0f); + xyz[1].set(0.0f,0.0f,225.0f); + xyz[2].set(0.0f,0.0f,375.0f); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle); + + for(int i=0; i < 3; ++i) { + mDoMtx_stack_c::multVec(&xyz[i], &xyz[i]); + field_0x404[i].SetC(xyz[i]); + dComIfG_Ccsp()->Set(&field_0x404[i]); + } + + field_0x404[0].OnAtSPrmBit(cCcD_AtSPrm_Set_e); + + field_0x404[0].SetR(100.0f); } /* 0000144C-000014D4 .text set_at__11daMachine_cFv */ void daMachine_c::set_at() { - /* Nonmatching */ + f32 fVar1; + + fVar1 = field_0xc04.getFrameCtrl()->getFrame(); + if ((5.0f < fVar1) && (25.0f > fVar1)) { + + field_0xc6c.set(field_0xc3c[0][3], + field_0xc3c[1][3], + field_0xc3c[2][3]); + + mSph.SetC(field_0xc6c); + dComIfG_Ccsp()->Set(&mSph); + } } /* 000014D4-0000154C .text _draw__11daMachine_cFv */ bool daMachine_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + field_0xc04.entry(mpModel->getModelData()); + mDoExt_modelUpdateDL(mpModel); + return true; } /* 0000154C-0000156C .text daMachine_Create__FPv */ -static cPhs_State daMachine_Create(void*) { - /* Nonmatching */ +static cPhs_State daMachine_Create(void* i_this) { + return ((daMachine_c*)i_this)->_create(); } /* 0000156C-00001590 .text daMachine_Delete__FPv */ -static BOOL daMachine_Delete(void*) { - /* Nonmatching */ +static BOOL daMachine_Delete(void* i_this) { + return ((daMachine_c*)i_this)->_delete(); } /* 00001590-000015B4 .text daMachine_Draw__FPv */ -static BOOL daMachine_Draw(void*) { - /* Nonmatching */ +static BOOL daMachine_Draw(void* i_this) { + return ((daMachine_c*)i_this)->_draw(); } /* 000015B4-000015D8 .text daMachine_Execute__FPv */ -static BOOL daMachine_Execute(void*) { - /* Nonmatching */ +static BOOL daMachine_Execute(void* i_this) { + return ((daMachine_c*)i_this)->_execute(); } /* 000015D8-000015E0 .text daMachine_IsDelete__FPv */ static BOOL daMachine_IsDelete(void*) { - /* Nonmatching */ + return TRUE; } static actor_method_class daMachineMethodTable = {