diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 7c2ec179..cbfbb8ff 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -10221,13 +10221,13 @@ fn_8018EB80 = .text:0x8018EB80; // type:function size:0x5C fn_8018EBE0 = .text:0x8018EBE0; // type:function size:0x38 fn_8018EC20 = .text:0x8018EC20; // type:function size:0x2C fn_8018EC50 = .text:0x8018EC50; // type:function size:0x538 -fn_8018F190 = .text:0x8018F190; // type:function size:0x60 +kill__12dAcOInsect_cFv = .text:0x8018F190; // type:function size:0x60 checkForLinkScare__12dAcOInsect_cFv = .text:0x8018F1F0; // type:function size:0xAC -fn_8018F2A0 = .text:0x8018F2A0; // type:function size:0xA0 +checkDeath__12dAcOInsect_cFR9dBgS_Acch = .text:0x8018F2A0; // type:function size:0xA0 isLinkUsingBugNet__12dAcOInsect_cFv = .text:0x8018F340; // type:function size:0x4C getLinkSpeedLevel__12dAcOInsect_cFv = .text:0x8018F390; // type:function size:0x50 -isLinkNearby__12dAcOInsect_cFf = .text:0x8018F3E0; // type:function size:0x40 -isLinkNearbyZ__12dAcOInsect_cFf = .text:0x8018F420; // type:function size:0x38 +checkPlayerRadius__12dAcOInsect_cFf = .text:0x8018F3E0; // type:function size:0x40 +checkPlayerElevationDiff__12dAcOInsect_cFf = .text:0x8018F420; // type:function size:0x38 someBaseFunction__12dAcOInsect_cFv = .text:0x8018F460; // type:function size:0xD8 dAcOInsect_0x8C__12dAcOInsect_cFv = .text:0x8018F540; // type:function size:0x8 someBaseFunction0__12dAcOInsect_cFv = .text:0x8018F550; // type:function size:0xD4 @@ -10240,16 +10240,16 @@ dAcOInsect_0x84__12dAcOInsect_cFv = .text:0x8018F7D0; // type:function size:0x8 dAcOInsect_0x88__12dAcOInsect_cFv = .text:0x8018F7E0; // type:function size:0x8 isLinkCloseAndFlag__12dAcOInsect_cFv = .text:0x8018F7F0; // type:function size:0xA8 dAcOInsect_0x94__12dAcOInsect_cFv = .text:0x8018F8A0; // type:function size:0x8 -fn_8018F8B0 = .text:0x8018F8B0; // type:function size:0x14C -fn_8018FA00 = .text:0x8018FA00; // type:function size:0x7C +checkDeath__12dAcOInsect_cFR8cCcD_Obj = .text:0x8018F8B0; // type:function size:0x14C +checkCaught__12dAcOInsect_cFR8cCcD_Obj = .text:0x8018FA00; // type:function size:0x7C resetScale__12dAcOInsect_cFv = .text:0x8018FA80; // type:function size:0x18 fn_8018FAA0__12dAcOInsect_cFv = .text:0x8018FAA0; // type:function size:0x28 -fn_8018FAD0 = .text:0x8018FAD0; // type:function size:0x314 -fn_8018FDF0 = .text:0x8018FDF0; // type:function size:0x2C0 -fn_801900B0 = .text:0x801900B0; // type:function size:0xD0 +fn_8018FAD0__12dAcOInsect_cFv = .text:0x8018FAD0; // type:function size:0x314 +fn_8018FDF0__12dAcOInsect_cFRC7mVec3_c = .text:0x8018FDF0; // type:function size:0x2C0 +fn_801900B0__12dAcOInsect_cFRC7mVec3_cRC7mVec3_c = .text:0x801900B0; // type:function size:0xD0 fn_80190180__12dAcOInsect_cFR4mAng = .text:0x80190180; // type:function size:0x2C0 -fn_80190440 = .text:0x80190440; // type:function size:0x1D0 -fn_80190610 = .text:0x80190610; // type:function size:0x2C +fn_80190440__12dAcOInsect_cFv = .text:0x80190440; // type:function size:0x1D0 +fn_80190160__12dAcOInsect_cFv = .text:0x80190610; // type:function size:0x2C dAcOInsect_0xAC__12dAcOInsect_cFv = .text:0x80190640; // type:function size:0x4 dAcOInsect_0xA8__12dAcOInsect_cFv = .text:0x80190650; // type:function size:0x4 dAcOInsect_0xA4__12dAcOInsect_cFv = .text:0x80190660; // type:function size:0x8 diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 2be88e75..5e085107 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -9,7 +9,6 @@ #include "stddef.h" #include "toBeSorted/tlist.h" - class dAcBase_c; struct SoundSource { @@ -147,6 +146,10 @@ class dAcBase_c : public dBase_c { return diff.x * diff.x + diff.z * diff.z; } + f32 getDistanceTo(const mVec3_c &to) const { + return position.distance(to); + } + bool IsOutOfRange(const mVec3_c &point, f32 radius) { return getSquareDistanceTo(point) > radius; } diff --git a/include/d/a/d_a_insect.h b/include/d/a/d_a_insect.h index e0497c76..54bdb548 100644 --- a/include/d/a/d_a_insect.h +++ b/include/d/a/d_a_insect.h @@ -1,5 +1,8 @@ #include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w_base.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d_g_pla.h" #include "m/m_mtx.h" #include "m/m_vec.h" @@ -36,12 +39,14 @@ class dAcOInsect_c : public dAcObjBase_c { return checkForLinkScare(); } /* 0xAC */ virtual void dAcOInsect_0xAC() {} - /* 0xB0 */ virtual void dAcOInsect_0xB0(); + /* 0xB0 */ virtual bool checkCaught(cCcD_Obj &col); protected: - void goPoof(); - bool isLinkNearby(f32 radius); - bool isLinkNearbyZ(f32 distance); + void kill(); + void checkDeath(dBgS_Acch &acch); + bool checkDeath(cCcD_Obj &col); + bool checkPlayerRadius(f32 radius); + bool checkPlayerElevationDiff(f32 distance); void someBaseFunction(); bool someBaseFunction0(); bool checkForLinkScare(); @@ -50,6 +55,11 @@ class dAcOInsect_c : public dAcObjBase_c { static bool isLinkUsingBugNet(); bool resetScale(); bool fn_8018FAA0(); + bool fn_8018FAD0(); + void fn_8018FDF0(const mVec3_c &); + int fn_801900B0(const mVec3_c &, const mVec3_c &); + void fn_80190440(); + void fn_80190160(); bool fn_80190180(mAng &outAng); private: @@ -58,16 +68,26 @@ class dAcOInsect_c : public dAcObjBase_c { /* 0x335 */ u8 field_0x335; /* 0x338 */ u32 field_0x338; /* 0x33C */ mVec3_c field_0x33C; - /* 0x348 */ u8 field_0x348[0x35C - 0x348]; + /* 0x348 */ mVec3_c field_0x348; + /* 0x354 */ f32 field_0x354; + /* 0x358 */ f32 field_0x358; /* 0x35C */ f32 field_0x35C; - /* 0x360 */ u8 field_0x360[0x3BE - 0x360]; + /* 0x360 */ mVec3_c field_0x360; + /* 0x36C */ mVec3_c field_0x36C; + /* 0x378 */ u8 field_0x378[0x3A8 - 0x378]; + /* 0x3A8 */ cM3dGPla mPlane_0x3A8; + /* 0x3B8 */ int mMaterial; + /* 0x3BC */ u8 field_0x3BC; + /* 0x3BD */ u8 field_0x3BD; /* 0x3BE */ u8 field_0x3BE; /* 0x3BF */ u8 field_0x3BF; /* 0x3C0 */ mMtx_c field_0x3C0; - /* 0x3F0 */ u8 field_0x3F0[0x3F8 - 0x3F0]; + /* 0x3F0 */ u8 field_0x3F0[0x3F4 - 0x3F0]; + /* 0x3F4 */ u8 field_0x3F4; /* 0x3F8 */ u32 mLinkNearby; /* 0x3FC */ dAcRef_c field_0x3FC; - /* 0x408 */ u8 field_0x408[0x40D - 0x408]; + /* 0x408 */ u8 field_0x408[0x40C - 0x408]; + /* 0x40C */ u8 field_0x40C; /* 0x40D */ u8 field_0x40D; /* 0x410 */ mVec3_c field_0x410[3]; /* 0x434 */ mVec3_c field_0x434[3]; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 5d644a1d..97115c85 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -224,6 +224,7 @@ class dAcPy_c : public dAcObjBase_c { /* 0x360 */ UNKWORD field_0x360; /* 0x364 */ u32 mActionFlags; /* 0x368 */ u32 mActionFlagsCont; + /* 0x36C */ int mCurrentAction; // TODO (Document Enum) inline bool checkFlags0x340(u32 mask) const { return (someFlags_0x340 & mask) != 0; @@ -237,5 +238,9 @@ class dAcPy_c : public dAcObjBase_c { return mActionFlags & FLG0_FLY; } + int getCurrentAction() const { + return mCurrentAction; + } + static dAcPy_c *LINK; }; diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index c492dfdb..0f9db422 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -97,6 +97,10 @@ class dAcObjBase_c : public dAcBase_c { return getVelocityMag() <= EGG::Math::epsilon(); } + bool isSlowerThan(f32 speed) const { + return fabsf(forwardSpeed) <= speed; + } + // could be their own thing? /* 8002de40 */ static void *getOarcFile(const char *oarcName, const char *fileName); /* 8002de60 */ static void *getOarcSubEntry(const char *oarcName, const char *fileName); diff --git a/include/d/col/bg/d_bg_s_spl_grp_chk.h b/include/d/col/bg/d_bg_s_spl_grp_chk.h index d4d47f25..8d80a520 100644 --- a/include/d/col/bg/d_bg_s_spl_grp_chk.h +++ b/include/d/col/bg/d_bg_s_spl_grp_chk.h @@ -67,6 +67,10 @@ class dBgS_SplGrpChk : public cBgS_PolyInfo, public cBgS_Chk, public dBgS_Chk { void CopyGnd() { mGroundCopy = mGnd; } + + f32 GetGroundH() const { + return mGroundH; + } }; #endif diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 5500de1c..387ee6be 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -68,6 +68,11 @@ struct mAng { f32 radian() const { return ((2.f * M_PI) / 65536.0f) * mVal; } + + f32 radian2() const { + return mVal * sAngToRad; + } + static s16 fromRad(f32 rad) { return rad * sRadToAng; } diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index e3dabf65..12fb49bf 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -9,6 +9,7 @@ #include "m/m_vec.h" #include "nw4r/types_nw4r.h" #include "rvl/MTX/mtx.h" +#include "rvl/MTX/mtxvec.h" class mMtx_c : public EGG::Matrix34f { typedef f32 (*MtxRef)[4]; @@ -70,6 +71,11 @@ class mMtx_c : public EGG::Matrix34f { void trans(f32 x, f32 y, f32 z) { PSMTXTrans(*this, x, y, z); } + mVec3_c multVec(const mVec3_c &v) const { + mVec3_c ret = v; + PSMTXMultVec(*this, ret, ret); + return ret; + } mMtx_c &operator+=(const mMtx_c &rhs) { PSMTXConcat(*this, rhs, *this); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 4e21dafc..b2564cfa 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -217,6 +217,13 @@ class mVec3_c : public EGG::Vector3f { return PSVECMag(*this); } + f32 distance(const mVec3_c &to) const { + return EGG::Math::sqrt(PSVECSquareDistance(*this, to)); + } + + f32 squareMagXZ() const { + return x * x + z * z; + } void rotY(const mAng &angle); void CopyTo(nw4r::math::VEC3 *p) { diff --git a/src/d/a/d_a_insect.cpp b/src/d/a/d_a_insect.cpp index 9ae59c4a..af296b3c 100644 --- a/src/d/a/d_a_insect.cpp +++ b/src/d/a/d_a_insect.cpp @@ -1,47 +1,96 @@ #include "d/a/d_a_insect.h" +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_pc.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/bg/d_bg_w_base.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d_g_pla.h" #include "egg/math/eggMath.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" #include "m/m_vec.h" #include "rvl/MTX/mtxvec.h" #include "toBeSorted/attention.h" -void AcOInsectFloats() { - 50.0f; - 1.0f; - 30.0f; - 5000.0f; - 0.1f; - 10.0f; - 500.0f; - 0.0f; - 400.0f; - -200.0f; - 200.0f; - 20.0f; - EGG::Math::epsilon(); - 5.0f; - -5.0f; - 0.99f; - int x = 0; - (f32) x; -} - -void AcOInsectFloats2() { - -1.0f; - 0.5f; - 2250000.0f; +#include + +// Very Hack ?? +static inline bool IsZero(f32 in) { + return in <= EGG::Math::epsilon(); +} + +// void AcOInsectFloats() { +// 50.0f; +// 1.0f; +// 30.0f; +// 5000.0f; +// 0.1f; +// 10.0f; +// 500.0f; +// 0.0f; +// 400.0f; +// -200.0f; +// 200.0f; +// 20.0f; +// EGG::Math::epsilon(); +// 5.0f; +// -5.0f; +// 0.99f; +// int x = 0; +// (f32) x; +// } + +// void AcOInsectFloats2() { +// -1.0f; +// 0.5f; +// 2250000.0f; +// } + +extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_394_; + +void dAcOInsect_c::kill() { + // Small Ordering issue between loading particle id and position + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_394_, &position, nullptr, 0, 0, 0, 0, 0); + playSound(0x1236); // TODO (Sound ID) + deleteRequest(); } bool dAcOInsect_c::checkForLinkScare() { if (dAcPy_c::LINK != nullptr) { - // TODO + if (dAcPy_c::LINK->getCurrentAction() == 12 /* Rolling */) { // TODO (Player Action Enum) + if (dAcPy_c::LINK->getDistanceTo(position) < 50.f) { + mLinkNearby = 1; + return true; + } + } else if (dAcPy_c::LINK->forwardSpeed > 1.f) { + if (dAcPy_c::LINK->getDistanceTo(position) < 30.f) { + mLinkNearby = 1; + return true; + } + } } return false; } +void dAcOInsect_c::checkDeath(dBgS_Acch &acch) { + if (acch.ChkWaterHit() && acch.mWtr.GetGroundH() >= position.y) { + kill(); + } + if (acch.ChkGroundLanding() && dBgS::GetInstance()->GetSpecialCode(acch.mGnd) == POLY_ATTR_LAVA) { + kill(); + } + if (position.y < pos_copy.y - 5000.f) { + deleteRequest(); + } +} + bool dAcOInsect_c::isLinkUsingBugNet() { if (dAcPy_c::LINK != nullptr && !dAcPy_c::LINK->isUsingBugnet()) { return false; @@ -64,14 +113,14 @@ s32 dAcOInsect_c::getLinkSpeedLevel() { return 3; } -bool dAcOInsect_c::isLinkNearby(f32 rad) { +bool dAcOInsect_c::checkPlayerRadius(f32 rad) { if (dAcPy_c::LINK != nullptr && isWithinPlayerRadius(rad)) { return true; } return false; } -bool dAcOInsect_c::isLinkNearbyZ(f32 dist) { +bool dAcOInsect_c::checkPlayerElevationDiff(f32 dist) { if (dAcPy_c::LINK != nullptr && fabsf(dAcPy_c::LINK->position.y - position.y) > dist) { return false; } @@ -81,7 +130,7 @@ bool dAcOInsect_c::isLinkNearbyZ(f32 dist) { void dAcOInsect_c::someBaseFunction() { dAcPy_c *link = dAcPy_c::LINK; if (link != nullptr) { - if (isLinkNearbyZ(500.0f) && isLinkNearby(dAcOInsect_0x8C())) { + if (checkPlayerElevationDiff(500.0f) && checkPlayerRadius(dAcOInsect_0x8C())) { field_0x335 = field_0x334; field_0x334 = link->isUsingBugnet1(); if (link->isUsingBugnet1()) { @@ -100,7 +149,7 @@ void dAcOInsect_c::someBaseFunction() { bool dAcOInsect_c::someBaseFunction0() { f32 rad = dAcOInsect_0x80(); - if (isLinkNearbyZ(500.0f) && isLinkNearby(rad)) { + if (checkPlayerElevationDiff(500.0f) && checkPlayerRadius(rad)) { field_0x338 = 1; return true; } @@ -130,9 +179,7 @@ void dAcOInsect_c::addAttentionTarget() { void dAcOInsect_c::preAttention() { // It's always the simplest vector functions that cause problems poscopy2 = position; - f32 y = position.y; - y += 20.0f; - poscopy2.y = y; + poscopy2.y += 20.f; poscopy3 = poscopy2; } @@ -153,6 +200,31 @@ bool dAcOInsect_c::isLinkCloseAndFlag() { return false; } +bool dAcOInsect_c::checkDeath(cCcD_Obj &col) { + if (field_0x3F4 != 0) { + field_0x3F4--; + return false; + } + + if (col.ChkTgHit() && + (col.ChkTgAtHitType(AT_TYPE_0x2) || col.ChkTgAtHitType(AT_TYPE_0x8) || col.ChkTgAtHitType(AT_TYPE_0x20) || + col.ChkTgAtHitType(AT_TYPE_0x40) || col.ChkTgAtHitType(AT_TYPE_0x80) || col.ChkTgAtHitType(AT_TYPE_0x2000) || + col.ChkTgAtHitType(AT_TYPE_0x4000) || col.ChkTgAtHitType(AT_TYPE_0x800000) || + col.ChkTgAtHitType(AT_TYPE_0x800))) { + mLinkNearby = 0; + return true; + } + + return false; +} + +bool dAcOInsect_c::checkCaught(cCcD_Obj &col) { + if (col.ChkTgHit() && col.ChkTgAtHitType(AT_TYPE_BUGNET)) { + return true; + } + return false; +} + bool dAcOInsect_c::resetScale() { mScale.set(1.0f, 1.0f, 1.0f); return true; @@ -166,6 +238,50 @@ bool dAcOInsect_c::fn_8018FAA0() { return false; } +bool dAcOInsect_c::fn_8018FAD0() { + f32 speed = fabsf(forwardSpeed); + if (IsZero(speed)) { + fn_8018FDF0(mPlane_0x3A8.GetN()); + return true; + } else { + f32 clampSpeed = speed < 5.0f ? forwardSpeed > 0.f ? forwardSpeed : -5.f : 5.f; + + mVec3_c pos0 = position + field_0x360; + mVec3_c pos1 = pos0 + field_0x36C * forwardSpeed; + int linType = fn_801900B0(pos0, pos1); + field_0x410[0] = pos0; + field_0x434[0] = pos1; + // TODO + } +} + +void dAcOInsect_c::fn_8018FDF0(const mVec3_c &point) { + mMtx_c mtx; + field_0x360 = point; + mtx.setAxisRotation(field_0x360, rotation.y.radian2()); + // TODO + f32 a_comparision = 0.99f; +} + +int dAcOInsect_c::fn_801900B0(const mVec3_c &point0, const mVec3_c &point1) { + cM3dGPla pla; + if (!dBgS_ObjLinChk::LineCross(&point0, &point1, this)) { + return 1; + } + if (!dBgS_ObjLinChk::GetTriPla(&pla)) { + return 1; + } + if (mMaterial != dBgS_ObjLinChk::GetMaterial()) { + return 2; + } + + position = dBgS_ObjLinChk::GetInstance().GetLinEnd(); + mPlane_0x3A8 = pla; + field_0x3BC = 1; + fn_8018FDF0(pla.GetN()); + return 0; +} + // Looks like it decides on a direction and angle based on a target point? bool dAcOInsect_c::fn_80190180(mAng &outAng) { // Stack and reg problems @@ -186,11 +302,8 @@ bool dAcOInsect_c::fn_80190180(mAng &outAng) { if (field_0x3BF != 0) { f32 len = fabsf(field_0x33C.y + field_0x35C * 0.5f - position.y); for (int i = 0; i < 4; i++) { - mVec3_c tmp = vecs[i] * 20.0f; - // ??? - mVec3_c tmp2 = tmp; - PSMTXMultVec(field_0x3C0, tmp2, tmp2); - f32 len2 = fabsf(field_0x33C.y + field_0x35C * 0.5f - tmp2.y); + // mVec3_c tmp2 = field_0x3C0.multVec(vecs[i] * 20.0f); + f32 len2 = fabsf(field_0x33C.y + field_0x35C * 0.5f - field_0x3C0.multVec(vecs[i] * 20.0f).y); if (len > len2) { len = len2; i3 = i; @@ -198,14 +311,10 @@ bool dAcOInsect_c::fn_80190180(mAng &outAng) { } } else if (field_0x3BE != 0) { mVec3_c dir = field_0x33C - position; - f32 len = dir.x * dir.x + dir.z * dir.z; + f32 len = dir.squareMagXZ(); for (int i = 0; i < 4; i++) { - mVec3_c tmp = vecs[i] * 20.0f; - // ??? - mVec3_c tmp2 = tmp; - PSMTXMultVec(field_0x3C0, tmp2, tmp2); - mVec3_c dir2 = field_0x33C - tmp2; - f32 len2 = dir2.x * dir2.x + dir2.z * dir2.z; + // mVec3_c tmp2 = field_0x3C0.multVec(vecs[i] * 20.0f); + f32 len2 = (field_0x33C - field_0x3C0.multVec(vecs[i] * 20.0f)).squareMagXZ(); if (len > len2) { len = len2; i3 = i; @@ -221,3 +330,13 @@ bool dAcOInsect_c::fn_80190180(mAng &outAng) { return false; } + +void dAcOInsect_c::fn_80190440() { + f32 a = 2250000.f; // float order +} + +void dAcOInsect_c::fn_80190160() { + field_0x33C = field_0x348; + field_0x354 = field_0x358; + field_0x40C = 0; +}