diff --git a/configure.py b/configure.py index 7f581f2c4..5d114de56 100644 --- a/configure.py +++ b/configure.py @@ -524,7 +524,7 @@ config.libs = [ Object(Matching, "SSystem/SComponent/c_m3d_g_aab.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_cyl.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_pla.cpp"), - Object(NonMatching, "SSystem/SComponent/c_m3d_g_sph.cpp"), + Object(Matching, "SSystem/SComponent/c_m3d_g_sph.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_tri.cpp"), Object(NonMatching, "SSystem/SComponent/c_lib.cpp"), Object(NonMatching, "SSystem/SComponent/c_angle.cpp"), diff --git a/include/SSystem/SComponent/c_m3d.h b/include/SSystem/SComponent/c_m3d.h index 23ad25f58..58bb9f192 100644 --- a/include/SSystem/SComponent/c_m3d.h +++ b/include/SSystem/SComponent/c_m3d.h @@ -58,7 +58,7 @@ int cM3d_Cross_LinSph_CrossPos(const cM3dGSph&, const cM3dGLin&, Vec*, Vec*); bool cM3d_Cross_CylSph(const cM3dGCyl*, const cM3dGSph*, f32*); bool cM3d_Cross_CylSph(const cM3dGCyl*, const cM3dGSph*, Vec*, f32*); bool cM3d_Cross_SphSph(const cM3dGSph*, const cM3dGSph*, f32*); -static bool cM3d_Cross_SphSph(const cM3dGSph*, const cM3dGSph*, f32*, f32*); +bool cM3d_Cross_SphSph(const cM3dGSph*, const cM3dGSph*, f32*, f32*); bool cM3d_Cross_SphSph(const cM3dGSph*, const cM3dGSph*, Vec*); static void cM3d_CalcSphVsTriCrossPoint(const cM3dGSph*, const cM3dGTri*, Vec*); bool cM3d_Cross_SphTri(const cM3dGSph*, const cM3dGTri*, Vec*); diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 6081215e7..4e0de30be 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -66,7 +66,7 @@ class dNpc_EventCut_c { /* 0x18 */ int mTimer; /* 0x1C */ char* mpActorName; /* 0x20 */ u32 field_0x20; - /* 0x24 */ s32 mSetID; + /* 0x24 */ s32 mSetId; /* 0x28 */ cXyz mOffsetPos; /* 0x34 */ cXyz mTargetActorPos; /* 0x40 */ fopAc_ac_c* mpTargetActor; diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 764bfe8aa..d8c9a23f7 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -185,11 +185,11 @@ public: /* 0x0C0 */ int mAcType; /* 0x0C4 */ create_tag_class mAcTg; /* 0x0D8 */ create_tag_class mDwTg; - /* 0x0EC */ profile_method_class* mSubMtd; + /* 0x0EC */ actor_method_class* mSubMtd; /* 0x0F0 */ JKRSolidHeap* mHeap; /* 0x0F4 */ dEvt_info_c mEvtInfo; /* 0x10C */ dKy_tevstr_c mTevStr; - /* 0x1BC */ u16 mSetID; + /* 0x1BC */ u16 mSetId; /* 0x1BE */ u8 mGroup; /* 0x1BF */ s8 mCullType; /* 0x1C0 */ u8 mDemoActorId; diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 85f10094b..e0984a758 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -28,10 +28,10 @@ struct fopAcM_prm_class { /* 0x00 */ u32 mParameter; // single U32 Parameter /* 0x04 */ cXyz mPos; /* 0x10 */ csXyz mAngle; // rotation - /* 0x16 */ u16 mEnemyNo; + /* 0x16 */ u16 mSetId; /* 0x18 */ u8 mScale[3]; - /* 0x1B */ u8 mGbaName; // from WW, maybe a different parameter here - /* 0x1C */ s32 mParentPId; // parent process ID + /* 0x1B */ u8 mGbaName; + /* 0x1C */ s32 mParentPcId; // parent process ID /* 0x20 */ s8 mSubtype; /* 0x21 */ s8 mRoomNo; }; @@ -315,7 +315,7 @@ inline f32 fopAcM_searchActorDistanceY(fopAc_ac_c* actorA, fopAc_ac_c* actorB) { } inline u16 fopAcM_GetSetId(fopAc_ac_c* p_actor) { - return p_actor->mSetID; + return p_actor->mSetId; } inline void dComIfGs_onActor(int bitNo, int roomNo); diff --git a/src/SSystem/SComponent/c_m3d_g_sph.cpp b/src/SSystem/SComponent/c_m3d_g_sph.cpp index cd3bd4ae0..d6845ba71 100644 --- a/src/SSystem/SComponent/c_m3d_g_sph.cpp +++ b/src/SSystem/SComponent/c_m3d_g_sph.cpp @@ -13,18 +13,19 @@ #define CHECK_VEC3_RANGE(line, v) JUT_ASSERT(line, -1.0e32f < v.x && v.x < 1.0e32f && -1.0e32f < v.y && v.y < 1.0e32f && -1.0e32f < v.z && v.z < 1.0e32f) /* 8025238C-80252624 .text SetC__8cM3dGSphFRC4cXyz */ -void cM3dGSph::SetC(const cXyz& pos) { - CHECK_FLOAT_CLASS(21, pos.x); - CHECK_FLOAT_CLASS(22, pos.y); - CHECK_FLOAT_CLASS(23, pos.z); - CHECK_VEC3_RANGE(26, pos); - mCenter = pos; +void cM3dGSph::SetC(const cXyz& p) { + CHECK_FLOAT_CLASS(18, p.x); + CHECK_FLOAT_CLASS(19, p.y); + CHECK_FLOAT_CLASS(20, p.z); + CHECK_VEC3_RANGE(23, p); + mCenter = p; } /* 80252624-80252750 .text SetR__8cM3dGSphFf */ void cM3dGSph::SetR(float r) { CHECK_FLOAT_CLASS(32, r); CHECK_FLOAT_RANGE(33, r); + mRadius = r; } /* 80252750-8025277C .text cross__8cM3dGSphCFPC8cM3dGSphP4cXyz */ diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index beaa58772..3e73bc41e 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -794,10 +794,10 @@ void dNpc_EventCut_c::cutTurnToActorStart() { u32* set = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "SetId"); if(set) { - mSetID = *set; + mSetId = *set; } else { - mSetID = 0; + mSetId = 0; } Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "OffsetPos"); @@ -860,7 +860,7 @@ void dNpc_EventCut_c::cutTurnToActorStart() { } void dNpc_EventCut_c::cutTurnToActorProc() { - if(mSetID != 0) { + if(mSetId != 0) { mTargetActorPos.set(0.0f, 0.0f, 0.0f); fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); } @@ -957,10 +957,10 @@ void dNpc_EventCut_c::cutMoveToActorStart() { } if(set == 0) { - mSetID = 0; + mSetId = 0; } else { - mSetID = *set; + mSetId = *set; } if(speed == 0) { @@ -986,7 +986,7 @@ void dNpc_EventCut_c::cutMoveToActorStart() { } void dNpc_EventCut_c::cutMoveToActorProc() { - if(mSetID != 0) { + if(mSetId != 0) { mTargetActorPos.set(0.0f, 0.0f, 0.0f); fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); } @@ -1037,7 +1037,7 @@ fopAc_ac_c* dNpc_EventCut_c::findActorCallBack(fopAc_ac_c* pActor, void* pData) return 0; } - if(cut->mSetID != 0 && pActor->mSetID == cut->mSetID) { + if(cut->mSetId != 0 && pActor->mSetId == cut->mSetId) { cut->mTargetActorPos = pActor->current.pos; cut->mpTargetActor = pActor; diff --git a/src/f_op/f_op_actor.cpp b/src/f_op/f_op_actor.cpp index 6e5ad7b05..395489105 100644 --- a/src/f_op/f_op_actor.cpp +++ b/src/f_op/f_op_actor.cpp @@ -29,24 +29,26 @@ s32 fopAc_IsActor(void* pProc) { extern void drawActorPointMiniMap(fopAc_ac_c*); /* 80023540-8002362C .text fopAc_Draw__FPv */ -void fopAc_Draw(void* pProc) { - if (dMenu_flag()) - return; - +s32 fopAc_Draw(void* pProc) { fopAc_ac_c * actor = (fopAc_ac_c *)pProc; - if ((dComIfGp_event_moveApproval(pProc) == 2 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && - (!fopAcM_checkStatus(actor, fopAcStts_CULL_e) || fopAcM_cullingCheck(actor)) && - !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e)) { - fopAcM_OffCondition(actor, fopAcCnd_NODRAW_e); - fpcLf_DrawMethod(actor->mpDrawMtd, actor); - } else { - fopAcM_OnCondition(actor, fopAcCnd_NODRAW_e); + s32 ret = TRUE; + + if (!dMenu_flag()) { + if ((dComIfGp_event_moveApproval(actor) == 2 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && + (!fopAcM_checkStatus(actor, fopAcStts_CULL_e) || !fopAcM_cullingCheck(actor)) && !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e)) { + fopAcM_OffCondition(actor, fopAcCnd_NODRAW_e); + ret = fpcLf_DrawMethod((leafdraw_method_class*)actor->mSubMtd, actor); + } else { + fopAcM_OnCondition(actor, fopAcCnd_NODRAW_e); + } + + fopAcM_OffStatus(actor, fopAcStts_NODRAW_e); + + if (dComIfGp_roomControl_getStayNo() >= 0 && fopAcM_checkStatus(actor, fopAcStts_SHOWMAP_e)) + drawActorPointMiniMap(actor); } - fopAcM_OffStatus(actor, fopAcStts_NODRAW_e); - - if (dComIfGp_roomControl_getStayNo() >= 0 && fopAcM_checkStatus(actor, fopAcStts_SHOWMAP_e)) - drawActorPointMiniMap(actor); + return ret; } #define CHECK_FLOAT_CLASS(line, x) JUT_ASSERT(line, !(((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)) ) == 1)); @@ -111,8 +113,57 @@ s32 fopAc_Delete(void* pProc) { } /* 80023CD4-80023F78 .text fopAc_Create__FPv */ -void fopAc_Create(void*) { - /* Nonmatching */ +s32 fopAc_Create(void* pProc) { + fopAc_ac_c* actor = (fopAc_ac_c*)pProc; + + if (fpcM_IsFirstCreating(actor)) { + actor_process_profile_definition* profile = (actor_process_profile_definition*)fpcM_GetProfile(pProc); + actor->mAcType = fpcBs_MakeOfType(&g_fopAc_type); + actor->mSubMtd = profile->mSubMtd; + fopAcTg_Init(&actor->mAcTg, actor); + fopAcTg_ToActorQ(&actor->mAcTg); + fopDwTg_Init(&actor->mDwTg, actor); + actor->mStatus = profile->mStatus; + actor->mGroup = profile->mGroup; + actor->mCullType = profile->mCullType; + + fopAcM_prm_class* prm = fopAcM_GetAppend(actor); + if (prm != NULL) { + fopAcM_SetParam(actor, prm->mParameter); + actor->orig.pos = prm->mPos; + actor->orig.angle = prm->mAngle; + actor->shape_angle = prm->mAngle; + actor->mParentPcId = prm->mParentPcId; + actor->mSubtype = prm->mSubtype; + actor->mCarryType = prm->mGbaName; + actor->mScale.set(prm->mScale[0] * 0.1f, prm->mScale[1] * 0.1f, prm->mScale[2] * 0.1f); + actor->mSetId = prm->mSetId; + actor->orig.roomNo = prm->mRoomNo; + } + + actor->next = actor->orig; + actor->current = actor->orig; + actor->mEyePos = actor->orig.pos; + actor->mMaxFallSpeed = -100.0f; + actor->mAttentionInfo.mDistances[0] = 1; + actor->mAttentionInfo.mDistances[1] = 2; + actor->mAttentionInfo.mDistances[2] = 3; + actor->mAttentionInfo.mDistances[3] = 7; + actor->mAttentionInfo.mDistances[4] = 8; + actor->mAttentionInfo.mDistances[7] = 15; + actor->mAttentionInfo.mDistances[5] = 16; + actor->mAttentionInfo.mDistances[6] = 16; + actor->mAttentionInfo.mPosition = actor->orig.pos; + dKy_tevstr_init(&actor->mTevStr, actor->orig.roomNo, 0xFF); + } + + s32 status = fpcMtd_Create((process_method_class*)actor->mSubMtd, actor); + if (status == cPhs_COMPLEATE_e) { + s32 priority = fpcLf_GetPriority(actor); + fopDwTg_ToDrawQ(&actor->mDwTg, priority); + } + + return status; } actor_method_class g_fopAc_Method = {