diff --git a/configure.py b/configure.py index 858100aa0..e98e791c8 100755 --- a/configure.py +++ b/configure.py @@ -1665,7 +1665,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_homensmoke", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_hsehi1"), ActorRel(NonMatching, "d_a_obj_htetu1"), - ActorRel(NonMatching, "d_a_obj_iceisland"), + ActorRel(Matching, "d_a_obj_iceisland", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_jump"), ActorRel(NonMatching, "d_a_obj_kanoke"), ActorRel(Equivalent, "d_a_obj_ladder", extra_cflags=['-pragma "nosyminline on"']), # weak func order diff --git a/include/d/actor/d_a_obj_iceisland.h b/include/d/actor/d_a_obj_iceisland.h index eb460ad2e..285433981 100644 --- a/include/d/actor/d_a_obj_iceisland.h +++ b/include/d/actor/d_a_obj_iceisland.h @@ -2,6 +2,8 @@ #define D_A_OBJ_ICEISLAND_H #include "f_op/f_op_actor.h" +#include "d/d_particle.h" +#include "f_op/f_op_actor_mng.h" class daObjIceisland_c : public fopAc_ac_c { public: @@ -10,7 +12,7 @@ public: inline bool _draw(); inline bool _execute(); - void CreateHeap(); + BOOL CreateHeap(); void daObjIceisland_particle_set(); void CreateInit(); void set_mtx(); @@ -24,7 +26,23 @@ public: void daObjIceisland_fail_demo_main(); public: - /* Place member variables here */ + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ mDoExt_btkAnm mBtkAnm1; + /* 0x2B0 */ mDoExt_btkAnm mBtkAnm2; + /* 0x2C4 */ mDoExt_brkAnm mBrkAnm; + /* 0x2DC */ JPABaseEmitter* mEmitter1; + /* 0x2E0 */ JPABaseEmitter* mEmitter2; + /* 0x2E4 */ dKy_tevstr_c mTevStr; + /* 0x394 */ u8 field_0x394[0x396 - 0x394]; + /* 0x396 */ s16 field_0x396; + /* 0x398 */ s16 mMeltIceEventIdx; + /* 0x39A */ s16 mFreezeIceEventIdx; + /* 0x39C */ int field_0x39C; +}; // Size: 0x3A0 + +namespace daObjIceisland_prm { + inline u8 getSwitchNo(daObjIceisland_c* ac) { return (fopAcM_GetParam(ac) >> 8) & 0xFF; } }; #endif /* D_A_OBJ_ICEISLAND_H */ diff --git a/src/d/actor/d_a_obj_iceisland.cpp b/src/d/actor/d_a_obj_iceisland.cpp index a25e06a5d..bc9ab4adc 100644 --- a/src/d/actor/d_a_obj_iceisland.cpp +++ b/src/d/actor/d_a_obj_iceisland.cpp @@ -5,95 +5,272 @@ #include "d/actor/d_a_obj_iceisland.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/res/res_gicel.h" +#include "JSystem/JKernel/JKRExpHeap.h" /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 00000098-00000338 .text CreateHeap__16daObjIceisland_cFv */ -void daObjIceisland_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjIceisland_c::CreateHeap() { + mDoExt_getGameHeap()->check(); + + J3DModelData* model_data = (J3DModelData*)(dComIfG_getObjectRes("GiceL", GICEL_BDL_GICEL00)); + JUT_ASSERT(0x66, model_data != NULL); + mpModel = mDoExt_J3DModel__create(model_data, 0, 0x11020203); + + J3DAnmTextureSRTKey* btk1 = static_cast(dComIfG_getObjectRes("GiceL", GICEL_BTK_GICEL00_01)); + JUT_ASSERT(0x6D, btk1 != NULL); + int result1 = mBtkAnm1.init(model_data, btk1, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0); + + J3DAnmTextureSRTKey* btk2 = static_cast(dComIfG_getObjectRes("GiceL", GICEL_BTK_GICEL00_02)); + JUT_ASSERT(0x73, btk2 != NULL); + int result2 = mBtkAnm2.init(model_data, btk2, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0); + + J3DAnmTevRegKey * brk = static_cast(dComIfG_getObjectRes("GiceL", GICEL_BRK_GICEL00)); + JUT_ASSERT(0x7A, brk != NULL); + int result3 = mBrkAnm.init(model_data, brk, true, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, 0); + return((mpModel != NULL) && (result1 != 0) && (result2 != 0) && (result3 != 0)); } /* 00000338-00000410 .text daObjIceisland_particle_set__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_particle_set() { - /* Nonmatching */ + if(mEmitter1 == NULL) { + mEmitter1 = dComIfGp_particle_set(dPa_name::ID_SCENE_81AA, ¤t.pos, ¤t.angle); + } + if(mEmitter2 == NULL) { + mEmitter2 = dComIfGp_particle_set(dPa_name::ID_SCENE_81AB, ¤t.pos, ¤t.angle); + } } /* 00000410-00000588 .text CreateInit__16daObjIceisland_cFv */ void daObjIceisland_c::CreateInit() { - /* Nonmatching */ + cullMtx = mpModel->getBaseTRMtx(); + cullSizeFar = 1.0f; + set_mtx(); + dKy_tevstr_init(&mTevStr, fopAcM_GetHomeRoomNo(this), 0xFF); + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &mTevStr); + mEmitter1 = NULL; + mEmitter2 = NULL; + u8 switchNo = daObjIceisland_prm::getSwitchNo(this); + if(fopAcM_isSwitch(this, switchNo)){ + mBrkAnm.setFrame(mBrkAnm.getEndFrame()); + if(dComIfGs_getStartPoint() == 2 && current.roomNo == dComIfGs_getRestartRoomNo()){ + field_0x39C = 6; + }else { + field_0x39C = 3; + } + field_0x396 = 0; + } else{ + daObjIceisland_particle_set(); + field_0x39C = 0; + field_0x396 = 100; + } + mMeltIceEventIdx = dComIfGp_evmng_getEventIdx("MELT_ICE"); + mFreezeIceEventIdx = dComIfGp_evmng_getEventIdx("FREEZE_ICE"); } /* 00000588-00000608 .text set_mtx__16daObjIceisland_cFv */ void daObjIceisland_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_trans(mDoMtx_stack_c::now, current.pos.x, current.pos.y, current.pos.z); + mDoMtx_YrotM(mDoMtx_stack_c::now, current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000608-0000067C .text daObjIceisland_freeze_main__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_freeze_main() { - /* Nonmatching */ + u8 switchNo = daObjIceisland_prm::getSwitchNo(this); + if(fopAcM_isSwitch(this, switchNo)){ + fopAcM_orderOtherEventId(this, mMeltIceEventIdx, 0xffff); + field_0x39C = 1; + } } /* 0000067C-00000774 .text daObjIceisland_melt_demo_wait__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_melt_demo_wait() { - /* Nonmatching */ + if(eventInfo.mCommand == dEvtCmd_INDEMO_e){ + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + JPABaseEmitter* emitter = mEmitter1; + if(emitter != NULL) { + emitter->becomeInvalidEmitter(); + mEmitter1 = NULL; + } + emitter = mEmitter2; + if(emitter != NULL){ + emitter->becomeInvalidEmitter(); + mEmitter2 = NULL; + } + mBrkAnm.setPlaySpeed(1.0f); + field_0x39C = 2; + } else { + fopAcM_orderOtherEventId(this,mMeltIceEventIdx,0xffff); + } } /* 00000774-000007DC .text daObjIceisland_melt_demo__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_melt_demo() { - /* Nonmatching */ + mBrkAnm.play(); + if (dComIfGp_evmng_endCheck(mMeltIceEventIdx)) { + dComIfGp_event_reset(); + field_0x39C = 3; + } } /* 000007DC-00000850 .text daObjIceisland_melt_main__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_melt_main() { - /* Nonmatching */ + u8 switchNo = daObjIceisland_prm::getSwitchNo(this); + if(!fopAcM_isSwitch(this, switchNo)){ + fopAcM_orderOtherEventId(this,mFreezeIceEventIdx,0xffff); + field_0x39C = 4; + } } /* 00000850-000008C0 .text daObjIceisland_freeze_demo_wait__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_freeze_demo_wait() { - /* Nonmatching */ + if(eventInfo.mCommand == dEvtCmd_INDEMO_e){ + daObjIceisland_particle_set(); + mBrkAnm.setPlaySpeed(-1.0f); + field_0x39C = 5; + } + else { + fopAcM_orderOtherEventId(this, mFreezeIceEventIdx, 0xffff); + } } /* 000008C0-00000928 .text daObjIceisland_freeze_demo__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_freeze_demo() { - /* Nonmatching */ + mBrkAnm.play(); + if (dComIfGp_evmng_endCheck(mFreezeIceEventIdx)) { + dComIfGp_event_reset(); + field_0x39C = 0; + } } /* 00000928-00000994 .text daObjIceisland_fail_demo_wait__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_fail_demo_wait() { - /* Nonmatching */ + u8 switchNo = daObjIceisland_prm::getSwitchNo(this); + if(!fopAcM_isSwitch(this, switchNo)){ + daObjIceisland_particle_set(); + mBrkAnm.setPlaySpeed(1.0f); + field_0x39C = 7; + } } /* 00000994-000009B8 .text daObjIceisland_fail_demo_main__16daObjIceisland_cFv */ void daObjIceisland_c::daObjIceisland_fail_demo_main() { - /* Nonmatching */ + mBrkAnm.play(); +} + +cPhs_State daObjIceisland_c::_create(){ + fopAcM_SetupActor(this, daObjIceisland_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "GiceL"); + if (phase_state == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x13D0)) { + return cPhs_ERROR_e; + } else { + CreateInit(); + } + } + return phase_state; +} + +bool daObjIceisland_c::_delete(){ + dComIfG_resDelete(&mPhs, "GiceL"); + return true; +} + +bool daObjIceisland_c::_draw(){ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &mTevStr); + g_env_light.settingTevStruct(TEV_TYPE_BG2, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mBtkAnm1.entry(mpModel->getModelData()); + mBtkAnm2.entry(mpModel->getModelData()); + mBrkAnm.entry(mpModel->getModelData()); + mDoExt_modelUpdateDL(mpModel); + return true; +} + +bool daObjIceisland_c::_execute(){ + switch(field_0x39C) { + case 0: + daObjIceisland_freeze_main(); + break; + case 1: + daObjIceisland_melt_demo_wait(); + break; + case 2: + daObjIceisland_melt_demo(); + break; + case 3: + daObjIceisland_melt_main(); + break; + case 4: + daObjIceisland_freeze_demo_wait(); + break; + case 5: + daObjIceisland_freeze_demo(); + break; + case 6: + daObjIceisland_fail_demo_wait(); + break; + case 7: + daObjIceisland_fail_demo_main(); + break; + } + mBtkAnm1.play(); + mBtkAnm2.play(); + set_mtx(); + u8 switchNo = daObjIceisland_prm::getSwitchNo(this); + if(fopAcM_isSwitch(this, switchNo)){ + if(field_0x396 > 0){ + field_0x396--; + } + } else if(field_0x396 < 100){ + field_0x396++; + } + fopAcM_seStartCurrent(this, JA_SE_ATM_ICEBERG_WIND, field_0x396); + JPABaseEmitter* emitter = mEmitter1; + if(emitter != NULL) { + + u8 colorK0R = (mTevStr.mColorK0.r / 2) + 0x80; + u8 colorK0G = (mTevStr.mColorK0.g / 2) + 0x80; + u8 colorK0B = (mTevStr.mColorK0.b / 2) + 0x80; + + emitter->setGlobalPrmColor(colorK0R, colorK0G, colorK0B); + emitter = mEmitter1; + emitter->setGlobalEnvColor(colorK0R, colorK0G, colorK0B); + + } + return true; } /* 000009B8-00000B2C .text daObjIceisland_Create__FPv */ -static cPhs_State daObjIceisland_Create(void*) { - /* Nonmatching */ +static cPhs_State daObjIceisland_Create(void* i_this) { + return static_cast(i_this)->_create(); } /* 00000C2C-00000C5C .text daObjIceisland_Delete__FPv */ -static BOOL daObjIceisland_Delete(void*) { - /* Nonmatching */ +static BOOL daObjIceisland_Delete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00000C5C-00000D2C .text daObjIceisland_Draw__FPv */ -static BOOL daObjIceisland_Draw(void*) { - /* Nonmatching */ +static BOOL daObjIceisland_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00000D2C-00000EC0 .text daObjIceisland_Execute__FPv */ -static BOOL daObjIceisland_Execute(void*) { - /* Nonmatching */ +static BOOL daObjIceisland_Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00000EC0-00000EC8 .text daObjIceisland_IsDelete__FPv */ static BOOL daObjIceisland_IsDelete(void*) { - /* Nonmatching */ + return TRUE; } static actor_method_class daObj_IceislandMethodTable = {