diff options
| author | Zeclos <Zeclos99@gmail.com> | 2026-03-12 21:48:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-12 16:48:04 -0400 |
| commit | cca42433acc680a36ea58518f1c5c17a87bdb425 (patch) | |
| tree | 469ccae30e6b95e8a547fbde3fd3c5b15a225625 /src/d/actor/d_a_fm.cpp | |
| parent | ea7c107eb784bc05c446956ec72b5aaee7b2e21c (diff) | |
D_a_fm matching (#917)
* small progress push
* bit of progress
* most funcs done
* mostly matching
* debug drawr matching
* cleanup and matching
* bit of cleanup, matching for GZLE01 and GZLP01
* accidentally changed the wrong actor in configure.py
* even more cleanup
* removed changed configure.py
* fully matching
* version select jut assert
Diffstat (limited to 'src/d/actor/d_a_fm.cpp')
| -rw-r--r-- | src/d/actor/d_a_fm.cpp | 3164 |
1 files changed, 3022 insertions, 142 deletions
diff --git a/src/d/actor/d_a_fm.cpp b/src/d/actor/d_a_fm.cpp index 1cc4928a..6911648d 100644 --- a/src/d/actor/d_a_fm.cpp +++ b/src/d/actor/d_a_fm.cpp @@ -5,9 +5,26 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_fm.h" +#include "d/actor/d_a_player_main.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "d/d_lib.h" +#include "d/d_jnt_hit.h" +#include "d/d_snap.h" +#include "d/d_material.h" +#include "d/actor/d_a_bomb.h" +#include "d/actor/d_a_tsubo.h" +#include "d/actor/d_a_npc_cb1.h" +#include "d/actor/d_a_npc_md.h" +#include "d/d_s_play.h" +#include "d/d_a_obj.h" +#include "d/res/res_fm.h" +#include "d/actor/d_a_player_main_data.h" + + +const u32 daFm_c::m_heapsize = 0x2100; +const char daFm_c::m_arc_name[] = "Fm"; const dCcD_SrcSph daFm_c::m_sph_src = { // dCcD_SrcGObjInf @@ -69,540 +86,3403 @@ const dCcD_SrcCyl daFm_c::m_cyl_src = { }}, }; +class daFm_HIO_c : public mDoHIO_entry_c{ +public: + daFm_HIO_c(); + virtual ~daFm_HIO_c() {}; + + void genMessage(JORMContext* ctx) {} + +public: + /* 0x004 */ s8 field_0x004; + /* 0x005 */ bool field_0x005; + /* 0x006 */ bool field_0x006; + /* 0x007 */ bool field_0x007; + /* 0x008 */ bool field_0x008; + /* 0x009 */ bool field_0x009; + /* 0x00A */ bool field_0x00A; + /* 0x00B */ bool field_0x00B; + /* 0x00C */ bool field_0x00C; + /* 0x00D */ bool field_0x00D; + /* 0x00E */ bool field_0x00E; + /* 0x00F */ bool field_0x00F[6]; + /* 0x015 */ u8 field_0x015[0x01F - 0x015]; + /* 0x01F */ u8 field_0x01F; + /* 0x020 */ cXyz field_0x020; + /* 0x02C */ cXyz field_0x02C; + /* 0x038 */ cXyz field_0x038; + /* 0x044 */ cXyz field_0x044; + /* 0x050 */ cXyz field_0x050; + /* 0x05C */ csXyz field_0x05C; + /* 0x062 */ s16 mFreezeDuration; + /* 0x064 */ s16 mMaxHealth; + /* 0x066 */ s16 field_0x066; + /* 0x068 */ s16 field_0x068; + /* 0x06A */ s16 field_0x06A; + /* 0x06C */ f32 mSpAttackVJumpHeight; + /* 0x070 */ f32 mSpAttackVJumpRadius; + /* 0x074 */ s16 mSpAttackVJumpStartFrame; + /* 0x076 */ s16 mSpAttackVJumpEndFrame; + /* 0x078 */ f32 mSpAttackJumpHeight; + /* 0x07C */ f32 mSpAttackJumpRadius; + /* 0x080 */ s16 mSpAttackJumpStartFrame; + /* 0x082 */ s16 mSpAttackJumpEndFrame; + /* 0x084 */ s16 field_0x084; + /* 0x086 */ s16 field_0x086; + /* 0x088 */ s16 field_0x088; + /* 0x08A */ s16 field_0x08A; + /* 0x08C */ s16 field_0x08C; + /* 0x08E */ s16 field_0x08E; + /* 0x090 */ s16 field_0x090; + /* 0x092 */ s16 field_0x092; + /* 0x094 */ s16 field_0x094; + /* 0x096 */ s16 field_0x096; + /* 0x098 */ s16 field_0x098; + /* 0x09A */ s16 field_0x09A; + /* 0x09C */ s16 field_0x09C; + /* 0x09E */ s16 field_0x09E; + /* 0x0A0 */ s16 field_0x0A0; + /* 0x0A2 */ s16 field_0x0A2; + /* 0x0A4 */ s16 field_0x0A4; + /* 0x0A6 */ s16 field_0x0A6; + /* 0x0A8 */ f32 field_0x0A8; + /* 0x0AC */ f32 field_0x0AC; + /* 0x0B0 */ f32 field_0x0B0; + /* 0x0B4 */ f32 field_0x0B4; + /* 0x0B8 */ f32 field_0x0B8; + /* 0x0BC */ f32 field_0x0BC; + /* 0x0C0 */ f32 field_0x0C0; + /* 0x0C4 */ f32 field_0x0C4; + /* 0x0C8 */ f32 field_0x0C8; + /* 0x0CC */ f32 field_0x0CC; + /* 0x0D0 */ f32 field_0x0D0; + /* 0x0D4 */ f32 field_0x0D4; + /* 0x0D8 */ f32 field_0x0D8; + /* 0x0DC */ f32 field_0x0DC; + /* 0x0E0 */ f32 field_0x0E0; + /* 0x0E4 */ f32 field_0x0E4; + /* 0x0E8 */ f32 field_0x0E8; + /* 0x0EC */ f32 field_0x0EC; + /* 0x0F0 */ f32 field_0x0F0; + /* 0x0F4 */ f32 field_0x0F4; + /* 0x0F8 */ f32 field_0x0F8; + /* 0x0FC */ f32 field_0x0FC; + /* 0x100 */ s16 field_0x100; + /* 0x104 */ cXyz field_0x104; + /* 0x110 */ f32 field_0x110; + /* 0x114 */ f32 field_0x114; + /* 0x118 */ f32 field_0x118; + /* 0x11C */ s16 field_0x11C; + /* 0x11E */ s16 field_0x11E; + /* 0x120 */ f32 field_0x120; + /* 0x124 */ f32 field_0x124; + /* 0x128 */ f32 field_0x128; + /* 0x12C */ f32 field_0x12C; + /* 0x130 */ JntHit_HIO_c field_0x130; +}; // Size: 0x158 + +static daFm_HIO_c l_HIO; /* 000000EC-000003EC .text __ct__10daFm_HIO_cFv */ daFm_HIO_c::daFm_HIO_c() { - /* Nonmatching */ + field_0x006 = 0; + field_0x007 = 0; + field_0x008 = 0; + field_0x004 = 0; + field_0x01F = 0; + field_0x00B = 0; + field_0x009 = 0; + field_0x00A = 0; + field_0x00C = 0; + field_0x005 = false; + + field_0x068 = 0x1e; + mSpAttackVJumpHeight = 240.0f; + mSpAttackVJumpRadius = 100.0f; + mSpAttackVJumpStartFrame = 0; + mSpAttackVJumpEndFrame = 0xF; + mSpAttackJumpHeight = 120.0f; + mSpAttackJumpRadius = 100.0f; + mSpAttackJumpStartFrame = 5; + mSpAttackJumpEndFrame = 0xF; + field_0x11C = 100; + field_0x00E = 0; + field_0x00D = 0; + mFreezeDuration = 0x78; + + for (int i = 0; i < 6; i++) { + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 5: + field_0x00F[i] = true; + break; + + case 4: + default: + field_0x00F[i] = false; + break; + } + } + field_0x050.setall(0.0f); + field_0x05C.setall(0); + field_0x020.x = -10.0f; + field_0x020.y = 5.0f; + field_0x020.z = -10.0f; + field_0x02C.x = 0.0f; + field_0x02C.y = 0.0f; + field_0x02C.z = -30.0f; + field_0x038.x = 40.0f; + field_0x038.y = -20.0f; + field_0x038.z = 0.0f; + field_0x044.setall(0.0f); + field_0x104.set(0.0f, -20.0f, -0.0f); + + field_0x0A8 = 600.0f; + mMaxHealth = 0xC; + field_0x066 = 0x28; + field_0x084 = 0x5A; + field_0x086 = 0xF0; + field_0x088 = 0x3C; + field_0x08A = 1; + field_0x08C = 0x3C; + field_0x08E = 0x78; + field_0x090 = 10; + field_0x092 = 0x11; + field_0x094 = 0; + field_0x096 = 500; + field_0x098 = 18000; + field_0x09A = 7000; + field_0x0C0 = 15.0f; + field_0x120 = 0.01f; + field_0x124 = 1.0f; + field_0x128 = 0.1f; + field_0x12C = 0.02f; + field_0x0C4 = 290.0f; + field_0x0C8 = 80.0f; + field_0x0CC = 7.0f; + field_0x0D0 = 2.0f; + field_0x0D4 = 5.0f; + field_0x0D8 = 80.0f; + field_0x0DC = 100.0f; + field_0x0E0 = 150.0f; + field_0x0E4 = 500.0f; + field_0x0E8 = 800.0f; + field_0x0EC = 30.0f; + field_0x0F0 = 25.0f; + field_0x0F4 = 9.0f; + field_0x0F8 = -2.5f; + field_0x0FC = 16.0f; + field_0x09C = 5; + field_0x100 = 0x1e; + field_0x110 = 20.0f; + field_0x114 = 50.0f; + field_0x118 = -20.0f; + field_0x0B0 = 30.0f; + field_0x0A0 = 0x14; + field_0x0A2 = 0x96; + field_0x0B4 = 1000.0f; + field_0x0B8 = 1000.0f; + field_0x09E = 0x96; + field_0x0AC = 300.0f; + field_0x0BC = 750.0f; + field_0x0A6 = 10; } /* 000003EC-00000438 .text nodeControl_CB__FP7J3DNodei */ -static BOOL nodeControl_CB(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeControl_CB(J3DNode* node, int arg1) { + J3DJoint* joint = (J3DJoint*)node; + if(arg1 == 0) { + daFm_c* i_this = (daFm_c*)j3dSys.getModel()->getUserArea(); + if(i_this != NULL) { + i_this->_nodeControl(joint, j3dSys.getModel()); + } + } + return TRUE; } /* 00000438-00000690 .text _nodeControl__6daFm_cFP7J3DNodeP8J3DModel */ -void daFm_c::_nodeControl(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daFm_c::_nodeControl(J3DNode* node, J3DModel* model) { + J3DJoint* joint = static_cast<J3DJoint*>(node); + int jntNo = joint->getJntNo(); + + cXyz temp; + cXyz temp2; + cXyz temp3; + Mtx mtx; + MTXCopy(model->getAnmMtx(jntNo), mtx); + + temp.set(mtx[0][3], mtx[1][3], mtx[2][3]); + mtx[2][3] = 0.0f; + mtx[1][3] = 0.0f; + mtx[0][3] = 0.0f; + mDoMtx_stack_c::transS(temp); + if (jntNo < 6 && jntNo >= field_0x390 && l_HIO.field_0x00F[jntNo] == true) { + mDoMtx_stack_c::quatM(&field_0x330[jntNo]); + } + mDoMtx_stack_c::concat(mtx); + + if (jntNo == 5) { + if(cLib_calcTimer(&field_0x64C) != 0) { + field_0x68A += REG12_S(2) + 0x1830; + cLib_addCalcAngleS2(&field_0x68C, 0, 10, 0x1C8); + s16 temp3 = field_0x68C * cM_ssin(field_0x68A); // maybe immediately inline this? + + mDoMtx_stack_c::YrotM(temp3); + } + temp2.set(0.0f, 0.0f, 0.0f); + + temp2 = l_HIO.field_0x038; + mDoMtx_stack_c::multVec(&temp2, &field_0x61C); + + temp2 = l_HIO.field_0x104; + mDoMtx_stack_c::multVec(&temp2, &field_0x63C); + } + if (jntNo < 6) { + mDoMtx_stack_c::multVecZero(&field_0x2E8[jntNo]); + } + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); } /* 00000690-000006B0 .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* i_this) { + return static_cast<daFm_c*>(i_this)->_createHeap(); } /* 000006B0-00000718 .text _createHeap__6daFm_cFv */ -void daFm_c::_createHeap() { - /* Nonmatching */ +BOOL daFm_c::_createHeap() { + if(holeCreateHeap() == false) { + return false; + } + if(bodyCreateHeap() == false) { + return false; + } + + return jntHitCreateHeap() ? TRUE : FALSE; } /* 00000718-0000086C .text holeCreateHeap__6daFm_cFv */ -void daFm_c::holeCreateHeap() { - /* Nonmatching */ +bool daFm_c::holeCreateHeap() { + + J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, FM_BDL_YPIT00)); + JUT_ASSERT(0x2C7, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x19001222); + if(mpModel == NULL) { + return false; + } + + J3DAnmTextureSRTKey* btk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(m_arc_name, FM_BTK_YPIT00)); + JUT_ASSERT(0x2D0, btk != NULL); + + if(!mBtkAnm.init(modelData, btk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return false; + } + + return true; } /* 0000086C-000009CC .text bodyCreateHeap__6daFm_cFv */ -void daFm_c::bodyCreateHeap() { - /* Nonmatching */ +bool daFm_c::bodyCreateHeap() { + J3DModelData* fmModelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, FM_BDL_FM)); + JUT_ASSERT(0x2DD, fmModelData != NULL); + + mpMorf = new mDoExt_McaMorf( + fmModelData, + NULL, NULL, + +#if VERSION == VERSION_DEMO + NULL, + J3DFrameCtrl::EMode_NULL, +#else + static_cast<J3DAnmTransformKey*>(dComIfG_getObjectRes(m_arc_name, FM_BCK_MODORU)), + J3DFrameCtrl::EMode_LOOP, +#endif + + 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x37441422 + ); + + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return false; + } + + if (mInvisibleModel.create(mpMorf->getModel()) == 0) { + return false; + } + mpMorf->getModel()->setUserArea((u32)this); + return true; } /* 000009CC-00000A30 .text jntHitCreateHeap__6daFm_cFv */ -void daFm_c::jntHitCreateHeap() { - /* Nonmatching */ +bool daFm_c::jntHitCreateHeap() { + static Vec hand_sph_offset[] = {20.0f, 0.0f, 0.0f}; + static Vec ude_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {60.0f, 0.0f, 0.0f}}; + static Vec yubi_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {15.0f, 0.0f, 0.0f}}; + static Vec te_cyl2_offset[] = {{20.0f, 0.0f, 0.0f}, {20.0f, -5.0f, 0.0f}}; + + static __jnt_hit_data_c search_data[] = { + { + /* mShapeType */ JntHitType_CYL2_e, + /* mJointIndex */ 0x05, + /* mRadius */ 22.0f, + /* mpOffsets */ te_cyl2_offset, + }, + + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x01, + /* mRadius */ 8.0f, + /* mpOffsets */ ude_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x02, + /* mRadius */ 8.0f, + /* mpOffsets */ ude_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x03, + /* mRadius */ 8.0f, + /* mpOffsets */ ude_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x04, + /* mRadius */ 8.0f, + /* mpOffsets */ ude_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x06, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x07, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x08, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x09, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0A, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0B, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0C, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0D, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0E, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 0x0F, + /* mRadius */ 4.0f, + /* mpOffsets */ yubi_cyl_offset, + }, + + }; + mpJntHit = JntHit_create(mpMorf->getModel(), search_data, ARRAY_SIZE(search_data)); + if (mpJntHit) { + jntHit = mpJntHit; + } else { + return false; + } + return true; } /* 00000A30-00000A6C .text pathMove_CB__FP4cXyzP4cXyzP4cXyzPv */ -void pathMove_CB(cXyz*, cXyz*, cXyz*, void*) { - /* Nonmatching */ +BOOL pathMove_CB(cXyz* param_1, cXyz* param_2, cXyz* param_3, void* i_this) { + return ((daFm_c*)i_this)->_pathMove(param_1, param_2, param_3 ); } /* 00000A6C-00000D40 .text _pathMove__6daFm_cFP4cXyzP4cXyzP4cXyz */ -void daFm_c::_pathMove(cXyz*, cXyz*, cXyz*) { - /* Nonmatching */ +BOOL daFm_c::_pathMove(cXyz* param_1, cXyz* param_2, cXyz* param_3) { + field_0x398 = *param_3; + field_0x3A4 = *param_2; + cXyz temp = (*param_3 - *param_2).normZP(); + + if ((current.pos - *param_1).abs() < l_HIO.field_0x0D4 + 1.0f) { + f32 temp2 = cM_rndF(9.0f) + 1.0f; + field_0x394 = cM_rndF(9.0f) + 1.0f; + *param_1 = *param_1 + temp * l_HIO.field_0x0D8 * temp2; + } + + if (param_2->abs(*param_1) > param_2->abs(*param_3)) { + *param_1 = *param_3; + return true; + } + + return false; } /* 00000D40-00000D6C .text searchNearOtherActor_CB__FPvPv */ -void searchNearOtherActor_CB(void*, void*) { - /* Nonmatching */ +void* searchNearOtherActor_CB(void* param_1, void* param_2) { + return ((daFm_c*)param_2)->searchNearOtherActor((fopAc_ac_c*)param_1); } /* 00000D6C-00000F18 .text searchNearOtherActor__6daFm_cFP10fopAc_ac_c */ -void daFm_c::searchNearOtherActor(fopAc_ac_c*) { - /* Nonmatching */ +fopAc_ac_c* daFm_c::searchNearOtherActor(fopAc_ac_c* i_actor) { + if(dComIfGp_event_runCheck()) { + return NULL; + } + if(fopAc_IsActor(i_actor)) { + if(!checkHeight(i_actor)) { + return NULL; + } + f32 dist = fopAcM_searchActorDistanceXZ(this, i_actor); + + if(dist < l_HIO.field_0x0E4) { + if(fopAcM_GetName(i_actor) == PROC_BOMB) { + mpActorTarget = i_actor; + if(!((daBomb_c*)mpActorTarget)->chk_state(daBomb_c::STATE_0)) { + return i_actor; + } + } else if(fopAcM_GetName(i_actor) == PROC_TSUBO) { + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + + f32 dist2 = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + f32 dist3 = fopAcM_searchActorDistanceXZ(i_actor, dComIfGp_getPlayer(0)); + + if(dist2 < l_HIO.field_0x0E8) { + if(dist3 > REG12_F(0) + 80.0f || fopAcM_GetID(i_actor) == pLink->getGrabActorID()) { + switch(((daTsubo::Act_c*)i_actor)->prm_get_type()) { + case 0: + case 1: + case 2: + case 4: + case 5: + case 6: + mpActorTarget = i_actor; + return i_actor; + } + + } + } + } + } + } + return NULL; } /* 00000F18-00000F44 .text searchNearFm_CB__FPvPv */ -void searchNearFm_CB(void*, void*) { - /* Nonmatching */ +static void* searchNearFm_CB(void* param_1, void* param_2) { + ((daFm_c*)param_2)->searchNearFm((fopAc_ac_c*)param_1); } /* 00000F44-00001150 .text searchNearFm__6daFm_cFP10fopAc_ac_c */ -void daFm_c::searchNearFm(fopAc_ac_c*) { - /* Nonmatching */ +bool daFm_c::searchNearFm(fopAc_ac_c* i_actor) { + f32 dist; + if(fopAc_IsActor(i_actor) && fopAc_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_FM) { // redundant isactor check? + f32 abs = (field_0x3E4 - current.pos).absXZ(); + dist = fopAcM_searchActorDistanceXZ(this, i_actor); + if(dist != 0.0f) { + if(field_0x3E4.absXZ() == 0.0) { + field_0x3E4 = i_actor->current.pos; + } else if(dist < abs) { + field_0x3E4 = i_actor->current.pos; + } + } + } + return false; } /* 00001150-00001384 .text moveRndBack__6daFm_cFv */ void daFm_c::moveRndBack() { - /* Nonmatching */ + cLib_distanceAngleS(shape_angle.y, field_0x9D0); // unused angle + f32 temp = 100000.0f; + + if(mpActorTarget != NULL) { + temp = fopAcM_searchActorDistanceXZ(this, mpActorTarget); + } + + if(field_0x9D4 <= l_HIO.field_0x0E0 || temp <= l_HIO.field_0x0E0) { + if(!isGrabFoot()) { + if(cLib_calcTimer(&field_0x648) == 0 || field_0xAE4 == 0 || mObjAcch.ChkWallHit()) { + if(field_0xAE4 == 0 || mObjAcch.ChkWallHit()) { + field_0x680 += (s16)(0x5000 + field_0x680 + cM_rndF(3.0f) * 4096.0f); + } else { + field_0x680 = shape_angle.y + 0x3000 + cM_rndF(5.0f) * 4096.0f; + } + field_0x394 = cM_rndF(9.0f) + 1.0f; + field_0x660.z += l_HIO.field_0x0AC * cM_scos(field_0x680); + field_0x660.x += l_HIO.field_0x0AC * cM_ssin(field_0x680); + field_0x648 = l_HIO.field_0x0A0; + } + } + + + } + if(field_0xAE4 != 0 && !mObjAcch.ChkWallHit()) { + cLib_addCalcPosXZ2(¤t.pos, field_0x660, 0.1f, l_HIO.field_0x0B0); + } } /* 00001384-000015F8 .text moveRndEscape__6daFm_cFv */ void daFm_c::moveRndEscape() { - /* Nonmatching */ + f32 dist = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + + if(cLib_calcTimer(&field_0x648) == 0 || field_0xAE4 == 0 || mObjAcch.ChkWallHit()) { + if(dist < l_HIO.field_0x0B4) { + if(field_0xAE4 == 0 || mObjAcch.ChkWallHit()) { + field_0x680 += (s16)(0x5000 + field_0x680 + cM_rndF(3.0f) * 4096.0f); + } else { + field_0x680 = shape_angle.y + 0x3000 + cM_rndF(5.0f) * 4096.0f; + } + field_0x660.set(field_0x690); + field_0x660.z += l_HIO.field_0x0B8 * cM_scos(field_0x680); + field_0x660.x += l_HIO.field_0x0B8 * cM_ssin(field_0x680); + field_0x648 = l_HIO.field_0x0A0; + } + + if(cM_rndF(100.0f) < 33.0f) { + setAnm(0xC, false); + } + } + + if(mAnmPrmIdx != 0xc && field_0xAE4 != 0 && !mObjAcch.ChkWallHit()) { + cLib_addCalcPosXZ2(¤t.pos, field_0x660, (l_HIO.field_0x0CC + 1.0f) *0.005f * field_0x394, l_HIO.field_0x0B0); + field_0x690.set(current.pos); + } } /* 000015F8-00001680 .text spAttackVJump__6daFm_cFv */ void daFm_c::spAttackVJump() { - /* Nonmatching */ + initBt(l_HIO.mSpAttackVJumpHeight, l_HIO.mSpAttackVJumpRadius); + f32 frame = mpMorf->getFrame(); + + setBtAttackData(l_HIO.mSpAttackVJumpStartFrame, l_HIO.mSpAttackVJumpEndFrame, 700.0f, 3); + setBtNowFrame(frame); } /* 00001680-00001708 .text spAttackJump__6daFm_cFv */ void daFm_c::spAttackJump() { - /* Nonmatching */ + initBt(l_HIO.mSpAttackJumpHeight, l_HIO.mSpAttackJumpRadius); + f32 frame = mpMorf->getFrame(); + + setBtAttackData(l_HIO.mSpAttackJumpStartFrame, l_HIO.mSpAttackJumpEndFrame, 700.0f, 1); + setBtNowFrame(frame); } /* 00001708-00001738 .text spAttackNone__6daFm_cFv */ void daFm_c::spAttackNone() { - /* Nonmatching */ + setBtAttackData(100.0f, 100.0f, 10000.0f, 0); + setBtNowFrame(0.0f); } /* 00001738-000017CC .text iceProc__6daFm_cFv */ void daFm_c::iceProc() { - /* Nonmatching */ + setAttention(); + J3DModel* pModel = mpMorf->getModel(); + +#if VERSION != VERSION_DEMO + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); +#else + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); +#endif + mpMorf->calc(); + + if(mEnemyIce.mLightShrinkTimer != 0 || health <= 0) { + setHoleScale(l_HIO.field_0x120, 0.1f, l_HIO.field_0x128); + } + + holeSetMtx(); + cancelGrab(); } /* 000017CC-00001864 .text bodySetMtx__6daFm_cFv */ void daFm_c::bodySetMtx() { - /* Nonmatching */ + J3DModel* pModel = mpMorf->getModel(); + pModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::transM(field_0x610); + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } /* 00001864-00001920 .text holeSetMtx__6daFm_cFv */ void daFm_c::holeSetMtx() { - /* Nonmatching */ + Vec scale = {field_0x3E0, field_0x3E0, field_0x3E0}; + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::transM(l_HIO.field_0x020); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + } /* 00001920-00001A50 .text setCollision__6daFm_cFv */ void daFm_c::setCollision() { - /* Nonmatching */ + if(isBodyAppear()) { + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK400_e | daPyStts0_UNK2_e)) { + mSph.SetR(l_HIO.field_0x0C8 * 1.5f); + } else { + mSph.SetR(l_HIO.field_0x0C8); + } + mSph.SetC(field_0x61C); + dComIfG_Ccsp()->Set(&mSph); + } + + if(isHoleAppear()) { + mCyl.SetR(field_0x3E0); + mCyl.SetH(150.0f); + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + } } /* 00001A50-00001C90 .text setAttention__6daFm_cFv */ void daFm_c::setAttention() { - /* Nonmatching */ + if(field_0x2E4 != 0) { + attention_info.position = current.pos; + eyePos = current.pos; + + } else { + if(mMode == 0xe || mMode == 0x10 || mMode == 0xf || (mMode == 0 || mMode == 0x11)) { + attention_info.position = current.pos; + eyePos = current.pos; + } else { + attention_info.position = field_0x61C; + attention_info.position.y += 20.0f; + daPy_py_c* pLink = daPy_getPlayerActorClass(); + f32 abs = (pLink->getHeadTopPos() - field_0x61C).abs(); + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK400_e | daPyStts0_UNK2_e)) { + eyePos = field_0x61C; + } else { + if(mMode == 8) { + if(abs > l_HIO.field_0x0EC) { + eyePos = field_0x61C; + } else { + eyePos = current.pos; + eyePos.y += 200.0f; + } + } else { + eyePos = field_0x61C; + } + } + } + } } /* 00001C90-00002530 .text checkTgHit__6daFm_cFv */ -void daFm_c::checkTgHit() { - /* Nonmatching */ +bool daFm_c::checkTgHit() { + daPy_py_c* player = daPy_getPlayerActorClass(); + mStts2.Move(); + bool temp; + + if(cLib_calcTimer(&field_0x9C4) == 0 && mSph.ChkTgHit()) { + temp = true; + cXyz* hitPos = mSph.GetTgHitPosP(); + cCcD_Obj* hitObj = mSph.GetTgHitObj(); + field_0x9C4 = l_HIO.field_0x09C; + + if(hitObj == NULL) { + return false; + } + switch (hitObj->GetAtType()) { + case AT_TYPE_SWORD: + case AT_TYPE_MACHETE: + case AT_TYPE_UNK800: + case AT_TYPE_DARKNUT_SWORD: + case AT_TYPE_MOBLIN_SPEAR: + fopAcM_seStart(this, JA_SE_LK_SW_HIT_S, 0x20); + switch(player->getCutType()) { + case 0x10: + mHitType = 0xC; + break; + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x15: + case 0x17: + case 0x19: + case 0x1A: + case 0x1B: + mHitType = 1; + break; + default: + mHitType = 0; + break; + } + break; + case AT_TYPE_WIND: + temp = false; + mHitType = 3; + break; + + case AT_TYPE_BOOMERANG: + case AT_TYPE_BOKO_STICK: + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44); + temp = false; + mHitType = 4; + dComIfGp_particle_set(dPa_name::ID_COMMON_STARS_BLOW, &attention_info.position); + fopAcM_monsSeStart(this, JA_SE_CV_FM_DAMAGE, 0); + modeProcInit(0x13); + break; + + case AT_TYPE_HOOKSHOT: + fopAcM_seStart(this, JA_SE_LK_HS_SPIKE, 0x44); + temp = false; + mHitType = 5; + modeProcInit(10); + break; + + case AT_TYPE_SKULL_HAMMER: + case AT_TYPE_STALFOS_MACE: + fopAcM_seStart(this, JA_SE_LK_HAMMER_HIT, 0x20); + mHitType = 8; + if(player->getCutType() == 0x11) { + mHitType = 9; + } + break; + case AT_TYPE_BOMB: + mHitType = 7; + break; + + case AT_TYPE_ICE_ARROW: + temp = false; + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); + mEnemyIce.mFreezeDuration = l_HIO.mFreezeDuration; + mHitType = 10; + modeProcInit(7); + break; + + case AT_TYPE_LIGHT_ARROW: + temp = false; + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); + mEnemyIce.mLightShrinkTimer = 1; + mHitType = 0xB; + break; + + case AT_TYPE_FIRE_ARROW: + case AT_TYPE_NORMAL_ARROW: + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); + mHitType = 6; + break; + + case AT_TYPE_GRAPPLING_HOOK: + fopAcM_monsSeStart(this, JA_SE_CV_FM_DAMAGE, 0); + dComIfGp_particle_set(dPa_name::ID_COMMON_STARS_BLOW, &attention_info.position); + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44); + mHitType = 0xD; + temp = false; + break; + + } + CcAtInfo atInfo; + atInfo.pParticlePos = NULL; + atInfo.mpObj = mSph.GetTgHitObj(); + + if (temp) { + cc_at_check(this, &atInfo); + if (mHitType == 1 || mHitType == 8 || mHitType == 9 || mHitType== 0xc || health <= 0) { + dComIfGp_particle_set(dPa_name::ID_COMMON_0010, hitPos); + cXyz temp2(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, hitPos, &player->shape_angle, &temp2); + + if (health <= 0) { + fopAcM_monsSeStart(this, JA_SE_CV_FM_DIE, 0); + } else { + fopAcM_monsSeStart(this, JA_SE_CV_FM_DAMAGE, 0); + } + + if (mHitType == 0xc || mHitType == 8) { + modeProcInit(0x14); + return 1; + } + + if (health <= 0) { + modeProcInit(0x0C); + } else { + modeProcInit(10); + } + } else { + dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, hitPos, &player->shape_angle); + + fopAcM_monsSeStart(this, JA_SE_CV_FM_DAMAGE, 0); + modeProcInit(10); + } + } else if (mHitType == 0xD) { + modeProcInit(10); + s8 oldHealth = health; + health = 10; + cc_at_check(this, &atInfo); + health = oldHealth; + setAnm(1, false); + field_0x64C = 0x28; + field_0x68C = 0x2B00; + } + return true; + } + + return false; } /* 00002530-000026A0 .text setGrabPos__6daFm_cFv */ void daFm_c::setGrabPos() { - /* Nonmatching */ + daBomb_c* bomb = (daBomb_c*)mpActorTarget; + if (bomb == NULL) { + mGrabPos = current.pos; + } else { + if (fopAcM_GetName(bomb) == PROC_BOMB && bomb->chk_state(daBomb_c::STATE_0)) { + mGrabPos = current.pos; + return; + } + + if (isLink(mpActorTarget)) { + mGrabPos = daPy_getPlayerLinkActorClass()->getHeadTopPos() + getOffsetPos(); + } else { + if (isNpc(mpActorTarget)) { + mGrabPos = mpActorTarget->current.pos + getOffsetPos(); + } + else { + mGrabPos = mpActorTarget->current.pos + getOffsetPos(); + } + } + } } /* 000026A0-00002868 .text getOffsetPos__6daFm_cFv */ -void daFm_c::getOffsetPos() { - /* Nonmatching */ +cXyz daFm_c::getOffsetPos() { + cXyz offset(0.0f, 0.0f, 0.0f); + + if(isLink(mpActorTarget)) { + offset.set(0.0f, -10.0f, 0.0f); + } else { + + s16 procName = fopAcM_GetName(mpActorTarget); + if(procName == PROC_NPC_CB1) { + if(fopAcM_checkCarryNow(mpActorTarget)) { + offset.set(0.0f, 20.0f, 0.0f); + } else { + offset.set(0.0f, 80.0f, 0.0f); + } + + } else if(procName == PROC_NPC_MD) { + if(fopAcM_checkCarryNow(mpActorTarget)) { + offset.set(0.0f, 20.0f, 0.0f); + } else { + offset.set(0.0f, 140.0f, 0.0f); + } + + } else if(procName == PROC_BOMB) { + offset.set(0.0f, 80.0f, 0.0f); + + } else if(procName == PROC_TSUBO) { + + switch(((daTsubo::Act_c*)mpActorTarget)->prm_get_type()) { + case 5: + case 0: + offset.set(0.0f, 80.0f, 0.0f); + break; + + case 4: + case 6: + offset.set(0.0f, 80.0f, 0.0f); + break; + + case 1: + case 2: + offset.set(0.0f, 90.0f, 0.0f); + break; + } + } + } + return offset; } /* 00002868-000028D4 .text checkPlayerGrabBomb__6daFm_cFv */ -void daFm_c::checkPlayerGrabBomb() { - /* Nonmatching */ +u8 daFm_c::checkPlayerGrabBomb() { + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + fopAc_ac_c* ac = fopAcM_SearchByID(pLink->getGrabActorID()); + if(ac == NULL) { + return false; + } + return fopAcM_GetName(ac) == PROC_BOMB; } /* 000028D4-00002954 .text checkPlayerGrabNpc__6daFm_cFv */ -void daFm_c::checkPlayerGrabNpc() { - /* Nonmatching */ +u8 daFm_c::checkPlayerGrabNpc() { + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + fopAc_ac_c* ac = fopAcM_SearchByID(pLink->getGrabActorID()); + if(ac == NULL) { + return false; + } + return isNpc(ac) != 0; } /* 00002954-000029A8 .text checkPlayerGrabTarget__6daFm_cFv */ -void daFm_c::checkPlayerGrabTarget() { - /* Nonmatching */ +u8 daFm_c::checkPlayerGrabTarget() { + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + return pLink->getGrabActorID() == mProcId; } /* 000029A8-00002CEC .text isGrabPos__6daFm_cFv */ -void daFm_c::isGrabPos() { - /* Nonmatching */ +bool daFm_c::isGrabPos() { + bool temp; + if(mpActorTarget == NULL) { + return false; + } + + f32 abs = (mGrabPos - current.pos).absXZ(); + + if(fopAcM_checkCarryNow(mpActorTarget)) { + if(checkPlayerGrabBomb() == 1) { + return false; + } + if(checkPlayerGrabTarget() != 1) { + return false; + } + } + + if(isLink(mpActorTarget)) { + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + + + if(pLink->checkCarryActionNow() || pLink->getGrabActorID() != -1) { + return false; + } + + if(isLinkControl()) { + return false; + } + } + + if(isLink(mpActorTarget)) { + if(abs <= l_HIO.field_0x0E0) { + return false; + } + } else if(abs <= l_HIO.field_0x0E0 || abs > l_HIO.field_0x0E4) { + return false; + } + + if(std::fabsf(mGrabPos.y - current.pos.y) > l_HIO.field_0x0A8) { + return false; + } + if(cLib_distanceAngleS(shape_angle.y, cLib_targetAngleY(¤t.pos, &mGrabPos)) > l_HIO.field_0x098) { + return false; + } + if(field_0x2D0 == 0) { + if((field_0x69C - mGrabPos).absXZ() > field_0x2E0) { + return false; + } + } + return true; } /* 00002CEC-00002E7C .text isGrab__6daFm_cFv */ -void daFm_c::isGrab() { - /* Nonmatching */ +bool daFm_c::isGrab() { + if(mpActorTarget == NULL) { + return false; + } + + if(isLink(mpActorTarget) && (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK100_e) || checkPlayerGrabBomb())) { + return false; + } + + if(std::fabsf(mGrabPos.y - current.pos.y) > l_HIO.field_0x0A8) { + return false; + } + + cXyz temp = mGrabPos - field_0x61C; + f32 temp2 = l_HIO.field_0x0EC; + if(field_0x2E4 != 0) { + temp2 = l_HIO.field_0x0EC * 2.0f; + } + if(temp.abs() > temp2) { + return false; + } + return true; } /* 00002E7C-00002F98 .text isGrabFoot__6daFm_cFv */ -void daFm_c::isGrabFoot() { - /* Nonmatching */ +bool daFm_c::isGrabFoot() { +#if VERSION <= VERSION_JPN + if(mBaseTarget == NULL) { + return false; + } + + if(!isLink(mBaseTarget)) { + return false; + } +#else + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); +#endif + +#if VERSION <= VERSION_JPN + if(std::fabsf(current.pos.y - mBaseTarget->current.pos.y) > 10.0f) { +# else + if(std::fabsf(current.pos.y - pLink->current.pos.y) > 10.0f) { +#endif + return false; + } + + +#if VERSION <= VERSION_JPN + if(fopAcM_searchActorDistanceXZ(this, daPy_getPlayerActorClass()) > l_HIO.field_0x0DC) { +#else + if(fopAcM_searchActorDistanceXZ(this, pLink) > l_HIO.field_0x0DC) { +#endif + return false; + } + +#if VERSION <= VERSION_JPN + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); +#endif + if(pLink->speedF > 4.0f) { + return false; + } + if(pLink->checkPlayerFly() || pLink->checkFrontRoll() || pLink->getGrabActorID() != -1 +#if VERSION > VERSION_JPN + || isLinkControl() +#endif + ) { + return false; + } + return true; } /* 00002F98-00002FDC .text modeSwWaitInit__6daFm_cFv */ void daFm_c::modeSwWaitInit() { - /* Nonmatching */ + setAnm(8, false); + field_0x3E0 = l_HIO.field_0x120; } /* 00002FDC-000031B0 .text modeSwWait__6daFm_cFv */ void daFm_c::modeSwWait() { - /* Nonmatching */ + resetInvKine(); + if(!dComIfGs_isSwitch(field_0x2D4, fopAcM_GetRoomNo(this))) { + return; + } + + if(field_0x2E4 != 0) { + setHoleScale(l_HIO.field_0x124, 0.1f, l_HIO.field_0x128); + if(eventInfo.mCommand == dEvtCmd_INDEMO_e) { + if(field_0x2E4 != 0 && cLib_calcTimer(&field_0x650) != 0) { + return; + } + } else { + if(dComIfGp_evmng_startCheck("DEFAULT_FM_SW_APEEAR") == 0) { + fopAcM_orderOtherEvent2(this,"DEFAULT_FM_SW_APEEAR",dEvtFlag_NOPARTNER_e); + return; + } + } + } else { + if(dComIfGp_evmng_startCheck("DEFAULT_FM_SW_APEEAR") != 0) { + field_0x2E5 = true; + } + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + } + + switch(field_0x2D0) { + case 0: + modeProcInit(2); + break; + case 1: + if(setHoleScale(l_HIO.field_0x124, 0.1f, l_HIO.field_0x128) != 0) { + modeProcInit(3); + } + break; + case 2: + if(setHoleScale(l_HIO.field_0x124, 0.1f, l_HIO.field_0x128) != 0) { + modeProcInit(4); + } + break; + } } /* 000031B0-00003200 .text modeHideInit__6daFm_cFv */ void daFm_c::modeHideInit() { - /* Nonmatching */ + setAnm(8, false); + field_0x650 = setRnd(l_HIO.field_0x084,l_HIO.field_0x086); } /* 00003200-000032E0 .text modeHide__6daFm_cFv */ void daFm_c::modeHide() { - /* Nonmatching */ + field_0x690 = current.pos; + resetInvKine(); + if(setHoleScale(l_HIO.field_0x120, 0.1f, l_HIO.field_0x128) != 0) { + current.pos.x = mBaseTarget->current.pos.x; + current.pos.z = mBaseTarget->current.pos.z; + if(cLib_calcTimer(&field_0x650) == 0) { + if(std::fabsf(field_0x69C.y - mBaseTarget->current.pos.y) <= l_HIO.field_0x0A8 && field_0xAE4 == 1) { + modeProcInit(2); + } + } + } } /* 000032E0-00003344 .text modeUnderFootInit__6daFm_cFv */ void daFm_c::modeUnderFootInit() { - /* Nonmatching */ + setAnm(8, false); + field_0x650 = l_HIO.field_0x066; + current.pos.x = mBaseTarget->current.pos.x; + current.pos.z = mBaseTarget->current.pos.z; + field_0x3E0 = l_HIO.field_0x120; } /* 00003344-000034E4 .text modeUnderFoot__6daFm_cFv */ void daFm_c::modeUnderFoot() { - /* Nonmatching */ + if(cLib_calcTimer(&field_0x648) == 0) { + field_0x660 = mBaseTarget->current.pos; + field_0x648 = l_HIO.field_0x08A; + } + cLib_addCalcPosXZ2(¤t.pos, field_0x660, 0.1f, l_HIO.field_0x0C0); + + field_0x690 = current.pos; + resetInvKine(); + if(std::fabsf(field_0x69C.y - mBaseTarget->current.pos.y) > l_HIO.field_0x0A8|| field_0xAE4 == 0) { + modeProcInit(1); + } else { + if(setHoleScale(l_HIO.field_0x124, 0.1f, l_HIO.field_0x12C) != 0) { + if(cLib_calcTimer(&field_0x650) == 0) { + if(isGrabFoot() && !dComIfGp_event_runCheck()) { + modeProcInit(0xf); + } else { + if(field_0x9D4 < l_HIO.field_0x0E4 && field_0xAE5 == 0) { + modeProcInit(5); + } else { + modeProcInit(1); + } + } + } + } + } } /* 000034E4-00003528 .text modePathMoveInit__6daFm_cFv */ void daFm_c::modePathMoveInit() { - /* Nonmatching */ + setAnm(8, false); + field_0x3E0 = l_HIO.field_0x124; } /* 00003528-00003670 .text modePathMove__6daFm_cFv */ void daFm_c::modePathMove() { - /* Nonmatching */ + field_0x690 = current.pos; + resetInvKine(); + turnToBaseTarget(); + if(isGrabFoot() && !dComIfGp_event_runCheck()) { + modeProc(PROC_0_e,0xf); + } else { + + dLib_pathMove(&field_0x3B0, &field_0x3BC, mpPath, 3.0f, pathMove_CB, this); + cLib_addCalcPosXZ2(¤t.pos, field_0x3B0, (l_HIO.field_0x0D0 + 1.0f) * 0.005f * field_0x394, 20.0f); + + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + if(field_0x9D4 < l_HIO.field_0x0E4 && std::fabsf(pLink->current.pos.y - current.pos.y) < l_HIO.field_0x0A8 && field_0xAE5 == 0) { + modeProc(PROC_0_e,5); + } + } } /* 00003670-000036B4 .text modeGoalKeeperInit__6daFm_cFv */ void daFm_c::modeGoalKeeperInit() { - /* Nonmatching */ + setAnm(8, false); + field_0x3E0 = l_HIO.field_0x124; } /* 000036B4-000038DC .text modeGoalKeeper__6daFm_cFv */ void daFm_c::modeGoalKeeper() { - /* Nonmatching */ + + if(field_0x2E5 && dComIfGp_evmng_endCheck("DEFAULT_FM_SUIKOMI_NPC")) { + modeProc(PROC_0_e,6); + return; + } + + resetInvKine(); + turnToBaseTarget(); + if(isGrabFoot() && !dComIfGp_event_runCheck()) { + modeProc(PROC_0_e, 0xf); + } else { + if(field_0x2E4 != 0) { + modeProc(PROC_0_e, 5); + } else { + f32 temp = std::fabsf(current.pos.y - mBaseTarget->current.pos.y); + if(field_0x9D4 < l_HIO.field_0x0E8 && temp < l_HIO.field_0x0A8) { + if((mBaseTarget->current.pos - field_0x69C).absXZ() < field_0x2E0 && field_0xAE5 == 0) { + modeProc(PROC_0_e,5); + } + } + field_0x690 = field_0x69C; + cLib_addCalcPosXZ2(¤t.pos, field_0x690, (l_HIO.field_0x0CC + 1.0f) *0.005f * field_0x394, 40.0f); + } + } } /* 000038DC-00003938 .text modeAppearInit__6daFm_cFv */ void daFm_c::modeAppearInit() { - /* Nonmatching */ + setAnm(2, false); + field_0x660 = current.pos; + shape_angle.y = field_0x9D0; + field_0x650 = 0x1e; } /* 00003938-00003A00 .text modeAppear__6daFm_cFv */ void daFm_c::modeAppear() { - /* Nonmatching */ + if(field_0x2D0 == 0) { + moveRndBack(); + } + resetInvKine(); + if(!checkTgHit()) { + searchTarget(); + if(mpActorTarget != NULL) { + setGrabPos(); + if(field_0x2E4 != 0 && cLib_calcTimer(&field_0x650) != 0) { + return; + } + if(isGrabPos()) { + modeProc(PROC_0_e,8); + return; + } + } + if(mAnmPrmIdx == 1) { + modeProc(PROC_0_e,7); + } + } } /* 00003A00-00003A68 .text modeDisappearInit__6daFm_cFv */ void daFm_c::modeDisappearInit() { - /* Nonmatching */ + if(mAnmPrmIdx != 8 && mAnmPrmIdx != 6) { + setAnm(3, false); + } + + if(mAnmPrmIdx == 6) { + setAnm(8, false); + } } /* 00003A68-00003BDC .text modeDisappear__6daFm_cFv */ void daFm_c::modeDisappear() { - /* Nonmatching */ + if(field_0x2D0 != 2) { + field_0x690 = current.pos; + } + resetInvKine(); + cancelGrab(); + if(mAnmPrmIdx == 8) { + if(mpMorf->isStop()) { + if(field_0x2E4 != 0 || field_0x2E5) { + modeProc(PROC_0_e, 0x12); + } else { + fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + if(isGrabFoot() && !dComIfGp_event_runCheck()) { + modeProc(PROC_0_e, 0xf); + } else { + switch(field_0x2D0) { + case 0: + modeProc(PROC_0_e, 1); + break; + case 1: + modeProc(PROC_0_e, 3); + break; + case 2: + modeProc(PROC_0_e, 4); + break; + } + } + } + } + } } /* 00003BDC-00003C5C .text modeWaitInit__6daFm_cFv */ void daFm_c::modeWaitInit() { - /* Nonmatching */ + field_0x658 = l_HIO.field_0x088; + field_0x650 = setRnd(l_HIO.field_0x08C,l_HIO.field_0x08E); + + mSinkTimer = l_HIO.field_0x08A; + field_0x65C = l_HIO.field_0x100; + field_0x6B4 = 0; + field_0x660 = current.pos; } /* 00003C5C-00003F90 .text modeWait__6daFm_cFv */ void daFm_c::modeWait() { - /* Nonmatching */ + resetInvKine(); + cancelGrab(); + if(checkTgHit()) { + return; + } + if(!areaCheck()) { + modeProc(PROC_0_e, 6); + return; + } + if(isGrabFoot()) { + modeProc(PROC_0_e, 6); + return; + } + + searchTarget(); + s32 angle = cLib_distanceAngleS(shape_angle.y, field_0x9D0); + if(mpActorTarget != NULL) { + if(field_0x9D4 > l_HIO.field_0x0E0) { + s16 angle2 = cLib_targetAngleY(¤t.pos, &mGrabPos); + if(isNpc(mpActorTarget) || isLink(mpActorTarget)) { + cLib_addCalcAngleS2(&shape_angle.y, angle2, 8, 0x300); + } else { + cLib_addCalcAngleS2(&shape_angle.y, angle2, 4, 0x800); + } + } + setGrabPos(); + if(isGrabPos()) { + if(checkPlayerGrabTarget()) { + if(cLib_calcTimer(&field_0x65C) == 0) { + modeProc(PROC_0_e, 8); + return; + } + } else { + if(isNpc(mpActorTarget)) { + if(cLib_calcTimer(&field_0x65C) != 0) { + return; + } + modeProc(PROC_0_e,8); + return; + } + modeProc(PROC_0_e,8); + return; + } + } + } else { + if(angle > l_HIO.field_0x09A) { + cLib_addCalcAngleS2(&shape_angle.y, field_0x9D0, 10, 0x100); + } + } + if(field_0x2D0 == 2 && (mBaseTarget->current.pos - field_0x69C).absXZ() > field_0x2E0) { + modeProc(PROC_0_e, 6); + } else { + moveRndBack(); + } + if(field_0x9D4 > l_HIO.field_0x0E4 && field_0x9D4 < l_HIO.field_0x0E8) { + turnToBaseTarget(); + } + if(field_0x9D4 > l_HIO.field_0x0E8) { + if(cLib_calcTimer(&field_0x658) == 0) { + modeProc(PROC_0_e,6); + } + } else { + field_0x658 = l_HIO.field_0x088; + } } /* 00003F90-00003FF8 .text modeAttackInit__6daFm_cFv */ void daFm_c::modeAttackInit() { - /* Nonmatching */ + if(dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK400_e | daPyStts0_UNK2_e)) { + modeProc(PROC_0_e,7); + } else { + setAnm(4, false); + field_0x650 = l_HIO.field_0x094; + } } /* 00003FF8-000049CC .text modeAttack__6daFm_cFv */ void daFm_c::modeAttack() { - /* Nonmatching */ + f32 dist; + if(mAnmPrmIdx != 5 && !isGrab()) { + dist = (mGrabPos - current.pos).absXZ(); + if(!(dist > l_HIO.field_0x0E0 && dist < l_HIO.field_0x0C4) && dist < l_HIO.field_0x0E4 + 10.0f) { + field_0x660 = mGrabPos; + cLib_addCalcPosXZ2(¤t.pos, field_0x660, (l_HIO.field_0x0CC + 1.0f) *0.005f * field_0x394, 40.0f); + } + } + + if (!checkTgHit()) { + if (mAnmPrmIdx == 5) { + if (mpMorf->isStop()) { + modeProcInit(7); + return; + } + } + + if (mpActorTarget == NULL) { + setAnm(5, false); + } else { + calcInvKine(mpActorTarget); + s16 actorAngle = fopAcM_searchActorAngleY(this, mpActorTarget); + if (cLib_distanceAngleS(shape_angle.y, actorAngle) > l_HIO.field_0x09A) { + cLib_addCalcAngleS2(&shape_angle.y, actorAngle, 4, l_HIO.field_0x096); + } + + + if (field_0xAE4 == 0) { + modeProcInit(6); + } else if (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK400_e | daPyStts0_UNK2_e)) { + f32 oldGrabPosY = mGrabPos.y; + mGrabPos = daPy_getPlayerLinkActorClass()->current.pos; + mGrabPos.y = oldGrabPosY; + + } else { + if (isGrabPos()) { + setGrabPos(); + } else { + setAnm(5, false); + return; + } + + if (isGrab()) { + if(isLink(mpActorTarget) && mAnmPrmIdx == 4) { + if(mpMorf->isStop()) { + modeProcInit(0xD); + fopAcM_seStart(this, JA_SE_CM_FM_GRAB_HAND, 0); + daPy_getPlayerLinkActorClass()->voiceStart(0x1C); + } else { + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + + if(pLink->speedF >= 1.0f){ + dist = (mGrabPos - field_0x63C).absXZ(); + if(dist > l_HIO.field_0x110 && dist < l_HIO.field_0x114) { + s16 targetAngle2 = cLib_targetAngleY(&field_0x63C, &mGrabPos); + f32 dist2 = std::fabsf(l_HIO.field_0x114 -l_HIO.field_0x110); + if (dist2 == 0.0f) { + dist2 = 1.0f; + } + f32 temp4 = l_HIO.field_0x118 * (std::fabsf(dist - l_HIO.field_0x110) / dist2); + pLink->setOutPower(temp4, targetAngle2, 0); + } + } + } + } else { + if (isNpc(mpActorTarget) == true) { + if (!fopAcM_CheckStatus(mpActorTarget, fopAcStts_CARRY_e)) { + fopAcM_seStart(this, JA_SE_CM_FM_GRAB_HAND, 0); + fopAcM_setCarryNow(mpActorTarget, 0); + field_0x684 = 4; + + if (fopAcM_GetName(mpActorTarget) == PROC_NPC_CB1) { + ((daNpc_Cb1_c*)mpActorTarget)->noCarryAction(); + } + + if (fopAcM_GetName(mpActorTarget) == PROC_NPC_MD) { + ((daNpc_Md_c*)mpActorTarget)->noCarryAction(); + } + + field_0x6B8 = 1; + if(field_0x2E4 != 0) { + if (dComIfGp_evmng_startCheck("DEFAULT_FM_SW_APEEAR")) { + dComIfGp_event_reset(); + } + modeProcInit(0xD); + } else { + f32 temp3 = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + + if ((temp3 > l_HIO.field_0x0BC || + std::fabsf(pLink->current.pos.y - current.pos.y) > l_HIO.field_0x0A8) && + !dComIfGp_event_runCheck()) { + modeProcInit(0x10); + } else { + + modeProcInit(0xD); + } + } + } else { + fopAcM_cancelCarryNow(mpActorTarget); + } + } else { + fopAc_ac_c* actor = mpActorTarget; + s16 procName = fopAcM_GetName(actor); + + if (procName == PROC_BOMB) { + if (!fopAcM_CheckStatus(actor, fopAcStts_CARRY_e)) { + fopAcM_setCarryNow(actor, 0); + field_0x684 = 2; + fopAcM_seStart(this, JA_SE_CM_FM_GRAB, 0); + + modeProcInit(0xD); + } else { + modeProcInit(7); + } + } else if (procName == PROC_TSUBO) { + if (!fopAcM_CheckStatus(actor, fopAcStts_CARRY_e)) { + fopAcM_setCarryNow(actor, 0); + field_0x684 = 3; + fopAcM_seStart(this, JA_SE_CM_FM_GRAB, 0); + + modeProcInit(0xD); + } else { + fopAcM_cancelCarryNow(actor); + } + } + } + + } + } else if (isLink(mpActorTarget) && mAnmPrmIdx == 4) { + dist = (mGrabPos - field_0x63C).absXZ(); + + if (dist > l_HIO.field_0x110 && dist < l_HIO.field_0x114) { + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + + if(pLink->speedF >= 1.0f) { + s16 targetAngle = cLib_targetAngleY(&field_0x63C, &mGrabPos); + f32 dist3 = std::fabsf(l_HIO.field_0x114 - l_HIO.field_0x110); + if (dist3 == 0.0f) { + dist3 = 1.0f; + } + f32 temp5 = l_HIO.field_0x118 * (std::fabsf(dist - l_HIO.field_0x110) / dist3); + pLink->setOutPower(temp5, targetAngle, 0); + } + + } else if (mpMorf->isStop() && cLib_calcTimer(&field_0x650) == 0) { + setAnm(5, false); + } + } else if (mAnmPrmIdx == 4){ + if (mpMorf->isStop() && cLib_calcTimer(&field_0x650) == 0) { + setAnm(5, false); + } + } + } + } + } } /* 000049CC-000049F4 .text modeThrowInit__6daFm_cFv */ void daFm_c::modeThrowInit() { - /* Nonmatching */ + setAnm(0xB, false); } /* 000049F4-00004CE4 .text modeThrow__6daFm_cFv */ void daFm_c::modeThrow() { - /* Nonmatching */ + resetInvKine(); + if(mAnmPrmIdx == 1 && cLib_calcTimer(&field_0x650) == 0) { + modeProc(PROC_0_e, 7); + } + if(field_0x684 != 0 && mpActorTarget == NULL) { + modeProc(PROC_0_e, 10); + return; + } + if(field_0x684 == 0) { + return; + } + if(checkTgHit()) { + return; + } + + if(field_0x2D0 != 2 || isNpc(mpActorTarget) != true) { + s16 angle = fopAcM_searchPlayerAngleY(this); + cLib_addCalcAngleS2(&shape_angle.y, angle, 4, 0x800); + } + + if(l_HIO.field_0x0FC == mpMorf->getFrame()) { + if(isNpc(mpActorTarget)) { + mpActorTarget->speedF = l_HIO.field_0x0F0; + mpActorTarget->speed.y = l_HIO.field_0x0F4; + fopAcM_cancelCarryNow(mpActorTarget); + field_0x684 = 0; + mGrabPos = current.pos; + } else { + if(fopAcM_GetName(mpActorTarget) == PROC_BOMB || fopAcM_GetName(mpActorTarget) == PROC_TSUBO) { + mpActorTarget->current.angle.y = shape_angle.y; + mpActorTarget->shape_angle.y = shape_angle.y; + mpActorTarget->speedF = l_HIO.field_0x0F0; + + f32 temp = field_0x9D4 / (REG12_F(13) + 1000.0f); + if (temp <= 0.0f) { + temp = 0.0f; + } else if (temp >= 1.0f) { + temp = 1.0f; + } + + f32 dropspeed = temp *= l_HIO.field_0x0F4; + daTsubo::Act_c* tsubo = (daTsubo::Act_c*)mpActorTarget; + + if(fopAcM_GetName(mpActorTarget) == PROC_TSUBO) { + switch(tsubo->prm_get_type()) { + case 0: + case 1: + case 2: + case 4: + case 5: + case 6: + tsubo->set_drop_spd_y0(dropspeed); + tsubo->m810 = 1; + break; + } + } else { + tsubo->set_drop_spd_y0(dropspeed); + } + mpActorTarget->gravity = l_HIO.field_0x0F8; + fopAcM_cancelCarryNow(mpActorTarget); + field_0x684 = 0; + mGrabPos = current.pos; + } + } + } + + if(mAnmPrmIdx == 11) { + if(mpMorf->isStop()) { + field_0x650 = 0x3c; + } + } } /* 00004CE4-00004D20 .text modeGrabFootDemoInit__6daFm_cFv */ void daFm_c::modeGrabFootDemoInit() { - /* Nonmatching */ + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + field_0x610.setall(0.0f); + field_0x630.set(pLink->current.pos); } /* 00004D20-000050B4 .text modeGrabFootDemo__6daFm_cFv */ void daFm_c::modeGrabFootDemo() { - /* Nonmatching */ + resetInvKine(); + if(l_HIO.field_0x00D) { + modeProc(PROC_0_e, 5); + } else { + if(eventInfo.mCommand == dEvtCmd_INDEMO_e) { + // char* cutName; + // int staffIdx; + + int staffIdx = dComIfGp_evmng_getMyStaffId("Fmaster"); + char* cutName = dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx); + if(strcmp(cutName, "Dummy") == 0 || strcmp(cutName, "WAIT") == 0) { + dComIfGp_evmng_cutEnd(staffIdx); + } + if(strcmp(cutName, "GRAB_FOOT") == 0 && mAnmPrmIdx == 10 && + mpMorf->getFrame() == 10.0f) { + dComIfGp_evmng_cutEnd(staffIdx); + } + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + fopAc_ac_c* ac = fopAcM_SearchByID(pLink->getGrabActorID()); + if(ac != NULL) { + fopAcM_cancelCarryNow(ac); + } + pLink->changeOriginalDemo(); + + if(mAnmPrmIdx != 10) { + if(fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)) < 3.0f) { + setAnm(10, false); + } else { + cLib_addCalcPosXZ2(&field_0x630, current.pos, 0.3f, 10.0f); + pLink->setPlayerPosAndAngle(&field_0x630, &pLink->current.angle); + } + } else { + if(mpMorf->getFrame() == 25.0f) { + fopAcM_seStart(this, JA_SE_CM_FM_PULL_IN, 0); + } + if(mpMorf->getFrame() == 10.0f) { + fopAcM_seStart(this, JA_SE_CM_FM_GRAB_FOOT, 0); + pLink->voiceStart(28); + } + if(mpMorf->getFrame() == 10.0f) { + pLink->mDemo.setDemoMode(0x11); + } + if(mpMorf->getFrame() >= 10.0f && mpMorf->getFrame() <= 40.0f) { + pLink->setPlayerPosAndAngle(&field_0x61C, &pLink->current.angle); + } + } + if(dComIfGp_evmng_endCheck("DEFAULT_FM_GRAB_FOOT")) { + if(field_0x2C7 != 0xff) { + dLib_setNextStageBySclsNum(field_0x2C7, current.roomNo); + } else { + dComIfGp_setNextStage(dComIfGp_getStartStageName(), 0, current.roomNo, -1, 0.0f, 0); + } + } + } else { + fopAcM_orderOtherEvent2(this,"DEFAULT_FM_GRAB_FOOT", dEvtFlag_NOPARTNER_e); + } + } } /* 000050B4-000050F8 .text modeParalysisInit__6daFm_cFv */ void daFm_c::modeParalysisInit() { - /* Nonmatching */ + setAnm(0xd, true); + field_0x650 = l_HIO.field_0x11C; } /* 000050F8-00005218 .text modeParalysis__6daFm_cFv */ void daFm_c::modeParalysis() { - /* Nonmatching */ + if(field_0x650 == l_HIO.field_0x11C - 0x14) { + enemy_piyo_set(this); + } + if(field_0x650 <= l_HIO.field_0x11C - 0x14 && field_0x650 >= l_HIO.field_0x11C -0x3C) { + fopAcM_seStart(this, JA_SE_CM_MD_PIYO, 0); + } + if(field_0x650 == l_HIO.field_0x11C - 0x3c) { + setAnm(1, false); + field_0x64C = 0x28; + field_0x68C = 0x2b00; + } + if(cLib_calcTimer(&field_0x650) == 0) { + modeProc(PROC_0_e, 7); + } + cancelGrab(); + if (checkTgHit()) { + // comment below is from from d_a_Rd_c::modeParalysis, likely applies here too + // This line setting speedF to itself gets optimized out and produces no code, but affects codegen. + // It's not known what the original code that got optimized out here was, it could be speedF or something else. + speedF = speedF; + } } /* 00005218-0000525C .text modeDamageInit__6daFm_cFv */ void daFm_c::modeDamageInit() { - /* Nonmatching */ + setAnm(7, true); + field_0x650 = l_HIO.field_0x0A6; } /* 0000525C-00005308 .text modeDamage__6daFm_cFv */ void daFm_c::modeDamage() { - /* Nonmatching */ + resetInvKine(); + cancelGrab(); + if(mAnmPrmIdx == 1 && field_0x64C == 0) { + searchTarget(); + if(mpActorTarget != NULL && !isNpc(mpActorTarget)) { + modeProc(PROC_0_e, 7); + } + if(!cLib_calcTimer(&field_0x650)) { + modeProc(PROC_0_e, 7); + } + } + if (checkTgHit()) { + // comment below is from d_a_Rd_c::modeParalysis, likely applies here too + // This line setting speedF to itself gets optimized out and produces no code, but affects codegen. + // It's not known what the original code that got optimized out here was, it could be speedF or something else. + speedF = speedF; + } } /* 00005308-000053E0 .text modeGrabInit__6daFm_cFv */ void daFm_c::modeGrabInit() { - /* Nonmatching */ + if (isLink(mpActorTarget)) { + mSinkTimer = l_HIO.field_0x090; + } else { + mSinkTimer = l_HIO.field_0x09E; + } + field_0x650 = l_HIO.field_0x092; + if (isNpc(mpActorTarget) == true) { + setAnm(0xC, false); + } else { + s16 procName = fopAcM_GetName(mpActorTarget); + if(procName == PROC_BOMB || procName == PROC_TSUBO) { + setAnm(9, false); + } + } + field_0x660 = field_0x690; } /* 000053E0-00005A7C .text modeGrab__6daFm_cFv */ void daFm_c::modeGrab() { - /* Nonmatching */ + f32 dist; + if (!isLink(mpActorTarget) && (field_0x2D0 == 0 || field_0x2D0 == 1) && isNpc(mpActorTarget) == true) { + moveRndEscape(); + } + if (mpActorTarget == NULL) { + modeProcInit(10); + } else { + if(isLink(mpActorTarget)) { + calcInvKine(mpActorTarget); + } else { + resetInvKine(); + } + + if (!checkTgHit()) { + s16 angle; + + if (isLink(mpActorTarget)) { + angle = cLib_targetAngleY(¤t.pos,&mGrabPos); + if (cLib_distanceAngleS(shape_angle.y, angle) > l_HIO.field_0x09A) { + cLib_addCalcAngleS2(&shape_angle.y, angle, 4, l_HIO.field_0x096); + } + + } else { + dist = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + if (field_0x2D0 == 2 && isNpc(mpActorTarget) && dist < l_HIO.field_0x0C4) { + fopAcM_Search(searchNearFm_CB, this); + if (field_0x3E4.absXZ() != 0.0f) { + angle = cLib_targetAngleY(¤t.pos, &field_0x3E4); + } else { + angle = (s16)fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); + } + } else { + angle = (s16)fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); + } + cLib_addCalcAngleS2(&shape_angle.y, angle, 4, 0x800); + } + + if (isLink(mpActorTarget)) { + setGrabPos(); + if (checkPlayerGrabBomb()) { + setAnm(7, false); + modeProcInit(7); + } else { + if (cLib_calcTimer(&mSinkTimer) == 0 && !l_HIO.field_0x00D && !dComIfGp_event_runCheck()) { + modeProcInit(0xE); + field_0x684 = 1; + } else { + // temp.absXZ() matches offsets but cant store mGrabPos - field_0x63C in temp first + // dist = temp.absXZ(); + dist = (mGrabPos - field_0x63C).absXZ(); + if (dist > l_HIO.field_0x110 && dist < l_HIO.field_0x114) { + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + angle = cLib_targetAngleY(&field_0x63C, &mGrabPos); + f32 temp4 = std::fabsf(l_HIO.field_0x114 - l_HIO.field_0x110); + if (temp4 == 0.0f) { + temp4 = 1.0f; + } + f32 temp5 = l_HIO.field_0x118 * (std::fabsf(dist - l_HIO.field_0x110) / temp4); + pLink->setOutPower(temp5, angle, 0); + + } else { + if (!isGrab()) { + setAnm(5, false); + modeProcInit(7); + } + } + if (isGrabFoot()) { + modeProcInit(6); + } + } + } + + } else { + if (isNpc(mpActorTarget) == true) { + mGrabPos = field_0x61C; + if (field_0x2E4 != 0) { + if (!isLinkControl()) { + modeProcInit(0x10); + } + + } else { + dist = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + if (dist < l_HIO.field_0x0B4 && field_0x2D0 == 2) { + angle = cLib_targetAngleY(¤t.pos, &field_0x3E4); + + if (cLib_distanceAngleS(shape_angle.y, angle) < 0x500 && dist < l_HIO.field_0x0C4) { + modeProcInit(9); + return; + } + } + if (cLib_calcTimer(&mSinkTimer) == 0) { + if (!l_HIO.field_0x00D && !dComIfGp_event_runCheck()) { + modeProcInit(0xE); + } + } else if (field_0x2DC == 1) { + modeProcInit(9); + } + + } + } else { + s16 procName = fopAcM_GetName(mpActorTarget); + if (procName == PROC_BOMB || procName == PROC_TSUBO) { + moveRndBack(); + mGrabPos = field_0x61C; + if (!daPy_getPlayerLinkActorClass()->checkPlayerGuard()) { + if (cLib_calcTimer(&field_0x650) == 0 && !l_HIO.field_0x00D) { + modeProcInit(9); + } + } else { + field_0x650 = l_HIO.field_0x092; + } + } + } + } + } + } } /* 00005A7C-00005AD8 .text modeGrabDemoInit__6daFm_cFv */ void daFm_c::modeGrabDemoInit() { - /* Nonmatching */ + setAnm(6, false); + if (isLink(mpActorTarget)) { + field_0x3FC = true; + } + else { + field_0x3FC = false; + } } /* 00005AD8-00005EDC .text modeGrabDemo__6daFm_cFv */ void daFm_c::modeGrabDemo() { - /* Nonmatching */ + resetInvKine(); + + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + pLink->changeOriginalDemo(); + if (mAnmPrmIdx == 6 && mpMorf->getFrame() == 15.0f) { + fopAcM_seStart(this, JA_SE_CM_FM_PULL_IN, 0); + } + if (field_0x3FC) { + fopAc_ac_c* actor = fopAcM_SearchByID(pLink->getGrabActorID()); + if (actor != NULL) { + fopAcM_cancelCarryNow(actor); + } + if (mAnmPrmIdx == 6 && mpMorf->getFrame() == 40.0f) { + pLink->voiceStart(0xC); + } + pLink->changeDemoMode(0x1e); + pLink->changeDemoParam0(1); + cXyz temp(0.0f, 0.0f, 0.0f); + cLib_chasePos(&field_0x610, temp, 5.0f); + + if (dComIfGp_evmng_endCheck("DEFAULT_FM_GRAB")) { + if (field_0x2C7 != 0xff) { + dLib_setNextStageBySclsNum(field_0x2C7, fopAcM_GetRoomNo(this)); + } else { + dComIfGp_setNextStage(dComIfGp_getStartStageName(), 0, current.roomNo); + } + } + } else { + if (mAnmPrmIdx == 6 && mpMorf->getFrame() == 40.0f) { + s16 procName = fopAcM_GetName(mpActorTarget); + if (procName == PROC_NPC_MD) { + fopAcM_monsSeStart(this, JA_SE_CV_MD_DAMAGE, 0); + } else if (procName == PROC_NPC_CB1) { + fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0); + } + } + if (fopAcM_GetName((daNpc_Md_c *)mpActorTarget) == PROC_NPC_MD) { // ghidra shows cast here but unnecessary + ((daNpc_Md_c *)mpActorTarget)->changeCaught02(); + field_0x688 = true; + } + + if (dComIfGp_evmng_endCheck("DEFAULT_FM_SUIKOMI_NPC")) { + if (field_0x2C8 != 0xff) { + cancelGrab(); + if (fopAcM_GetName(mpActorTarget) == PROC_NPC_CB1) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3408); + ((daPy_npc_c *)mpActorTarget)->setPointRestart(field_0x2C8, 1); + } + if (fopAcM_GetName(mpActorTarget) == PROC_NPC_MD) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3404); + ((daPy_npc_c *)mpActorTarget)->setPointRestart(field_0x2C8, 2); + } + } + dComIfGp_event_reset(); + modeProcInit(0x12); + } + } + } else { + if (isLink(mpActorTarget)) { + fopAcM_orderOtherEvent2(this, "DEFAULT_FM_GRAB", dEvtFlag_NOPARTNER_e); + } + else { + if (isNpc(mpActorTarget)) { +#if VERSION > VERSION_JPN + if (field_0x2E4 != 0) { + fopAcM_orderChangeEvent(this, "DEFAULT_FM_SUIKOMI_NPC", 0, 0xFFFF); + } else { + fopAcM_orderOtherEvent2(this, "DEFAULT_FM_SUIKOMI_NPC", dEvtFlag_NOPARTNER_e); + } +#else + fopAcM_orderOtherEvent2(this, "DEFAULT_FM_SUIKOMI_NPC", dEvtFlag_NOPARTNER_e); +#endif + } + } + } } /* 00005EDC-00005F04 .text modeDeathInit__6daFm_cFv */ void daFm_c::modeDeathInit() { - /* Nonmatching */ + setAnm(3, false); } /* 00005F04-00005FA4 .text modeDeath__6daFm_cFv */ void daFm_c::modeDeath() { - /* Nonmatching */ + resetInvKine(); + cancelGrab(); + if(mAnmPrmIdx == 8 && setHoleScale(l_HIO.field_0x120, 0.1f, l_HIO.field_0x128) != 0) { + fopAcM_onActor(this); + fopAcM_createDisappear(this, ¤t.pos, 5, daDisItem_IBALL_e); + fopAcM_delete(this); + } } /* 00005FA4-00005FF0 .text modePrepareItemInit__6daFm_cFv */ void daFm_c::modePrepareItemInit() { - /* Nonmatching */ + setAnm(3, false); + field_0x650 = l_HIO.field_0x092; + cancelGrab(); } /* 00005FF0-000061A4 .text modePrepareItem__6daFm_cFv */ void daFm_c::modePrepareItem() { - /* Nonmatching */ + if(!checkTgHit()) { + s8 temp = mAnmPrmIdx; + if(temp == 3) { + if(mpMorf->isStop()) { + u32 skullPrm = daTsubo::Act_c::prm_make_skull(); + mProcId2 = fopAcM_create(PROC_TSUBO, skullPrm, &field_0x61C, tevStr.mRoomNo); + return; + } + } + if(temp == 8) { + mpActorTarget = fopAcM_SearchByID(mProcId2); + fopAcM_setCarryNow(mpActorTarget, 0); + field_0x684 = 3; + setAnm(2, false); + setGrabPos(); + } else { + if(temp == 2) { + if(mpMorf->isStop()) { + setAnm(9, false); + return; + } + } + + if(temp == 9) { + if(!daPy_getPlayerLinkActorClass()->checkPlayerGuard()) { + if(cLib_calcTimer(&field_0x650) == 0) { + modeProc(PROC_0_e,9); + } + } else { + field_0x650 = l_HIO.field_0x092; + } + } + } + } } /* 000061A4-000061CC .text modeGrabNpcDemoInit__6daFm_cFv */ void daFm_c::modeGrabNpcDemoInit() { - /* Nonmatching */ + setAnm(9, false); } /* 000061CC-0000638C .text modeGrabNpcDemo__6daFm_cFv */ void daFm_c::modeGrabNpcDemo() { - /* Nonmatching */ + resetInvKine(); + mGrabPos = field_0x61C; + if(eventInfo.mCommand == dEvtCmd_INDEMO_e) { + int staffIdx = dComIfGp_evmng_getMyStaffId("Fmaster"); + if(strcmp(dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx), "YAYU") == 0) { + setAnm(12, false); + if(mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(staffIdx); + + } + } else { + dComIfGp_evmng_cutEnd(staffIdx); + } + if(dComIfGp_evmng_endCheck("DEFAULT_FM_NPC_GRAB") != 0) { + if(field_0x2E4 != 0) { + dComIfGp_event_reset(); + modeProc(PROC_0_e, 0xE); + } else { + dComIfGp_event_reset(); + modeProc(PROC_0_e, 0xD); + } + } + } +#if VERSION > VERSION_JPN + else if(field_0x2E4 != 0) { + fopAcM_orderChangeEvent(this,"DEFAULT_FM_NPC_GRAB", 0, 0xffff); + } +#endif + else { + fopAcM_orderOtherEvent2(this, "DEFAULT_FM_NPC_GRAB", dEvtFlag_NOPARTNER_e); + } } /* 0000638C-000063C4 .text modePlayerStartDemoInit__6daFm_cFv */ void daFm_c::modePlayerStartDemoInit() { - /* Nonmatching */ + field_0x3E0 = l_HIO.field_0x120; + current.pos = dComIfGp_getPlayer(0)->current.pos; } /* 000063C4-000066A0 .text modePlayerStartDemo__6daFm_cFv */ void daFm_c::modePlayerStartDemo() { - /* Nonmatching */ + resetInvKine(); + if(dComIfGp_event_runCheck()) { + int staffIdx = dComIfGp_evmng_getMyStaffId("Fmaster"); + char* cutName = dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx); + + daPy_py_c* pLink = (daPy_py_c*)dComIfGp_getLinkPlayer(); + + + pLink->changeOriginalDemo(); + + if(strcmp(cutName, "Dummy") == 0 || strcmp(cutName, "WAIT") == 0) { + cXyz pos = current.pos; + pos.y -= REG12_F(2); + pLink->setPlayerPosAndAngle(&pos, &pLink->shape_angle); + pLink->onPlayerNoDraw(); + dComIfGp_evmng_cutEnd(staffIdx); + + } else if(strcmp(cutName, "OPEN") == 0) { + cXyz pos2 = current.pos; + pos2.y -= REG12_F(2); + pLink->setPlayerPosAndAngle(&pos2, &pLink->shape_angle); + pLink->onPlayerNoDraw(); + if(setHoleScale(l_HIO.field_0x124, 0.1f, l_HIO.field_0x128)) { + dComIfGp_evmng_cutEnd(staffIdx); + } + + } else if(strcmp(cutName, "PL_OUT") == 0) { + pLink->offPlayerNoDraw(); + pLink->setThrowDamage( + NULL, + pLink->shape_angle.y, + REG12_F(0) + 10.0f, + REG12_F(1) + 50.0f, + 0 + ); + dComIfGp_evmng_cutEnd(staffIdx); + + } else if(strcmp(cutName, "CLOSE") == 0) { + pLink->offPlayerNoDraw(); + if(setHoleScale(l_HIO.field_0x120, 0.1f, l_HIO.field_0x128)) { + dComIfGp_evmng_cutEnd(staffIdx); + } + + } else if(strcmp(cutName, "DELETE") == 0) { + modeProc(PROC_0_e, 0x12); + } + } } /* 000066A0-000066A4 .text modeDeleteInit__6daFm_cFv */ void daFm_c::modeDeleteInit() { - /* Nonmatching */ + } /* 000066A4-00006744 .text modeDelete__6daFm_cFv */ void daFm_c::modeDelete() { - /* Nonmatching */ + resetInvKine(); + bool temp = false; + if(isHoleAppear()) { + if(setHoleScale(l_HIO.field_0x120, 0.1f, l_HIO.field_0x128)) { + temp = true; + } else { + temp = false; + } + } + if(!dComIfGp_event_runCheck() && temp == true) { + fopAcM_delete(this); + } } /* 00006744-000067A0 .text modeBikubikuInit__6daFm_cFv */ void daFm_c::modeBikubikuInit() { - /* Nonmatching */ + field_0x650 = l_HIO.field_0x068; + mSinkTimer = 5; + setAnm(0xe,true); + field_0x650 = l_HIO.field_0x068; } /* 000067A0-000068D0 .text modeBikubiku__6daFm_cFv */ void daFm_c::modeBikubiku() { - /* Nonmatching */ + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + mGrabPos = pLink->current.pos; + if(mAnmPrmIdx == 1) { + resetInvKine(); + } else if(mAnmPrmIdx != 0xe) { + calcInvKine(pLink); + } else { + if(cLib_calcTimer(&mSinkTimer)!= 0) { + calcInvKine(pLink); + } + } + + if(mAnmPrmIdx == 0xe) { + if(cLib_calcTimer(&field_0x650) == 0) { + if(health <= 0) { + modeProc(PROC_0_e, 0xC); + return; + } else { + setAnm(1, true); + field_0x64C = REG12_S(3) + 0x28; + field_0x68C = 0x2b00; + } + } + } else if(mAnmPrmIdx == 1 && field_0x64C == 0) { + modeProc(PROC_0_e,7); + } } /* 000068D0-00006D8C .text modeProc__6daFm_cFQ26daFm_c6Proc_ei */ -void daFm_c::modeProc(daFm_c::Proc_e, int) { - /* Nonmatching */ +void daFm_c::modeProc(daFm_c::Proc_e proc, int newMode) { + + struct ModeEntry { + ModeFunc init; + ModeFunc run; + const char* name; + }; + + static ModeEntry mode_tbl[] = { + { + &daFm_c::modeSwWaitInit, + &daFm_c::modeSwWait, + "SW_WAIT", + }, + { + &daFm_c::modeHideInit, + &daFm_c::modeHide, + "HIDE" + }, + { + &daFm_c::modeUnderFootInit, + &daFm_c::modeUnderFoot, + "UNDERFOOT" + }, + { + &daFm_c::modePathMoveInit, + &daFm_c::modePathMove, + "PATH_MOVE" + }, + { + &daFm_c::modeGoalKeeperInit, + &daFm_c::modeGoalKeeper, + "GOAL_KEEPER" + }, + { + &daFm_c::modeAppearInit, + &daFm_c::modeAppear, + "APPEAR" + }, + { + &daFm_c::modeDisappearInit, + &daFm_c::modeDisappear, + "DISAPPEAR" + }, + { + &daFm_c::modeWaitInit, + &daFm_c::modeWait, + "WAIT" + }, + { + &daFm_c::modeAttackInit, + &daFm_c::modeAttack, + "ATTACK" + }, + { + &daFm_c::modeThrowInit, + &daFm_c::modeThrow, + "THROW" + }, + { + &daFm_c::modeDamageInit, + &daFm_c::modeDamage, + "DAMAGE" + }, + { + &daFm_c::modePrepareItemInit, + &daFm_c::modePrepareItem, + "PREPARE_ITEM" + }, + { + &daFm_c::modeDeathInit, + &daFm_c::modeDeath, + "DEATH" + }, + { + &daFm_c::modeGrabInit, + &daFm_c::modeGrab, + "GRAB" + }, + { + &daFm_c::modeGrabDemoInit, + &daFm_c::modeGrabDemo, + "GRAB_DEMO" + }, + { + &daFm_c::modeGrabFootDemoInit, + &daFm_c::modeGrabFootDemo, + "GRAB_FOOT_DEMO" + }, + { + &daFm_c::modeGrabNpcDemoInit, + &daFm_c::modeGrabNpcDemo, + "GRAB_NPC_DEMO" + }, + { + &daFm_c::modePlayerStartDemoInit, + &daFm_c::modePlayerStartDemo, + "PLAYER_START_DEMO" + }, + { + &daFm_c::modeDeleteInit, + &daFm_c::modeDelete, + "DELETE" + }, + { + &daFm_c::modeParalysisInit, + &daFm_c::modeParalysis, + "PARALYSIS" + }, + { + &daFm_c::modeBikubikuInit, + &daFm_c::modeBikubiku, + "BIKUBIKU" + } + }; + + if(proc == PROC_0_e) { + switch(newMode) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + case 0xB: + case 0xC: + case 0xE: + case 0xF: + case 0x10: + case 0x11: + case 0x12: + attention_info.flags &= ~fopAc_Attn_LOCKON_BATTLE_e; + break; + default: + attention_info.flags |= fopAc_Attn_LOCKON_BATTLE_e; + break; + } + mMode = newMode; + (this->*mode_tbl[mMode].init)(); + } else if(proc == PROC_1_e) { + (this->*mode_tbl[mMode].run)(); + } } /* 00006D8C-00006DE8 .text setAnm__6daFm_cFScb */ -void daFm_c::setAnm(signed char, bool) { - /* Nonmatching */ +void daFm_c::setAnm(s8 anmPrmIdx, bool param_2) { + static const int a_anm_bcks_tbl[] = { + FM_BCK_WAIT, + FM_BCK_DERU, + FM_BCK_MODORU, + FM_BCK_TUKAMU, + FM_BCK_TUKAMU2WAIT, + FM_BCK_HIKIKOMU, + FM_BCK_DAMAGE, + FM_BCK_TUMAMIWAIT, + FM_BCK_ASITUKAMI, + FM_BCK_NAGERU, + FM_BCK_YAYU, + FM_BCK_MAHI, + FM_BCK_KUSIZASI + }; + + static const dLib_anm_prm_c a_anm_prm_tbl[] = { + { + /* mAnmIdx */ -1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 0, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mAnmIdx */ 1, + /* mNextPrmIdx */ 1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 2, + /* mNextPrmIdx */ 8, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 3, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 4, + /* mNextPrmIdx */ 1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 5, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 6, + /* mNextPrmIdx */ 1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 0.0f, + /* mPlaySpeed */ 0.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 7, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mAnmIdx */ 8, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 9, + /* mNextPrmIdx */ 1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 10, + /* mNextPrmIdx */ 9, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 11, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mAnmIdx */ 12, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + }; + if(anmPrmIdx != 0xF) { + mAnmPrmIdx = anmPrmIdx; + } + + dLib_bcks_setAnm(m_arc_name, mpMorf, &mBckIdx, &mAnmPrmIdx, &mOldAnmPrmIdx, a_anm_bcks_tbl, a_anm_prm_tbl, param_2); } /* 00006DE8-00006EA4 .text cancelGrab__6daFm_cFv */ void daFm_c::cancelGrab() { - /* Nonmatching */ + if(mpActorTarget != NULL) { + if(field_0x684 != 0 && fopAcM_CheckStatus(mpActorTarget, fopAcStts_CARRY_e) && !checkPlayerGrabTarget()) { + mpActorTarget->gravity = 0.0f; + mpActorTarget->speedF = 0.0f; + mpActorTarget->speed.x = 0.0f; + mpActorTarget->speed.y = 0.0f; + mpActorTarget->speed.z = 0.0f; + mpActorTarget->current.angle.x = 0; + mpActorTarget->current.angle.z = 0; + mpActorTarget->shape_angle.x = 0; + mpActorTarget->shape_angle.z = 0; + fopAcM_cancelCarryNow(mpActorTarget); + } + field_0x684 = 0; + } } /* 00006EA4-0000702C .text calcInvKine__6daFm_cFP10fopAc_ac_c */ -void daFm_c::calcInvKine(fopAc_ac_c*) { - /* Nonmatching */ +void daFm_c::calcInvKine(fopAc_ac_c* i_this) { + if (isBodyAppear() && i_this != NULL) { + if (!(fopAcM_searchActorDistanceXZ(this, i_this) <= l_HIO.field_0x0DC)) { + for(int i = 5; i >= 0; i--) { + field_0x390 = i; + cXyz temp(field_0x2E8[i]); + if(l_HIO.field_0x00F[field_0x390] == 1) { + cXyz diff = mGrabPos - temp; + cXyz diff2 = field_0x61C - temp; + Quaternion quat; + + daObj::quat_rotVec(&quat, diff2, diff); + mDoMtx_quatSlerp(&field_0x330[i], &quat, &field_0x330[i], 0.75f - REG12_F(0x19)); + } + mpMorf->calc(); + } + } + } } /* 0000702C-000070F4 .text resetInvKine__6daFm_cFv */ void daFm_c::resetInvKine() { - /* Nonmatching */ + if (isBodyAppear()) { + field_0x390 = 0; + for(int i = 0; i < 6; i++) { + mDoMtx_quatSlerp(&field_0x330[i], &ZeroQuat, &field_0x330[i], 0.05000000074505806f); + } + mpMorf->calc(); + } } /* 000070F4-000071E0 .text grabBomb__6daFm_cFv */ void daFm_c::grabBomb() { - /* Nonmatching */ -} - + if (fopAcM_GetName(mpActorTarget) == PROC_BOMB) { + cXyz temp_pos(5.0f, -10.0f, 5.0f); + cXyz pos = l_HIO.field_0x038 + temp_pos; + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(5)); + mDoMtx_stack_c::multVec(&pos, &mpActorTarget->current.pos); + mpActorTarget->gravity = 0.0f; + mpActorTarget->speedF = 0.0f; + mpActorTarget->speed.x = 0.0f; + mpActorTarget->speed.y = 0.0f; + mpActorTarget->speed.z = 0.0f; + } +} + /* 000071E0-0000743C .text grabTsubo__6daFm_cFv */ void daFm_c::grabTsubo() { - /* Nonmatching */ + if(fopAcM_GetName(mpActorTarget) == PROC_TSUBO) { + daTsubo::Act_c* tsubo = (daTsubo::Act_c*)mpActorTarget; + + cXyz pos(0.0f, 0.0f, 0.0f); + csXyz angle(0, 0, 0); + switch(tsubo->prm_get_type()) { + case 0: + pos.set(25.0f, -25.0f, 0.0f); + angle.set(0, 0, 5000); + break; + case 1: + case 2: + pos.set(55.0f, -55.0f, 0.0f); + angle.set(0, 0, 5000); + break; + case 4: + pos.set(50.0f, -45.0f, 0.0f); + angle.set(0, 0, 7000); + break; + case 5: + pos.set(0.0f, -15.0f, 0.0f); + angle.set(0, 16000, 0); + break; + case 6: + pos.set(40.0f, -20.0f, 0.0f); + angle.set(0, 0, 7000); + break; + } + + cXyz pos2 = l_HIO.field_0x038 + pos; + + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(5)); + mDoMtx_stack_c::transM(pos2); + mDoMtx_stack_c::ZXYrotM(angle); + MTXCopy(mDoMtx_stack_c::get(), field_0x6BC); + + mDoMtx_stack_c::multVecZero(&mpActorTarget->current.pos); + MtxToRot(mDoMtx_stack_c::get(), &mpActorTarget->shape_angle); + + tsubo->tevStr.mEnvrIdxOverride = tevStr.mEnvrIdxOverride; + } } /* 0000743C-00007680 .text grabPlayer__6daFm_cFv */ void daFm_c::grabPlayer() { - /* Nonmatching */ + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + cXyz offset(pLink->getHeadTopPos() - pLink->current.pos); + cXyz temp; + cXyz temp2; + temp.setall(0.0f); + csXyz angle(0, 0, 0); + switch (mAnmPrmIdx) { + case 4: + case 6: + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + cXyz offset2 = pLink->getHeadTopPos() - pLink->current.pos; + temp.set(5.0f, 0.0f, 10.0f); + angle.set(-3000, 0, 7000); + temp2 = l_HIO.field_0x038 + temp; + temp2.y -= offset2.abs(); + + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(5)); + mDoMtx_stack_c::ZXYrotM(angle.x, angle.y, angle.z); + mDoMtx_stack_c::transM(temp2); + MTXCopy(mDoMtx_stack_c::get(), field_0x6BC); + pLink->setPlayerPosAndAngle(mDoMtx_stack_c::get()); + + case 5: + default: + break; + } } /* 00007680-00007828 .text grabNPC__6daFm_cFv */ void daFm_c::grabNPC() { - /* Nonmatching */ + if(isNpc(mpActorTarget) == true) { + cXyz temp(0.0f, 0.0f, 0.0f); + csXyz angle(0, 0, 0); + if(fopAcM_GetName(mpActorTarget) == PROC_NPC_CB1) { + temp.set(-15.0f, -10.0f, 8.0f); + angle.x = 0; + angle.y = 16000; + angle.z = -4000; + } + + if(fopAcM_GetName(mpActorTarget) == PROC_NPC_MD) { + temp.set(10.0f, 0.0f, 5.0f); + angle.x = 4000; + angle.y = 18000; + angle.z = -4000; + } + cXyz temp2 = l_HIO.field_0x038 + temp; + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(5)); + mDoMtx_stack_c::transM(temp2); + mDoMtx_stack_c::ZXYrotM(angle.x, angle.y, angle.z); + MTXCopy(mDoMtx_stack_c::get(), field_0x6BC); + mDoMtx_stack_c::multVecZero(&mpActorTarget->current.pos); + MtxToRot(mDoMtx_stack_c::get(), &mpActorTarget->shape_angle); + } } /* 00007828-00007A4C .text searchTarget__6daFm_cFv */ void daFm_c::searchTarget() { - /* Nonmatching */ + if(!dComIfGp_event_runCheck() || field_0x2E4 != 0) { + fopAc_ac_c* actor = mpActorTarget = (fopAc_ac_c*)fopAcM_Search(searchNearOtherActor_CB, this); + if(mpActorTarget == NULL) { + actor = fopAcM_SearchByName(PROC_NPC_CB1); + if(actor == NULL) { + actor = fopAcM_SearchByName(PROC_NPC_MD); + } + + if(actor != NULL) { + if(fopAcM_searchActorDistanceXZ(this, actor) < l_HIO.field_0x0E4 || checkHeight(actor)) { + if(field_0x2DC == 1) { + if(fopAcM_checkCarryNow(actor)) { + mpActorTarget = actor; + } + } else { + mpActorTarget = actor; + } + } + } + } + + if(mpActorTarget == NULL && field_0x2DC != 2) { + fopAc_ac_c* link_actor = dComIfGp_getLinkPlayer(); + daPy_lk_c* link_player = (daPy_lk_c*)link_actor; + if(dComIfGp_getLinkPlayer() != NULL && !dComIfGp_checkPlayerStatus0(0, daPyStts0_HOOKSHOT_AIM_e | daPyStts0_UNK100_e)) { + if(!checkPlayerGrabBomb()) { + if(!checkPlayerGrabNpc() && !isLinkControl()) { + if(!((daPy_lk_c*)dComIfGp_getLinkPlayer())->checkCarryActionNow() && link_player->getGrabActorID() == -1) { + if(fopAcM_searchActorDistanceXZ(this, link_actor) < l_HIO.field_0x0E4 || checkHeight(mpActorTarget)) { + mpActorTarget = link_actor; + } + } + } + } + } + } + + actor = mpActorTarget; + if(actor != NULL) { + mProcId = fopAcM_GetID(actor); + } + } } /* 00007A4C-00007C18 .text setBaseTarget__6daFm_cFv */ void daFm_c::setBaseTarget() { - /* Nonmatching */ + daPy_lk_c* pLink; + fopAc_ac_c* pMdActor; + switch(field_0x2DC) { + case 0: + fopAcM_SearchByName(PROC_NPC_CB1); + pMdActor = fopAcM_SearchByName(PROC_NPC_MD); + pLink = daPy_getPlayerLinkActorClass(); + + if (field_0x2D0 == 1 || field_0x2D0 == 2) { + if (pMdActor == NULL) { + mBaseTarget = pLink; + } else { + f32 dist = fopAcM_searchActorDistanceXZ(this, pLink); + f32 dist2 = fopAcM_searchActorDistanceXZ(this, pMdActor); + if (dist2 < l_HIO.field_0x0E8) { + mBaseTarget = pMdActor; + } else { + if (dist < l_HIO.field_0x0E8) { + mBaseTarget = pLink; + } + } + } + } else if (pMdActor != NULL) { + mBaseTarget = pMdActor; + } else { + mBaseTarget = pLink; + } + break; + case 1: + mBaseTarget = daPy_getPlayerLinkActorClass(); + break; + case 2: + fopAc_ac_c* actor = fopAcM_SearchByName(PROC_NPC_CB1); + + if(actor != NULL) { + mBaseTarget = actor; + } else { + actor = fopAcM_SearchByName(PROC_NPC_MD); + if(actor != NULL) { + mBaseTarget = actor; + } + } + break; + } + + if (mBaseTarget == NULL) { + field_0x9D0 = 0; + field_0x9D4 = 0.0f; + } else { + field_0x9D0 = fopAcM_searchActorAngleY(this, mBaseTarget); + field_0x9D4 = fopAcM_searchActorDistanceXZ(this, mBaseTarget); + } } /* 00007C18-00007C4C .text turnToBaseTarget__6daFm_cFv */ void daFm_c::turnToBaseTarget() { - /* Nonmatching */ + cLib_addCalcAngleS2(&shape_angle.y, field_0x9D0, 4, 0x800); } /* 00007C4C-00007C7C .text isNpc__6daFm_cFP10fopAc_ac_c */ -void daFm_c::isNpc(fopAc_ac_c*) { - /* Nonmatching */ +bool daFm_c::isNpc(fopAc_ac_c* i_actor) { + if(i_actor == NULL) { + return false; + } + return fopAcM_GetName(i_actor) == PROC_NPC_CB1 || fopAcM_GetName(i_actor) == PROC_NPC_MD; } /* 00007C7C-00007CD0 .text checkHeight__6daFm_cFP10fopAc_ac_c */ -void daFm_c::checkHeight(fopAc_ac_c*) { - /* Nonmatching */ +bool daFm_c::checkHeight(fopAc_ac_c* i_actor) { + if (i_actor == NULL) { + return false; + } + return !(std::fabsf(i_actor->current.pos.y - current.pos.y) > l_HIO.field_0x0A8 / 2.0f); } + /* 00007CD0-00007CEC .text isLink__6daFm_cFP10fopAc_ac_c */ -void daFm_c::isLink(fopAc_ac_c*) { - /* Nonmatching */ +bool daFm_c::isLink(fopAc_ac_c* i_actor) { + return i_actor == dComIfGp_getLinkPlayer(); } /* 00007CEC-00007D0C .text isLinkControl__6daFm_cFv */ -void daFm_c::isLinkControl() { - /* Nonmatching */ +bool daFm_c::isLinkControl() { + return dComIfGp_getPlayer(0) != dComIfGp_getLinkPlayer(); } /* 00007D0C-00007F5C .text areaCheck__6daFm_cFv */ -void daFm_c::areaCheck() { - /* Nonmatching */ +bool daFm_c::areaCheck() { + bool ret = true; + for(int i = 0; i < 12; i++) { +#if VERSION == VERSION_DEMO + s16 angle = 0x1555; + angle = angle *i; +#endif + cXyz temp(l_HIO.field_0x0E0, -30.0f, 0.0f); + mDoMtx_stack_c::transS(current.pos); + +#if VERSION == VERSION_DEMO + mDoMtx_stack_c::YrotM(angle); +#else + mDoMtx_stack_c::YrotM(i * 0x1555); +#endif + mDoMtx_stack_c::transM(temp); + + mDoMtx_stack_c::multVecZero(&field_0xA48[i]); + + cXyz temp2 = field_0xA48[i]; + temp2.y += 60.0f; + + if(field_0x2D0 == 0 || field_0x2D0 == 1) { + if((field_0xA48[i] - field_0x69C).absXZ() > field_0x2E0) { + field_0xAD8[i] = false; + ret = false; + } else { + field_0xAD8[i] = true; + } + } + + if(field_0xAD8[i] == true || field_0x2D0 == 2) { + if(!lineCheck(&temp2, &field_0xA48[i])) { + field_0xAD8[i] = false; + ret = false; + + } else { + field_0xAD8[i] = true; + } + } + } + return ret; } /* 00007F5C-00007FDC .text lineCheck__6daFm_cFP4cXyzP4cXyz */ -void daFm_c::lineCheck(cXyz*, cXyz*) { - /* Nonmatching */ +bool daFm_c::lineCheck(cXyz* param_1, cXyz* param_2) { + mLinChk.Set(param_1, param_2, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + *param_2 = mLinChk.mLin.GetEnd(); + return true; + } + return false; } /* 00007FDC-00008044 .text setRnd__6daFm_cFii */ -void daFm_c::setRnd(int, int) { - /* Nonmatching */ +int daFm_c::setRnd(int param_1, int param_2) { + f32 rnd = cM_rndF(std::fabsf((f32)(param_2 - param_1))); + return param_1 + (int)rnd; } /* 00008044-00008114 .text setHoleEffect__6daFm_cFv */ void daFm_c::setHoleEffect() { - /* Nonmatching */ + if(mpFollowEcallBack.getEmitter() == NULL) { + dComIfGp_particle_setShipTail(dPa_name::ID_SCENE_809E, ¤t.pos, NULL, NULL, 0xFF, &mpFollowEcallBack, fopAcM_GetRoomNo(this)); + } + JPABaseEmitter* emitter = mpFollowEcallBack.getEmitter(); + + if(emitter != NULL) { + Vec scale = {field_0x3E0, field_0x3E0, field_0x3E0}; + emitter->setGlobalScale(scale); + } } /* 00008114-000081E0 .text holeExecute__6daFm_cFv */ void daFm_c::holeExecute() { - /* Nonmatching */ + if(isHoleAppear()) { + mBtkAnm.play(); + fopAcM_seStart(this, JA_SE_CM_FM_SPOT, 0); + fopAcM_SetStatusMap(this, 0x20); + setHoleEffect(); + } else { + fopAcM_ClearStatusMap(this); + mpFollowEcallBack.end(); + } } /* 000081E0-00008258 .text setHoleScale__6daFm_cFfff */ -void daFm_c::setHoleScale(float, float, float) { - /* Nonmatching */ +bool daFm_c::setHoleScale(f32 param_1, f32 param_2, f32 param_3) { + cLib_addCalc2(&field_0x3E0, param_1, param_2, param_3); + return std::fabsf(field_0x3E0 - param_1) <= param_3; } /* 00008258-00008564 .text _execute__6daFm_cFv */ bool daFm_c::_execute() { - /* Nonmatching */ + holeExecute(); + fopAcM_SearchByID(mProcId, &mpActorTarget); + daBomb_c* bomb = (daBomb_c*)mpActorTarget; + if(bomb != NULL && fopAcM_GetName(bomb) == PROC_BOMB && bomb->chk_state(daBomb_c::STATE_0)) { + mpActorTarget = NULL; + mProcId = 0; + modeProcInit(7); + } + + if(enemy_ice(&mEnemyIce)) { + iceProc(); + return true; + } + + setBaseTarget(); + if(mBaseTarget == NULL) { + bodySetMtx(); + holeSetMtx(); + mpMorf->calc(); + return true; + } else { + field_0xAE4 = areaCheck(); + field_0xAE5 = 0; + + cXyz temp = current.pos; + temp.y += 100.0f; + + cXyz temp2 = mBaseTarget->current.pos; + temp2.y += 100.0f; + + if (field_0x9D4 < l_HIO.field_0x0E8 && lineCheck(&temp, &temp2) == true) { + field_0xAE5 = 1; + } + if (field_0x2E4 != 0) { + field_0xAE5 = 0; + } + + if (mpActorTarget != NULL) { + if (mMode == 8 && mAnmPrmIdx == 4 && isLink(mpActorTarget)) { + spAttackVJump(); + } else if (mAnmPrmIdx == 0xB || mAnmPrmIdx == 0xC) { + spAttackJump(); + } else { + spAttackNone(); + } + } + modeProc(PROC_1_e, 0x15); + setAnm(0xF, false); + mpMorf->play(¤t.pos, 0, 0); + mpMorf->calc(); + + if (field_0x684 != 0) { + + if (!fopAcM_SearchByID(mProcId, &mpActorTarget)) { + field_0x684 = 0; + } + + switch(field_0x684) { + case 1: + grabPlayer(); + break; + case 4: + grabNPC(); + break; + case 2: + grabBomb(); + break; + case 3: + grabTsubo(); + break; + + } + } + field_0x660.y = current.pos.y; + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mObjAcch.CrrPos(*dComIfG_Bgsp()); + + bodySetMtx(); + holeSetMtx(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + setAttention(); + setCollision(); + } + return true; } /* 00008564-000085A4 .text MtxToRot__6daFm_cFPA4_fP5csXyz */ -void daFm_c::MtxToRot(Mtx, csXyz*) { - /* Nonmatching */ +void daFm_c::MtxToRot(Mtx i_mtx, csXyz* angle) { + Mtx mtx; + mDoMtx_inverseTranspose(i_mtx, mtx); + mDoMtx_MtxToRot(mtx, angle); } + + /* 000085A4-000089A4 .text debugDraw__6daFm_cFv */ void daFm_c::debugDraw() { - /* Nonmatching */ + static const u32 dummy[] = { // to match rodata + 0x0000FF80, + 0x00FF0080, + }; + + static const GXColor color_ok = {0x00, 0xFF, 0x00, 0x80}; + static const GXColor color_ng = {0xFF, 0x00, 0x00, 0x80}; + + static const u32 dummy2[] = { // to match rodata + 0x0000FF80, + 0x0000FF80, + 0xFF000080, + 0x00FF0080, + 0xFF00FF80, + 0x00FFFF80, + 0xFF00FF80, + 0x0000FF80, + 0x00FF0080, + 0xFF000080, + 0xFFFF0080, + 0xFF000080, + 0xFF000080, + 0x00FF0080, + 0x00FF0080, + 0xFF000080, + 0xFF000080, + 0x00FF0080, + 0x00FF0080, + 0x00FF0080, + 0x0000FF80, + 0xFF000080, + 0x00FF0080, + 0x00FF0080, + 0xFF000080, + 0x00FF0080, + }; + + Mtx mtx; + cXyz temp; + cXyz temp2; + cXyz temp3; + cXyz temp4; + cXyz temp5; + cXyz temp6; + cXyz temp7; + cXyz temp8; + u32 temp9; + s16 temp10; + int temp11; + cXyz temp12; + cXyz temp13; + cXyz temp14; + cXyz temp15; + f32 temp16; + f32 local_90; + cXyz temp17; + + if (l_HIO.field_0x00C) { + for (int i = 0; i != 12; i++) { + temp = field_0xA48[i]; + temp.y += 60.0f; + } + + if (field_0x9D4 < l_HIO.field_0x0E8 && mBaseTarget != NULL) { + temp2 = current.pos; + temp2.y += 100.0f; + + temp3 = mBaseTarget->current.pos; + temp3.y += 100.0f; + } + temp4 = field_0x69C; + temp4.y += 20.0f; + } + if (l_HIO.field_0x00A) { + temp5 = current.pos; + temp6 = field_0x690; + temp5.y += 20.0f; + + temp6.y += 20.0f; + + } + if (l_HIO.field_0x009) { + + f32 curPosX = current.pos.x; + temp7.x = curPosX; + f32 curPosY = current.pos.y; + temp7.y = curPosY; + f32 curPosZ = current.pos.z; + temp7.z = curPosZ; + temp8 = field_0x690; + temp7.y += 20.0f; + temp8.y += 20.0f; + local_90 = curPosX; + + temp9 = l_HIO.field_0x098; + if (temp9 - 0x70000 != 0xFFFF || l_HIO.field_0x098 != 0) { + temp10 = shape_angle.y; + + int temp19 = shape_angle.y + temp9; + temp12.set(curPosX, curPosY, curPosZ); + temp12.z = curPosZ + l_HIO.field_0x0C4 * cM_scos(temp19); + temp12.x = curPosX + l_HIO.field_0x0C4 * cM_ssin(temp19); + temp13.x = local_90; + + temp13.y = curPosY; + temp13.z = curPosZ; + temp13.z = curPosZ + l_HIO.field_0x0C4 * cM_scos(temp10 - temp9); + temp13.x = local_90 + l_HIO.field_0x0C4 * cM_ssin(temp10 - temp9); + } + + temp9 = l_HIO.field_0x09A; + if (temp9 - 0x70000 != 0xFFFF || l_HIO.field_0x09A != 0) { + temp10 = shape_angle.y; + int temp16 = shape_angle.y + temp9; + temp14.set(curPosX, curPosY, curPosZ); + temp14.z = curPosZ + l_HIO.field_0x0C4 * cM_scos(temp16); + temp14.x = local_90 + l_HIO.field_0x0C4 * cM_ssin(temp16); + temp15.x = local_90; + temp15.y = curPosY; + temp15.z = curPosZ; + + temp15.z = curPosZ + l_HIO.field_0x0C4 * cM_scos(temp10 - temp9); + temp15.x = local_90 + l_HIO.field_0x0C4 * cM_ssin(temp10 - temp9); + } + + temp17.set(curPosX, curPosY, curPosZ); + temp17.y = curPosY + l_HIO.field_0x0A8; + } + + if (l_HIO.field_0x00B) { + for (int i = 6; i != 0; i--) { + } + } + if (l_HIO.field_0x006) { + dLib_debugDrawAxis(field_0x6BC, 100.0f); + } + if (l_HIO.field_0x007) { + MTXCopy(fopAcM_GetModel(this)->getAnmMtx(5), mtx); + dLib_debugDrawAxis(mtx, 100.0f); + } + if (l_HIO.field_0x005) { + daPy_getPlayerLinkActorClass()->getHeadTopPos(); + } } /* 000089A4-00008A14 .text holeDraw__6daFm_cFv */ void daFm_c::holeDraw() { - /* Nonmatching */ + g_env_light.setLightTevColorType(mpModel, &tevStr); + mBtkAnm.entry(mpModel->getModelData()); + mDoExt_modelUpdateDL(mpModel); + mBtkAnm.remove(mpModel->getModelData()); } /* 00008A14-00008A88 .text bodyDraw__6daFm_cFv */ void daFm_c::bodyDraw() { - /* Nonmatching */ + g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr); + if(mEnemyIce.mFreezeTimer > 0x14) { + dMat_control_c::iceEntryDL(mpMorf, -1, &mInvisibleModel); + } else { + mpMorf->entryDL(); + } } /* 00008A88-00008B4C .text _draw__6daFm_cFv */ bool daFm_c::_draw() { - /* Nonmatching */ + debugDraw(); + if(field_0x3E0 > 0.015f) { + holeDraw(); + } + + if(isBodyAppear()) { + bodyDraw(); + dSnap_RegistFig(DSNAP_TYPE_UNKB5, this, field_0x61C, shape_angle.y, 1.0f, 1.0f, 1.0f); + } + return true; } /* 00008B4C-00008C78 .text getArg__6daFm_cFv */ void daFm_c::getArg() { - /* Nonmatching */ + u32 params = fopAcM_GetParam(this); + + s16 homeAngleX = home.angle.x; + s16 homeAngleZ = home.angle.z; + field_0x2C7 = fopAcM_GetParam(this); + field_0x2D0 = fopAcM_GetParamBit(params, 0x8, 2); + field_0x2DC = fopAcM_GetParamBit(params, 0xa, 2); + m_path_no = fopAcM_GetParamBit(params, 0x10, 8); + field_0x2D4 = params >> 0x18; + field_0x2D8 = homeAngleX & 0xff; + field_0x2C8 = fopAcM_GetParamBit(homeAngleX, 0x08, 8); + params = homeAngleZ & 0xff; + + if(params == 0xff) { + field_0x2E0 = 0.0f; + } else { + field_0x2E0 = (f32)params * 100.0f; + } + + if((f32)home.angle.y != 0.0f && field_0x2D4 != 0xff) { + field_0x2E4 = 1; + } + + if(field_0x2D0 == 3) { + field_0x2D0 = 0; + } + + if(field_0x2DC == 3) { + field_0x2DC = 0; + } + + if(field_0x2E0 == 0.0f) { + field_0x2E0 = 3000.0f; + } + + home.angle.z = 0; + current.angle.z = 0; + shape_angle.z = 0; + home.angle.x = 0; + current.angle.x = 0; + shape_angle.x = 0; } /* 00008C78-000090DC .text createInit__6daFm_cFv */ void daFm_c::createInit() { - /* Nonmatching */ + mStts2.Init(200.0f, 0.0f, this); + mSph.Set(m_sph_src); + mSph.SetStts(&mStts2); + mStts.Init(200.0f, 0.0f, this); + mCyl.Set(m_cyl_src); + mCyl.SetStts(&mStts); + mAcchCir.SetWall(30.0f, 200.0f); + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); + + mObjAcch.SetRoofNone(); + if(field_0x2E4 != 0) { + mObjAcch.SetWallNone(); + } + + J3DModelData* modelData = mpMorf->getModel()->getModelData(); + for(u16 i = 0; i < modelData->getJointNum(); i++) { + switch(i) { + case 0: + case 1: + case 2: + case 3: + case 5: + modelData->getJointNodePointer(i)->setCallBack(nodeControl_CB); + break; + + } + } + + for(int i = 0; i < 6; i++) { + field_0x330[i] = ZeroQuat; + } + + bodySetMtx(); + holeSetMtx(); + mpMorf->calc(); + +#if VERSION != VERSION_DEMO + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); +#endif + + if(field_0x2D0 == 0) { + itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Fmaster", 0); + } else if(field_0x2D0 == 1) { + itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Fmastr1", 0); + } else if(field_0x2D0 == 2) { + itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Fmastr2", 0); + } + + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -300.0f, -50.0f, -300.0f, 300.0f, 400.0f, 300.0f); + + if(m_path_no != 0xFF) { + mpPath = dPath_GetRoomPath(m_path_no, current.roomNo); + } + + mEnemyIce.mpActor = this; + mEnemyIce.m00C = 1; + mEnemyIce.mWallRadius = 100.0f; + mEnemyIce.mCylHeight = 200.0f; + + mBtHeight = 240.0f; + mBtBodyR = 100.0f; + attention_info.flags = 0; + stealItemLeft = 3; + max_health = l_HIO.mMaxHealth; + health = max_health; + mGrabPos = current.pos; + + field_0x684 = 0; + mpActorTarget = NULL; + field_0x69C = current.pos; + setBaseTarget(); + field_0x690 = current.pos; + setAnm(8, false); + field_0x394 = cM_rndF(9.0f) + 1.0f; + field_0x610 = l_HIO.field_0x02C; + if(mMode != 0x11) { + if(field_0x2D4 != 0xff && !dComIfGs_isSwitch(field_0x2D4, fopAcM_GetRoomNo(this))) { + modeProc(PROC_0_e, 0); + } else { + switch(field_0x2D0) { + case 0: + modeProc(PROC_0_e, 2); + break; + case 1: + modeProc(PROC_0_e, 3); + JUT_ASSERT(VERSION_SELECT(0x1419, 0x1420, 0x1444, 0x1444), m_path_no != 0xff); + break; + case 2: + modeProc(PROC_0_e, 4); + break; + } + } + } } /* 000090DC-00009258 .text _create__6daFm_cFv */ cPhs_State daFm_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daFm_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, m_arc_name); + if(phase_state == cPhs_COMPLEATE_e) { + if(parentActorID != -1) { + fopAc_ac_c* ac = fopAcM_SearchByID(parentActorID); + + if(ac != NULL && fopAc_IsActor(ac) && isLink(ac)) { + modeProc(PROC_0_e, 0x11); + } + } + + if(mMode != 0x11) { + getArg(); + if(field_0x2D8 != 0xff && dComIfGs_isSwitch(field_0x2D8, fopAcM_GetRoomNo(this))) { + return cPhs_ERROR_e; + } + + if(field_0x2D4 != 0xff && dComIfGs_isSwitch(field_0x2D4, fopAcM_GetRoomNo(this)) && field_0x2E4 != 0) { + return cPhs_ERROR_e; + } + } + + if(!fopAcM_entrySolidHeap(this, createHeap_CB, 0x2100)) { + return cPhs_ERROR_e; + } + createInit(); + } + return phase_state; } /* 0000A094-0000A0FC .text _delete__6daFm_cFv */ bool daFm_c::_delete() { - /* Nonmatching */ + cancelGrab(); + dComIfG_resDelete(&mPhs, m_arc_name); + mpFollowEcallBack.remove(); +#if VERSION != VERSION_DEMO + if(heap != NULL) { + mpMorf->stopZelAnime(); + } +#endif + return TRUE; } /* 0000A0FC-0000A11C .text daFmCreate__FPv */ |
