diff --git a/include/d/actor/d_a_esa.h b/include/d/actor/d_a_esa.h index 5de52186e..27423722c 100644 --- a/include/d/actor/d_a_esa.h +++ b/include/d/actor/d_a_esa.h @@ -2,10 +2,23 @@ #define D_A_ESA_H #include "f_op/f_op_actor.h" +#include "d/d_particle.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" class esa_class : public fopAc_ac_c { public: - /* Place member variables here */ -}; + /* 0x290 */ u8 field_0x290[0x298 - 0x290]; + /* 0x298 */ u8 field_0x298; + /* 0x29C */ f32 mGroundHeight; + /* 0x2A0 */ s8 mActionState; + /* 0x2A1 */ s8 mState; + /* 0x2A2 */ u8 field_0x2A2[0x2A4 - 0x2A2]; + /* 0x2A4 */ dPa_rippleEcallBack field_0x2A4; + /* 0x2B8 */ u8 field_0x2B8; + /* 0x2B9 */ s8 field_0x2B9; + /* 0x2BA */ u8 field_0x2BA; + /* 0x2BC */ J3DModel* mpModel; + /* 0x2C0 */ s16 mTimer[2]; +}; // Size: 0x2C4 #endif /* D_A_ESA_H */ diff --git a/include/d/actor/d_a_npc_nz.h b/include/d/actor/d_a_npc_nz.h index 72eaecf0c..0c4c521b8 100644 --- a/include/d/actor/d_a_npc_nz.h +++ b/include/d/actor/d_a_npc_nz.h @@ -2,46 +2,57 @@ #define D_A_NPC_NZ_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_particle.h" +#include "d/d_bg_s_acch.h" +#include "d/d_npc.h" +#include "d/actor/d_a_shop_item.h" class J3DNode; -class daNpc_Nz_c : public fopAc_ac_c { +class daNpc_Nz_c : public fopNpc_npc_c { public: enum Proc_e { - + PROC_0_e = 0, + PROC_1_e = 1, }; + // objdiff says this is a weak function + // but defining it here with {} causes it to be inlined with fopAcM_SetupActor which breaks things + daNpc_Nz_c(); + void modeProcInit(int) {} - static BOOL NodeCallBack(J3DNode*, int); - static BOOL TailNodeCallBack(J3DNode*, int); + BOOL NodeCallBack(J3DNode*, int); + BOOL TailNodeCallBack(J3DNode*, int); void TailControl(); - void _createHeap(); - void XyEventCB(int); + bool _createHeap(); + s16 XyEventCB(int); void eventOrder(); void checkOrder(); void setAttention(); void LookBack(); - void setAnm(signed char, bool); + void setAnm(s8, bool); void setMtx(); void modeWaitInit(); void modeWait(); void modeEventEsaInit(); void modeEventEsa(); void modeProc(Proc_e, int); - void createShopItem(unsigned char, unsigned char); - void getShopItem(int); + void createShopItem(u8, u8); + daShopItem_c* getShopItem(int); void deleteShopItem(); - void next_msgStatus(unsigned long*); - void anmAtr(unsigned short); - BOOL _execute(); - BOOL _draw(); - void createInit(); + u16 next_msgStatus(u32*); + void anmAtr(u16); + bool _execute(); + bool _draw(); + BOOL createInit(); void setSmokeParticle(); void getArg(); s32 _create(); - BOOL _delete(); - void _searchEsa(fopAc_ac_c*); + bool _delete(); + BOOL _searchEsa(fopAc_ac_c*); void cutProc(); void cutEatesaStart(); void cutEatesaProc(); @@ -61,15 +72,66 @@ public: void cutChkGetItemProc(); public: - /* Place member variables here */ -}; + static const char m_arc_name[]; + static const char m_bdl_arc_name[]; -class daNpc_Nz_HIO_c { + /* 0x6C4 */ cXyz field_0x6C4; + /* 0x6D0 */ int mCurMode; + /* 0x6D4 */ s8 field_0x6D4; + /* 0x6D5 */ s8 field_0x6D5; + /* 0x6D6 */ s8 field_0x6D6; + /* 0x6D8 */ request_of_phase_process_class mPhs1; + /* 0x6E0 */ request_of_phase_process_class mPhs2; + /* 0x6E8 */ mDoExt_McaMorf* mpMorf; + /* 0x6EC */ f32 field_0x6EC; + /* 0x6F0 */ dBgS_ObjAcch mAcch; + /* 0x8B4 */ dBgS_AcchCir mAcchCir; + /* 0x8F4 */ int field_0x8F4; + /* 0x8F8 */ u8 field_0x8F8; + /* 0x8FA */ s16 field_0x8FA; + /* 0x8FC */ bool field_0x8FC; + /* 0x8FE */ s16 field_0x8FE; + /* 0x900 */ u32 field_0x900; + /* 0x904 */ s16 field_0x904; + /* 0x906 */ s16 field_0x906; + /* 0x908 */ u8 field_0x908; + /* 0x909 */ u8 field_0x909; + /* 0x90A */ s16 field_0x90A; + /* 0x90C */ fopAc_ac_c* mpBait; + /* 0x910 */ f32 field_0x910; + /* 0x914 */ dPa_smokeEcallBack field_0x914; + /* 0x934 */ mDoExt_3DlineMat1_c field_0x934; + /* 0x970 */ u32 field_0x970; + /* 0x974 */ cXyz field_0x974[10]; + /* 0x9EC */ cXyz field_0x9EC[10]; + /* 0xA64 */ cXyz field_0xA64[2]; + /* 0xA7C */ u8 field_0xA70[0xC]; + /* 0xA88 */ u32 field_0xA88; + /* 0xA8C */ u32 field_0xA8C; + /* 0xA90 */ s16 field_0xA90; +}; // Size: 0xA92 + +class daNpc_Nz_HIO_c : public JORReflexible { public: daNpc_Nz_HIO_c(); + virtual ~daNpc_Nz_HIO_c() {} -public: - /* Place member variables here */ -}; + /* 0x00 - vtable */ + /* 0x04 */ s8 field_0x04; + /* 0x06 */ s16 field_0x06; + /* 0x08 */ s16 field_0x08; + /* 0x0A */ s16 field_0x0A; + /* 0x0C */ s16 field_0x0C; + /* 0x0E */ s16 field_0x0E; + /* 0x10 */ s16 field_0x10; + /* 0x12 */ s16 field_0x12; + /* 0x14 */ s16 field_0x14; + /* 0x16 */ s16 field_0x16; + /* 0x18 */ s16 field_0x18; + /* 0x1A */ s8 field_0x1A; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; +}; // Size: 0x28 #endif /* D_A_NPC_NZ_H */ diff --git a/include/d/actor/d_a_obj_barrel.h b/include/d/actor/d_a_obj_barrel.h index 3ab981f48..58d19181d 100644 --- a/include/d/actor/d_a_obj_barrel.h +++ b/include/d/actor/d_a_obj_barrel.h @@ -8,7 +8,11 @@ namespace daObjBarrel { public: void attr() const {} void get_slant_angle() {} - void pos_init() {} + void pos_init() { + current.pos = home.pos; + current.angle = home.angle; + shape_angle = home.angle; + } void prm_get_cull() const {} void set_slant_angle(short) {} diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 1298e1b74..137918bf1 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -135,6 +135,8 @@ public: bool ChkWallHit() { return m_flags & WALL_HIT; } void OffLineCheckHit() { m_flags &= ~LINE_CHECK_HIT; } void OffLineCheck() { m_flags &= ~LINE_CHECK; } + void OffLineCheckNone() { m_flags &= ~LINE_CHECK_NONE; } + void OnLineCheckNone() { m_flags |= LINE_CHECK_NONE; } bool ChkLineCheckNone() { return m_flags & LINE_CHECK_NONE; } bool ChkLineCheck() { return m_flags & LINE_CHECK; } void ClrRoofHit() { m_flags &= ~ROOF_HIT; } diff --git a/include/d/d_lib.h b/include/d/d_lib.h index 8b375f4e1..baa7b4ddb 100644 --- a/include/d/d_lib.h +++ b/include/d/d_lib.h @@ -56,6 +56,12 @@ public: virtual s16 getAngleStick(); }; +class dLib_anm_idx_c { +public: + /* 0x00 */ int field_0x00; + /* 0x04 */ int field_0x04; +}; // Size: 0x08 + class dLib_anm_prm_c { public: /* 0x00 */ s8 mBckIdx; @@ -64,7 +70,7 @@ public: /* 0x04 */ f32 mMorf; /* 0x08 */ f32 mPlaySpeed; /* 0x0C */ int mLoopMode; -}; +}; // Size: 0x10 class dLib_circle_path_c { public: @@ -86,8 +92,6 @@ public: /* 0x0A */ s16 mRotZ; }; -class dLib_anm_idx_c; - void dLib_setCirclePath(dLib_circle_path_c*); f32 dLib_getWaterY(cXyz& pos, dBgS_ObjAcch& acch); void dLib_waveRot(Vec*, f32, dLib_wave_c*); diff --git a/src/d/actor/d_a_esa.cpp b/src/d/actor/d_a_esa.cpp index dd8fed3f4..65d6c3baa 100644 --- a/src/d/actor/d_a_esa.cpp +++ b/src/d/actor/d_a_esa.cpp @@ -4,45 +4,308 @@ // #include "d/actor/d_a_esa.h" -#include "dolphin/types.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_s_play.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/d_bg_s_func.h" +#include "d/actor/d_a_sea.h" +#include "d/actor/d_a_player_main.h" /* 800E7E60-800E7EA8 .text daEsa_Draw__FP9esa_class */ -static BOOL daEsa_Draw(esa_class*) { - /* Nonmatching */ +static BOOL daEsa_Draw(esa_class* i_this) { + g_env_light.setLightTevColorType(i_this->mpModel, &i_this->tevStr); + mDoExt_modelUpdateDL(i_this->mpModel); + + return true; } /* 800E7EA8-800E849C .text bg_check__FP9esa_class */ -void bg_check(esa_class*) { - /* Nonmatching */ +void bg_check(esa_class* i_this) { + /* Nonmatching - stack */ + + dBgS_GndChk gndChk; + f32 x = i_this->current.pos.x; + f32 y = i_this->current.pos.y; + f32 z = i_this->current.pos.z; + y += 100.0f; + gndChk.GetPointP()->x = x; + gndChk.GetPointP()->y = y; + gndChk.GetPointP()->z = z; + + i_this->mGroundHeight = dComIfG_Bgsp()->GroundCross(&gndChk) + 5.0f; + s8 state = 1; + if(daSea_ChkArea(i_this->current.pos.x, i_this->current.pos.z)) { + f32 wave = daSea_calcWave(i_this->current.pos.x, i_this->current.pos.z); + if(i_this->mGroundHeight <= wave) { + i_this->mGroundHeight = wave; + state = 2; + } + } + + cXyz temp(i_this->current.pos); + temp.y += 100.0f; + f32 waterHeight = dBgS_GetWaterHeight(temp); + if(waterHeight != -1000000000.0f && i_this->mGroundHeight <= waterHeight) { + i_this->mGroundHeight = waterHeight; + state = 2; + } + + if(i_this->speed.y <= 0.0f && i_this->current.pos.y <= i_this->mGroundHeight) { + i_this->current.pos.y = i_this->mGroundHeight; + i_this->mState = state; + } + else { + i_this->mState = 0; + } + + dBgS_LinChk linChk; + cXyz temp4 = i_this->old.pos + (i_this->current.pos - i_this->old.pos) * 1.5f; + temp4.y = i_this->old.pos.y; + cXyz temp5 = i_this->old.pos - temp4; + if(temp5.abs() > 1.0f) { + linChk.Set(&i_this->old.pos, &temp4, i_this); + if(dComIfG_Bgsp()->LineCross(&linChk)) { + i_this->current.pos.x = i_this->old.pos.x; + i_this->current.pos.z = i_this->old.pos.z; + i_this->speedF *= 0.5f; + i_this->current.angle.y -= 0x8000; + cXyz temp6; + temp6.x = 0.0f; + temp6.y = 0.0f; + temp6.z = i_this->speedF; + cXyz temp7; + mDoMtx_YrotS(*calc_mtx, i_this->current.angle.y); + MtxPosition(&temp6, &temp7); + i_this->speed.x = temp7.x; + i_this->speed.z = temp7.z; + } + } + else { + fopAcM_OffStatus(i_this, fopAcStts_UNK4000_e); + } } /* 800E849C-800E88F8 .text esa_1_move__FP9esa_class */ -void esa_1_move(esa_class*) { - /* Nonmatching */ +void esa_1_move(esa_class* i_this) { + /* Nonmatching - stack */ + + switch(i_this->mActionState) { + case 0: + i_this->current.angle.y += (s16)cM_rndFX(4000.0f); + i_this->current.angle.z = cM_rndFX(32768.0f); + cXyz temp; + temp.x = 0.0f; + temp.y = cM_rndF(8.0f) + 15.0f; + temp.z = cM_rndF(5.0f) + 10.0f; + i_this->speedF = temp.z; + mDoMtx_YrotS(*calc_mtx, i_this->current.angle.y); + MtxPosition(&temp, &i_this->speed); + + i_this->mActionState = 1; + case 1: + if(i_this->mState != 0) { + if(i_this->mState == 2) { + i_this->mTimer[0] = cM_rndF(50.0f) + 200.0f; + i_this->mActionState = 3; + if(i_this->field_0x2A4.getEmitter() == NULL) { + static cXyz ripple_scale(0.2f, 0.2f, 0.2f); + dComIfGp_particle_setShipTail(0x33, &i_this->current.pos, 0, &ripple_scale, 0xFF, &i_this->field_0x2A4); + if(i_this->field_0x2A4.getEmitter()) { + i_this->field_0x2A4.setRate(0.4f); + } + } + } + else { + if(i_this->speed.y < 5.0f) { + i_this->speed.y *= -(cM_rndF(0.05f) + 0.15f); + i_this->current.angle.z = cM_rndFX(32768.0f); + } + + i_this->current.angle.y += (s16)cM_rndFX(8000.0f); + i_this->speedF *= cM_rndF(0.3f) + 0.3f; + cXyz temp2; + temp2.x = 0.0f; + temp2.y = 0.0f; + temp2.z = i_this->speedF; + mDoMtx_YrotS(*calc_mtx, i_this->current.angle.y); + cXyz temp3; + MtxPosition(&temp2, &temp3); + i_this->speed.x = temp3.x; + i_this->speed.z = temp3.z; + if(i_this->speedF < 0.1f) { + i_this->mActionState = 2; + i_this->mTimer[0] = cM_rndF(50.0f) + 200.0f; + + break; + } + } + } + + i_this->current.pos.x += i_this->speed.x; + i_this->current.pos.y += i_this->speed.y; + i_this->current.pos.z += i_this->speed.z; + i_this->speed.y -= 3.0f; + bg_check(i_this); + + break; + case 2: + if(i_this->mTimer[0] == 0) { + fopAcM_delete(i_this); + } + + break; + case 3: + if(dComIfGp_evmng_startCheck("SO_ESA_XY")) { + i_this->mTimer[0] = 10000; + } + + i_this->field_0x2A4.end(); + i_this->current.pos.y = daSea_calcWave(i_this->current.pos.x, i_this->current.pos.z); + + if(i_this->mTimer[0] == 0) { + i_this->mTimer[0] = 10; + i_this->mActionState = 4; + } + + if(i_this->field_0x298) { + i_this->mTimer[0] = 10; + i_this->mActionState = 4; + + if(i_this->field_0x2A4.getEmitter() == NULL) { + static cXyz ripple_scale(0.2f, 0.2f, 0.2f); + dComIfGp_particle_setShipTail(0x33, &i_this->current.pos, 0, &ripple_scale, 0xFF, &i_this->field_0x2A4); + if(i_this->field_0x2A4.getEmitter()) { + i_this->field_0x2A4.setRate(0.4f); + } + } + } + + break; + case 4: + if(i_this->mTimer[0] == 0) { + fopAcM_delete(i_this); + } + + break; + } } /* 800E88F8-800E89B8 .text daEsa_Execute__FP9esa_class */ -static BOOL daEsa_Execute(esa_class*) { - /* Nonmatching */ +static BOOL daEsa_Execute(esa_class* i_this) { + for(int i = 0; i < 2; i++) { + if(i_this->mTimer[i] != 0) { + i_this->mTimer[i]--; + } + } + + esa_1_move(i_this); + + MtxTrans(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z, false); + mDoMtx_YrotM(*calc_mtx, i_this->current.angle.y); + mDoMtx_XrotM(*calc_mtx, i_this->current.angle.x); + mDoMtx_ZrotM(*calc_mtx, i_this->current.angle.z); + i_this->mpModel->setBaseTRMtx(*calc_mtx); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr); + + return true; } /* 800E89B8-800E89C0 .text daEsa_IsDelete__FP9esa_class */ -static BOOL daEsa_IsDelete(esa_class*) { - /* Nonmatching */ +static BOOL daEsa_IsDelete(esa_class* i_this) { + return true; } /* 800E89C0-800E89E8 .text daEsa_Delete__FP9esa_class */ -static BOOL daEsa_Delete(esa_class*) { - /* Nonmatching */ +static BOOL daEsa_Delete(esa_class* i_this) { + i_this->field_0x2A4.end(); + + return true; } /* 800E89E8-800E8AB0 .text daEsa_CreateHeap__FP10fopAc_ac_c */ -static BOOL daEsa_CreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL daEsa_CreateHeap(fopAc_ac_c* i_actor) { + esa_class* i_this = static_cast(i_actor); + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Link", 0x2C)); + JUT_ASSERT(0x1E8, modelData != 0); + i_this->mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + + if(i_this->mpModel == NULL) { + return false; + } + + return true; } /* 800E8AB0-800E8CA4 .text daEsa_Create__FP10fopAc_ac_c */ -static s32 daEsa_Create(fopAc_ac_c*) { - /* Nonmatching */ +static s32 daEsa_Create(fopAc_ac_c* i_actor) { + /* Nonmatching - regalloc */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + + fopAcM_SetupActor(i_actor, esa_class); + + esa_class* i_this = static_cast(i_actor); + + i_this->field_0x2B9 = fopAcM_GetParam(i_this) & 0xFF; + i_this->field_0x2BA = fopAcM_GetParam(i_this) >> 8 & 0xFF; + if(g_regHIO.mChild->mShortRegs[0] != 0) { + i_this->field_0x2BA = 1; + } + + if(!fopAcM_entrySolidHeap(i_this, daEsa_CreateHeap, 0x4C0)) { + return cPhs_ERROR_e; + } + + if(i_this->field_0x2BA == 0) { + int num = i_this->field_0x2B9; + if(num > 0) { + for(int i = 0; i < num; i++) { + fopAcM_prm_class* params = fopAcM_CreateAppend(); + cXyz pos = player->getLeftHandPos(); + params->mPos = pos; + params->mAngle.x = 0; + params->mAngle.y = i_this->current.angle.y; + params->mAngle.z = cM_rndF(65536.0f); + params->mParameter = 0x000000FF; + fpcM_Create(PROC_ESA, 0, params); + } + } + } + + f32 temp = g_regHIO.mChild->mFloatRegs[6] + 0.65f; + f32 scaleF = temp + cM_rndF(g_regHIO.mChild->mFloatRegs[5] + 1.0f - temp); + cXyz scale(scaleF, scaleF, scaleF); + i_this->mpModel->setBaseScale(scale); + fopAcM_SetMtx(i_this, i_this->mpModel->getBaseTRMtx()); + + return cPhs_COMPLEATE_e; } +actor_method_class l_daEsa_Method = { + (process_method_func)daEsa_Create, + (process_method_func)daEsa_Delete, + (process_method_func)daEsa_Execute, + (process_method_func)daEsa_IsDelete, + (process_method_func)daEsa_Draw, +}; + +actor_process_profile_definition g_profile_ESA = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_ESA, + /* Proc SubMtd */ &g_fpcLf_Method.base, + /* Size */ sizeof(esa_class), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x00D0, + /* Actor SubMtd */ &l_daEsa_Method, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_UNK4000_e | fopAcStts_CULL_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_0_e, +}; diff --git a/src/d/actor/d_a_npc_nz.cpp b/src/d/actor/d_a_npc_nz.cpp index 934989a45..56158b4d7 100644 --- a/src/d/actor/d_a_npc_nz.cpp +++ b/src/d/actor/d_a_npc_nz.cpp @@ -4,320 +4,1375 @@ // #include "d/actor/d_a_npc_nz.h" -#include "dolphin/types.h" +#include "JSystem/J3DGraphBase/J3DSys.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_tsubo.h" +#include "d/actor/d_a_obj_barrel.h" +#include "d/actor/d_a_esa.h" +#include "d/d_com_inf_game.h" +#include "d/d_lib.h" +#include "d/d_item.h" +#include "d/d_procname.h" + +// need to figure out what's putting this data in front of a bunch of rels +static f32 dummy[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0, 0.5}; + +const char daNpc_Nz_c::m_arc_name[] = "NZ"; +const char daNpc_Nz_c::m_bdl_arc_name[] = "Npcnz"; + +// I think this file has something like -inline deferred on +// since modeProc() appears before cutProc() in the original dol but the in-function statics +// are in the opposite order in .data /* 000000EC-00000128 .text daNpcNz_NodeCallBack__FP7J3DNodei */ -static BOOL daNpcNz_NodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL daNpcNz_NodeCallBack(J3DNode* node, int param_1) { + return reinterpret_cast(j3dSys.getModel()->getUserArea())->NodeCallBack(node, param_1); } /* 00000128-0000024C .text NodeCallBack__10daNpc_Nz_cFP7J3DNodei */ -BOOL daNpc_Nz_c::NodeCallBack(J3DNode*, int) { - /* Nonmatching */ +BOOL daNpc_Nz_c::NodeCallBack(J3DNode* node, int param_1) { + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + + if(jntNo == m_jnt.getHeadJntNum()) { + cXyz temp(0.0f, 0.0f, 0.0f); + mDoMtx_stack_c::YrotM(m_jnt.getHead_y()); + mDoMtx_stack_c::ZrotM(-m_jnt.getHead_x()); + mDoMtx_stack_c::multVec(&temp, &eyePos); + } + if(jntNo == m_jnt.getBackboneJntNum()) { + mDoMtx_stack_c::XrotM(m_jnt.getBackbone_y()); + mDoMtx_stack_c::ZrotM(-m_jnt.getBackbone_x()); + } + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } + + return true; } /* 00000288-000002C4 .text daNpcNz_TailNodeCallBack__FP7J3DNodei */ -static BOOL daNpcNz_TailNodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL daNpcNz_TailNodeCallBack(J3DNode* node, int param_1) { + return reinterpret_cast(j3dSys.getModel()->getUserArea())->TailNodeCallBack(node, param_1); } /* 000002C4-000003A4 .text TailNodeCallBack__10daNpc_Nz_cFP7J3DNodei */ -BOOL daNpc_Nz_c::TailNodeCallBack(J3DNode*, int) { +BOOL daNpc_Nz_c::TailNodeCallBack(J3DNode* node, int param_1) { /* Nonmatching */ + + if (!param_1) { + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + s32 idx = 0; + J3DModel* model = j3dSys.getModel(); + + if(jntNo == 9) { + idx = 1; + } + + static cXyz offset(cXyz::Zero); + + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + mDoMtx_stack_c::multVec(&offset, &field_0xA64[idx]); + } + + return true; } /* 000003A4-00000978 .text TailControl__10daNpc_Nz_cFv */ void daNpc_Nz_c::TailControl() { /* Nonmatching */ + + cXyz temp(0.0f, 0.0f, 5.0f); + field_0x974[0] = field_0xA64[0]; + cXyz temp2 = field_0xA64[1] - field_0xA64[0]; + s32 angle = cM_atan2s(temp2.x, temp2.z); + f32 dist = temp2.absXZ(); + s32 angle2 = cM_atan2s(temp2.x, dist); + mDoMtx_stack_c::YrotS(angle); + mDoMtx_stack_c::XrotM(angle2); + mDoMtx_stack_c::multVec(&temp, &temp2); + dBgS_GndChk gndChk; + + for(int i = 1; i < 10; i++) { + f32 temp3 = 1.0f - i * 0.1f; + cXyz temp4; + temp4.x = field_0x9EC[i].x + temp2.x * temp3; + temp4.y = field_0x9EC[i].y + temp2.y * temp3; + temp4.z = field_0x9EC[i].z + temp2.z * temp3; + f32 temp5 = field_0x974[i].y + temp4.y - 2.0f; + if(temp5 < home.pos.y + 5.0f) { + temp5 = home.pos.y + 5.0f; + } + cXyz temp6; + temp6.y = temp5 - field_0x974[i].y; + temp6.x = temp4.x + (field_0x974[i].x - field_0x974[i - 1].x); + temp6.z = temp4.z + (field_0x974[i].z - field_0x974[i - 1].z); + s16 temp7 = cM_atan2s(temp6.x, temp6.z); + f32 temp8 = temp6.absXZ(); + s16 temp9 = -cM_atan2s(temp6.x, dist); + cXyz temp10(0.0f, 0.0f, 20.0f); + mDoMtx_stack_c::YrotS(temp7); + mDoMtx_stack_c::XrotM(temp9); + mDoMtx_stack_c::multVec(&temp10, &temp6); + field_0x9EC[i] = field_0x974[i]; + field_0x974[i].x = field_0x974[i - 1].x + temp6.x; + field_0x974[i].y = field_0x974[i - 1].y + temp6.y; + field_0x974[i].z = field_0x974[i - 1].z + temp6.z; + field_0x9EC[i].x = (field_0x974[i].x - field_0x9EC[i].x) * 0.8f; + field_0x9EC[i].y = (field_0x974[i].y - field_0x9EC[i].y) * 0.8f; + field_0x9EC[i].z = (field_0x974[i].z - field_0x9EC[i].z) * 0.8f; + } + + for(int i = 0; i < 10; i++) { + field_0x934.mpLines->mpSegments[i] = field_0x974[i]; + } } +static daNpc_Nz_HIO_c l_HIO; + /* 00000CF8-00000D18 .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { +static int createHeap_CB(fopAc_ac_c* i_this) { /* Nonmatching */ + + return static_cast(i_this)->_createHeap(); } /* 00000D18-00000F98 .text _createHeap__10daNpc_Nz_cFv */ -void daNpc_Nz_c::_createHeap() { - /* Nonmatching */ +bool daNpc_Nz_c::_createHeap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(m_bdl_arc_name, 3)); + JUT_ASSERT(0xD0, modelData != 0); + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, + 0, + -1, 1.0f, 0, -1, 1, + NULL, + 0x00080000, + 0x37441422 + ); + + if(mpMorf == NULL || mpMorf->getModel() == NULL) { + return false; + } + + mpMorf->getModel()->setUserArea((u32)this); + + m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head")); + JUT_ASSERT(0xDA, m_jnt.getHeadJntNum() >= 0); + + m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("mune")); + JUT_ASSERT(0xDD, m_jnt.getBackboneJntNum() >= 0); + + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == m_jnt.getHeadJntNum() || i == m_jnt.getBackboneJntNum()) { + modelData->getJointNodePointer(i)->setCallBack(daNpcNz_NodeCallBack); + } + if(i == 1 || i == 9) { + modelData->getJointNodePointer(i)->setCallBack(daNpcNz_TailNodeCallBack); + } + } + + return field_0x934.init(1, 10, static_cast(dComIfG_getObjectRes(m_arc_name, 0x2E)), 0) != FALSE; } /* 00000F98-00001010 .text __ct__14daNpc_Nz_HIO_cFv */ daNpc_Nz_HIO_c::daNpc_Nz_HIO_c() { - /* Nonmatching */ + field_0x04 = -1; + field_0x06 = 0x1F40; + field_0x08 = 0x1F40; + field_0x0A = 0; + field_0x0C = 0x1F40; + field_0x0E = -0xBB8; + field_0x10 = -0x1F40; + field_0x12 = 0; + field_0x14 = -0x1F40; + field_0x16 = 0x7D0; + field_0x18 = 0x640; + field_0x1A = 0; + field_0x1C = 100.0f; + field_0x20 = 250.0f; + field_0x24 = 250.0f; } /* 00001010-000011A0 .text daNpc_Nz_XyCheckCB__FPvi */ -static s16 daNpc_Nz_XyCheckCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_Nz_XyCheckCB(void* i_actor, int equippedItemIdx) { + daNpc_Nz_c* i_this = static_cast(i_actor); + + if(dComIfGp_getSelectItem(equippedItemIdx) == BIRD_ESA_5) { + f32 temp2 = l_HIO.field_0x20; + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz temp(player->current.pos); + temp.x += temp2 * cM_ssin(player->current.angle.y); + temp.z += temp2 * cM_scos(player->current.angle.y); + cXyz temp3 = i_this->field_0x6C4 - temp; + if(temp3.absXZ() < l_HIO.field_0x24) { + return true; + } + + return false; + } + + return false; } /* 000011A0-000011C0 .text daNpc_Nz_XyEventCB__FPvi */ -static s16 daNpc_Nz_XyEventCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_Nz_XyEventCB(void* i_this, int param_1) { + return static_cast(i_this)->XyEventCB(param_1); } /* 000011C0-00001210 .text XyEventCB__10daNpc_Nz_cFi */ -void daNpc_Nz_c::XyEventCB(int) { - /* Nonmatching */ +s16 daNpc_Nz_c::XyEventCB(int) { + field_0x8FA = dComIfGp_evmng_getEventIdx("DEFAULT_NPC_NZ_ESA", -1); + return field_0x8FA; } /* 00001210-00001268 .text eventOrder__10daNpc_Nz_cFv */ void daNpc_Nz_c::eventOrder() { - /* Nonmatching */ + if(field_0x8F8 == 1 || field_0x8F8 == 2) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); + if (field_0x8F8 == 1) { + fopAcM_orderSpeakEvent(this); + } + } } /* 00001268-000012D0 .text checkOrder__10daNpc_Nz_cFv */ void daNpc_Nz_c::checkOrder() { - /* Nonmatching */ + if(eventInfo.checkCommandTalk() && (field_0x8F8 == 1 || field_0x8F8 == 2)) { + if(field_0x8F8 == 2) { + modeProc(PROC_0_e, 1); + } + + field_0x8F8 = 0; + } } /* 000012D0-000012F4 .text setAttention__10daNpc_Nz_cFv */ void daNpc_Nz_c::setAttention() { - /* Nonmatching */ + attention_info.position = current.pos; + attention_info.position.y = eyePos.y; } /* 000012F4-000013E8 .text LookBack__10daNpc_Nz_cFv */ void daNpc_Nz_c::LookBack() { /* Nonmatching */ + + s16 targetY = current.angle.y; + cXyz dstPos = dNpc_playerEyePos(0.0f); + cXyz* dstTemp = &dstPos; + + s16 maxFollowRotVel; + if (m_jnt.trnChk()) { + maxFollowRotVel = l_HIO.field_0x18; + } + else { + maxFollowRotVel = 0; + } + + m_jnt.setParam(l_HIO.field_0x0A, l_HIO.field_0x0C, l_HIO.field_0x12, l_HIO.field_0x14, l_HIO.field_0x06, l_HIO.field_0x08, l_HIO.field_0x0E, l_HIO.field_0x10, l_HIO.field_0x16); + m_jnt.lookAtTarget(¤t.angle.y, dstTemp, eyePos, targetY, maxFollowRotVel, true); } /* 000013E8-0000146C .text setAnm__10daNpc_Nz_cFScb */ -void daNpc_Nz_c::setAnm(signed char, bool) { +void daNpc_Nz_c::setAnm(s8 param_1, bool param_2) { /* Nonmatching */ + + static const dLib_anm_idx_c a_anm_idx_tbl[] = { + {0x23, 0x12}, + {0x15, 0x07}, + {0x16, -1}, + {0x17, 0x08}, + {0x18, 0x09}, + {0x19, 0x0A}, + {0x1A, 0x0B}, + {0x1B, 0x0C}, + {0x1C, 0x0D}, + {0x1D, 0x0E}, + {0x1F, 0x10}, + {0x20, 0x11}, + {0x1E, 0x11}, + {0x21, -1}, + {0x22, -1} + }; + static const dLib_anm_prm_c a_anm_prm_tbl[] = { + {0x00, -1, 0x00, 8.0f, 1.0f, 2}, + {0x01, -1, 0x00, 8.0f, 1.0f, 0}, + {0x02, -1, 0x00, 8.0f, 1.0f, 0}, + {0x03, -1, 0x00, 8.0f, 1.0f, 0}, + {0x04, -1, 0x00, 8.0f, 1.0f, 0}, + {0x05, -1, 0x00, 8.0f, 1.0f, 0}, + {0x06, -1, 0x00, 8.0f, 1.0f, 2}, + {0x07, -1, 0x00, 8.0f, 1.0f, 2}, + {0x08, -1, 0x00, 8.0f, 1.0f, 0}, + {0x09, -1, 0x00, 8.0f, 1.0f, 0}, + {0x0A, -1, 0x00, 8.0f, 1.0f, 2}, + {0x0B, -1, 0x00, 8.0f, 1.0f, 2}, + {0x0C, -1, 0x00, 8.0f, 1.0f, 0}, + {0x0D, -1, 0x00, 8.0f, 1.0f, 0}, + {0x0E, -1, 0x00, 8.0f, 1.0f, 0}, + }; + + if(param_1 != 0xF) { + field_0x6D5 = param_1; + } + + if(field_0x6D5 == 0) { + m_jnt.offHeadLock(); + m_jnt.offBackBoneLock(); + } + else { + m_jnt.onHeadLock(); + m_jnt.onBackBoneLock(); + } + + dLib_setAnm(m_arc_name, mpMorf, &field_0x6D4, &field_0x6D5, &field_0x6D6, a_anm_idx_tbl, a_anm_prm_tbl, param_2); } /* 0000146C-000017E0 .text setMtx__10daNpc_Nz_cFv */ void daNpc_Nz_c::setMtx() { /* Nonmatching */ + + mpMorf->getModel()->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + + if(field_0x6D5 != 0xC && field_0x6D5 != 0xB) { + return; + } + + daShopItem_c* item = getShopItem(field_0x909); + if(item) { + cXyz* pScale = item->getScaleP(); + field_0xA90 = cLib_maxLimit(field_0xA90 + 1, 0x14); + f32 temp4 = 0.0f; + + f32 scaleX; + f32 scaleY; + if(field_0xA90 < 0xC) { + scaleX = (field_0xA90 / 12.0f); + scaleX *= 0.85f; + scaleY = (field_0xA90 / 12.0f) * 1.4f; + } + else if(field_0xA90 < 0x10) { + scaleY = (field_0xA90 - 0xC); + scaleY *= 0.25f; + scaleX = scaleY * 1.1f; + f32 temp = (1.0f - scaleY); + scaleX += temp * 0.85f; + scaleY = scaleY * 0.8f + temp * 1.4f; + } + else { + f32 temp = (field_0xA90 - 0x10); + temp *= 0.5f; + scaleY = temp; + scaleY *= 1.0f; + temp = 1.0f - temp; + scaleX = scaleY + temp * 1.1f; + scaleY = scaleY + temp * 0.8f; + } + + pScale->z = scaleX; + pScale->x = scaleX; + pScale->y = scaleY; + + J3DModel* pModel = mpMorf->getModel(); + mDoMtx_stack_c::copy(pModel->getAnmMtx(0x12)); + cXyz temp; + mDoMtx_stack_c::multVec(&cXyz::Zero, &temp); + mDoMtx_stack_c::copy(pModel->getAnmMtx(0x15)); + cXyz temp2; + mDoMtx_stack_c::multVec(&cXyz::Zero, &temp2); + cXyz temp3 = temp + temp2; + + switch(field_0x908) { + case 0x82: + temp4 = -15.0f; + break; + case 0x83: + temp4 = -5.0f; + break; + case 0x51: + case 0x53: + temp4 = -5.0f; + break; + case 0xC: + case 0xE: + temp4 = -15.0f; + break; + case 0x10: + case 0x12: + temp4 = -10.0f; + break; + } + + temp3 *= 0.5f; + temp3.y += scaleY * 20.0f + -20.0f; + temp3.y += temp4; + item->getPosP()->set(temp3); + } } /* 000017E0-000017E4 .text modeWaitInit__10daNpc_Nz_cFv */ void daNpc_Nz_c::modeWaitInit() { - /* Nonmatching */ + return; } /* 000017E4-000017F0 .text modeWait__10daNpc_Nz_cFv */ void daNpc_Nz_c::modeWait() { - /* Nonmatching */ + field_0x8F8 = 2; } /* 000017F0-000017F4 .text modeEventEsaInit__10daNpc_Nz_cFv */ void daNpc_Nz_c::modeEventEsaInit() { - /* Nonmatching */ + return; } /* 000017F4-000018EC .text modeEventEsa__10daNpc_Nz_cFv */ void daNpc_Nz_c::modeEventEsa() { - /* Nonmatching */ + if(!mEventCut.cutProc()) { + cutProc(); + } + + if(dComIfGp_evmng_endCheck(field_0x8FA)) { + dComIfGp_event_reset(); + + field_0x8FA = -1; + deleteShopItem(); + field_0x8FC = false; + + old.pos = home.pos; + current.pos = old.pos; + shape_angle = home.angle; + current.angle = shape_angle; + + modeProc(PROC_0_e, 0); + } } /* 000018EC-000019DC .text modeProc__10daNpc_Nz_cFQ210daNpc_Nz_c6Proc_ei */ -void daNpc_Nz_c::modeProc(daNpc_Nz_c::Proc_e, int) { +void daNpc_Nz_c::modeProc(daNpc_Nz_c::Proc_e proc, int newMode) { /* Nonmatching */ + + typedef void(daNpc_Nz_c::*mode_func_t)(void); + struct mode_entry_t { + mode_func_t init; + mode_func_t run; + }; + + static mode_entry_t mode_tbl[] = { + { + &daNpc_Nz_c::modeWaitInit, + &daNpc_Nz_c::modeWait, + }, + { + &daNpc_Nz_c::modeEventEsaInit, + &daNpc_Nz_c::modeEventEsa, + } + }; + + if(proc == PROC_0_e) { + mCurMode = newMode; + (this->*mode_tbl[mCurMode].init)(); + } + else if(proc == PROC_1_e) { + (this->*mode_tbl[mCurMode].run)(); + } } /* 000019DC-00001B38 .text daNpcNz_getShopBoughtMsg__FUc */ -void daNpcNz_getShopBoughtMsg(unsigned char) { - /* Nonmatching */ +static u32 daNpcNz_getShopBoughtMsg(u8 itemNo) { + int messageRupee = dComIfGp_getMessageRupee(); + if(dComIfGs_getRupee() < messageRupee) { + return 0x3405; + } + + if((itemNo == RED_BOTTLE || itemNo == BLUE_BOTTLE) && !dComIfGs_checkEmptyBottle()) { + return 0x3406; + } + + if(isBomb(itemNo) && dComIfGs_getBombNum() == dComIfGs_getBombMax()) { + return 0x3407; + } + + if(isArrow(itemNo) && dComIfGs_getArrowNum() == dComIfGs_getArrowMax()) { + return 0x3407; + } + + if((itemNo == BIRD_ESA_5 || itemNo == dItem_HYOI_PEAR_e) && !dComIfGs_checkBaitItemEmpty()) { + return 0x3407; + } + + int itemTemp = itemNo; // probably fake + if(checkItemGet(itemTemp, 0)) { + dComIfGp_setItemRupeeCount(-messageRupee); + execItemGet(itemTemp); + return 0x3403; + } + + return 0; } /* 00001B38-00001B70 .text daNpc_Nz_ShopItemCreateCB__FPv */ -void daNpc_Nz_ShopItemCreateCB(void*) { - /* Nonmatching */ +static int daNpc_Nz_ShopItemCreateCB(void* i_item) { + daShopItem_c* i_this = static_cast(i_item); + i_this->hide(); + i_this->tevType = TEV_TYPE_ACTOR; + + return cPhs_COMPLEATE_e; } /* 00001B70-00001C14 .text createShopItem__10daNpc_Nz_cFUcUc */ -void daNpc_Nz_c::createShopItem(unsigned char, unsigned char) { - /* Nonmatching */ +void daNpc_Nz_c::createShopItem(u8 itemNo1, u8 itemNo2) { + if(field_0xA88 == fpcM_ERROR_PROCESS_ID_e) { + field_0xA88 = fopAcM_createShopItem(¤t.pos, itemNo1, ¤t.angle, fopAcM_GetRoomNo(this), 0, daNpc_Nz_ShopItemCreateCB); + } + if(field_0xA8C == fpcM_ERROR_PROCESS_ID_e) { + field_0xA8C = fopAcM_createShopItem(¤t.pos, itemNo2, ¤t.angle, fopAcM_GetRoomNo(this), 0, daNpc_Nz_ShopItemCreateCB); + } } /* 00001C14-00001C6C .text getShopItem__10daNpc_Nz_cFi */ -void daNpc_Nz_c::getShopItem(int) { - /* Nonmatching */ +daShopItem_c* daNpc_Nz_c::getShopItem(int param_1) { + if(param_1 == 0) { + return (daShopItem_c*)fopAcM_SearchByID(field_0xA88); + } + else { + return (daShopItem_c*)fopAcM_SearchByID(field_0xA8C); + } } /* 00001C6C-00001CF0 .text deleteShopItem__10daNpc_Nz_cFv */ void daNpc_Nz_c::deleteShopItem() { - /* Nonmatching */ + if(field_0xA88 != fpcM_ERROR_PROCESS_ID_e) { + daShopItem_c* item = getShopItem(0); + if(item) { + fopAcM_delete(item); + field_0xA88 = fpcM_ERROR_PROCESS_ID_e; + } + } + if(field_0xA8C != fpcM_ERROR_PROCESS_ID_e) { + daShopItem_c* item = getShopItem(1); + if(item) { + fopAcM_delete(item); + field_0xA8C = fpcM_ERROR_PROCESS_ID_e; + } + } } /* 00001CF0-00002038 .text next_msgStatus__10daNpc_Nz_cFPUl */ -void daNpc_Nz_c::next_msgStatus(unsigned long*) { +u16 daNpc_Nz_c::next_msgStatus(u32* pMsgNo) { /* Nonmatching */ + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + + static u32 shop_next_msg_tbl[4][2] = { + { + 0x33FB, + 0x33FC + }, + { + 0x33FD, + 0x33FE + }, + { + 0x33FF, + 0x3400 + }, + { + 0x3401, + 0x3402 + } + }; + + const u8 itemArr1[4][2] = { + { + BIRD_ESA_5, + dItem_HYOI_PEAR_e + }, + { + RED_BOTTLE, + BLUE_BOTTLE + }, + { + BOMB_10, + BOMB_30 + }, + { + ARROW_10, + ARROW_30 + } + }; + + int temp = 1; + switch(*pMsgNo) { + case 0x33F5: + *pMsgNo = 0x33F6; + break; + case 0x33F6: + if(dComIfGs_checkGetBottle()) { + temp += 1; + } + if(dComIfGs_checkGetItem(BOMB_BAG)) { + temp += 1; + } + if(dComIfGs_getItem(0xC) != dItem_NONE_e) { + temp += 1; + } + + field_0x904 = cM_rndF(temp); + *pMsgNo = field_0x904 + 0x33F7; + createShopItem(itemArr1[field_0x904][0], itemArr1[field_0x904][1]); + field_0x900 = *pMsgNo; + break; + case 0x33F7: + case 0x33F8: + case 0x33F9: + case 0x33FA: + switch(mpCurrMsg->mSelectNum) { + case 0: + case 1: + field_0x908 = itemArr1[field_0x904][mpCurrMsg->mSelectNum]; + *pMsgNo = shop_next_msg_tbl[field_0x904][mpCurrMsg->mSelectNum]; + field_0x909 = mpCurrMsg->mSelectNum; + break; + case 2: + *pMsgNo = 0x3404; + break; + } + + break; + case 0x33FB: + case 0x33FC: + case 0x33FD: + case 0x33FE: + case 0x33FF: + case 0x3400: + case 0x3401: + case 0x3402: + switch(mpCurrMsg->mSelectNum) { + case 0: + u32 msgNo = daNpcNz_getShopBoughtMsg(field_0x908); + if(msgNo != 0) { + *pMsgNo = msgNo; + break; + } + + daShopItem_c* item = getShopItem(field_0x909); + if(item) { + item->hide(); + } + + setAnm(0, false); + dComIfGp_setItemRupeeCount(-dComIfGp_getMessageRupee()); + field_0x8F8 = 3; + field_0x8FA = dComIfGp_evmng_getEventIdx("DEFAULT_NPC_NZ_GETITEM", -1); + dComIfGp_event_setGtItm(field_0x908); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 1: + *pMsgNo = field_0x900; + break; + default: + break; + } + + break; + case 0x3404: + case 0x3405: + case 0x3406: + case 0x3407: + *pMsgNo = 0x3403; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + } + + return msgStatus; } /* 00002038-000022C0 .text anmAtr__10daNpc_Nz_cFUs */ -void daNpc_Nz_c::anmAtr(unsigned short) { +void daNpc_Nz_c::anmAtr(u16) { /* Nonmatching */ + + if(field_0x6D5 == 9 && mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + setAnm(0, false); + } + else if(field_0x6D5 == 0xC && mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + setAnm(0xB, false); + } + + if(dComIfGp_checkMesgSendButton()) { + if(mpCurrMsg->mStatus == 0x11 || mpCurrMsg->mStatus == 0x12 || mpCurrMsg->mStatus == 0x10) { + return; + } + + daShopItem_c* item; + switch(mpCurrMsg->mMsgNo) { + case 0x33F7: + case 0x33F8: + case 0x33F9: + case 0x33FA: + item = getShopItem(field_0x909); + if(item) { + item->hide(); + } + + setAnm(0, false); + break; + case 0x33FB: + case 0x33FC: + case 0x33FD: + case 0x33FE: + case 0x33FF: + case 0x3400: + case 0x3401: + case 0x3402: + item = getShopItem(field_0x909); + if(item) { + item->show(); + } + + field_0xA90 = 0; + fopAcM_seStart(this, JA_SE_CV_M_NZ_TALK_IN, 0); + setAnm(0xC, false); + + break; + case 0x3405: + case 0x3406: + case 0x3407: + item = getShopItem(field_0x909); + if(item) { + item->hide(); + } + + setAnm(0, false); + break; + case 0x3404: + item = getShopItem(field_0x909); + if(item) { + item->hide(); + } + + setAnm(0, false); + break; + case 0x3403: + item = getShopItem(field_0x909); + if(item) { + item->hide(); + } + + setAnm(0, false); + break; + } + } } /* 000022C0-00002390 .text _execute__10daNpc_Nz_cFv */ -BOOL daNpc_Nz_c::_execute() { +bool daNpc_Nz_c::_execute() { /* Nonmatching */ + + cLib_addCalc2(&speedF, field_0x6EC, 0.3f, 4.0f); + checkOrder(); + modeProc(PROC_1_e, 2); + LookBack(); + eventOrder(); + setAttention(); + mpMorf->play(0, 0, 0); + mpMorf->calc(); + TailControl(); + mAcch.CrrPos(*dComIfG_Bgsp()); + mpBait = 0; + field_0x910 = FLOAT_MAX; + setMtx(); + + return false; } /* 00002390-0000254C .text _draw__10daNpc_Nz_cFv */ -BOOL daNpc_Nz_c::_draw() { +bool daNpc_Nz_c::_draw() { /* Nonmatching */ + + if(!field_0x8FC) { + return true; + } + else { + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* pModelData = pModel->getModelData(); + + J3DJoint* rootJoint = pModelData->getJointNodePointer(0); + J3DShape* matShape = pModelData->getMaterialNodePointer(0)->getShape(); + J3DShape* matShape2 = pModelData->getMaterialNodePointer(1)->getShape(); + J3DShape* matShape3 = pModelData->getMaterialNodePointer(2)->getShape(); + matShape->hide(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + + mpMorf->entryDL(); + + dComIfGd_setListMaskOff(); + + matShape->show(); + pModel->getMatPacket(0)->unlock(); + matShape2->hide(); + matShape3->hide(); + rootJoint->entryIn(); + matShape2->show(); + matShape3->show(); + + dComIfGd_setList(); + + GXColor color = {200, 200, 200, 255}; + field_0x934.update(10, scale.x * 5.0f, color, 6, &tevStr); + dComIfGd_set3DlineMat(&field_0x934); + } + + return true; } /* 0000254C-00002768 .text createInit__10daNpc_Nz_cFv */ -void daNpc_Nz_c::createInit() { +BOOL daNpc_Nz_c::createInit() { /* Nonmatching */ + + setAnm(0, false); + modeProc(PROC_0_e, 0); + + mAcchCir.SetWall(30.0f, 10.0f); + mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, 0, 0); + mAcch.OnLineCheckNone(); + mAcch.SetWallNone(); + mAcch.SetRoofNone(); + gravity = 0.0f; + mAcch.CrrPos(*dComIfG_Bgsp()); + + setMtx(); + mpMorf->calc(); + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -450.0f, -50.0f, -450.0f, 450.0f, 750.0f, 450.0f); + fopAcM_setCullSizeFar(this, 10.0f); + attention_info.distances[1] = 0xB1; + attention_info.distances[3] = 0xB1; + attention_info.flags = fopAc_Attn_ACTION_TALK_e | fopAc_Attn_TALKFLAG_NOTALK_e; + eventInfo.setXyCheckCB(&daNpc_Nz_XyCheckCB); + eventInfo.setXyEventCB(&daNpc_Nz_XyEventCB); + mEventCut.setActorInfo2("NpcNz", this); + + field_0x8F8 = 0; + field_0x8FC = false; + field_0x906 = 0; + field_0x6C4 = home.pos; + home.pos.x -= cM_ssin(home.angle.y) * 50.0f; + home.pos.z -= cM_scos(home.angle.y) * 50.0f; + current.pos = home.pos; + field_0xA88 = -1; + field_0xA8C = -1; + + return true; } /* 00002768-0000282C .text setSmokeParticle__10daNpc_Nz_cFv */ void daNpc_Nz_c::setSmokeParticle() { /* Nonmatching */ + + if(field_0x914.getEmitter() != NULL) { + field_0x914.end(); + } + + if(field_0x914.getEmitter() == NULL) { + JPABaseEmitter* emitter = dComIfGp_particle_setToon(0x2022, ¤t.pos, ¤t.angle, 0, 0xB9, &field_0x914, fopAcM_GetRoomNo(this)); + if(emitter) { + emitter->setRate(3.0f); + emitter->setSpread(0.2f); + emitter->setAwayFromAxisSpeed(0.2f); + emitter->setMaxFrame(3); + } + } } /* 0000282C-00002830 .text getArg__10daNpc_Nz_cFv */ void daNpc_Nz_c::getArg() { - /* Nonmatching */ + return; } /* 00002830-000028FC .text _create__10daNpc_Nz_cFv */ s32 daNpc_Nz_c::_create() { /* Nonmatching */ + + fopAcM_SetupActor(this, daNpc_Nz_c); + + getArg(); + + s32 result = dComIfG_resLoad(&mPhs1, m_arc_name); + if(result != cPhs_COMPLEATE_e) { + return result; + } + + result = dComIfG_resLoad(&mPhs2, m_bdl_arc_name); + if(result != cPhs_COMPLEATE_e) { + return result; + } + + if(!fopAcM_entrySolidHeap(this, createHeap_CB, 0x2FE0)) { + return cPhs_ERROR_e; + } + + if(!createInit()) { + return cPhs_ERROR_e; + } + + return cPhs_COMPLEATE_e; } /* 00002E00-00002E6C .text _delete__10daNpc_Nz_cFv */ -BOOL daNpc_Nz_c::_delete() { - /* Nonmatching */ +bool daNpc_Nz_c::_delete() { + if(field_0x914.getEmitter()) { + field_0x914.end(); + } + + dComIfG_resDelete(&mPhs1, m_arc_name); + dComIfG_resDelete(&mPhs2, m_bdl_arc_name); + + return true; } /* 00002E6C-00002E8C .text daNpc_NzCreate__FPv */ -static s32 daNpc_NzCreate(void*) { - /* Nonmatching */ +static s32 daNpc_NzCreate(void* i_this) { + return static_cast(i_this)->_create(); } /* 00002E8C-00002EB0 .text daNpc_NzDelete__FPv */ -static BOOL daNpc_NzDelete(void*) { - /* Nonmatching */ +static BOOL daNpc_NzDelete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00002EB0-00002ED4 .text daNpc_NzExecute__FPv */ -static BOOL daNpc_NzExecute(void*) { - /* Nonmatching */ +static BOOL daNpc_NzExecute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00002ED4-00002EF8 .text daNpc_NzDraw__FPv */ -static BOOL daNpc_NzDraw(void*) { - /* Nonmatching */ +static BOOL daNpc_NzDraw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00002EF8-00002F00 .text daNpc_NzIsDelete__FPv */ static BOOL daNpc_NzIsDelete(void*) { - /* Nonmatching */ + return true; } /* 000032BC-000032E8 .text searchEsa_CB__FPvPv */ -void searchEsa_CB(void*, void*) { - /* Nonmatching */ +static BOOL searchEsa_CB(void* param_1, void* i_this) { + return static_cast(i_this)->_searchEsa((fopAc_ac_c*)param_1); } /* 000032E8-000034F0 .text _searchEsa__10daNpc_Nz_cFP10fopAc_ac_c */ -void daNpc_Nz_c::_searchEsa(fopAc_ac_c*) { +BOOL daNpc_Nz_c::_searchEsa(fopAc_ac_c* pActor) { /* Nonmatching */ + + if(fopAcM_GetName(pActor) == PROC_ESA) { + esa_class* pBait = static_cast(pActor); + if(pBait->field_0x298 == 0) { + cXyz delta = pBait->current.pos - current.pos; + if(mpMorf->getFrame() < 6.0f) { + cLib_addCalcPos2(&pBait->current.pos, current.pos, 0.1f, 2.5f); + mDoMtx_stack_c::transS(pBait->current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle); + pBait->mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + if(delta.absXZ() < field_0x910) { + mpBait = pBait; + field_0x910 = delta.absXZ(); + } + } + } + + return false; } /* 000034F0-00003528 .text searchNzAndBomb_CB__FPvPv */ -void searchNzAndBomb_CB(void*, void*) { - /* Nonmatching */ +static BOOL searchNzAndBomb_CB(void* param_1, void*) { + fopAc_ac_c* pActor = static_cast(param_1); + + if(fopAcM_GetName(pActor) == PROC_NZ || fopAcM_GetName(pActor) == PROC_BOMB) { + fopAcM_delete(pActor); + } + + return false; } /* 00003528-0000377C .text searchTsuboAndBarrel_CB__FPvPv */ -void searchTsuboAndBarrel_CB(void*, void*) { +static BOOL searchTsuboAndBarrel_CB(void* param_1, void* param_2) { /* Nonmatching */ + + fopAc_ac_c* pActor1 = static_cast(param_1); + fopAc_ac_c* pActor2 = static_cast(param_2); + + if(fopAcM_GetName(pActor1) == PROC_TSUBO || fopAcM_GetName(pActor1) == PROC_Obj_Barrel) { + cXyz delta = pActor1->current.pos - pActor2->current.pos; + + if(delta.absXZ() < 300.0f) { + if(fopAcM_GetName(pActor1) == PROC_TSUBO) { + static_cast(pActor1)->pos_init(); + + return true; + } + else if(fopAcM_GetName(pActor1) == PROC_TSUBO) { // this condition seems weird, also has another part with barrel member variables + static_cast(pActor1)->pos_init(); + + return true; + } + + if(fopAcM_GetName(pActor1) == PROC_TSUBO) { + fopAcM_delete(pActor1); + } + } + } + + return false; } /* 0000377C-00003908 .text searchEsaInit_CB__FPvPv */ -void searchEsaInit_CB(void*, void*) { - /* Nonmatching */ +static BOOL searchEsaInit_CB(void* pActor1, void* pActor2) { + if(fopAcM_GetName(pActor1) == PROC_ESA) { + esa_class* pBait = static_cast(pActor1); + daNpc_Nz_c* pNz = static_cast(pActor2); + + cXyz pos(pNz->field_0x6C4); + pos.x += cM_ssin(pNz->current.angle.y) * 150.0f; + pos.z += cM_scos(pNz->current.angle.y) * 150.0f; + s16 angle = cM_rndFX(358.0f) * 182.0444f; + f32 mag = cM_rndF(30.0f); + pos.x += mag * cM_ssin(angle); + pos.z += mag * cM_scos(angle); + + pBait->current.pos = pos; + pBait->old.pos = pos; + + mDoMtx_stack_c::transS(pBait->current.pos); + mDoMtx_stack_c::ZXYrotM(pBait->current.angle); + pBait->mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + return false; } /* 00003908-00003B90 .text cutProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutProc() { /* Nonmatching */ + + typedef void(daNpc_Nz_c::*Func_t)(void); + struct mode_entry_t { + Func_t start; + Func_t proc; + }; + + field_0x8F4 = dComIfGp_evmng_getMyStaffId(mEventCut.getActorName()); + if(field_0x8F4 == -1) { + return; + } + + static char* action_table[] = { + "EATESA", + "EATESA1ST", + "KILLALL", + "SHOW", + "HIDE", + "SETANM", + "GOHOME", + "CHKGETITEM", + }; + + static mode_entry_t cut_tbl[] = { + { + &daNpc_Nz_c::cutEatesaStart, + &daNpc_Nz_c::cutEatesaProc, + }, + { + &daNpc_Nz_c::cutEatesaFirstStart, + &daNpc_Nz_c::cutEatesaFirstProc, + }, + { + &daNpc_Nz_c::cutKillAllStart, + &daNpc_Nz_c::cutKillAllProc, + }, + { + &daNpc_Nz_c::cutShowStart, + &daNpc_Nz_c::cutShowProc, + }, + { + &daNpc_Nz_c::cutHideStart, + &daNpc_Nz_c::cutHideProc, + }, + { + &daNpc_Nz_c::cutSetAnmStart, + &daNpc_Nz_c::cutSetAnmProc, + }, + { + &daNpc_Nz_c::cutGoHomeStart, + &daNpc_Nz_c::cutGoHomeProc, + }, + { + &daNpc_Nz_c::cutChkGetItemStart, + &daNpc_Nz_c::cutChkGetItemProc, + } + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(field_0x8F4, action_table, ARRAY_SIZE(action_table), 1, 0); + if(actIdx == -1) { + dComIfGp_evmng_cutEnd(field_0x8F4); + return; + } + + if(dComIfGp_evmng_getIsAddvance(field_0x8F4)) { + (this->*cut_tbl[actIdx].start)(); + } + + (this->*cut_tbl[actIdx].proc)(); } /* 00003B90-00003BB8 .text cutEatesaStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutEatesaStart() { - /* Nonmatching */ + setAnm(6, false); } /* 00003BB8-00003CEC .text cutEatesaProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutEatesaProc() { /* Nonmatching */ + + fopAcM_Search((fopAcIt_JudgeFunc)&searchEsa_CB, this); + fopAc_ac_c* pBait = mpBait; + + if(mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + current.angle.y = shape_angle.y = home.angle.y + (s16)((int)cM_rndFX(4.0f) * 2048); + } + + if(pBait) { + fopAcM_delete(pBait); + mpBait = 0; + field_0x910 = FLOAT_MIN; + } + else { + if(mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + current.angle.y = shape_angle.y = home.angle.y; + dComIfGp_evmng_cutEnd(field_0x8F4); + } + } } /* 00003CEC-00003D40 .text cutEatesaFirstStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutEatesaFirstStart() { - /* Nonmatching */ + fopAcM_Search((fopAcIt_JudgeFunc)&searchEsa_CB, this); + current.angle.y = shape_angle.y = home.angle.y; + setAnm(0xA, false); } /* 00003D40-00003F54 .text cutEatesaFirstProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutEatesaFirstProc() { /* Nonmatching */ + + cXyz target(field_0x6C4); + target.x += cM_ssin(home.angle.y) * 100.0f; + target.z += cM_scos(home.angle.y) * 100.0f; + + if(field_0x6D5 == 10) { + f32 temp2 = cLib_addCalcPosXZ(¤t.pos, target, 0.25f, 10.0f, 2.0f); + s16 temp3 = cLib_targetAngleY(¤t.pos, &target); + cLib_addCalcAngleS2(&shape_angle.y, temp3, 8, 0x1000); + + if(cLib_IsZero(temp2) && mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + setAnm(6, false); + field_0x906 = 2; + } + else { + return; + } + } + + fopAcM_Search((fopAcIt_JudgeFunc)&searchEsa_CB, this); + fopAc_ac_c* pBait = mpBait; + if(pBait) { + if(mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f) && cLib_calcTimer(&field_0x906) == 0) { + fopAcM_delete(pBait); + mpBait = 0; + dComIfGp_evmng_cutEnd(field_0x8F4); + } + } + else { + dComIfGp_evmng_cutEnd(field_0x8F4); + } } /* 00003F54-0000404C .text cutKillAllStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutKillAllStart() { /* Nonmatching */ + + fopAcM_Search((fopAcIt_JudgeFunc)&searchNzAndBomb_CB, this); + fopAcM_Search((fopAcIt_JudgeFunc)&searchTsuboAndBarrel_CB, this); + fopAcM_Search((fopAcIt_JudgeFunc)&searchEsaInit_CB, this); + + cXyz pos = field_0x6C4; + pos.x += cM_ssin(home.angle.y + 0x8000) * 250.0f; + pos.z += cM_scos(home.angle.y + 0x8000) * 250.0f; + + daPy_getPlayerActorClass()->setPlayerPosAndAngle(&pos, home.angle.y + 0x8000); } /* 0000404C-00004080 .text cutKillAllProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutKillAllProc() { - /* Nonmatching */ + dComIfGp_evmng_cutEnd(field_0x8F4); } /* 00004080-0000408C .text cutShowStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutShowStart() { - /* Nonmatching */ + field_0x8FC = true; } /* 0000408C-000040C0 .text cutShowProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutShowProc() { - /* Nonmatching */ + dComIfGp_evmng_cutEnd(field_0x8F4); } /* 000040C0-000040CC .text cutHideStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutHideStart() { - /* Nonmatching */ + field_0x8FC = false; } /* 000040CC-00004100 .text cutHideProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutHideProc() { - /* Nonmatching */ + dComIfGp_evmng_cutEnd(field_0x8F4); } /* 00004100-00004204 .text cutSetAnmStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutSetAnmStart() { /* Nonmatching */ + + u32* pAnmNo = dComIfGp_evmng_getMyIntegerP(field_0x8F4, "anm_no"); + s32 anmNo = 0; + u32* pLoopCount = dComIfGp_evmng_getMyIntegerP(field_0x8F4, "loop_count"); + + if(pAnmNo) { + anmNo = *pAnmNo; + } + + if(pLoopCount) { + field_0x906 = *pLoopCount; + } + else { + field_0x906 = 0; + } + + setAnm(anmNo, false); + if(anmNo == 8) { + fopAcM_seStart(this, JA_SE_CV_M_NZ_TALK_IN, 0); + } } /* 00004204-000043C0 .text cutSetAnmProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutSetAnmProc() { /* Nonmatching */ + + if(mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) { + field_0x906--; + } + + if(field_0x906 <= 0) { + dComIfGp_evmng_cutEnd(field_0x8F4); + } + + if(field_0x6D5 == 8) { + if(mpMorf->checkFrame(8.0f)) { + setSmokeParticle(); + } + else if (mpMorf->checkFrame(13.0f)) { + J3DModel* pModel = mpMorf->getModel(); + + cXyz scale(0.65f, 0.65f, 0.65f); + csXyz temp2(current.angle); + temp2.y -= 0x4000; + cXyz temp4(10.0f, 0.0f, 10.0f); + cXyz pos; + GXColor color; + color.r = 0x80; + color.g = 0x80; + color.b = 0x80; + + mDoMtx_stack_c::copy(pModel->getAnmMtx(m_jnt.getHeadJntNum())); + mDoMtx_stack_c::multVec(&temp4, &pos); + dComIfGp_particle_set(0x57, &pos, &shape_angle, &scale, 0xFF, 0, -1, &color); + } + } } /* 000043C0-000043C4 .text cutGoHomeStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutGoHomeStart() { - /* Nonmatching */ + return; } /* 000043C4-000044D4 .text cutGoHomeProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutGoHomeProc() { /* Nonmatching */ + + s16 target = cLib_targetAngleY(¤t.pos, &home.pos); + cLib_addCalcAngleS2(¤t.angle.y, target, 4, 0x1000); + shape_angle.y = current.angle.y; + s16 dist = cLib_distanceAngleS(target, current.angle.y); + if(dist < 0x4000) { + if(field_0x6D5 != 0xA) { + fopAcM_seStart(this, JA_SE_CV_M_NZ_TALK_OUT, 0); + } + + setAnm(0xA, false); + if(cLib_addCalcPosXZ(¤t.pos, home.pos, 0.5f, 10.0f, 1.0f) < 1.0f) { + dComIfGp_evmng_cutEnd(field_0x8F4); + } + } } /* 000044D4-00004520 .text cutChkGetItemStart__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutChkGetItemStart() { - /* Nonmatching */ + if(field_0x8F8 >= 3) { + fopAcM_orderChangeEventId(dComIfGp_getPlayer(0), this, field_0x8FA, 1, 0xFFFF); + } } /* 00004520-00004554 .text cutChkGetItemProc__10daNpc_Nz_cFv */ void daNpc_Nz_c::cutChkGetItemProc() { - /* Nonmatching */ + dComIfGp_evmng_cutEnd(field_0x8F4); } +static actor_method_class daNpc_NzMethodTable = { + (process_method_func)daNpc_NzCreate, + (process_method_func)daNpc_NzDelete, + (process_method_func)daNpc_NzExecute, + (process_method_func)daNpc_NzIsDelete, + (process_method_func)daNpc_NzDraw, +}; + +actor_process_profile_definition g_profile_NPC_NZ = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 3, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_NPC_NZ, + /* Proc SubMtd */ &g_fpcLf_Method.base, + /* Size */ sizeof(daNpc_Nz_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x014A, + /* Actor SubMtd */ &daNpc_NzMethodTable, + /* Status */ fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_4_e, +};