diff --git a/configure.py b/configure.py index e0a6d0f4a..525dd27e5 100644 --- a/configure.py +++ b/configure.py @@ -1329,8 +1329,8 @@ config.libs = [ ActorRel(Matching, "d_a_am", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_am2", extra_cflags=["-sym off"]), ActorRel(NonMatching, "d_a_amiprop"), - ActorRel(NonMatching, "d_a_arrow_iceeff"), - ActorRel(NonMatching, "d_a_arrow_lighteff"), + ActorRel(NonMatching, "d_a_arrow_iceeff", extra_cflags=['-pragma "nosyminline on"']), + ActorRel(NonMatching, "d_a_arrow_lighteff", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_beam"), ActorRel(NonMatching, "d_a_boko"), ActorRel(NonMatching, "d_a_canon"), diff --git a/include/d/actor/d_a_arrow_iceeff.h b/include/d/actor/d_a_arrow_iceeff.h index 827604617..e27ed7244 100644 --- a/include/d/actor/d_a_arrow_iceeff.h +++ b/include/d/actor/d_a_arrow_iceeff.h @@ -2,20 +2,32 @@ #define D_A_ARROW_ICEEFF_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" class daArrow_Iceeff_c : public fopAc_ac_c { public: inline s32 _create(); - inline BOOL _delete(); - inline BOOL _draw(); - inline BOOL _execute(); + inline bool _delete(); + inline bool _draw(); + inline bool _execute(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); void set_mtx(); public: - /* Place member variables here */ -}; + u32 field_0x290; + u32 field_0x294; + J3DModel* field_0x298[30]; + J3DModel* mpModel; + Mtx field_0x314[30]; + cXyz field_0x8B4[30]; + J3DAnmTextureSRTKey* field_0xA1C; + mDoExt_bckAnm mBck; + s32 field_0xA30; + f32 field_0xA34; + s32 field_0xA38; + u8 field_0xA3C; +}; // Size: 0xA40 #endif /* D_A_ARROW_ICEEFF_H */ diff --git a/include/d/actor/d_a_arrow_lighteff.h b/include/d/actor/d_a_arrow_lighteff.h index 376a222c4..ecdb85cf7 100644 --- a/include/d/actor/d_a_arrow_lighteff.h +++ b/include/d/actor/d_a_arrow_lighteff.h @@ -2,24 +2,46 @@ #define D_A_ARROW_LIGHTEFF_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_particle.h" +#include "d/d_kankyo.h" + +class JPABaseEmitter; class daArrow_Lighteff_c : public fopAc_ac_c { public: inline s32 _create(); - inline BOOL _delete(); - inline BOOL _draw(); - inline BOOL _execute(); - void brk_play() {} + inline bool _delete(); + inline bool _draw(); + inline bool _execute(); + void brk_play() {} // based on position in the debug map this would play the btk so not sure what this is really doing void setTopPos(); void setPointLight(); void delete_particle(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); void set_mtx(); public: - /* Place member variables here */ + u32 field_0x290; + u32 field_0x294; + J3DModel* field_0x298; + cXyz field_0x29C; + cXyz field_0x2A8; + mDoExt_brkAnm mBrk; + mDoExt_btkAnm mBtk; + f32 field_0x2E0; + s32 field_0x2E4; + u8 field_0x2E8; + u8 field_0x2E9; + u8 field_0x2EA; + u32 field_0x2EC; + u32 field_0x2F0; + dPa_followEcallBack field_0x2F4; + dPa_followEcallBack field_0x308; + LIGHT_INFLUENCE field_0x31C; + f32 field_0x33C; }; #endif /* D_A_ARROW_LIGHTEFF_H */ diff --git a/src/d/actor/d_a_arrow_iceeff.cpp b/src/d/actor/d_a_arrow_iceeff.cpp index 146ef37c1..ddc9fdf94 100644 --- a/src/d/actor/d_a_arrow_iceeff.cpp +++ b/src/d/actor/d_a_arrow_iceeff.cpp @@ -4,55 +4,317 @@ // #include "d/actor/d_a_arrow_iceeff.h" -#include "dolphin/types.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "m_Do/m_Do_mtx.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_arrow.h" /* 000000EC-0000010C .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(); } /* 0000010C-00000324 .text CreateHeap__16daArrow_Iceeff_cFv */ -void daArrow_Iceeff_c::CreateHeap() { - /* Nonmatching */ +BOOL daArrow_Iceeff_c::CreateHeap() { + if(field_0xA38 == 0) { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Link", 0x40)); + JUT_ASSERT(87, modelData != 0); + for(int i = 0; i < 30; i++) { + field_0x298[i] = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if(field_0x298[i] == 0) { + return false; + } + } + } + else { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Link", 0x41)); + JUT_ASSERT(98, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if(mpModel == 0) { + return false; + } + + J3DAnmTransform* bck = static_cast(dComIfG_getObjectRes("Link", 0xD)); + JUT_ASSERT(107, bck != 0); + if(!mBck.init(modelData, bck, true, 0, 1.0f, 0, -1, false)) { + return false; + } + } + + return true; } /* 00000324-000005E4 .text CreateInit__16daArrow_Iceeff_cFv */ void daArrow_Iceeff_c::CreateInit() { - /* Nonmatching */ + if(field_0xA38 == 0) { + for(int i = 0; i < 30; i++) { + fopAcM_SetMtx(this, field_0x298[i]->getBaseTRMtx()); + + field_0x8B4[i].setall(cM_rndF(4.5f) + 6.2999997f); + + f32 temp = 180.0f * i / 30.0f; + s16 angle = cM_rndF(65536.0f); + mDoMtx_ZrotS(mDoMtx_stack_c::get(), cM_rndF(65536.0f)); + mDoMtx_XrotM(mDoMtx_stack_c::get(), cM_rndF(65536.0f)); + mDoMtx_YrotM(mDoMtx_stack_c::get(), cM_rndF(65536.0f)); + mDoMtx_stack_c::transM(temp * cM_ssin(angle), temp * cM_scos(angle), 0.0f); + mDoMtx_stack_c::ZrotM(current.angle.z); + mDoMtx_stack_c::XrotM(current.angle.x); + mDoMtx_stack_c::YrotM(current.angle.y); + MTXCopy(mDoMtx_stack_c::get(), field_0x314[i]); + } + } + else { + current.angle.y = cM_rndF(65536.0f); + } + + fopAcM_setCullSizeBox(this, -100.0f, -100.0f, -100.0f, 100.0f, 100.0f, 100.0f); + mCullSizeFar = 1.0f; + set_mtx(); + field_0xA30 = 0; + field_0xA34 = 0.0f; + if(field_0xA38 == 0) { + field_0xA1C = daPy_getPlayerLinkActorClass()->mpGicer00Btk; + } + else { + field_0xA1C = daPy_getPlayerLinkActorClass()->mpGicer01Btk; + } + + field_0xA1C->setFrame(field_0xA34); + field_0xA3C = 1; } /* 000005E4-0000073C .text set_mtx__16daArrow_Iceeff_cFv */ void daArrow_Iceeff_c::set_mtx() { - /* Nonmatching */ + if(field_0xA38 == 0) { + for(int i = 0; i < 30; i++) { + field_0x298[i]->setBaseScale(field_0x8B4[i]); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, 0); + mDoMtx_stack_c::concat(field_0x314[i]); + field_0x298[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + } + } + else { + mScale.setall(1.0f); + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } +} + +s32 daArrow_Iceeff_c::_create() { + fopAcM_SetupActor(this, daArrow_Iceeff_c); + + void* arrow = fopAcM_SearchByID(mParentPcId); + if(arrow == 0) { + return cPhs_ERROR_e; + } + else { + if(fopAcM_GetParam(arrow) == 4) { + field_0xA38 = 1; + } + else { + field_0xA38 = 0; + } + + if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0xD5E0)) { + return cPhs_ERROR_e; + } + + CreateInit(); + return cPhs_COMPLEATE_e; + } } /* 0000073C-00000854 .text daArrow_Iceeff_Create__FPv */ -static s32 daArrow_Iceeff_Create(void*) { - /* Nonmatching */ +static s32 daArrow_Iceeff_Create(void* i_this) { + return static_cast(i_this)->_create(); +} + +bool daArrow_Iceeff_c::_delete() { + return true; } /* 00000938-00000940 .text daArrow_Iceeff_Delete__FPv */ -static BOOL daArrow_Iceeff_Delete(void*) { - /* Nonmatching */ +static BOOL daArrow_Iceeff_Delete(void* i_this) { + return static_cast(i_this)->_delete(); +} + +bool daArrow_Iceeff_c::_draw() { + s32 temp = field_0xA30; + if(30 < temp) { + temp = 30; + } + + field_0xA1C->setFrame(field_0xA34); + dComIfGd_setListP1(); + + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &mTevStr); + if(field_0xA38 == 0) { + for(int i = 0; i < temp; i++) { + g_env_light.setLightTevColorType(field_0x298[i], &mTevStr); + + if(field_0xA3C == 1) { + mDoExt_modelUpdateDL(field_0x298[i]); + } + } + } + else { + g_env_light.setLightTevColorType(mpModel, &mTevStr); + J3DModelData* mdl_data = mpModel->getModelData(); + mBck.entry(mdl_data, mBck.getFrame()); + if(field_0xA3C == 1) { + mDoExt_modelUpdateDL(mpModel); + } + + mBck.remove(mpModel->getModelData()); + } + + dComIfGd_setList(); + + return true; } /* 00000940-00000A98 .text daArrow_Iceeff_Draw__FPv */ -static BOOL daArrow_Iceeff_Draw(void*) { - /* Nonmatching */ +static BOOL daArrow_Iceeff_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00000A98-00000ABC .text daArrow_Iceeff_Execute__FPv */ -static BOOL daArrow_Iceeff_Execute(void*) { - /* Nonmatching */ +static BOOL daArrow_Iceeff_Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00000ABC-00001050 .text _execute__16daArrow_Iceeff_cFv */ -BOOL daArrow_Iceeff_c::_execute() { - /* Nonmatching */ +bool daArrow_Iceeff_c::_execute() { + static cXyz ripple_scale(1.0f, 1.0f, 1.0f); + + daArrow_c* arrow = static_cast(fopAcM_SearchByID(mParentPcId)); + if(field_0xA38 == 0) { + if(arrow == 0) { + dComIfGp_particle_setP1(0x55, ¤t.pos, ¤t.angle, 0); + fopAcM_delete(this); + + return true; + } + + current.pos = arrow->field_0x6a8; + current.angle = arrow->shape_angle; + if(field_0xA30 == 0) { + fopAcM_seStartCurrent(this, JA_SE_OBJ_MINI_ICE, 0); + } + + if(field_0xA30 >= 30) { + field_0xA34 += 1.0f; + if(field_0xA34 >= field_0xA1C->getFrameMax()) { + field_0xA34 = field_0xA1C->getFrameMax(); + } + } + + if(field_0xA30 < 0x3C) { + field_0xA30++; + } + else { + dComIfGp_particle_setP1(0x55, ¤t.pos, ¤t.angle, 0); + fopAcM_seStartCurrent(this, JA_SE_OBJ_MINI_ICE_BREAK, 0); + fopAcM_delete(arrow); + fopAcM_delete(this); + } + } + else { + mBck.play(); + f32 waterY; + fopAcM_getWaterY(¤t.pos, &waterY); + current.pos.y = waterY; + if(field_0xA30 == 0) { + csXyz angle; + angle.set(-0x4000, 0, 0); + + JPABaseEmitter* ptcl = dComIfGp_particle_setP1(0x29E, ¤t.pos, &angle, 0); + if(ptcl) { + JGeometry::TVec3 scale(0.5f, 0.5f, 0.5f); + ptcl->setGlobalScale(scale); + ptcl->setRate(50.0f); + ptcl->setGlobalAlpha(0x80); + } + + fopAcM_seStartCurrent(this, JA_SE_OBJ_MINI_ICE, 0); + } + + field_0xA34 += 1.0f; + if(field_0xA34 >= field_0xA1C->getFrameMax()) { + field_0xA34 = field_0xA1C->getFrameMax(); + } + + if(field_0xA30 < 300) { + field_0xA30++; + } + else { + fopAcM_delete(this); + } + + if(field_0xA30 == 0x23) { + JPABaseEmitter* ptcl = dComIfGp_particle_setSingleRipple(0x3D, ¤t.pos, 0, &ripple_scale); + if(ptcl) { + JGeometry::TVec3 scale(0.67f, 0.67f, 1.0f); + ptcl->setGlobalParticleScale(scale); + } + } + else if(field_0xA30 == 0x28) { + JPABaseEmitter* ptcl = dComIfGp_particle_setP1(0x55, ¤t.pos, 0, 0); + if(ptcl) { + ptcl->setAwayFromCenterSpeed(25.0f); + ptcl->setAwayFromAxisSpeed(5.0f); + ptcl->setDirectionalSpeed(5.0f); + JGeometry::TVec3 scale1(0.5f, 1.0f, 0.5f); + ptcl->setEmitterScale(scale1); + JGeometry::TVec3 scale2(0.33f, 0.33f, 1.0f); + ptcl->setGlobalParticleScale(scale2); + } + + dComIfGp_particle_setSingleRipple(0x3F, ¤t.pos, 0, &ripple_scale); + fopAcM_seStartCurrent(this, JA_SE_OBJ_MINI_ICE_BREAK, 0); + + field_0xA3C = 0; + } + } + + set_mtx(); + + return true; } /* 00001050-00001058 .text daArrow_Iceeff_IsDelete__FPv */ static BOOL daArrow_Iceeff_IsDelete(void*) { - /* Nonmatching */ + return true; } +static actor_method_class daArrow_IceeffMethodTable = { + (process_method_func)daArrow_Iceeff_Create, + (process_method_func)daArrow_Iceeff_Delete, + (process_method_func)daArrow_Iceeff_Draw, + (process_method_func)daArrow_Iceeff_IsDelete, + (process_method_func)daArrow_Iceeff_Draw, +}; + +actor_process_profile_definition g_profile_ARROW_ICEEFF = { + fpcLy_CURRENT_e, + 9, + fpcPi_CURRENT_e, + PROC_ARROW_ICEEFF, + &g_fpcLf_Method.mBase, + sizeof(daArrow_Iceeff_c), + 0, + 0, + &g_fopAc_Method.base, + 0x01C0, + &daArrow_IceeffMethodTable, + fopAcStts_UNK40000_e | fopAcStts_UNK4000_e, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_arrow_lighteff.cpp b/src/d/actor/d_a_arrow_lighteff.cpp index 98b825ef4..c1dd081d0 100644 --- a/src/d/actor/d_a_arrow_lighteff.cpp +++ b/src/d/actor/d_a_arrow_lighteff.cpp @@ -4,70 +4,420 @@ // #include "d/actor/d_a_arrow_lighteff.h" -#include "dolphin/types.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_arrow.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_mtx.h" +#include "m_Do/m_Do_graphic.h" +#include "SSystem/SComponent/c_lib.h" +#include "JSystem/JKernel/JKRHeap.h" /* 00000078-00000108 .text setTopPos__18daArrow_Lighteff_cFv */ void daArrow_Lighteff_c::setTopPos() { - /* Nonmatching */ + daArrow_c* arrow = static_cast(fopAcM_SearchByID(mParentPcId)); + if(arrow) { + mDoMtx_stack_c::copy(arrow->field_0x6b4); + mDoMtx_stack_c::transM(0.0f, 0.0f, 62.0f); + mDoMtx_stack_c::multVecZero(&field_0x29C); + } } /* 00000108-00000230 .text setPointLight__18daArrow_Lighteff_cFv */ void daArrow_Lighteff_c::setPointLight() { - /* Nonmatching */ + static const s16 light_color[][3] = { + {0x0000, 0x0000, 0x0000}, + {0x0258, 0x0190, 0x0078}, + {0x0078, 0x0190, 0x0258}, + {0x0258, 0x0258, 0x00C8}, + }; + + if(field_0x2EC == 0 || field_0x2EC == 1) { + if(field_0x2E8 == 0) { + field_0x33C = 0.0f; + } + else { + cLib_addCalc2(&field_0x33C, cM_rndF(0.2f) + 1.0f, 0.5f, 0.05f); + } + } + else { + field_0x33C = 0.0f; + } + + field_0x31C.mPos = field_0x29C; + field_0x31C.mColor.r = light_color[field_0x2E8][0]; + field_0x31C.mColor.g = light_color[field_0x2E8][1]; + field_0x31C.mColor.b = light_color[field_0x2E8][2]; + field_0x31C.mPower = (s16)(field_0x33C * 150.0f); + field_0x31C.mFluctuation = 250.0f; } /* 00000230-000002C0 .text delete_particle__18daArrow_Lighteff_cFv */ void daArrow_Lighteff_c::delete_particle() { - /* Nonmatching */ + if(field_0x2F4.getEmitter()) { + if(field_0x2E8 == 3) { + field_0x2F4.getEmitter()->setGlobalAlpha(0); + } + + field_0x2F4.end(); + } + if(field_0x308.getEmitter()) { + if(field_0x2E8 == 3) { + field_0x308.getEmitter()->setGlobalAlpha(0); + } + + field_0x308.end(); + } } /* 000002C0-000002E0 .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(); } /* 000002E0-00000624 .text CreateHeap__18daArrow_Lighteff_cFv */ -void daArrow_Lighteff_c::CreateHeap() { - /* Nonmatching */ +BOOL daArrow_Lighteff_c::CreateHeap() { + field_0x2E8 = fopAcM_GetParam(this); + + J3DModelData* modelData; + if(field_0x2E8 == 1) { + modelData = static_cast(dComIfG_getObjectRes("Link", 0x32)); + } + else if(field_0x2E8 == 2) { + modelData = static_cast(dComIfG_getObjectRes("Link", 0x33)); + } + else { + modelData = static_cast(dComIfG_getObjectRes("Link", 0x34)); + } + + JUT_ASSERT(187, modelData != 0); + + field_0x298 = mDoExt_J3DModel__create(modelData, 0x80000, 0x3F441422); + if(field_0x298 == 0) { + return false; + } + + J3DAnmTextureSRTKey* btk; + J3DAnmTevRegKey* brk; + if(field_0x2E8 == 1) { + btk = static_cast(dComIfG_getObjectRes("Link", 0x5E)); + brk = static_cast(dComIfG_getObjectRes("Link", 0x52)); + } + else if(field_0x2E8 == 2) { + btk = static_cast(dComIfG_getObjectRes("Link", 0x5F)); + brk = static_cast(dComIfG_getObjectRes("Link", 0x53)); + } + else { + btk = static_cast(dComIfG_getObjectRes("Link", 0x60)); + brk = static_cast(dComIfG_getObjectRes("Link", 0x54)); + } + + JUT_ASSERT(216, btk != 0); + JUT_ASSERT(217, brk != 0); + + if(!mBtk.init(modelData, btk, true, 2, 1.0f, 0, -1, false, 0)) { + return false; + } + if(!mBrk.init(modelData, brk, true, 0, 1.0f, 0, -1, false, 0)) { + return false; + } + + field_0x2E0 = 0.0f; + + return true; } /* 00000624-00000880 .text CreateInit__18daArrow_Lighteff_cFv */ void daArrow_Lighteff_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, field_0x298->getBaseTRMtx()); + + field_0x2A8.setall(1.0f); + + fopAcM_setCullSizeBox(this, -100.0f, -100.0f, -100.0f, 100.0f, 100.0f, 100.0f); + mCullSizeFar = 1.0f; + + set_mtx(); + + field_0x2E4 = 0; + field_0x2F0 = 0; + field_0x2EC = 0; + + setTopPos(); + + if(field_0x2E8 == 1) { + if(field_0x2F4.getEmitter() == 0) { + dComIfGp_particle_setP1(0x299, &field_0x29C, ¤t.angle, 0, 0xFF, &field_0x2F4); + } + } + else if(field_0x2E8 == 2) { + if(field_0x2F4.getEmitter() == 0) { + dComIfGp_particle_setP1(0x29C, &field_0x29C, ¤t.angle, 0, 0xFF, &field_0x2F4); + } + if(field_0x308.getEmitter() == 0) { + dComIfGp_particle_setP1(0x29D, &field_0x29C, ¤t.angle, 0, 0xFF, &field_0x308); + } + } + else if(field_0x2E8 == 3) { + if(field_0x2F4.getEmitter() == 0) { + dComIfGp_particle_setP1(0x29F, &field_0x29C, ¤t.angle, 0, 0xFF, &field_0x2F4); + } + if(field_0x308.getEmitter() == 0) { + dComIfGp_particle_setP1(0x2A0, &field_0x29C, ¤t.angle, 0, 0xFF, &field_0x308); + } + } + + field_0x2E9 = 1; + dKy_plight_set(&field_0x31C); } /* 00000880-00000980 .text set_mtx__18daArrow_Lighteff_cFv */ void daArrow_Lighteff_c::set_mtx() { - /* Nonmatching */ + field_0x298->setBaseScale(field_0x2A8); + + daArrow_c* arrow = static_cast(fopAcM_SearchByID(mParentPcId)); + if(arrow) { + mDoMtx_stack_c::copy(arrow->field_0x6b4); + mDoMtx_stack_c::transM(0.0f, 0.0f, 62.0f); + field_0x298->setBaseTRMtx(mDoMtx_stack_c::get()); + } + else { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, 0); + mDoMtx_stack_c::transM(0.0f, 0.0f, 62.0f); + field_0x298->setBaseTRMtx(mDoMtx_stack_c::get()); + } +} + +s32 daArrow_Lighteff_c::_create() { + fopAcM_SetupActor(this, daArrow_Lighteff_c); + + field_0x2EA = 0; + if(!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0x2660)) { + return cPhs_ERROR_e; + } + + CreateInit(); + + return cPhs_COMPLEATE_e; } /* 00000980-00000A70 .text daArrow_Lighteff_Create__FPv */ -static s32 daArrow_Lighteff_Create(void*) { - /* Nonmatching */ +static s32 daArrow_Lighteff_Create(void* i_this) { + return static_cast(i_this)->_create(); +} + +bool daArrow_Lighteff_c::_delete() { + delete_particle(); + + if(field_0x2EA == 1) { + daPy_py_c* link = daPy_getPlayerActorClass(); + + daArrow_c* arrow = static_cast(fopAcM_SearchByID(mParentPcId)); + if(arrow) { + if(!arrow->isSetByZelda()) { + link->offUseArrowEffect(); + } + } + else { + link->offUseArrowEffect(); + } + } + + dKy_plight_cut(&field_0x31C); + + return true; } /* 00000B70-00000C10 .text daArrow_Lighteff_Delete__FPv */ -static BOOL daArrow_Lighteff_Delete(void*) { - /* Nonmatching */ +static BOOL daArrow_Lighteff_Delete(void* i_this) { + return static_cast(i_this)->_delete(); +} + +bool daArrow_Lighteff_c::_draw() { + if(field_0x2E9 == 0) { + return true; + } + + J3DModelData* modelData = field_0x298->getModelData(); + if(mDoGph_gInf_c::isMonotone()) { + dComIfGd_setListP1(); + } + else { + dComIfGd_setListMaskOff(); + } + + mBtk.entry(modelData, mBtk.getFrame()); + mBrk.entry(modelData, mBrk.getFrame()); + mDoExt_modelUpdateDL(field_0x298); + mBrk.remove(modelData); + mBtk.remove(modelData); + + dComIfGd_setList(); + + return true; } /* 00000C10-00000D20 .text daArrow_Lighteff_Draw__FPv */ -static BOOL daArrow_Lighteff_Draw(void*) { - /* Nonmatching */ +static BOOL daArrow_Lighteff_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00000D20-00000D44 .text daArrow_Lighteff_Execute__FPv */ -static BOOL daArrow_Lighteff_Execute(void*) { - /* Nonmatching */ +static BOOL daArrow_Lighteff_Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00000D44-000011A4 .text _execute__18daArrow_Lighteff_cFv */ -BOOL daArrow_Lighteff_c::_execute() { - /* Nonmatching */ +bool daArrow_Lighteff_c::_execute() { + field_0x2F0 = field_0x2EC; + + mBtk.play(); + + s32 cam = dComIfGp_getPlayerCameraID(0); + if(!dComIfGp_checkCameraAttentionStatus(cam, 0x20)) { + if(field_0x2E0 < mBrk.getEndFrame()) { + field_0x2E0 += 1.0f; + if(field_0x2E0 > mBrk.getEndFrame()) { + field_0x2E0 = mBrk.getEndFrame(); + } + } + } + else { + if(field_0x2E0 > 5.0f) { + field_0x2E0 -= 1.0f; + if(field_0x2E0 < 5.0f) { + field_0x2E0 = 5.0f; + } + } + else { + if(field_0x2E0 < 5.0f) { + field_0x2E0 += 1.0f; + if(field_0x2E0 > 5.0f) { + field_0x2E0 = 5.0f; + } + } + } + } + + mBrk.setFrame(field_0x2E0); + + daPy_py_c* link = daPy_getPlayerActorClass(); + daArrow_c* arrow = static_cast(fopAcM_SearchByID(mParentPcId)); + if(arrow) { + field_0x2EC = fopAcM_GetParam(arrow); + if(arrow->field_0x6e4 == 1) { + fopAcM_delete(this); + } + else { + if(field_0x2EC != 0) { + if(field_0x2EC == 1) { + if(field_0x2F0 != 1) { + if(!arrow->isSetByZelda()) { + link->onUseArrowEffect(); + } + + field_0x2EA = 1; + field_0x2A8.z = 1.0f; + } + else { + field_0x2A8.z += 1.0; + if(field_0x2A8.z >= 20.0f) { + field_0x2A8.z = 20.0f; + } + + field_0x2A8.x -= 0.025; + if(field_0x2A8.x <= 0.5f) { + field_0x2A8.x = 0.5f; + } + + field_0x2A8.y = field_0x2A8.x; + } + } + else if(field_0x2EC == 3) { + fopAcM_delete(this); + } + else { + field_0x2E9 = 0; + delete_particle(); + field_0x2E4++; + if(0x3C <= field_0x2E4) { + fopAcM_delete(this); + } + } + } + } + + current.pos = arrow->current.pos; + current.angle = arrow->field_0x6e6; + setTopPos(); + setPointLight(); + } + else { + fopAcM_delete(this); + } + + cam = dComIfGp_getPlayerCameraID(0); + if(field_0x2E8 == 1) { + fopAcM_seStartCurrent(this, JA_SE_OBJ_FIRE_ARROW_AMB, 0); + if(!dComIfGp_checkCameraAttentionStatus(cam, 0x20)) { + dComIfGp_particle_setSimple(0x4004, &field_0x29C, 0xFF, g_whiteColor, g_whiteColor, 0); + } + } + else if(field_0x2E8 == 2) { + fopAcM_seStartCurrent(this, JA_SE_OBJ_ICE_ARROW_AMB, 0); + if(dComIfGp_checkCameraAttentionStatus(cam, 0x20)) { + if(field_0x2F4.getEmitter()) { + field_0x2F4.getEmitter()->setGlobalAlpha(0x64); + } + if(field_0x308.getEmitter()) { + field_0x308.getEmitter()->setGlobalAlpha(0x64); + } + } + else { + if(field_0x2F4.getEmitter()) { + field_0x2F4.getEmitter()->setGlobalAlpha(0xFF); + } + if(field_0x308.getEmitter()) { + field_0x308.getEmitter()->setGlobalAlpha(0xFF); + } + } + } + else { + fopAcM_seStartCurrent(this, JA_SE_OBJ_LIGHT_ARROW_AMB, 0); + } + + set_mtx(); + + return true; } /* 000011A4-000011AC .text daArrow_Lighteff_IsDelete__FPv */ static BOOL daArrow_Lighteff_IsDelete(void*) { - /* Nonmatching */ + return true; } +static actor_method_class daArrow_LighteffMethodTable = { + (process_method_func)daArrow_Lighteff_Create, + (process_method_func)daArrow_Lighteff_Delete, + (process_method_func)daArrow_Lighteff_Draw, + (process_method_func)daArrow_Lighteff_IsDelete, + (process_method_func)daArrow_Lighteff_Draw, +}; + +actor_process_profile_definition g_profile_ARROW_LIGHTEFF = { + fpcLy_CURRENT_e, + 9, + fpcPi_CURRENT_e, + PROC_ARROW_LIGHTEFF, + &g_fpcLf_Method.mBase, + sizeof(daArrow_Lighteff_c), + 0, + 0, + &g_fopAc_Method.base, + 0x01C1, + &daArrow_LighteffMethodTable, + fopAcStts_UNK40000_e | fopAcStts_UNK4000_e, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, +}; +