diff --git a/configure.py b/configure.py index 3ad0b0361..01d063dd1 100755 --- a/configure.py +++ b/configure.py @@ -1519,7 +1519,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_shand", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_ship", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Equivalent, "d_a_shop_item"), # weak func order - ActorRel(NonMatching, "d_a_sie_flag"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_sie_flag", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_sitem"), ActorRel(NonMatching, "d_a_ss"), ActorRel(NonMatching, "d_a_sss"), diff --git a/include/d/actor/d_a_sie_flag.h b/include/d/actor/d_a_sie_flag.h index 4382e0417..2ed25e152 100644 --- a/include/d/actor/d_a_sie_flag.h +++ b/include/d/actor/d_a_sie_flag.h @@ -9,13 +9,15 @@ class daSie_Flag_c : public fopAc_ac_c { public: void set_mtx(); - void CreateHeap(); - void CreateInit(); + BOOL CreateHeap(); + cPhs_State CreateInit(); cPhs_State _create(); bool _delete(); bool _execute(); bool _draw(); + static const char M_arcname[]; + public: /* 0x290 */ request_of_phase_process_class mPhsEshata; /* 0x298 */ request_of_phase_process_class mPhsCloth; @@ -25,14 +27,20 @@ public: /* 0x2B4 */ dKy_tevstr_c mTevStr; /* 0x364 */ dCcD_Stts mStts; /* 0x3A0 */ dCcD_Cyl mCyl; + /* 0x4D0 */ dCcD_Cyl mCyl2; }; class daSie_Flag_HIO_c { public: daSie_Flag_HIO_c(); + virtual ~daSie_Flag_HIO_c() {}; + public: - /* Place member variables here */ + /* 0x00 */ //vtable + /* 0x04 */ s8 m04; + /* 0x08 */ f32 m08; + /* 0x0C */ s16 m0c; }; #endif /* D_A_SIE_FLAG_H */ diff --git a/src/d/actor/d_a_sie_flag.cpp b/src/d/actor/d_a_sie_flag.cpp index 546d12b82..2d303732b 100644 --- a/src/d/actor/d_a_sie_flag.cpp +++ b/src/d/actor/d_a_sie_flag.cpp @@ -4,9 +4,18 @@ // #include "d/actor/d_a_sie_flag.h" -#include "d/d_procname.h" -#include "d/d_priority.h" +#include "d/d_a_obj.h" #include "d/d_cc_d.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo.h" +#include "d/d_kankyo_wether.h" +#include "d/d_priority.h" +#include "d/d_procname.h" +#include "d/res/res_cloth.h" +#include "d/res/res_eshata.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_ext.h" +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep static dCcD_SrcCyl l_cyl_src = { // dCcD_SrcGObjInf @@ -38,50 +47,139 @@ static dCcD_SrcCyl l_cyl_src = { }, }; +static daSie_Flag_HIO_c l_HIO; + +static cXyz l_flag_offset(0.0f, 900.0f, 0.0f); +static cXyz l_wind_offset(0.0f, 725.0f, 0.0f); /* 000000EC-00000118 .text __ct__16daSie_Flag_HIO_cFv */ daSie_Flag_HIO_c::daSie_Flag_HIO_c() { - /* Nonmatching */ + m04 = -1; + m08 = 0.0f; + m0c = 0; } +const char daSie_Flag_c::M_arcname[] = "Eshata"; + /* 00000118-000001C4 .text set_mtx__12daSie_Flag_cFv */ void daSie_Flag_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::transM(l_flag_offset); + mpClothPacket->setMtx(mDoMtx_stack_c::get()); } /* 000001C4-000001E4 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_actor) { + return static_cast(i_actor)->CreateHeap(); } /* 000001E4-0000030C .text CreateHeap__12daSie_Flag_cFv */ -void daSie_Flag_c::CreateHeap() { - /* Nonmatching */ +BOOL daSie_Flag_c::CreateHeap() { + J3DModelData *modelData = (J3DModelData*)dComIfG_getObjectRes(M_arcname, ESHATA_BDL_ESHATA); + JUT_ASSERT(0x109, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpModel == NULL) { + return FALSE; + } else { + ResTIMG* eshata_timg = (ResTIMG*)dComIfG_getObjectRes(M_arcname, ESHATA_BTI_ESHATA); + ResTIMG* cloth_timg = (ResTIMG*)dComIfG_getObjectRes("Cloth", CLOTH_BTI_CLOTHTOON); + mpClothPacket = dCloth_packet_create(eshata_timg, cloth_timg, 5, 5, 700.0f, 350.0, &mTevStr, NULL); + return mpClothPacket != NULL ? TRUE : FALSE; + } } /* 0000030C-000003D4 .text CreateInit__12daSie_Flag_cFv */ -void daSie_Flag_c::CreateInit() { - /* Nonmatching */ +cPhs_State daSie_Flag_c::CreateInit() { + mStts.Init(0xFF, 0xFF, this); + + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + + mWindvec = *dKyw_get_wind_vec(); + + set_mtx(); + cullMtx = mpModel->getBaseTRMtx(); + fopAcM_setCullSizeBox(this, -700.0f, 0.0f, -700.0f, 700.0f, 1100.0f, 700.0f); + dKy_tevstr_init(&mTevStr, fopAcM_GetRoomNo(this), 0xFF); + + return cPhs_COMPLEATE_e; } /* 000003D4-00000488 .text _create__12daSie_Flag_cFv */ cPhs_State daSie_Flag_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daSie_Flag_c); + + cPhs_State result = dComIfG_resLoad(&mPhsEshata, M_arcname); + if (result != cPhs_COMPLEATE_e) { + return result; + } + + result = dComIfG_resLoad(&mPhsCloth, "Cloth"); + if (result != cPhs_COMPLEATE_e) { + return result; + } + + if (fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x1020)) { + return CreateInit(); + } else { + return cPhs_ERROR_e; + } } /* 00000814-00000864 .text _delete__12daSie_Flag_cFv */ bool daSie_Flag_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhsEshata, M_arcname); + dComIfG_resDelete(&mPhsCloth, "Cloth"); + return true; } /* 00000864-00000B08 .text _execute__12daSie_Flag_cFv */ bool daSie_Flag_c::_execute() { - /* Nonmatching */ + cXyz allwind; + cXyz position_plus_offset; + + set_mtx(); + mStts.Move(); + + if (mCyl.ChkTgHit() != 0) { + daObj::HitSeStart(fopAcM_GetPosition_p(this), fopAcM_GetRoomNo(this), &mCyl, 0x0B); + } + + fopAcM_rollPlayerCrash(this, 40.0f, 0x07); + + position_plus_offset = fopAcM_GetPosition(this) + l_flag_offset; + allwind = dKyw_get_AllWind_vecpow(&position_plus_offset); + if (allwind.abs() > mWindvec.abs()) { + mWindvec = allwind; + } else { + cLib_addCalcPos2(&mWindvec, allwind, 0.1f, 0.1f); + } + + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + + mpClothPacket->setParam(0.4f, -0.75f, 0.9f, 1.0f, 1.0f, 0x400, 0, 900, -800, 7.0f, 6.0f); + mpClothPacket->setWindPower(13.0f, 8.0f); + mpClothPacket->setGlobalWind(&mWindvec); + mpClothPacket->cloth_move(); + + return false; } /* 00000B08-00000B94 .text _draw__12daSie_Flag_cFv */ bool daSie_Flag_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + mpClothPacket->cloth_draw(); + return true; } /* 00000B94-00000BB4 .text daSie_FlagCreate__FPv */