From 5b3b66015a8da8b4c038ccab9bb0786b200eec6f Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sun, 14 Apr 2024 11:27:39 -0400 Subject: [PATCH] d_a_npc_nz: add .inc file, match .data section --- include/d/actor/d_a_npc_nz.h | 6 +- include/d/actor/d_a_obj_hole.h | 2 +- include/d/actor/d_a_rd.h | 2 +- src/d/actor/d_a_npc_nz.cpp | 420 ++------------------------------- src/d/actor/d_a_npc_nz_cut.inc | 391 ++++++++++++++++++++++++++++++ 5 files changed, 416 insertions(+), 405 deletions(-) create mode 100644 src/d/actor/d_a_npc_nz_cut.inc diff --git a/include/d/actor/d_a_npc_nz.h b/include/d/actor/d_a_npc_nz.h index 0c4c521b8..a6e0bf5b0 100644 --- a/include/d/actor/d_a_npc_nz.h +++ b/include/d/actor/d_a_npc_nz.h @@ -14,15 +14,15 @@ class J3DNode; class daNpc_Nz_c : public fopNpc_npc_c { public: enum Proc_e { - PROC_0_e = 0, - PROC_1_e = 1, + PROC_INIT = 0, + PROC_EXEC = 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) {} + void modeProcInit(int newMode) { modeProc(PROC_INIT, newMode); } BOOL NodeCallBack(J3DNode*, int); BOOL TailNodeCallBack(J3DNode*, int); diff --git a/include/d/actor/d_a_obj_hole.h b/include/d/actor/d_a_obj_hole.h index 628c08202..9911b0d62 100644 --- a/include/d/actor/d_a_obj_hole.h +++ b/include/d/actor/d_a_obj_hole.h @@ -9,7 +9,7 @@ class daObj_Hole_c : public fopAc_ac_c { public: enum Proc_e { PROC_INIT = 0, - PROC_EXEC = 1 + PROC_EXEC = 1, }; enum Mode { diff --git a/include/d/actor/d_a_rd.h b/include/d/actor/d_a_rd.h index 69d99856a..a27f63d73 100644 --- a/include/d/actor/d_a_rd.h +++ b/include/d/actor/d_a_rd.h @@ -48,7 +48,7 @@ class daRd_c : public fopEn_enemy_c { public: enum Proc_e { PROC_INIT = 0, - PROC_EXEC = 1 + PROC_EXEC = 1, }; enum Mode { diff --git a/src/d/actor/d_a_npc_nz.cpp b/src/d/actor/d_a_npc_nz.cpp index 56158b4d7..54c82c84f 100644 --- a/src/d/actor/d_a_npc_nz.cpp +++ b/src/d/actor/d_a_npc_nz.cpp @@ -4,17 +4,14 @@ // #include "d/actor/d_a_npc_nz.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/actor/d_a_player.h" #include "d/d_com_inf_game.h" #include "d/d_lib.h" #include "d/d_item.h" #include "d/d_procname.h" +static u8 dummy_bss[0x58]; + // 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}; @@ -24,10 +21,6 @@ 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* node, int param_1) { return reinterpret_cast(j3dSys.getModel()->getUserArea())->NodeCallBack(node, param_1); @@ -232,10 +225,15 @@ static s16 daNpc_Nz_XyEventCB(void* i_this, int param_1) { /* 000011C0-00001210 .text XyEventCB__10daNpc_Nz_cFi */ s16 daNpc_Nz_c::XyEventCB(int) { + static char* a_demo_name_tbl[] = { + "DEFAULT_NPC_NZ_ESA", + }; field_0x8FA = dComIfGp_evmng_getEventIdx("DEFAULT_NPC_NZ_ESA", -1); return field_0x8FA; } +#include "d/actor/d_a_npc_nz_cut.inc" + /* 00001210-00001268 .text eventOrder__10daNpc_Nz_cFv */ void daNpc_Nz_c::eventOrder() { if(field_0x8F8 == 1 || field_0x8F8 == 2) { @@ -251,7 +249,7 @@ void daNpc_Nz_c::eventOrder() { void daNpc_Nz_c::checkOrder() { if(eventInfo.checkCommandTalk() && (field_0x8F8 == 1 || field_0x8F8 == 2)) { if(field_0x8F8 == 2) { - modeProc(PROC_0_e, 1); + modeProcInit(1); } field_0x8F8 = 0; @@ -457,7 +455,7 @@ void daNpc_Nz_c::modeEventEsa() { shape_angle = home.angle; current.angle = shape_angle; - modeProc(PROC_0_e, 0); + modeProcInit(0); } } @@ -469,24 +467,27 @@ void daNpc_Nz_c::modeProc(daNpc_Nz_c::Proc_e proc, int newMode) { struct mode_entry_t { mode_func_t init; mode_func_t run; + const char* name; }; static mode_entry_t mode_tbl[] = { { &daNpc_Nz_c::modeWaitInit, &daNpc_Nz_c::modeWait, + "WAIT", }, { &daNpc_Nz_c::modeEventEsaInit, &daNpc_Nz_c::modeEventEsa, + "WAIT", } }; - if(proc == PROC_0_e) { + if(proc == PROC_INIT) { mCurMode = newMode; (this->*mode_tbl[mCurMode].init)(); } - else if(proc == PROC_1_e) { + else if(proc == PROC_EXEC) { (this->*mode_tbl[mCurMode].run)(); } } @@ -576,7 +577,7 @@ u16 daNpc_Nz_c::next_msgStatus(u32* pMsgNo) { /* Nonmatching */ u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; - static u32 shop_next_msg_tbl[4][2] = { + static const u32 shop_next_msg_tbl[4][2] = { { 0x33FB, 0x33FC @@ -784,15 +785,15 @@ bool daNpc_Nz_c::_execute() { cLib_addCalc2(&speedF, field_0x6EC, 0.3f, 4.0f); checkOrder(); - modeProc(PROC_1_e, 2); + modeProc(PROC_EXEC, 2); LookBack(); eventOrder(); setAttention(); - mpMorf->play(0, 0, 0); + mpMorf->play(NULL, 0, 0); mpMorf->calc(); TailControl(); mAcch.CrrPos(*dComIfG_Bgsp()); - mpBait = 0; + mpBait = NULL; field_0x910 = FLOAT_MAX; setMtx(); @@ -846,7 +847,7 @@ BOOL daNpc_Nz_c::createInit() { /* Nonmatching */ setAnm(0, false); - modeProc(PROC_0_e, 0); + modeProcInit(0); mAcchCir.SetWall(30.0f, 10.0f); mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, 0, 0); @@ -971,387 +972,6 @@ static BOOL daNpc_NzIsDelete(void*) { return true; } -/* 000032BC-000032E8 .text searchEsa_CB__FPvPv */ -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 */ -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 */ -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 */ -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 */ -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() { - 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() { - 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() { - dComIfGp_evmng_cutEnd(field_0x8F4); -} - -/* 00004080-0000408C .text cutShowStart__10daNpc_Nz_cFv */ -void daNpc_Nz_c::cutShowStart() { - field_0x8FC = true; -} - -/* 0000408C-000040C0 .text cutShowProc__10daNpc_Nz_cFv */ -void daNpc_Nz_c::cutShowProc() { - dComIfGp_evmng_cutEnd(field_0x8F4); -} - -/* 000040C0-000040CC .text cutHideStart__10daNpc_Nz_cFv */ -void daNpc_Nz_c::cutHideStart() { - field_0x8FC = false; -} - -/* 000040CC-00004100 .text cutHideProc__10daNpc_Nz_cFv */ -void daNpc_Nz_c::cutHideProc() { - 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() { - 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() { - 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() { - dComIfGp_evmng_cutEnd(field_0x8F4); -} - static actor_method_class daNpc_NzMethodTable = { (process_method_func)daNpc_NzCreate, (process_method_func)daNpc_NzDelete, diff --git a/src/d/actor/d_a_npc_nz_cut.inc b/src/d/actor/d_a_npc_nz_cut.inc new file mode 100644 index 000000000..08580589d --- /dev/null +++ b/src/d/actor/d_a_npc_nz_cut.inc @@ -0,0 +1,391 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_nz's "cut" functions +// are in a separate .text section from the rest of its functions. + +#include "d/actor/d_a_npc_nz.h" +#include "d/actor/d_a_esa.h" +#include "d/actor/d_a_tsubo.h" +#include "d/actor/d_a_obj_barrel.h" +#include "d/actor/d_a_player.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" + +/* 000032BC-000032E8 .text searchEsa_CB__FPvPv */ +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 */ +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 */ +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 */ +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 */ +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() { + 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() { + 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() { + dComIfGp_evmng_cutEnd(field_0x8F4); +} + +/* 00004080-0000408C .text cutShowStart__10daNpc_Nz_cFv */ +void daNpc_Nz_c::cutShowStart() { + field_0x8FC = true; +} + +/* 0000408C-000040C0 .text cutShowProc__10daNpc_Nz_cFv */ +void daNpc_Nz_c::cutShowProc() { + dComIfGp_evmng_cutEnd(field_0x8F4); +} + +/* 000040C0-000040CC .text cutHideStart__10daNpc_Nz_cFv */ +void daNpc_Nz_c::cutHideStart() { + field_0x8FC = false; +} + +/* 000040CC-00004100 .text cutHideProc__10daNpc_Nz_cFv */ +void daNpc_Nz_c::cutHideProc() { + 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() { + 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() { + 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() { + dComIfGp_evmng_cutEnd(field_0x8F4); +}