summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_fm.cpp
diff options
context:
space:
mode:
authorZeclos <Zeclos99@gmail.com>2026-03-12 21:48:04 +0100
committerGitHub <noreply@github.com>2026-03-12 16:48:04 -0400
commitcca42433acc680a36ea58518f1c5c17a87bdb425 (patch)
tree469ccae30e6b95e8a547fbde3fd3c5b15a225625 /src/d/actor/d_a_fm.cpp
parentea7c107eb784bc05c446956ec72b5aaee7b2e21c (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.cpp3164
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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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(&current.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, &current.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, &current.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(&current.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, &current.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, &current.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 */