diff --git a/configure.py b/configure.py index a52bd174b..7b4136fbd 100644 --- a/configure.py +++ b/configure.py @@ -379,7 +379,7 @@ LIBS = [ ActorRel(NonMatching, "d_a_lamp"), ActorRel(NonMatching, "d_a_lod_bg"), ActorRel(NonMatching, "d_a_lwood"), - ActorRel(NonMatching, "d_a_magma"), + ActorRel(Matching, "d_a_magma"), ActorRel(NonMatching, "d_a_majuu_flag"), ActorRel(NonMatching, "d_a_mdoor"), ActorRel(NonMatching, "d_a_msw"), diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 1467a4406..747c1a007 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -246,6 +246,7 @@ public: void setFrame(f32 frame) { mFrameCtrl.setFrame(frame); } void updateDL(); void play(Vec *, u32, u8); + void stopZelAnime(); u32 pad[0x50]; // J3DMtxCalcMaya /* 0x50 */ J3DModel* mpModel; diff --git a/src/d/actor/d_a_branch.cpp b/src/d/actor/d_a_branch.cpp index 5048b4d4a..ba3e2f4d8 100644 --- a/src/d/actor/d_a_branch.cpp +++ b/src/d/actor/d_a_branch.cpp @@ -9,13 +9,27 @@ #include "f_op/f_op_actor_mng.h" #include "d/d_procname.h" #include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" #include "d/d_com_inf_game.h" -#include "d/d_resorce.h" +#include "d/d_kankyo.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "dolphin/mtx/mtx.h" #include "dolphin/types.h" class daBranch_c : public fopAc_ac_c { public: + ~daBranch_c() { + for (int i = 0; i < 2; i++) { + mDoExt_McaMorf* anim = mAnims[i]; + if (anim != 0) { + anim->stopZelAnime(); + } + } + + dComIfG_resDelete(&mPhs, m_arcname); + } + void set_mtx(); void set_anim(int, int, int); void demoPlay(mDoExt_McaMorf*); @@ -24,9 +38,13 @@ public: static s32 solidHeapCB(fopAc_ac_c*); /* 0x0290 */ request_of_phase_process_class mPhs; - /* 0x0294 */ s8 dummy[0x10]; - // ... - /* 0x02A8*/ mDoExt_McaMorf* mAnims[2]; + /* 0x0298 */ J3DModel* mModels[2]; + /* 0x02A0 */ u8 dummy2[0x08]; + /* 0x02A8 */ mDoExt_McaMorf* mAnims[2]; + /* 0x02B0 */ u8 dummy[0x08]; + /* 0x02B8 */ u32 m02B8; + /* 0x02BC */ u8 m02BC; + /* 0x02BD */ u8 m02BD; static char m_arcname[]; }; @@ -35,20 +53,29 @@ char daBranch_c::m_arcname[] = "Kwood_00"; /* 00000078-00000128 .text set_mtx__10daBranch_cFv */ void daBranch_c::set_mtx() { - /* Nonmatching */ - //for (int i = 0; i < 2; i ++) { + J3DModel* pMdl; - //} + for (int i = 0; i < 2; i ++) { + pMdl = mModels[i]; + + if (pMdl) { + pMdl->setBaseScale(mScale); + + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::XYZrotM(getAngle().x, getAngle().y, getAngle().z); + pMdl->i_setBaseTRMtx(mDoMtx_stack_c::get()); + } + } } /* 00000128-000001E4 .text set_anim__10daBranch_cFiii */ void daBranch_c::set_anim(int i_animIdx, int i_bckIdx, int i_basIdx) { if (i_bckIdx > 0 && i_basIdx > 0) { void* pSnd = dComIfG_getObjectIDRes(m_arcname, i_basIdx); - void* pAnm = dComIfG_getObjectIDRes(m_arcname, i_bckIdx); + J3DAnmTransform* pAnm = static_cast(dComIfG_getObjectIDRes(m_arcname, i_bckIdx)); mAnims[i_animIdx]->setAnm( - static_cast(pAnm), + pAnm, -1, 0.0f, 1.0f, @@ -73,31 +100,25 @@ s32 daBranch_c::solidHeapCB(fopAc_ac_c* i_this) { /* 00000248-0000049C .text CreateHeap__10daBranch_cFv */ s32 daBranch_c::CreateHeap() { /* Nonmatching */ + int basIds[] = { 8, 0 }; + int bckIds[] = { 7, 2 }; + int bmdIds[] = { 6, 5 }; + int t[] = {0, 0}; BOOL status = TRUE; - s32 ids[] = { - 8, 0, - 7, 2, - 6, 5 - }; - for (int i = 0; i < 2; i++) { - void* modelRes = dRes_control_c::getIDRes(m_arcname, ids[i + 4], g_dComIfG_gameInfo.mResControl.mObjectInfo, 0x40); - void* bckRes = dRes_control_c::getIDRes(m_arcname, ids[i + 2], g_dComIfG_gameInfo.mResControl.mObjectInfo, 0x40); + J3DModelData* modelData = static_cast(dComIfG_getObjectIDRes(m_arcname, bmdIds[i])); + J3DAnmTransformKey* bck = static_cast(dComIfG_getObjectIDRes(m_arcname, bckIds[i])); - if (!modelRes) { - JUT_ASSERT(0x1CC, "modelData != 0"); - } - if (!bckRes) { - JUT_ASSERT(0x1CD, "bck != 0"); - } + JUT_ASSERT(0x1CC, modelData != 0); + JUT_ASSERT(0x1CD, bck != 0); mDoExt_McaMorf* newMorf = new mDoExt_McaMorf( - (J3DModelData*)dRes_control_c::getIDRes(m_arcname, ids[i + 4], g_dComIfG_gameInfo.mResControl.mObjectInfo, 0x40), + static_cast(dComIfG_getObjectIDRes(m_arcname, bmdIds[i])), 0, 0, - (J3DAnmTransformKey*)dRes_control_c::getIDRes(m_arcname, ids[i + 2], g_dComIfG_gameInfo.mResControl.mObjectInfo, 0x40), + static_cast(dComIfG_getObjectIDRes(m_arcname, bckIds[i])), 0, 1.0f, 0, @@ -109,35 +130,81 @@ s32 daBranch_c::CreateHeap() { ); mAnims[i] = newMorf; - if (mAnims[i] == 0) { + if (!mAnims[i]) { status = FALSE; break; } + mModels[i] = newMorf->mpModel; + if (!mModels[i]) { + status = FALSE; + break; + } + mAnims[i]->setFrame(0.0f); + set_anim(i, bckIds[i], basIds[i]); } return status; } /* 0000049C-00000524 .text daBranch_Draw__FP10daBranch_c */ -void daBranch_Draw(daBranch_c*) { - /* Nonmatching */ +BOOL daBranch_Draw(daBranch_c* i_this) { + int activeIdx = 0; + if (i_this->m02B8 == 5) { + activeIdx = 1; + } + + g_env_light.settingTevStruct(TEV_TYPE_BG0, &i_this->current.pos, &i_this->mTevStr); + g_env_light.setLightTevColorType(i_this->mModels[activeIdx], &i_this->mTevStr); + + i_this->mAnims[activeIdx]->updateDL(); + + return TRUE; } /* 00000524-0000060C .text daBranch_Execute__FP10daBranch_c */ -void daBranch_Execute(daBranch_c*) { +void daBranch_Execute(daBranch_c* i_this) { /* Nonmatching */ + int demoId = i_this->mDemoActorId; + + if (demoId == 0) { + if (i_this->m02B8 == 5) { + if (i_this->mAnims[1]) { + i_this->mAnims[1]->play(0, 0, 0); + } + } + else if (i_this->m02B8 == 6 && i_this->mAnims[0]) { + i_this->mAnims[0]->play(0, 0, 0); + } + } + else { + void* demoActor = g_dComIfG_gameInfo.play.mDemo; + + if (demoActor) { + //i_this->m02B8 = demoActor->mShape; + + if (i_this->m02B8 == 6) { + i_this->demoPlay(i_this->mAnims[0]); + } + else if (i_this->m02B8 == 5) { + i_this->demoPlay(i_this->mAnims[1]); + } + } + } + + i_this->set_mtx(); } /* 0000060C-00000614 .text daBranch_IsDelete__FP10daBranch_c */ -BOOL daBranch_IsDelete(daBranch_c*) { +BOOL daBranch_IsDelete(daBranch_c* i_this) { return TRUE; } /* 00000614-00000694 .text daBranch_Delete__FP10daBranch_c */ -void daBranch_Delete(daBranch_c*) { - /* Nonmatching */ +BOOL daBranch_Delete(daBranch_c* i_this) { + i_this->~daBranch_c(); + return TRUE; } /* 00000694-0000080C .text daBranch_Create__FP10fopAc_ac_c */ @@ -153,13 +220,30 @@ s32 daBranch_Create(fopAc_ac_c* i_this) { if (solidHeapResult & 0xFF == 0) { for (int i = 0; i < 2; i++) { - //branch->mBase.m + branch->mAnims[i] = 0; } state = cPhs_ERROR_e; } else { + branch->mCullMtx = branch->mModels[0]->mBaseTransformMtx; + fopAcM_setCullSizeBox(i_this, 0.0f, 0.0f, -50.0f, 300.0f, 100.0f, 50.0f); + + branch->m02B8 = 6; + branch->m02BC = 0; + branch->m02BD = 0; + for (int i = 0; i < 2; i++) { + J3DModelData* modelData = branch->mModels[i]->mModelData; + + for (int j = 0; j < modelData->getMaterialNum(); j++) { + J3DMaterial* mat = modelData->getMaterialNodePointer(j); + if (mat) { + J3DFog* fog = mat->getPEBlock()->getFog(); + fog->field_0x0 = 2; + } + } + } } } diff --git a/src/d/actor/d_a_magma.cpp b/src/d/actor/d_a_magma.cpp index 7fa484d2d..cf428ba22 100644 --- a/src/d/actor/d_a_magma.cpp +++ b/src/d/actor/d_a_magma.cpp @@ -3,21 +3,78 @@ // Translation Unit: d_a_magma.cpp // -#include "d_a_magma.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/d_magma.h" #include "dolphin/types.h" + +class daMagma_c : public fopAc_ac_c { +public: + ~daMagma_c() { + dComIfG_resDelete(&mPhs, "Magma"); + } + + request_of_phase_process_class mPhs; +}; + /* 00000078-00000080 .text daMagma_IsDelete__FP9daMagma_c */ -void daMagma_IsDelete(daMagma_c*) { - /* Nonmatching */ +BOOL daMagma_IsDelete(daMagma_c* i_this) { + return TRUE; } /* 00000080-000000CC .text daMagma_Delete__FP9daMagma_c */ -void daMagma_Delete(daMagma_c*) { - /* Nonmatching */ +BOOL daMagma_Delete(daMagma_c* i_this) { + i_this->~daMagma_c(); + return TRUE; } /* 000000CC-00000178 .text daMagma_Create__FP10fopAc_ac_c */ -void daMagma_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daMagma_Create(fopAc_ac_c* i_this) { + daMagma_c* magma = static_cast(i_this); + + fopAcM_SetupActor(magma, daMagma_c); + + int result = dComIfG_resLoad(&magma->mPhs, "Magma"); + if (result != cPhs_COMPLEATE_e) { + return result; + } + + if (g_dComIfG_gameInfo.play.createMagma()) { + g_dComIfG_gameInfo.play.mpMagmaPacket->newFloor( + magma->current.pos, + magma->mScale, + magma->getRoomNo(), + magma->mBase.mParameters + ); + } + + return cPhs_ERROR_e; } +static actor_method_class l_daMagma_Method = { + (process_method_func)daMagma_Create, + (process_method_func)daMagma_Delete, + (process_method_func)0, + (process_method_func)daMagma_IsDelete, + (process_method_func)0, +}; + +extern actor_process_profile_definition g_profile_MAGMA = { + fpcLy_CURRENT_e, + 7, + fpcPi_CURRENT_e, + PROC_MAGMA, + &g_fpcLf_Method.mBase, + sizeof(daMagma_c), + 0, + 0, + &g_fopAc_Method.base, + 0x01BC, + &l_daMagma_Method, + 0x00040180, + fopAc_ACTOR_e, + fopAc_CULLBOX_0_e +};