diff --git a/configure.py b/configure.py index 1843657f8..978427446 100755 --- a/configure.py +++ b/configure.py @@ -1440,7 +1440,7 @@ config.libs = [ ActorRel(Equivalent, "d_a_rd", extra_cflags=['-pragma "nosyminline on"']), # weak func order ActorRel(Matching, "d_a_rectangle"), ActorRel(Equivalent, "d_a_salvage"), # weak func order - ActorRel(NonMatching, "d_a_sbox"), + ActorRel(Matching, "d_a_sbox", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_sk"), ActorRel(NonMatching, "d_a_sk2"), ActorRel(Matching, "d_a_spotbox"), diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index afff15aff..041999520 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -322,7 +322,7 @@ public: void isContinuousParticle() {} void loadTexture(u8, GXTexMapID) {} void setEmitterRotation(const JGeometry::TVec3&) {} - void setGlobalParticleHeightScale(f32) {} + void setGlobalParticleHeightScale(f32 y) { mGlobalParticleScale.y = y; } void setGlobalParticleScale(f32, f32) {} void setGlobalParticleWidthScale(f32) {} diff --git a/include/d/actor/d_a_sbox.h b/include/d/actor/d_a_sbox.h index 9a777bcf8..ce21e3511 100644 --- a/include/d/actor/d_a_sbox.h +++ b/include/d/actor/d_a_sbox.h @@ -2,39 +2,61 @@ #define D_A_SBOX_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_particle.h" class daSbox_c : public fopAc_ac_c { public: - void chkFlag(unsigned short) {} - void clrFlag(unsigned short) {} + bool chkFlag(unsigned short flg) { return (m34E & flg) == flg; } + void clrFlag(unsigned short flg) { m34E &= ~flg; } inline BOOL draw(); inline BOOL execute(); - void setAction(unsigned char) {} - void setFlag(unsigned short) {} + void setAction(unsigned char action) { m2EC = action; } + void setFlag(unsigned short flg) { m34E |= flg; } - void CreateHeap(); + BOOL CreateHeap(); void calcMtx(); void shipMtx(); - void volmProc(); - void darkProc(); - void lightProc(); + BOOL volmProc(); + BOOL darkProc(); + BOOL lightProc(); void lightInit(); - void CreateInit(); + BOOL CreateInit(); cPhs_State create(); void demoInitWait(); - void demoProcWait(); + BOOL demoProcWait(); void demoInitOpen(); void demoProcOpen(); void demoInitDelete(); void demoProcDelete(); void demoInitCom(); void demoProcCom(); - void getNowEventAction(); - void demoProc(); - void actionWait(); + s32 getNowEventAction(); + BOOL demoProc(); + BOOL actionWait(); + + static const char M_arcname[]; public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhase; + /* 0x2AC */ J3DModel* mpModel1; + /* 0x29C */ mDoExt_bckAnm mBck1; + /* 0x2AC */ J3DModel* mpModel2; + /* 0x2B0 */ mDoExt_bckAnm mBck2; + /* 0x2C0 */ mDoExt_btkAnm mBtk; + /* 0x2D4 */ mDoExt_brkAnm mBrk; + /* 0x2EC */ u8 m2EC; + /* 0x2ED */ u8 m2ED[0x2F4 - 0x2ED]; + /* 0x2F4 */ s16 m2F4; + /* 0x2F8 */ s32 m2F8; + /* 0x2FC */ JPABaseEmitter* mEmitter; + /* 0x300 */ s16 m300; + /* 0x304 */ f32 m304; + /* 0x308 */ s16 m308; + /* 0x30C */ LIGHT_INFLUENCE m30C; + /* 0x32C */ LIGHT_INFLUENCE m32C; + /* 0x34C */ s16 m34C; + /* 0x34E */ u16 m34E; +}; // size = 0x350 #endif /* D_A_SBOX_H */ diff --git a/src/d/actor/d_a_sbox.cpp b/src/d/actor/d_a_sbox.cpp index 829562fc9..6ea83eeb0 100644 --- a/src/d/actor/d_a_sbox.cpp +++ b/src/d/actor/d_a_sbox.cpp @@ -4,122 +4,503 @@ // #include "d/actor/d_a_sbox.h" +#include "d/actor/d_a_ship.h" +#include "d/res/res_dalways.h" #include "d/d_procname.h" +#include "d/d_kankyo.h" #include "d/d_priority.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_actor_mng.h" + +const char daSbox_c::M_arcname[] = "Dalways"; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daSbox_c*)a_this)->CreateHeap(); } /* 00000098-0000034C .text CreateHeap__8daSbox_cFv */ -void daSbox_c::CreateHeap() { - /* Nonmatching */ +BOOL daSbox_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)(dComIfG_getObjectRes("Dalways", DALWAYS_BDL_BOXSEA)); + JUT_ASSERT(113, modelData != NULL); + + if (!mBck1.init(modelData, (J3DAnmTransform*)(dComIfG_getObjectRes("Dalways", DALWAYS_BCK_BOXOPENBOX)), true, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false)) + { + return FALSE; + } + + mpModel1 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + if (mpModel1 == NULL) { + return FALSE; + } + + J3DModelData* flashModelData = (J3DModelData*)(dComIfG_getObjectRes("Dalways", DALWAYS_BDL_IT_TAKARA_FLASH)); + JUT_ASSERT(140, flashModelData != NULL); + + mpModel2 = mDoExt_J3DModel__create(flashModelData, 0x80000, 0x1000200); + if (mpModel2 == NULL) { + return FALSE; + } + + if (!mBck2.init( + flashModelData, + (J3DAnmTransform*)(dComIfG_getObjectRes("Dalways", DALWAYS_BCK_IT_TAKARA_FLASH2)), + true, + J3DFrameCtrl::EMode_NONE, + 1.0f, + 0, + -1, + false + )) + { + return FALSE; + } + + if (!mBtk.init( + flashModelData, + (J3DAnmTextureSRTKey*)(dComIfG_getObjectRes("Dalways", DALWAYS_BTK_IT_TAKARA_FLASH)), + true, + J3DFrameCtrl::EMode_NONE, + 1.0f, + 0, + -1, + false, + 0 + )) + { + return FALSE; + } + + if (!mBrk.init( + flashModelData, + (J3DAnmTevRegKey*)(dComIfG_getObjectRes("Dalways", DALWAYS_BRK_IT_TAKARA_FLASH)), + true, + J3DFrameCtrl::EMode_NONE, + 1.0f, + 0, + -1, + false, + 0 + )) + { + return FALSE; + } + + calcMtx(); + return TRUE; } /* 0000034C-00000430 .text calcMtx__8daSbox_cFv */ void daSbox_c::calcMtx() { - /* Nonmatching */ + mpModel1->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel1->setBaseTRMtx(mDoMtx_stack_c::get()); + + mpModel2->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 50.0f, current.pos.z); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel2->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000430-00000598 .text shipMtx__8daSbox_cFv */ void daSbox_c::shipMtx() { - /* Nonmatching */ + daShip_c* ship = dComIfGp_getShipActor(); + if (ship == NULL) { + JUT_ASSERT(220, FALSE); + } + mDoMtx_stack_c::copy(ship->getBodyMtx()); + mDoMtx_stack_c::transM(0.0f, 22.35f, 20.0f); + mDoMtx_stack_c::YrotM(0x7fff); + mpModel1->setBaseTRMtx(mDoMtx_stack_c::get()); + + mDoMtx_multVecZero(mDoMtx_stack_c::get(), ¤t.pos); + + attention_info.position = current.pos; + eyePos = current.pos; + current.angle.y = ship->shape_angle.y + 0x7fff; + shape_angle.y = ship->shape_angle.y; + + mDoMtx_stack_c::copy(ship->getBodyMtx()); + mDoMtx_stack_c::transM(0.0f, 72.35f, 20.0f); + mpModel2->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000598-0000062C .text volmProc__8daSbox_cFv */ -void daSbox_c::volmProc() { - /* Nonmatching */ +BOOL daSbox_c::volmProc() { + if (mEmitter == NULL) { + return TRUE; + } + m300++; + if (m300 == 0x24) { + mEmitter->setGlobalAlpha(0xff); + } else { + if (m300 >= 0xb5) { + mEmitter->setGlobalAlpha(0); + mEmitter->becomeInvalidEmitter(); + mEmitter = NULL; + return TRUE; + } + + if (m300 > 0x9c) { + u8 tmp = 10; + mEmitter->setGlobalAlpha((0xB5 - m300) * tmp); + } + } + return FALSE; } /* 0000062C-00000700 .text darkProc__8daSbox_cFv */ -void daSbox_c::darkProc() { - /* Nonmatching */ +BOOL daSbox_c::darkProc() { + BOOL ret; + + if (!chkFlag(0x10)) { + return TRUE; + } + + m308++; + if (m308 > 0x96) { + m304 = 1.0f; + dKy_set_allcol_ratio(1.0f); + clrFlag(0x10); + ret = 1; + } else { + if (m308 > 0x78) { + f32 tmp = (m308 - 120.0f) / 30.0f; + m304 = tmp * 0.6f + 0.4f; + } + dKy_set_allcol_ratio(m304); + ret = 0; + } + return ret; } /* 00000700-000007F4 .text lightProc__8daSbox_cFv */ -void daSbox_c::lightProc() { - /* Nonmatching */ +BOOL daSbox_c::lightProc() { + if (!chkFlag(0x20)) { + return TRUE; + } + + m34C++; + if (m34C < 0x9c) { + if (m30C.mPower < 130.0f) { + m30C.mPower += 13.0f; + } + + if (m32C.mPower < 120.0f) { + m32C.mPower += 12.0f; + } + } else { + if (m30C.mPower > 5.2f) { + m30C.mPower -= 5.2f; + } else { + m30C.mPower = 0.0f; + } + + if (m32C.mPower > 4.8f) { + m32C.mPower -= 4.8f; + } else { + m32C.mPower = 0.0f; + } + + if (m30C.mPower == 0.0f && m32C.mPower == 0.0f) { + clrFlag(0x20); + return TRUE; + } + } + return FALSE; } /* 000007F4-000008BC .text lightInit__8daSbox_cFv */ void daSbox_c::lightInit() { - /* Nonmatching */ + m30C.mPos.set(current.pos.x, current.pos.y + 55.0f, current.pos.z); + m30C.mColor.r = 0xff; + m30C.mColor.g = 0xff; + m30C.mColor.b = 0xff; + m30C.mPower = 0.0f; + m30C.mFluctuation = 0.0f; + + m32C.mPos.set(current.pos.x, current.pos.y + 50.0f, current.pos.z); + m32C.mColor.r = 0xff; + m32C.mColor.g = 0xff; + m32C.mColor.b = 100; + m32C.mPower = 0.0f; + m32C.mFluctuation = 0.0f; + + setFlag(0x20); + m34C = 0; + dKy_plight_priority_set(&m30C); + dKy_efplight_set(&m32C); } /* 000008BC-000008F0 .text CreateInit__8daSbox_cFv */ -void daSbox_c::CreateInit() { - /* Nonmatching */ +BOOL daSbox_c::CreateInit() { + tevStr.mRoomNo = current.roomNo; + setAction(0); + calcMtx(); + return TRUE; } /* 000008F0-000009F0 .text create__8daSbox_cFv */ cPhs_State daSbox_c::create() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); + if (PVar1 != cPhs_COMPLEATE_e) { + return PVar1; + } + fopAcM_SetupActor(this, daSbox_c); +#else + fopAcM_SetupActor(this, daSbox_c); + cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); + if (PVar1 != cPhs_COMPLEATE_e) { + return PVar1; + } +#endif + + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x15C0)) { + return cPhs_ERROR_e; + } + + CreateInit(); + return cPhs_COMPLEATE_e; } /* 00000B4C-00000BB4 .text demoInitWait__8daSbox_cFv */ void daSbox_c::demoInitWait() { - /* Nonmatching */ + int* puVar1 = dComIfGp_evmng_getMyIntegerP(m2F8, "Timer"); + if (puVar1 != NULL) { + m2F4 = *puVar1; + } else { + m2F4 = 0; + } } /* 00000BB4-00000C04 .text demoProcWait__8daSbox_cFv */ -void daSbox_c::demoProcWait() { - /* Nonmatching */ +BOOL daSbox_c::demoProcWait() { + if (m2F4 > 0) { + m2F4--; + } else { + dComIfGp_evmng_cutEnd(m2F8); + } + return FALSE; } /* 00000C04-00000F1C .text demoInitOpen__8daSbox_cFv */ void daSbox_c::demoInitOpen() { - /* Nonmatching */ + mBck1.setPlaySpeed(1.0f); + mBck2.setPlaySpeed(1.0f); + mBtk.setPlaySpeed(1.0f); + mBrk.setPlaySpeed(1.0f); + + fopAcM_seStart(this, JA_SE_OBJ_TBOX_OPEN_S1, 0); + fopAcM_seStart(this, JA_SE_OBJ_TBOX_UNLOCK, 0); + + mDoAud_subBgmStart(JA_BGM_OPEN_BOX); + setFlag(2); + + dComIfGp_particle_set(dPa_name::ID_COMMON_01F1, ¤t.pos, ¤t.angle); + dComIfGp_particle_set(dPa_name::ID_COMMON_01F2, ¤t.pos, ¤t.angle); + dComIfGp_particle_set(dPa_name::ID_COMMON_01F6, ¤t.pos, ¤t.angle); + + cXyz scale; + scale.set(0.7f, 1.0f, 1.0f); + + JPABaseEmitter* pJVar1 = dComIfGp_particle_set(dPa_name::ID_COMMON_01F3, ¤t.pos, ¤t.angle); + if (pJVar1 != NULL) { + pJVar1->setEmitterScale(scale); + } + + JPABaseEmitter* pJVar2 = dComIfGp_particle_set(dPa_name::ID_COMMON_01F4, ¤t.pos, ¤t.angle); + if (pJVar2 != NULL) { + pJVar2->setEmitterScale(scale); + } + + mEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_01F5, ¤t.pos, ¤t.angle); + if (mEmitter != NULL) { + m300 = 0; + mEmitter->setGlobalAlpha(0); + mEmitter->setGlobalParticleHeightScale(0.7f); + } + + setFlag(0x10); + m304 = 0.4f; + m308 = 0; + lightInit(); } /* 00000F1C-00000FE4 .text demoProcOpen__8daSbox_cFv */ void daSbox_c::demoProcOpen() { - /* Nonmatching */ + if (chkFlag(1)) { + if (mBck1.play()) { + fopAcM_seStart(this, JA_SE_OBJ_TBOX_OPEN_S2, 0); + dComIfGp_evmng_cutEnd(m2F8); + clrFlag(1); + } + } else { + dComIfGp_evmng_cutEnd(m2F8); + } } /* 00000FE4-0000107C .text demoInitDelete__8daSbox_cFv */ void daSbox_c::demoInitDelete() { - /* Nonmatching */ + if (chkFlag(2)) { + if (mEmitter != NULL) { + mEmitter->becomeInvalidEmitter(); + mEmitter = NULL; + } + + if (chkFlag(0x10)) { + dKy_set_allcol_ratio(1.0f); + clrFlag(0x10); + } + } + + dKy_plight_cut(&m30C); + dKy_efplight_cut(&m32C); } /* 0000107C-000010B0 .text demoProcDelete__8daSbox_cFv */ void daSbox_c::demoProcDelete() { - /* Nonmatching */ + dComIfGp_evmng_cutEnd(m2F8); } /* 000010B0-00001110 .text demoInitCom__8daSbox_cFv */ void daSbox_c::demoInitCom() { - /* Nonmatching */ + if (dComIfGp_evmng_getMyIntegerP(m2F8, "DISP") != NULL) { + setFlag(8); + } } /* 00001110-000011F8 .text demoProcCom__8daSbox_cFv */ void daSbox_c::demoProcCom() { - /* Nonmatching */ + if (chkFlag(2)) { + BOOL iVar1 = mBck2.play(); + BOOL iVar2 = mBtk.play(); + BOOL iVar3 = mBrk.play(); + + if ((s32)mBck2.getFrame() == 36) { + setFlag(4); + } + + BOOL iVar4 = volmProc(); + BOOL iVar5 = darkProc(); + BOOL iVar6 = lightProc(); + if (iVar1 && iVar2 && iVar3 && iVar4 && iVar5 && iVar6) { + clrFlag(2 | 4); + } + } } /* 000011F8-00001240 .text getNowEventAction__8daSbox_cFv */ -void daSbox_c::getNowEventAction() { - /* Nonmatching */ +s32 daSbox_c::getNowEventAction() { + static char* action_table[] = {"WAIT", "OPEN", "DELETE"}; + + return dComIfGp_evmng_getMyActIdx(m2F8, action_table, ARRAY_SIZE(action_table), 0, 1); } /* 00001240-00001388 .text demoProc__8daSbox_cFv */ -void daSbox_c::demoProc() { - /* Nonmatching */ +BOOL daSbox_c::demoProc() { + m2F8 = dComIfGp_evmng_getMyStaffId("tkrSlv"); + if (m2F8 == -1) { + return FALSE; + } + + s32 iVar1 = getNowEventAction(); + + if (dComIfGp_evmng_getIsAddvance(m2F8)) { + setFlag(1); + demoInitCom(); + + switch (iVar1) { + case 0: + demoInitWait(); + break; + + case 1: + demoInitOpen(); + break; + + case 2: + demoInitDelete(); + break; + } + } + + switch (iVar1) { + case 0: + demoProcWait(); + break; + + case 1: + demoProcOpen(); + break; + + case 2: + demoProcDelete(); + break; + + default: + dComIfGp_evmng_cutEnd(m2F8); + break; + } + + demoProcCom(); + return TRUE; } /* 00001388-000013D0 .text actionWait__8daSbox_cFv */ -void daSbox_c::actionWait() { - /* Nonmatching */ +BOOL daSbox_c::actionWait() { + shipMtx(); + if (!demoProc()) { + fopAcM_delete(this); + } + return TRUE; +} + +BOOL daSbox_c::draw() { + fopAc_ac_c* a_this = this; + + J3DModelData* pJVar1 = mpModel1->getModelData(); + if (!chkFlag(8)) { + return TRUE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &a_this->tevStr); + g_env_light.setLightTevColorType(mpModel1, &a_this->tevStr); + + mBck1.entry(pJVar1); + mDoExt_modelUpdateDL(mpModel1); + + if (chkFlag(4)) { + pJVar1 = mpModel2->getModelData(); + mBck2.entry(pJVar1); + mBtk.entry(pJVar1); + mBrk.entry(pJVar1); + + dComIfGd_setListMaskOff(); + mDoExt_modelUpdateDL(mpModel2); + dComIfGd_setList(); + } + return TRUE; } /* 000013D0-00001500 .text daSbox_Draw__FP8daSbox_c */ -static BOOL daSbox_Draw(daSbox_c*) { - /* Nonmatching */ +static BOOL daSbox_Draw(daSbox_c* i_this) { + return ((daSbox_c*)i_this)->draw(); +} + +BOOL daSbox_c::execute() { + switch (m2EC) { + case 0: + actionWait(); + break; + } + return TRUE; } /* 00001500-00001534 .text daSbox_Execute__FP8daSbox_c */ -static BOOL daSbox_Execute(daSbox_c*) { - /* Nonmatching */ +static BOOL daSbox_Execute(daSbox_c* i_this) { + return ((daSbox_c*)i_this)->execute(); } /* 00001534-0000153C .text daSbox_IsDelete__FP8daSbox_c */ @@ -128,13 +509,16 @@ static BOOL daSbox_IsDelete(daSbox_c*) { } /* 0000153C-00001640 .text daSbox_Delete__FP8daSbox_c */ -static BOOL daSbox_Delete(daSbox_c*) { - /* Nonmatching */ +static BOOL daSbox_Delete(daSbox_c* i_this) { + dComIfG_resDeleteDemo(&i_this->mPhase, daSbox_c::M_arcname); + mDoAud_seDeleteObject(&i_this->eyePos); + i_this->~daSbox_c(); + return TRUE; } /* 00001640-00001660 .text daSbox_Create__FP10fopAc_ac_c */ -static cPhs_State daSbox_Create(fopAc_ac_c* i_this) { - return ((daSbox_c*)i_this)->create(); +static cPhs_State daSbox_Create(fopAc_ac_c* a_this) { + return ((daSbox_c*)a_this)->create(); } static actor_method_class l_daSbox_Method = {