diff --git a/configure.py b/configure.py index a99537bc6..bc1761e97 100755 --- a/configure.py +++ b/configure.py @@ -1412,7 +1412,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_ice", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_ikada", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_kanat"), - ActorRel(NonMatching, "d_a_obj_leaves"), + ActorRel(Matching, "d_a_obj_leaves", extra_cflags=["-sym off"]), ActorRel(NonMatching, "d_a_obj_lpalm"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_monument"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_movebox", extra_cflags=['-pragma "nosyminline on"']), diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 0b8027599..afff15aff 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -317,7 +317,7 @@ public: void getBaseEnvColor(GXColor&) {} void getBasePrmColor(GXColor&) {} void getCurrentCreateNumber() const {} - void getFrame() {} + f32 getFrame() { return mTick.getFrame(); } void getgReRDirection(JGeometry::TVec3&) {} void isContinuousParticle() {} void loadTexture(u8, GXTexMapID) {} diff --git a/include/SSystem/SComponent/c_m3d_g_sph.h b/include/SSystem/SComponent/c_m3d_g_sph.h index 9a84623d8..3ac012f6b 100644 --- a/include/SSystem/SComponent/c_m3d_g_sph.h +++ b/include/SSystem/SComponent/c_m3d_g_sph.h @@ -28,7 +28,7 @@ public: void SetC(const cXyz& p); void SetR(f32 r); #endif - void SetC(f32, f32, f32) {} // TODO + void SetC(f32 x, f32 y, f32 z) { mCenter.x = x; mCenter.y = y; mCenter.z = z; } void Set(const cM3dGSphS & src) { SetC(src.mCenter); SetR(src.mRadius); diff --git a/include/d/actor/d_a_obj_leaves.h b/include/d/actor/d_a_obj_leaves.h index f7b7d7e68..7e1cefef7 100644 --- a/include/d/actor/d_a_obj_leaves.h +++ b/include/d/actor/d_a_obj_leaves.h @@ -3,31 +3,79 @@ #include "f_op/f_op_actor.h" #include "d/d_cc_d.h" +#include "d/d_a_obj.h" +#include "d/d_particle.h" +#include "f_op/f_op_actor_mng.h" + +class dBgW; class daObjLeaves_c : public fopAc_ac_c { -public: - void param_get_itemNo() const {} - void param_get_itemSaveBitNo() const {} - void param_get_swSave() const {} - void param_on_swSave() const {} + typedef void (daObjLeaves_c::*MemberFunc)(); - void chk_appear(); + enum Param_e { + PRM_ITEM_SAVE_BIT_NO_W = 7, + PRM_ITEM_SAVE_BIT_NO_S = 6, + + PRM_ITEM_NO_W = 6, + PRM_ITEM_NO_S = 0, + + PRM_SWSAVE_W = 8, + PRM_SWSAVE_S = 13, + }; + +public: + s32 param_get_itemNo() const { return daObj::PrmAbstract(this, PRM_ITEM_NO_W, PRM_ITEM_NO_S); } + s32 param_get_itemSaveBitNo() const { return daObj::PrmAbstract(this, PRM_ITEM_SAVE_BIT_NO_W, PRM_ITEM_SAVE_BIT_NO_S); } + s32 param_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } + void param_on_swSave() const { } + + bool chk_appear(); + void setPEmitter(JPABaseEmitter*); void init_mtx(); void birthEffect(int, cXyz*, csXyz*, GXColor*); - void solidHeapCB(fopAc_ac_c*); - void create_heap(); - void tg_hitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*); + static BOOL solidHeapCB(fopAc_ac_c*); + bool create_heap(); + static void tg_hitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*); + bool checkCollision(); + void registFireCollision(); cPhs_State _create(); bool _delete(); void wait_proc(); void alpha_calc_start_wait_proc(); void item_set_wait_proc(); void retire_wait_proc(); + void retire_wait_without_particle_proc(); bool _execute(); bool _draw(); public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhase; + /* 0x298 */ J3DModel* mModel; + /* 0x29C */ dBgW* mpBgW; + /* 0x2A0 */ dCcD_Stts mStts; + /* 0x2DC */ dCcD_Sph mSph; +#if VERSION <= VERSION_JPN + /* 0x408 */ dCcD_Cyl mCyl; + /* 0x538 */ u8 m538; +#endif + /* 0x408 */ f32 m408; + /* 0x40C */ f32 m40C; +#if VERSION == VERSION_DEMO + /* 0x544 */ JPABaseEmitter* m_emitter_p; +#endif + /* 0x410 */ dPa_smokeEcallBack mSmokeCallback; +#if VERSION == VERSION_DEMO + /* 0x430 */ f32 m430; +#else + /* 0x430 */ s32 m430; + /* 0x434 */ s32 m434; +#endif + /* 0x438 */ s32 m438; + /* 0x43C */ bool m43C; + /* 0x440 */ MemberFunc mMemberFunc; +#if VERSION > VERSION_JPN + /* 0x44C */ bool m44C; +#endif +}; // size = 0x450, demo size = 0x580 #endif /* D_A_OBJ_LEAVES_H */ diff --git a/src/d/actor/d_a_obj_leaves.cpp b/src/d/actor/d_a_obj_leaves.cpp index 413857736..f10a32d69 100644 --- a/src/d/actor/d_a_obj_leaves.cpp +++ b/src/d/actor/d_a_obj_leaves.cpp @@ -4,95 +4,766 @@ */ #include "d/actor/d_a_obj_leaves.h" +#include "d/actor/d_a_player.h" +#include "d/res/res_vochi.h" #include "d/d_bg_w.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" #include "d/d_priority.h" +#include "d/d_bg_w.h" -class J3DMaterial; +#if VERSION == VERSION_DEMO +#include "m_Do/m_Do_hostIO.h" + +class daObjLeaves_HIO_c : public JORReflexible { +public: + daObjLeaves_HIO_c(); + virtual ~daObjLeaves_HIO_c() {} + + void genMessage(JORMContext*); + +public: + /* 0x04 */ s8 m04; + /* 0x08 */ f32 m08; + /* 0x0C */ f32 m0C; + /* 0x10 */ f32 m10; + /* 0x14 */ f32 m14; + /* 0x18 */ f32 m18; + /* 0x1C */ f32 m1C; + /* 0x20 */ u8 m20; + /* 0x21 */ u8 m21; + /* 0x22 */ u8 m22; + /* 0x23 */ u8 m23; + /* 0x24 */ u8 m24; +}; // size = 0x28 + +static daObjLeaves_HIO_c l_HIO; +#endif + +namespace { +const char l_arcname[] = "Vochi"; + +#if VERSION <= VERSION_JPN +static const dCcD_SrcSph l_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_WATER & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + {{ + /* Center */ {0.0f, 0.0f, 0.0f}, + /* Radius */ 90.0f, + }}, +}; + +static const dCcD_SrcCyl l_fire_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_FIRE, + /* SrcObjAt Atp */ 1, + /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ dCcG_AtSPrm_NoConHit_e, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, + 0.0f, + 0.0f, + /* Radius */ 70.0f, + /* Height */ 50.0f, + }, +}; +#endif + +#if VERSION == VERSION_DEMO +daObjLeaves_HIO_c::daObjLeaves_HIO_c() { + m04 = -1; + m08 = 150.0f; + m0C = 115.0f; + m10 = 95.0f; + m14 = 8.0f; + m18 = 160.0f; + m1C = 200.0f; + m20 = 0; + m21 = 0; + m22 = 0; + m23 = 0; + m24 = 0; +} +#endif +} // namespace + +#if VERSION >= VERSION_USA +namespace { +static const dCcD_SrcSph l_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_WATER & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + {{ + /* Center */ {0.0f, 0.0f, 0.0f}, + /* Radius */ 150.0f, + }}, +}; +} // namespace +#endif /* 00000078-000000D8 .text chk_appear__13daObjLeaves_cFv */ -void daObjLeaves_c::chk_appear() { - /* Nonmatching */ +bool daObjLeaves_c::chk_appear() { + s32 switchIndex = param_get_swSave(); + bool ret = true; + if (switchIndex != 0xff) { + ret = fopAcM_isSwitch(this, switchIndex) == FALSE; + } + return ret; } +#if VERSION == VERSION_DEMO +void daObjLeaves_c::setPEmitter(JPABaseEmitter* emitter) { + m_emitter_p = emitter; +} +#endif + /* 000000D8-00000148 .text init_mtx__13daObjLeaves_cFv */ void daObjLeaves_c::init_mtx() { - /* Nonmatching */ + mModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000148-000002E4 .text birthEffect__13daObjLeaves_cFiP4cXyzP5csXyzP8_GXColor */ -void daObjLeaves_c::birthEffect(int, cXyz*, csXyz*, GXColor*) { - /* Nonmatching */ +void daObjLeaves_c::birthEffect(int arg1, cXyz* arg2, csXyz* arg3, GXColor* arg4) { +#if VERSION == VERSION_DEMO + struct ParticleData { + /* 0x00 */ u16 m00; + /* 0x04 */ s32 m04; + /* 0x08 */ f32 m08; + /* 0x0C */ f32 m0C; + }; // size = 0x14 + + static ParticleData particle_data[] = { + {dPa_name::ID_SCENE_822F, 0, 0, -12.0f}, + {dPa_name::ID_SCENE_A230, 1, 0, -12.0f}, + {dPa_name::ID_SCENE_822E, 0, 0, -12.0f}, + {dPa_name::ID_SCENE_8268, 0, 60, -3.0f}, + {dPa_name::ID_SCENE_8269, 0, 60, -3.0f}, + {dPa_name::ID_SCENE_826A, 0, 0, -12.0f}, + }; +#else + struct ParticleData { + /* 0x00 */ u16 m00; + /* 0x04 */ s32 m04; + /* 0x08 */ s32 m08; + /* 0x0C */ s32 m0C; + /* 0x10 */ f32 m10; + }; // size = 0x14 + + static ParticleData particle_data[] = { + {dPa_name::ID_SCENE_822F, 0, 0, 1, -12.0f}, + {dPa_name::ID_SCENE_A230, 1, 0, 1, -12.0f}, + {dPa_name::ID_SCENE_822E, 0, 0, 1, -12.0f}, + {dPa_name::ID_SCENE_8268, 0, 60, 120, -3.0f}, + {dPa_name::ID_SCENE_8269, 0, 60, 120, -3.0f}, + {dPa_name::ID_SCENE_826A, 0, 0, 1, -12.0f}, + }; +#endif + + if (arg1 < 0 || arg1 >= 6) { + JUT_ASSERT(VERSION_SELECT(427, 424, 428, 428), FALSE); + return; + } + + ParticleData* particle = &particle_data[arg1]; + + m438 = particle->m04; + switch (particle->m04) { + case 0: +#if VERSION == VERSION_DEMO + m_emitter_p = +#endif + dComIfGp_particle_set(particle->m00, arg2, arg3, NULL, 0xff, NULL, -1, arg4); + break; + + case 1: + mSmokeCallback.remove(); +#if VERSION == VERSION_DEMO + m_emitter_p = dComIfGp_particle_setToon(particle->m00, arg2, arg3, NULL, l_HIO.m18, &mSmokeCallback); +#else + dComIfGp_particle_setToon(particle->m00, arg2, arg3, NULL, 0xa0, &mSmokeCallback); +#endif + break; + + default: + JUT_ASSERT(VERSION_SELECT(470, 464, 468, 468), FALSE); + break; + } + + m430 = particle->m08; +#if VERSION == VERSION_DEMO + m40C = particle->m0C; +#else + m434 = particle->m0C; + m40C = particle->m10; +#endif } /* 000002E4-00000360 .text rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ -void rideCallBack(dBgW*, fopAc_ac_c*, fopAc_ac_c*) { - /* Nonmatching */ +void rideCallBack(dBgW*, fopAc_ac_c* a_this, fopAc_ac_c* a_player) { + daObjLeaves_c* i_this = (daObjLeaves_c*)a_this; + + if (fopAcM_GetName(a_player) == PROC_PLAYER) { + daPy_py_c* player = (daPy_py_c*)a_player; +#if VERSION == VERSION_DEMO + if (player->speedF >= l_HIO.m14) { +#else + if (player->speedF >= 8.0f) { +#endif + if (player->getFootOnGround()) { + i_this->birthEffect(2, &player->current.pos, NULL, &i_this->tevStr.mColorK0); +#if VERSION == VERSION_DEMO + i_this->setPEmitter(NULL); +#endif + } + } + } } /* 00000360-00000384 .text solidHeapCB__13daObjLeaves_cFP10fopAc_ac_c */ -void daObjLeaves_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjLeaves_c::solidHeapCB(fopAc_ac_c* a_this) { + return ((daObjLeaves_c*)a_this)->create_heap(); } /* 00000384-00000494 .text create_heap__13daObjLeaves_cFv */ -void daObjLeaves_c::create_heap() { - /* Nonmatching */ +bool daObjLeaves_c::create_heap() { + bool uVar5 = true; + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcname, VOCHI_BDL_VOCHI); + if (modelData == NULL) { + JUT_ASSERT(VERSION_SELECT(550, 544, 548, 548), FALSE); + uVar5 = false; + } else { + mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x31000202); + mpBgW = dBgW_NewSet((cBgD_t*)dComIfG_getObjectRes(l_arcname, VOCHI_DZB_VOCHI), cBgW::MOVE_BG_e, &mModel->getBaseTRMtx()); + if (mModel == NULL || mpBgW == NULL) { + uVar5 = false; + } else { + mpBgW->SetRideCallback(rideCallBack); + } + } + return uVar5; } -/* 00000494-000008C0 .text tg_hitCallback__13daObjLeaves_cFP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daObjLeaves_c::tg_hitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +#if VERSION <= VERSION_JPN +bool daObjLeaves_c::checkCollision() { + bool ret = false; + + if (mSph.ChkTgHit() != 0) { + cCcD_Obj* hitObj = mSph.GetTgHitObj(); + + if (hitObj != NULL) { + u32 cVar5 = hitObj->GetAtType(); + switch (cVar5) { + case AT_TYPE_WIND: + fopAc_ac_c* player = dComIfGp_getPlayer(0); + s16 iVar3 = cM_atan2s(current.pos.x - player->current.pos.x, current.pos.z - player->current.pos.z); + csXyz sp0C; + sp0C.x = 0; + sp0C.y = iVar3; + sp0C.z = 0; + birthEffect(0, ¤t.pos, &sp0C, &tevStr.mColorK0); + birthEffect(1, ¤t.pos, &sp0C, NULL); + fopAcM_seStartCurrent(this, JA_SE_OBJ_OCHIBA_BLOW, 0); + ret = true; + break; + + case AT_TYPE_BOMB: + birthEffect(5, ¤t.pos, NULL, &tevStr.mColorK0); + fopAcM_seStartCurrent(this, JA_SE_OBJ_OCHIBA_BLOW, 0); + ret = true; + break; + + default: + f32 abs = (*mSph.GetTgHitPosP() - current.pos).absXZ(); +#if VERSION == VERSION_DEMO + if (abs < l_HIO.m10) { +#elif VERSION == VERSION_JPN + if (abs < 95.0f) { +#else + if (abs < 110.0f) { +#endif + switch (cVar5) { + case AT_TYPE_HOOKSHOT: + case AT_TYPE_MACHETE: + case AT_TYPE_BOOMERANG: + case AT_TYPE_UNK8: + case AT_TYPE_SWORD: + case AT_TYPE_BOKO_STICK: + case AT_TYPE_UNK2000: + case AT_TYPE_SPIKE: + case AT_TYPE_UNK800: + case AT_TYPE_NORMAL_ARROW: + case AT_TYPE_LIGHT_ARROW: + case AT_TYPE_ICE_ARROW: + case AT_TYPE_DARKNUT_SWORD: + case AT_TYPE_UNK2000000: + case AT_TYPE_STALFOS_MACE: + case AT_TYPE_MOBLIN_SPEAR: + birthEffect(2, mSph.GetTgHitPosP(), NULL, &tevStr.mColorK0); +#if VERSION == VERSION_DEMO + m_emitter_p = NULL; +#endif + break; + + case AT_TYPE_SKULL_HAMMER: + birthEffect(5, ¤t.pos, NULL, &tevStr.mColorK0); + fopAcM_seStartCurrent(this, JA_SE_OBJ_OCHIBA_BLOW, 0); +#if VERSION == VERSION_DEMO + m_emitter_p = NULL; +#endif + break; + + case AT_TYPE_FIRE: + case AT_TYPE_FIRE_ARROW: + case AT_TYPE_UNK20000: + birthEffect(3, ¤t.pos, NULL, NULL); + birthEffect(4, ¤t.pos, NULL, NULL); + m538 = 1; + fopAcM_seStartCurrent(this, JA_SE_OBJ_OCHIBA_BURN, 0); + ret = true; + break; + } + } + } + } + + mSph.ClrTgHit(); + } + return ret; } +#else +/* 00000494-000008C0 .text tg_hitCallback__13daObjLeaves_cFP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ +void daObjLeaves_c::tg_hitCallback(fopAc_ac_c* a_this, dCcD_GObjInf* arg1, fopAc_ac_c*, dCcD_GObjInf*) { + daObjLeaves_c* i_this = (daObjLeaves_c*)a_this; + cCcD_Obj* hitObj = arg1->GetTgHitObj(); + + if (hitObj == NULL) { + return; + } + + u32 cVar5 = hitObj->GetAtType(); + switch (cVar5) { + case AT_TYPE_WIND: + fopAc_ac_c* player = dComIfGp_getPlayer(0); + s16 iVar3 = cM_atan2s(a_this->current.pos.x - player->current.pos.x, a_this->current.pos.z - player->current.pos.z); + csXyz sp0C; + sp0C.x = 0; + sp0C.y = iVar3; + sp0C.z = 0; + i_this->birthEffect(0, &a_this->current.pos, &sp0C, &a_this->tevStr.mColorK0); + i_this->birthEffect(1, &a_this->current.pos, &sp0C, NULL); + fopAcM_seStartCurrent(a_this, JA_SE_OBJ_OCHIBA_BLOW, 0); + i_this->m44C = true; + break; + + case AT_TYPE_BOMB: + i_this->birthEffect(5, &a_this->current.pos, NULL, &a_this->tevStr.mColorK0); + fopAcM_seStartCurrent(a_this, JA_SE_OBJ_OCHIBA_BLOW, 0); + i_this->m44C = true; + break; + + default: + f32 abs = (*i_this->mSph.GetTgHitPosP() - a_this->current.pos).absXZ(); + if (abs < 110.0f) { + switch (cVar5) { + case AT_TYPE_HOOKSHOT: + case AT_TYPE_MACHETE: + case AT_TYPE_BOOMERANG: + case AT_TYPE_UNK8: + case AT_TYPE_SWORD: + case AT_TYPE_BOKO_STICK: + case AT_TYPE_UNK2000: + case AT_TYPE_SPIKE: + case AT_TYPE_UNK800: + case AT_TYPE_NORMAL_ARROW: + case AT_TYPE_LIGHT_ARROW: + case AT_TYPE_ICE_ARROW: + case AT_TYPE_DARKNUT_SWORD: + case AT_TYPE_UNK2000000: + case AT_TYPE_STALFOS_MACE: + case AT_TYPE_MOBLIN_SPEAR: + i_this->birthEffect(2, i_this->mSph.GetTgHitPosP(), NULL, &a_this->tevStr.mColorK0); + break; + + case AT_TYPE_SKULL_HAMMER: + i_this->birthEffect(5, &a_this->current.pos, NULL, &a_this->tevStr.mColorK0); + fopAcM_seStartCurrent(i_this, JA_SE_OBJ_OCHIBA_BLOW, 0); + break; + + case AT_TYPE_FIRE: + case AT_TYPE_FIRE_ARROW: + case AT_TYPE_UNK20000: + i_this->birthEffect(3, &a_this->current.pos, NULL, NULL); + i_this->birthEffect(4, &a_this->current.pos, NULL, NULL); + fopAcM_seStartCurrent(a_this, JA_SE_OBJ_OCHIBA_BURN, 0); + i_this->m44C = true; + break; + } + } + } +} +#endif + +#if VERSION <= VERSION_JPN +void daObjLeaves_c::registFireCollision() { + if (m538 == 1) { + mStts.Move(); + dComIfG_Ccsp()->Set(&mCyl); + } +} +#endif /* 000008C0-00000B08 .text _create__13daObjLeaves_cFv */ cPhs_State daObjLeaves_c::_create() { - /* Nonmatching */ + cPhs_State PVar4 = cPhs_ERROR_e; + + fopAcM_SetupActor(this, daObjLeaves_c); + + if (base.mInitState == 0) { + m43C = chk_appear(); + } + + if (m43C == true) { + PVar4 = dComIfG_resLoad(&mPhase, l_arcname); + } + + if (PVar4 == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, solidHeapCB, 0xC20) == true) { + if (dComIfG_Bgsp()->Regist(mpBgW, this)) { + PVar4 = cPhs_ERROR_e; + } else { + fopAcM_SetMtx(this, mModel->getBaseTRMtx()); + init_mtx(); + mStts.Init(0xff, 0xff, this); + mSph.Set(l_sph_src); + mSph.SetStts(&mStts); +#if VERSION == VERSION_DEMO + mSph.SetC(current.pos.x, current.pos.y - 115.0f, current.pos.z); +#else + cXyz sp08(current.pos.x, current.pos.y - 115.0f, current.pos.z); + mSph.SetC(sp08); +#if VERSION >= VERSION_USA + mSph.SetR(150.0f); +#endif +#endif +#if VERSION <= VERSION_JPN + mCyl.Set(l_fire_cyl_src); + mCyl.SetStts(&mStts); + mCyl.SetC(current.pos); +#endif +#if VERSION > VERSION_JPN + mSph.SetTgHitCallback(tg_hitCallback); +#endif + m408 = 255.0f; + mMemberFunc = &daObjLeaves_c::wait_proc; + mSmokeCallback.setTevStr(&tevStr); + mSmokeCallback.setRateOff(0); + mSmokeCallback.setFollowOff(); + } + } else { + PVar4 = cPhs_ERROR_e; + } + } + +#if VERSION == VERSION_DEMO + if (l_HIO.m04 < 0) { + l_HIO.m04 = mDoHIO_createChild("落ち葉", &l_HIO); + } +#endif + return PVar4; } /* 00000CC0-00000D74 .text _delete__13daObjLeaves_cFv */ bool daObjLeaves_c::_delete() { - /* Nonmatching */ + if (m43C == true) { + dComIfG_resDelete(&mPhase, l_arcname); +#if VERSION == VERSION_DEMO + if (mMemberFunc != &daObjLeaves_c::wait_proc && m438 == 1) +#endif + { + mSmokeCallback.remove(); + } +#if VERSION > VERSION_DEMO + if (heap != NULL && mpBgW != NULL) { +#else + if (mpBgW != NULL) { +#endif + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } +#if VERSION > VERSION_DEMO + mpBgW = NULL; +#endif + } + } + +#if VERSION == VERSION_DEMO + if (l_HIO.m04 >= 0) { + mDoHIO_deleteChild(l_HIO.m04); + l_HIO.m04 = -1; + } +#endif + + return true; } /* 00000D74-00000E84 .text wait_proc__13daObjLeaves_cFv */ void daObjLeaves_c::wait_proc() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + mSph.SetR(l_HIO.m08); + mSph.SetC(current.pos.x, current.pos.y - l_HIO.m0C, current.pos.z); +#endif + mpBgW->Move(); + mStts.Move(); + +#if VERSION <= VERSION_JPN + if (!checkCollision()) +#else + mSph.ClrTgHit(); + if (!m44C) +#endif + { + dComIfG_Ccsp()->Set(&mSph); + } else { + param_on_swSave(); + s32 swSave = param_get_swSave(); + if (swSave != 0xFF) { + fopAcM_onSwitch((fopAc_ac_c*)this, swSave); + } + fopAcM_OffStatus(this, fopAcStts_NOCULLEXEC_e); + + if (mpBgW != NULL && mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + +#if VERSION == VERSION_DEMO + if (m_emitter_p != NULL) +#endif + { + mMemberFunc = &daObjLeaves_c::alpha_calc_start_wait_proc; + } +#if VERSION == VERSION_DEMO + else + { + mMemberFunc = &daObjLeaves_c::item_set_wait_proc; + } +#endif + } } /* 00000E84-00000EB4 .text alpha_calc_start_wait_proc__13daObjLeaves_cFv */ void daObjLeaves_c::alpha_calc_start_wait_proc() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + registFireCollision(); + JUT_ASSERT(908, m_emitter_p != NULL); + + if (m_emitter_p->getFrame() >= m430) { + mMemberFunc = &daObjLeaves_c::item_set_wait_proc; + } +#elif VERSION == VERSION_JPN + registFireCollision(); + if (m430 <= 0) { + mMemberFunc = &daObjLeaves_c::item_set_wait_proc; + } +#endif + +#if VERSION > VERSION_JPN + if (m430 <= 0) { + mMemberFunc = &daObjLeaves_c::item_set_wait_proc; + } +#endif } /* 00000EB4-00000FB8 .text item_set_wait_proc__13daObjLeaves_cFv */ void daObjLeaves_c::item_set_wait_proc() { - /* Nonmatching */ +#if VERSION <= VERSION_JPN + registFireCollision(); +#endif + m408 += m40C; +#if VERSION == VERSION_DEMO + if (m408 <= l_HIO.m1C) { +#else + if (m408 <= 200.0f) { +#endif + s32 item = param_get_itemNo(); + s32 itemSaveBit = param_get_itemSaveBitNo(); + + cXyz sp10 = current.pos; + csXyz angle(0, 0, 0); + + sp10.y -= 30.0f; + fopAcM_createItemFromTable(&sp10, item, itemSaveBit, fopAcM_GetHomeRoomNo(this), 0, &angle, 1, NULL); +#if VERSION == VERSION_DEMO + if (m_emitter_p != NULL) +#endif + { + mMemberFunc = &daObjLeaves_c::retire_wait_proc; + } +#if VERSION == VERSION_DEMO + else + { + mMemberFunc = &daObjLeaves_c::retire_wait_without_particle_proc; + } +#endif + } } /* 00000FB8-00001010 .text retire_wait_proc__13daObjLeaves_cFv */ void daObjLeaves_c::retire_wait_proc() { - /* Nonmatching */ +#if VERSION <= VERSION_JPN + registFireCollision(); +#endif +#if VERSION == VERSION_DEMO + JUT_ASSERT(961, m_emitter_p != NULL); +#endif + +#if VERSION == VERSION_DEMO + m408 += m40C; + if (m408 <= 0.0f) { + m408 = 0.0f; + if (m_emitter_p->isEnableDeleteEmitter()) { + fopAcM_delete(this); + m_emitter_p = NULL; + m538 = 0; + } + } +#else + m408 += m40C; + if (m408 <= 0.0f) { + m408 = 0.0f; + if (m434 <= 0) { + fopAcM_delete(this); +#if VERSION == VERSION_JPN + m538 = 0; +#endif + } + } +#endif } +#if VERSION == VERSION_DEMO +void daObjLeaves_c::retire_wait_without_particle_proc() { + registFireCollision(); + m408 += m40C; + if (m408 <= 0.0f) { + m408 = 0.0f; + fopAcM_delete(this); + m_emitter_p = NULL; + m538 = 0; + } +} +#endif + /* 00001010-0000107C .text _execute__13daObjLeaves_cFv */ bool daObjLeaves_c::_execute() { - /* Nonmatching */ +#if VERSION >= VERSION_JPN + m430--; + if (m430 <= 0) { + m430 = 0; + } + + m434--; + if (m434 <= 0) { + m434 = 0; + } +#endif + (this->*mMemberFunc)(); + return true; } /* 0000107C-000011B0 .text set_material_sub__FP11J3DMaterialUc */ -void set_material_sub(J3DMaterial*, unsigned char) { - /* Nonmatching */ +void set_material_sub(J3DMaterial* material, unsigned char alpha) { + while (material != NULL) { + if (alpha == 0) { + material->getShape()->hide(); + } else { + material->getShape()->show(); + if (alpha != 0xFF) { + material->setMaterialMode(4); + material->getZMode()->setUpdateEnable(0); + material->getBlend()->setType(1); + material->getBlend()->setSrcFactor(4); + material->getBlend()->setDstFactor(5); + } + material->getTevKColor(3)->mColor.a = alpha; + } + + material = material->getNext(); + } } /* 000011B0-00001218 .text set_material__FP8J3DModelUc */ -void set_material(J3DModel*, unsigned char) { - /* Nonmatching */ +void set_material(J3DModel* model, unsigned char alpha) { + J3DModelData* modelData = model->getModelData(); + for (u16 i = 0; i < modelData->getJointNum(); i++) { + set_material_sub(modelData->getJointNodePointer(i)->getMesh(), alpha); + } } /* 00001218-00001290 .text _draw__13daObjLeaves_cFv */ bool daObjLeaves_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mModel, &tevStr); + set_material(mModel, m408); + mDoExt_modelUpdateDL(mModel); + return true; } /* 00001290-000012B0 .text daObjLeaves_Create__FP13daObjLeaves_c */