diff --git a/include/d/actor/d_a_obj_pbco.h b/include/d/actor/d_a_obj_pbco.h index 2fdd85a55..8dfb08b15 100644 --- a/include/d/actor/d_a_obj_pbco.h +++ b/include/d/actor/d_a_obj_pbco.h @@ -1,6 +1,8 @@ #ifndef D_A_OBJ_PBCO_H #define D_A_OBJ_PBCO_H +#include "SSystem/SComponent/c_phase.h" +#include "d/d_bg_w.h" #include "f_op/f_op_actor.h" class daObj_Pbco_c : public fopAc_ac_c { @@ -9,21 +11,22 @@ public: inline BOOL _delete(); inline BOOL _draw(); inline BOOL _execute(); - + static const char M_arcname[]; + BOOL CreateHeap(); + s32 CreateInit(); void set_mtx(); - void CreateHeap(); - void CreateInit(); public: - /* Place member variables here */ -}; - + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dBgW* mpBgW; + /* 0x2A0 */ Mtx mMtx; +}; // Size: 0x2A0 class daObj_Pbco_HIO_c { public: daObj_Pbco_HIO_c(); - -public: - /* Place member variables here */ -}; + virtual ~daObj_Pbco_HIO_c() {} + /* 0x04 */ s8 field_0x04; +}; // Size: 0x04 #endif /* D_A_OBJ_PBCO_H */ diff --git a/src/d/actor/d_a_obj_pbco.cpp b/src/d/actor/d_a_obj_pbco.cpp index fb3f358e5..74dfea0d4 100644 --- a/src/d/actor/d_a_obj_pbco.cpp +++ b/src/d/actor/d_a_obj_pbco.cpp @@ -4,55 +4,138 @@ // #include "d/actor/d_a_obj_pbco.h" -#include "dolphin/types.h" +#include "d/d_com_inf_game.h" +#include "d/d_item.h" +#include "d/d_procname.h" + +static daObj_Pbco_HIO_c l_HIO; +const char daObj_Pbco_c::M_arcname[] = "Pbco"; /* 000000EC-00000104 .text __ct__16daObj_Pbco_HIO_cFv */ daObj_Pbco_HIO_c::daObj_Pbco_HIO_c() { - /* Nonmatching */ + field_0x04 = -1; } /* 00000104-0000018C .text set_mtx__12daObj_Pbco_cFv */ void daObj_Pbco_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } - /* 0000018C-000001AC .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static int CheckCreateHeap(fopAc_ac_c* i_this) { + daObj_Pbco_c* a_this = static_cast(i_this); + return a_this->CreateHeap(); } /* 000001AC-00000348 .text CreateHeap__12daObj_Pbco_cFv */ -void daObj_Pbco_c::CreateHeap() { - /* Nonmatching */ +BOOL daObj_Pbco_c::CreateHeap() { + J3DModelData* modelData; + if (dComIfGs_isEventBit(0x0a02) && !checkItemGet(dItem_PEARL_NAYRU_e, TRUE)) { + modelData = (J3DModelData*)(dComIfG_getObjectRes(M_arcname, 0x04)); + } else { + modelData = (J3DModelData*)(dComIfG_getObjectRes(M_arcname, 0x05)); + } + JUT_ASSERT(0xa9, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (dComIfGs_isEventBit(0x0a02) && !checkItemGet(dItem_PEARL_NAYRU_e, TRUE)) { + mpBgW = NULL; + } else { + mpBgW = dBgW_NewSet((cBgD_t*)dComIfG_getObjectRes(M_arcname, 0x08), cBgW::MOVE_BG_e, + &mpModel->getBaseTRMtx()); + if (mpBgW == NULL) { + return FALSE; + } + } + return mpModel != NULL; } /* 00000348-000003A4 .text CreateInit__12daObj_Pbco_cFv */ -void daObj_Pbco_c::CreateInit() { - /* Nonmatching */ +s32 daObj_Pbco_c::CreateInit() { + set_mtx(); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + if (mpBgW) { + dComIfG_Bgsp()->Regist(mpBgW, this); + } + return cPhs_COMPLEATE_e; } +s32 daObj_Pbco_c::_create() { + fopAcM_SetupActor(this, daObj_Pbco_c); + int phase_state = dComIfG_resLoad(&mPhs, M_arcname); + if (phase_state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x10000)) { + phase_state = CreateInit(); + } else { + phase_state = cPhs_ERROR_e; + } + } + return phase_state; +} /* 000003A4-00000434 .text daObj_PbcoCreate__FPv */ -static s32 daObj_PbcoCreate(void*) { - /* Nonmatching */ +static int daObj_PbcoCreate(void* i_this) { + return static_cast(i_this)->_create(); } +BOOL daObj_Pbco_c::_delete() { + if (mpBgW != NULL) { + dComIfG_Bgsp()->Release(mpBgW); + } + dComIfG_resDelete(&mPhs, M_arcname); + return TRUE; +} /* 00000434-0000048C .text daObj_PbcoDelete__FPv */ -static BOOL daObj_PbcoDelete(void*) { - /* Nonmatching */ +static BOOL daObj_PbcoDelete(void* i_this) { + static_cast(i_this)->_delete(); + return TRUE; +} +BOOL daObj_Pbco_c::_execute() { + if (mpBgW != NULL) + mpBgW->Move(); + set_mtx(); + return FALSE; } - /* 0000048C-000004D0 .text daObj_PbcoExecute__FPv */ -static BOOL daObj_PbcoExecute(void*) { - /* Nonmatching */ +static BOOL daObj_PbcoExecute(void* i_this) { + return static_cast(i_this)->_execute(); } +BOOL daObj_Pbco_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + return TRUE; +} /* 000004D0-0000053C .text daObj_PbcoDraw__FPv */ -static BOOL daObj_PbcoDraw(void*) { - /* Nonmatching */ +static BOOL daObj_PbcoDraw(void* i_this) { + daObj_Pbco_c* a_this = (daObj_Pbco_c*)i_this; + return a_this->_draw(); } /* 0000053C-00000544 .text daObj_PbcoIsDelete__FPv */ static BOOL daObj_PbcoIsDelete(void*) { - /* Nonmatching */ + return TRUE; } +static actor_method_class daObj_PbcoMethodTable = { + (process_method_func)daObj_PbcoCreate, (process_method_func)daObj_PbcoDelete, + (process_method_func)daObj_PbcoExecute, (process_method_func)daObj_PbcoIsDelete, + (process_method_func)daObj_PbcoDraw, +}; +actor_process_profile_definition g_profile_Obj_Pbco = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 2, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_Obj_Pbco, + /* Proc SubMtd */ &g_fpcLf_Method.base, + /* Size */ sizeof(daObj_Pbco_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x0021, + /* Actor SubMtd */ &daObj_PbcoMethodTable, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_NOCULLEXEC_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +};