From 4ebe6758cb08b4cd12b598d02b62de0df2c4b659 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sat, 26 Jul 2025 01:37:17 +0100 Subject: [PATCH] d_a_ep (#819) --- configure.py | 2 +- include/d/actor/d_a_ep.h | 45 +-- src/d/actor/d_a_ep.cpp | 623 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 619 insertions(+), 51 deletions(-) diff --git a/configure.py b/configure.py index bd4d4b59b..159042a0b 100755 --- a/configure.py +++ b/configure.py @@ -1365,7 +1365,7 @@ config.libs = [ ActorRel(Equivalent, "d_a_door10", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_dr"), ActorRel(Equivalent, "d_a_dr2"), - ActorRel(NonMatching, "d_a_ep"), + ActorRel(Matching, "d_a_ep", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_floor"), ActorRel(Matching, "d_a_grass"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_hitobj", extra_cflags=['-pragma "nosyminline on"']), diff --git a/include/d/actor/d_a_ep.h b/include/d/actor/d_a_ep.h index b6df7a6ef..c79b39438 100644 --- a/include/d/actor/d_a_ep.h +++ b/include/d/actor/d_a_ep.h @@ -9,17 +9,30 @@ class JPABaseEmitter; struct ep_ga_s { - -}; + /* 0x00 */ J3DModel* mpModel; + /* 0x04 */ cXyz mPos; + /* 0x10 */ cXyz m10; + /* 0x1C */ cXyz m1C; + /* 0x28 */ s16 rotX; + /* 0x2A */ s16 rotY; + /* 0x2C */ char m2C[0x4]; + /* 0x30 */ f32 scaleXZ; + /* 0x34 */ f32 scaleY; + /* 0x38 */ s16 m38; + /* 0x3A */ u8 mbEnabled; + /* 0x3B */ u8 m3B; +}; // size = 0x3C -class ep_class : public fopAc_ac_c { -public: - /* 0x290 */ request_of_phase_process_class mPhsLoad_Ep; +struct ep_class { + ep_class(); + + /* 0x000 */ fopAc_ac_c actor; + /* 0x290 */ request_of_phase_process_class mPhase; /* 0x298 */ Mtx mAlphaModelMtx; /* 0x2C8 */ J3DModel* mpModel; /* 0x2CC */ dBgS_AcchCir mAcchCir; - /* 0x30C */ dBgS_Acch mAcch; - /* 0x4D0 */ int m4D0; + /* 0x30C */ dBgS_ObjAcch mAcch; + /* 0x4D0 */ s32 m4D0; /* 0x4D4 */ u8 m4D4[0x4DC - 0x4D4]; /* 0x4DC */ f32 mLightPower; /* 0x4E0 */ f32 m4E0; @@ -50,25 +63,13 @@ public: /* 0x7D6 */ u8 m7D6[0x7D8 - 0x7D6]; /* 0x7D8 */ f32 m7D8; /* 0x7DC */ s16 m7DC; - /* 0x7DE */ u8 mbHasObm; + /* 0x7DE */ s8 mbHasObm; /* 0x7DF */ u8 m7DF[0x7E0 - 0x7DF]; - /* 0x7E0 */ int m7E0; + /* 0x7E0 */ s32 m7E0; /* 0x7E4 */ u8 mbHasGa; /* 0x7E5 */ u8 m7E5[0x7E8 - 0x7E5]; /* 0x7E8 */ ep_ga_s mEpGa[2]; - /* 0x860 */ u32 m860; - /* 0x864 */ u32 m864; - /* 0x868 */ u32 m868; - /* 0x86C */ u32 m86C; - /* 0x870 */ f32 m870; - /* 0x874 */ u32 m874; - /* 0x878 */ u8 m878[0x87C - 0x878]; - /* 0x87C */ f32 m87C; - /* 0x880 */ u32 m880; - /* 0x884 */ u32 m884; - /* 0x888 */ f32 m888; - /* 0x88C */ u32 m88C; - /* 0x890 */ u32 m890; + /* 0x860 */ J3DLightInfo m860; /* 0x894 */ u8 m894[0x910 - 0x894]; /* 0x910 */ u8 mGroundCheckTimer; /* 0x911 */ u8 m911[0x914 - 0x911]; diff --git a/src/d/actor/d_a_ep.cpp b/src/d/actor/d_a_ep.cpp index 7924b3d9c..8de36b1a4 100644 --- a/src/d/actor/d_a_ep.cpp +++ b/src/d/actor/d_a_ep.cpp @@ -4,58 +4,491 @@ */ #include "d/actor/d_a_ep.h" +#include "d/res/res_ep.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" +#include "d/d_a_obj.h" +#include "d/actor/d_a_player.h" +#include "d/d_s_play.h" +#include "d/d_bg_s_lin_chk.h" +#include "m_Do/m_Do_lib.h" + + +void daEp_ToFore(ep_class* i_this) { +} + +void daEp_ToBack(ep_class* i_this) { +} /* 00000078-00000158 .text ga_draw__FP8ep_class */ -void ga_draw(ep_class*) { - /* Nonmatching */ +void ga_draw(ep_class* i_this) { + ep_ga_s* ga = i_this->mEpGa; + for (s32 i = 0; i < 2; i++, ga++) { + if (ga->mbEnabled == 1) { + MtxTrans(ga->mPos.x, ga->mPos.y, ga->mPos.z, false); + cMtx_YrotM(*calc_mtx, ga->rotY); + cMtx_XrotM(*calc_mtx, ga->rotX); + MtxScale(ga->scaleXZ, ga->scaleXZ * ga->scaleY, ga->scaleXZ, true); + MtxTrans(0.0f, -18.0f, 0.0f, true); + ga->mpModel->setBaseTRMtx(*calc_mtx); + mDoExt_modelUpdateDL(ga->mpModel); + } + } } /* 00000158-000001F8 .text ep_draw__FP8ep_class */ -void ep_draw(ep_class*) { - /* Nonmatching */ +void ep_draw(ep_class* i_this) { + GXColor color; + color.r = 0xEB; + color.g = 0x7D; + color.b = 0x0; + color.a = 0x0; + dComIfGd_setAlphaModelColor(color); + + if (REG0_S(1) == 0) { + dComIfGd_setAlphaModel(dDlst_alphaModel_c::TYPE_SPHERE, i_this->mAlphaModelMtx, i_this->mAlphaModelAlpha); + } else { + dComIfGd_setAlphaModel(dDlst_alphaModel_c::TYPE_TWO_SPHERES, i_this->mAlphaModelMtx, i_this->mAlphaModelAlpha); + } } /* 000001F8-000002E0 .text daEp_Draw__FP8ep_class */ -static BOOL daEp_Draw(ep_class*) { - /* Nonmatching */ +static BOOL daEp_Draw(ep_class* i_this) { + if ((i_this->mType == 0) || (i_this->mType == 3)) { + if (i_this->mbShouldDrawModel != 1) { + dComIfGd_setListBG(); + g_env_light.settingTevStruct(TEV_TYPE_BG0, &i_this->actor.current.pos, &i_this->actor.tevStr); + g_env_light.setLightTevColorType(i_this->mpModel, &i_this->actor.tevStr); + mDoExt_modelUpdateDL(i_this->mpModel); + dComIfGd_setList(); + } + + if (i_this->mbHasGa != 0) { + ga_draw(i_this); + } + } + + if (i_this->mbNoEp != 1) { + ep_draw(i_this); + } + return TRUE; } /* 000002E0-00000344 .text ep_switch_event_end__FP8ep_class */ -void ep_switch_event_end(ep_class*) { - /* Nonmatching */ +BOOL ep_switch_event_end(ep_class*) { + BOOL ret = FALSE; + if (dComIfGp_evmng_endCheck("SHOKUDAI_SWITCH")) { + dComIfGp_event_reset(); + ret = TRUE; + } + return ret; } /* 00000344-000003E8 .text ep_switch_event_begin__FP8ep_class */ -void ep_switch_event_begin(ep_class*) { - /* Nonmatching */ +s32 ep_switch_event_begin(ep_class* i_this) { + BOOL ret = FALSE; + if (!i_this->actor.eventInfo.checkCommandDemoAccrpt()) { + fopAcM_orderOtherEvent(&i_this->actor, "SHOKUDAI_SWITCH"); + } else { + i_this->actor.eventInfo.onCondition(dEvtCnd_UNK2_e); + ret = dComIfGp_evmng_getMyStaffId("SHOKUDAI"); + if (ret == -1) { + ep_switch_event_end(i_this); + } + } + return ret; } /* 000003E8-000004C4 .text ep_switch_event_move__FP8ep_class */ -void ep_switch_event_move(ep_class*) { - /* Nonmatching */ +BOOL ep_switch_event_move(ep_class* i_this) { + BOOL ret = FALSE; + if (dComIfGp_evmng_getIsAddvance(i_this->m7E0)) { + static char* actions[] = { "WAIT", "FIRE" }; + + ret = dComIfGp_evmng_getMyActIdx(i_this->m7E0, actions, 2, FALSE, 0); + switch (ret) { + case 1: + mDoAud_seStart(JA_SE_OBJ_TORCH_IGNITION, &i_this->mPosTop); + break; + + case 0: + default: + ret = FALSE; + dComIfGp_evmng_cutEnd(i_this->m7E0); + break; + } + } + return ret; } /* 000004C4-00000B48 .text ga_move__FP8ep_class */ -void ga_move(ep_class*) { - /* Nonmatching */ +void ga_move(ep_class* i_this) { + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + ep_ga_s* ga = &i_this->mEpGa[0]; + cXyz sp88; + cXyz sp7C; + cXyz sp70; + cXyz sp64; + cXyz sp58; + + sp88.set(0.0f, 0.0f, 10.0f); + sp58.set(10000.0f, 10000.0f, 10000.0f); + + player->getBokoFlamePos(&sp58); + + dBgS_LinChk linChk; + + for (s32 i = 0; i < 2; i++, ga++) { + if (ga->mbEnabled != 0) { + if (ga->m3B != 0) { + ga->m3B--; + } else { + ga->m3B = cM_rndF(10.0f); + ga->m1C.x = i_this->mPosTop.x + cM_rndFX(150.0f); + ga->m1C.y = i_this->mPosTop.y + cM_rndFX(100.0f); + ga->m1C.z = i_this->mPosTop.z + cM_rndFX(150.0f); + + if (i == 0) { + sp64 = sp58 - ga->mPos; + + if (sp64.abs() < 300.0f) { + ga->m1C.x = sp58.x + cM_rndFX(100.0f); + ga->m1C.y = sp58.y + cM_rndFX(100.0f); + ga->m1C.z = sp58.z + cM_rndFX(100.0f); + } + } + + if (i_this->m4D0 == 0) { + ga->m1C.y += 1000.0f; + } + + if (std::fabsf(i_this->mPosTop.y - ga->mPos.y) > 500.0f) { + ga->mbEnabled = 2; + } else { + ga->mbEnabled = 1; + } + } + + sp70 = ga->m1C - ga->mPos; + + cLib_addCalcAngleS2(&ga->rotY, cM_atan2s(sp70.x, sp70.z), 2, 0x1000); + cLib_addCalcAngleS2(&ga->rotX, -cM_atan2s(sp70.y, std::sqrtf(sp70.x * sp70.x + sp70.z * sp70.z)), 2, 0x1000); + + cMtx_YrotS(*calc_mtx, ga->rotY); + cMtx_XrotM(*calc_mtx, ga->rotX); + + MtxPosition(&sp88, &sp7C); + + ga->m10 = ga->mPos; + ga->mPos += sp7C; + + if (i_this->m7D4 != 0) { + cXyz sp4C; + + cMtx_YrotS(*calc_mtx, i_this->m7DC); + sp4C.set(0.0f, 1.0f, i_this->m7D8 * (REG0_F(9) + 5.0f)); + MtxPosition(&sp4C, &sp7C); + ga->mPos += sp7C; + + sp7C = ga->m10 + (ga->mPos - ga->m10) * 1.05f; + + linChk.Set(&ga->m10, &sp7C, &i_this->actor); + if (dComIfG_Bgsp()->LineCross(&linChk)) { + ga->mPos = linChk.GetCross(); + } + } + ga->scaleY = cM_ssin(ga->m38); + ga->m38 += 0x3E00; + } + } } /* 00000F80-0000173C .text ep_move__FP8ep_class */ -void ep_move(ep_class*) { - /* Nonmatching */ +void ep_move(ep_class* i_this) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + cXyz pos; + pos.set(i_this->mPosTop.x, i_this->mPosTop.y + -240.0f + 235.0f + 15.0f + REG6_F(0), i_this->mPosTop.z); + + switch (i_this->m4D0) { + case 0: + if (i_this->m508 != 0) { + cLib_addCalc0(&i_this->mLightPower, 0.5f, 0.05000000074505806f); + + if (i_this->mSph1.ChkTgHit()) { + cCcD_Obj* hitObj = i_this->mSph1.GetTgHitObj(); + + if (hitObj == NULL || !hitObj->ChkAtType(0x600000)) { + if (i_this->m505 != 0xff) { + i_this->mTimers[3] = i_this->m505 * 10 + 1; + } + dComIfGs_onSwitch(i_this->m508 - 1, fopAcM_GetRoomNo(&i_this->actor)); + } + } + + if (dComIfGs_isSwitch(i_this->m508 - 1, fopAcM_GetRoomNo(&i_this->actor))) { + if (i_this->mType != 3) { + if (dComIfGp_evmng_existence("SHOKUDAI_SWITCH")) { + s32 begin = ep_switch_event_begin(i_this); + i_this->m7E0 = begin; + if (begin != 0) { + i_this->m508 = 0; + if (i_this->m7E0 != -1) { + ep_switch_event_move(i_this); + } + } + break; + } + } + mDoAud_seStart(JA_SE_OBJ_TORCH_IGNITION, &i_this->mPosTop); + i_this->m508 = 0; + } + } else if (i_this->mType != 3 && i_this->m7E0 != -1) { + if (ep_switch_event_move(i_this)) { + i_this->m4D0 = 3; + i_this->m4E0 = i_this->actor.scale.x; + } + } else { + i_this->m4D0 = 3; + i_this->m4E0 = i_this->actor.scale.x; + } + break; + + case 3: + i_this->m4D0++; + + case 4: + cLib_addCalc2(&i_this->mLightPower, i_this->m4E0, 0.5f, 0.2f); + if (i_this->mType != 2) { + if (i_this->m7D4 < (s16)(REG0_S(7) + 7)) { + dComIfGp_particle_setSimple(1, &pos); + if (i_this->m7D4 == 0 && i_this->mSph1.ChkTgHit()) { + cCcD_Obj* hitObj = i_this->mSph1.GetTgHitObj(); + + if (hitObj != NULL && hitObj->ChkAtType(0x600000)) { + fopAc_ac_c* ac = hitObj->GetAc(); + + if (fopAcM_GetName(ac) == PROC_BDK) { + i_this->m7DC = ac->shape_angle.y; + } else { + i_this->m7DC = player->shape_angle.y; + } + i_this->m7D4 = REG0_S(2) + 40; + } + } + } + + pos.y += 20.0f; + dComIfGp_particle_setSimple(0x4004, &pos); + } + + if (i_this->mTimers[3] == 1 && (i_this->m507 == 0xFF || !dComIfGs_isSwitch(i_this->m507, fopAcM_GetRoomNo(&i_this->actor)))) { + dComIfGs_offSwitch(i_this->mOnSwitchNo, fopAcM_GetRoomNo(&i_this->actor)); + } + + if (i_this->mOnSwitchNo != 0xFF && !dComIfGs_isSwitch(i_this->mOnSwitchNo, fopAcM_GetRoomNo(&i_this->actor))) { + i_this->m4D0 = 0; + if (i_this->mOnSwitchNo != 0xff) { + i_this->m508 = i_this->mOnSwitchNo + 1; + } + mDoAud_seStart(JA_SE_OBJ_TORCH_OFF, &i_this->mPosTop); + } else { + mDoAud_seStart(JA_SE_OBJ_TORCH_BURNING, &i_this->mPosTop); + } + + default: + if (i_this->mType != 3 && i_this->m7E0 != -1) { + if (ep_switch_event_end(i_this)) { + i_this->m7E0 = -1; + } else { + dComIfGp_evmng_cutEnd(i_this->m7E0); + } + } + break; + + case 10: + cLib_addCalc0(&i_this->mLightPower, 1.0f, 0.10000000149011612f); + if (i_this->mLightPower < 0.05f) { + if (i_this->mType == 0 || i_this->mType == 3) { + i_this->m4D0 = 0; + if (i_this->mOnSwitchNo != 0xFF) { + dComIfGs_offSwitch(i_this->mOnSwitchNo, fopAcM_GetRoomNo(&i_this->actor)); + i_this->m508 = i_this->mOnSwitchNo + 1; + } + } else { + fopAcM_delete(&i_this->actor); + } + } + break; + } + + i_this->mLight.mPos = i_this->mPosTop; + i_this->mLight.mColor.r = 600; + i_this->mLight.mColor.g = 400; + i_this->mLight.mColor.b = 0x78; + i_this->mLight.mPower = i_this->mLightPower * 150.0f; + i_this->mLight.mFluctuation = 250.0f; + i_this->actor.scale.y = i_this->mLightPower; + + if (i_this->actor.scale.y > 0.5f) { + i_this->mSph1.OnAtSetBit(); + } else { + i_this->mSph1.OffAtSetBit(); + } + + cXyz sp3C; + sp3C.set(i_this->mPosTop.x, i_this->mPosTop.y + 30.0f, i_this->mPosTop.z); + + i_this->mSph1.SetC(sp3C); + dComIfG_Ccsp()->Set(&i_this->mSph1); + + if (i_this->m7D4 != 0) { + s16 tmp = REG0_S(2) + 40; + if (i_this->m7D4 == tmp && i_this->mpEmitter == NULL) { + pos.set( + i_this->mPosTop.x, + i_this->mPosTop.y + -240.0f + 235.0f + 8.0f + REG6_F(4), + i_this->mPosTop.z + ); + + cXyz scale; + scale.z = scale.y = scale.x = REG0_F(6) + 1.0f; + i_this->mpEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_01EA, &pos, NULL, &scale); + } + + if (i_this->mpEmitter != NULL) { + cLib_addCalc2(&i_this->m7D8, (i_this->m7D4 > (s16)(REG0_S(3) + 10)) ? REG0_F(5) + 4.0f : 0.0f, 1.0f, REG0_F(8) + 0.5f); + cMtx_YrotS(*calc_mtx, i_this->m7DC); + + cXyz sp24; + cXyz sp18; + sp24.set(0.0f, 1.0f, i_this->m7D8); + MtxPosition(&sp24, &sp18); + + JGeometry::TVec3 sp181; + sp181.set(sp18); + i_this->mpEmitter->setDirection(sp181); + + if (i_this->m7D4 == 1) { + i_this->mpEmitter->becomeInvalidEmitter(); + i_this->mpEmitter = NULL; + } + } + i_this->m7D4--; + } } /* 0000173C-00001834 .text daEp_set_mtx__FP8ep_class */ -void daEp_set_mtx(ep_class*) { - /* Nonmatching */ +void daEp_set_mtx(ep_class* i_this) { + if ((i_this->mType == 0) || (i_this->mType == 3)) { + MtxTrans(i_this->actor.current.pos.x, i_this->actor.current.pos.y, i_this->actor.current.pos.z, false); + cMtx_YrotM(*calc_mtx, i_this->actor.current.angle.y); + cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x); + cMtx_ZrotM(*calc_mtx, i_this->actor.current.angle.z); + + i_this->mpModel->setBaseTRMtx(*calc_mtx); + + cXyz sp08; + sp08.x = sp08.z = 0.0f; + sp08.y = REG0_F(0) + 140.0f; + MtxPosition(&sp08, &i_this->mPosTop); + } else { + i_this->mPosTop = i_this->actor.current.pos; + } } /* 00001834-00001E30 .text daEp_Execute__FP8ep_class */ -static BOOL daEp_Execute(ep_class*) { - /* Nonmatching */ +static BOOL daEp_Execute(ep_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor; + + i_this->mbNoEp = 0; + i_this->mbShouldDrawModel = 0; + + if ((i_this->mType == 0) || (i_this->mType == 3)) { + i_this->mCyl.SetC(a_this->current.pos); + dComIfG_Ccsp()->Set(&i_this->mCyl); + if (i_this->mCyl.ChkTgHit()) { + daObj::HitSeStart(&a_this->current.pos, fopAcM_GetRoomNo(a_this), &i_this->mCyl, 11); + } + fopAcM_rollPlayerCrash(a_this, 35.0f, 0); + + mDoLib_clipper::changeFar(1000000.0f); + i_this->mbShouldDrawModel = fopAcM_checkCullingBox(i_this->mpModel->getBaseTRMtx(), -30.0f, 0.0f, -30.0f, 30.0f, 180.0f, 30.0f); + mDoLib_clipper::resetFar(); + + if (i_this->mbHasGa != 0) { + ga_move(i_this); + } + } + + for (s32 i = 0; i < 3; i++) { + if (i_this->mTimers[i] != 0) { + i_this->mTimers[i]--; + } + } + + if ((i_this->mTimers[3] != 0) && (i_this->mTimers[3] < 10000)) { + i_this->mTimers[3]--; + } + + if (i_this->mTimers[0] == 0) { + i_this->mTimers[0] = cM_rndF(REG0_F(2) + 5.0f) + REG0_F(3); + i_this->mAlphaModelAlphaTarget = 8.0f + cM_rndF(REG0_F(6) + 4.0f) + REG0_F(7); + } + + if (i_this->mTimers[1] == 0) { + if (i_this->m7D4 != 0) { + i_this->mTimers[1] = cM_rndF(5.0f); + i_this->mAlphaModelScaleTarget = cM_rndF(0.2f) + 0.55f; + } else { + i_this->mTimers[1] = cM_rndF(6.0f) + 3.0f; + i_this->mAlphaModelScaleTarget = cM_rndF(0.075f) + 0.75f; + } + } + + cLib_addCalc2(&i_this->mAlphaModelAlpha, i_this->mAlphaModelAlphaTarget, 1.0f, REG0_F(4) + 0.1f + 0.9f); + cLib_addCalc2(&i_this->mAlphaModelScale, i_this->mAlphaModelScaleTarget, 0.4f, 0.04f); + + MtxTrans(i_this->mPosTop.x, i_this->mPosTop.y, i_this->mPosTop.z, false); + + cMtx_YrotM(*calc_mtx, i_this->mAlphaModelRotY); + cMtx_XrotM(*calc_mtx, i_this->mAlphaModelRotX); + + f32 scale = i_this->mAlphaModelScale * i_this->mLightPower; + MtxScale(scale, scale, scale, true); + cMtx_copy(*calc_mtx, i_this->mAlphaModelMtx); + + mDoLib_clipper::changeFar(1000000.0f); + i_this->mbNoEp = fopAcM_checkCullingBox(i_this->mAlphaModelMtx, -160.0f, -160.0f, -160.0f, 160.0f, 160.0f, 160.0f); + mDoLib_clipper::resetFar(); + + ep_move(i_this); + + i_this->mAlphaModelRotY += 0xd0; + i_this->mAlphaModelRotX += 0x100; + + if (i_this->m4D0 > 0) { + if (i_this->m4D0 < 10) { + i_this->mGroundCheckTimer++; + if ((i_this->mGroundCheckTimer & 0xF) == 0) { + dBgS_ObjGndChk_Spl gndChk; + + cXyz sp08 = i_this->mPosTop; + sp08.y += 200.0f; + + gndChk.SetPos(&sp08); + + f32 fVar6 = dComIfG_Bgsp()->GroundCross(&gndChk); + if ((fVar6 != -G_CM3D_F_INF) && (i_this->mPosTop.y < fVar6)) { + i_this->m4D0 = 10; + } + } + } + } + return TRUE; } /* 00002270-00002278 .text daEp_IsDelete__FP8ep_class */ @@ -64,23 +497,87 @@ static BOOL daEp_IsDelete(ep_class*) { } /* 00002278-000022D4 .text daEp_Delete__FP8ep_class */ -static BOOL daEp_Delete(ep_class*) { - /* Nonmatching */ +static BOOL daEp_Delete(ep_class* i_this) { + dComIfG_resDeleteDemo(&i_this->mPhase, "Ep"); + dKy_plight_cut(&i_this->mLight); + mDoAud_seDeleteObject(&i_this->mPosTop); + return TRUE; } /* 000022D4-00002518 .text daEp_CreateHeap__FP10fopAc_ac_c */ -static BOOL daEp_CreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL daEp_CreateHeap(fopAc_ac_c* a_this) { + ep_class* i_this = (ep_class*)a_this; + J3DModelData* modelData; + + if (i_this->mbHasObm == 0) { + modelData = static_cast(dComIfG_getObjectRes("Ep", EP_BDL_VKTSD)); + } else { + modelData = static_cast(dComIfG_getObjectRes("Ep", EP_BDL_OBM_SHOKUDAI1)); + } + JUT_ASSERT(VERSION_SELECT(996, 997, 997, 997), modelData != NULL); + +#if VERSION == VERSION_DEMO + i_this->mpModel = mDoExt_J3DModel__create(modelData, 0x0, 0x11020203); +#else + i_this->mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); +#endif + if (i_this->mpModel == NULL) { + return FALSE; + } + + if (i_this->mbHasGa != 0) { + modelData = static_cast(dComIfG_getObjectRes("Ep", EP_BDL_EP_GA)); + JUT_ASSERT(VERSION_SELECT(1007, 1010, 1010, 1010), modelData != NULL); + + for (s32 i = 0; i < 2; i++) { +#if VERSION == VERSION_DEMO + i_this->mEpGa[i].mpModel = mDoExt_J3DModel__create(modelData, 0x0, 0x11020203); +#else + i_this->mEpGa[i].mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); +#endif + if (i_this->mEpGa[i].mpModel == NULL) { + return FALSE; + } + + if (i == 0 || cM_rndF(1.0f) < 0.5f) { + i_this->mEpGa[i].mbEnabled = true; + i_this->mEpGa[i].mPos = a_this->current.pos; + i_this->mEpGa[i].mPos.y += 140.0f; + i_this->mEpGa[i].scaleXZ = cM_rndF(0.3f) + 0.3f; + i_this->mEpGa[i].m38 = cM_rndF(30000.0f); + } + } + } + return TRUE; } /* 00002518-00002608 .text daEp_CreateInit__FP10fopAc_ac_c */ -void daEp_CreateInit(fopAc_ac_c*) { - /* Nonmatching */ +void daEp_CreateInit(fopAc_ac_c* a_this) { + ep_class* i_this = (ep_class*)a_this; + + i_this->m4D0 = 0; + i_this->m508 = 0; + + fopAcM_SetMtx(a_this, i_this->mAlphaModelMtx); + fopAcM_SetMin(a_this, -160.0f, -160.0f, -160.0f); + fopAcM_SetMax(a_this, 160.0f, 160.0f, 160.0f); + i_this->mAlphaModelRotX = cM_rndF(32768.0f); + i_this->mAlphaModelRotY = cM_rndF(32768.0f); + a_this->attention_info.position.x = a_this->current.pos.x; + a_this->attention_info.position.y = a_this->current.pos.y + 100.0f; + a_this->attention_info.position.z = a_this->current.pos.z; + a_this->eyePos.x = a_this->current.pos.x; + a_this->eyePos.y = a_this->current.pos.y + 130.0f; + a_this->eyePos.z = a_this->current.pos.z; + + daEp_set_mtx(i_this); + + i_this->mbNoEp = 0; + i_this->mbShouldDrawModel = 0; } /* 00002608-00002840 .text daEp_Create__FP10fopAc_ac_c */ -static cPhs_State daEp_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daEp_Create(fopAc_ac_c* a_this) { static dCcD_SrcSph sph_src = { // dCcD_SrcGObjInf { @@ -138,6 +635,76 @@ static cPhs_State daEp_Create(fopAc_ac_c*) { /* Height */ 120.0f, }, }; + + ep_class* i_this = (ep_class*)a_this; + +#if VERSION == VERSION_DEMO + cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Ep"); + if (ret == cPhs_COMPLEATE_e) { + fopAcM_SetupActor(a_this, ep_class); +#else + fopAcM_SetupActor(a_this, ep_class); + cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Ep"); + if (ret == cPhs_COMPLEATE_e) { +#endif + i_this->mType = fopAcM_GetParam(a_this) & 0x3F; + if (i_this->mType == 0x3F) { + i_this->mType = 0; + } + + i_this->mbHasGa = (fopAcM_GetParam(a_this) >> 6) & 1; + i_this->mbHasObm = (fopAcM_GetParam(a_this) >> 7) & 1; + i_this->m505 = fopAcM_GetParam(a_this) >> 8; + i_this->m507 = fopAcM_GetParam(a_this) >> 0x10; + i_this->mOnSwitchNo = fopAcM_GetParam(a_this) >> 0x18; + + i_this->mStts.Init(0xFF, 0xFF, a_this); + i_this->mSph1.Set(sph_src); + i_this->mSph1.SetStts(&i_this->mStts); + + if ((i_this->mType == 0) || (i_this->mType == 3)) { + u32 maxHeapSize; + if (i_this->mbHasObm == 0) { + maxHeapSize = 0x4C0; + } else { + maxHeapSize = 0x4E0; + } + + if (i_this->mbHasGa != 0) { + maxHeapSize += 0x9A0; + } +#if VERSION == VERSION_DEMO + if (!fopAcM_entrySolidHeap(a_this, daEp_CreateHeap, 0x369C)) { +#else + if (!fopAcM_entrySolidHeap(a_this, daEp_CreateHeap, maxHeapSize)) { +#endif + return cPhs_ERROR_e; + } + + i_this->mCyl.Set(co_cyl_src); + i_this->mCyl.SetStts(&i_this->mStts); + i_this->mAcch.Set(fopAcM_GetPosition_p(a_this), fopAcM_GetOldPosition_p(a_this), a_this, 1, &i_this->mAcchCir, fopAcM_GetSpeed_p(a_this), NULL, NULL); + i_this->mAcchCir.SetWall(10.0f, 20.0f); + i_this->mAcch.CrrPos(*dComIfG_Bgsp()); + } + + daEp_CreateInit(a_this); + + if (i_this->mOnSwitchNo != 0xFF && !dComIfGs_isSwitch(i_this->mOnSwitchNo, fopAcM_GetRoomNo(a_this))) { + i_this->m508 = i_this->mOnSwitchNo + 1; + } + + i_this->mTimers[3] = 20000; + dKy_plight_set(&i_this->mLight); + i_this->mGroundCheckTimer = cM_rndF(255.0f); + } + + i_this->m7E0 = -1; + return ret; +} + +ep_class::ep_class() { + m860 = j3dDefaultLightInfo; } static actor_method_class l_daEp_Method = {