diff options
| author | lepelog <25211966+lepelog@users.noreply.github.com> | 2026-06-24 01:13:28 +0200 |
|---|---|---|
| committer | lepelog <25211966+lepelog@users.noreply.github.com> | 2026-06-28 13:10:42 +0200 |
| commit | 2f3d3dc4f6cd68c325838e2ae01be707d0e3463a (patch) | |
| tree | 7dbeb612afa84ec173d01de249c3145d06d93550 | |
| parent | 261b6b9524602ca6f686fa557cf96d93dc977a88 (diff) | |
more progress
| -rw-r--r-- | include/d/a/npc/d_a_npc_bee.h | 11 | ||||
| -rw-r--r-- | include/d/a/npc/d_a_npc_insect_capture_game_kobun.h | 1 | ||||
| -rw-r--r-- | include/m/m_vec.h | 7 | ||||
| -rw-r--r-- | src/REL/d/a/npc/d_a_npc_bee.cpp | 266 |
4 files changed, 275 insertions, 10 deletions
diff --git a/include/d/a/npc/d_a_npc_bee.h b/include/d/a/npc/d_a_npc_bee.h index 4c840438..cc2f0958 100644 --- a/include/d/a/npc/d_a_npc_bee.h +++ b/include/d/a/npc/d_a_npc_bee.h @@ -35,14 +35,16 @@ public: /* 0x006 */ u8 field_0x006; /* 0x007 */ u8 field_0x007; /* 0x008 */ u8 field_0x008; - /* 0x009 */ u8 field_0x009[0xc-9]; + /* 0x009 */ u8 field_0x009; + /* 0x00A */ u8 field_0x00A; + /* 0x00B */ u8 field_0x00B; /* 0x00C */ s16 mRotY; /* 0x00E */ s16 field_0x00E; /* 0x010 */ f32 field_0x010; /* 0x014 */ f32 field_0x014; /* 0x018 */ mVec3_c mPos; /* 0x024 */ mVec3_c field_0x024; - /* 0x030 */ u8 field_0x030[0x3C-0x30]; + /* 0x030 */ mVec3_c field_0x030; /* 0x03C */ mVec3_c field_0x03C; /* 0x048 */ mVec3_c field_0x048; /* 0x054 */ mVec3_c field_0x054; @@ -60,13 +62,14 @@ public: virtual int create() override; virtual int actorExecute() override; virtual int draw() override; - void updateSwarmBeeColliders(); + virtual int doDelete() override; + u32 updateSwarmBeeColliders(); void actuallyUpdateSwarmBees(); void handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee); void fn_14_1350(dAcNpcBeeSingleBee* bee); void fn_14_1F40(dAcNpcBeeSingleBee* bee); u32 fn_14_2630(); - u32 fn_14_2690(dAcNpcBeeSingleBee* bee); + s32 fn_14_2690(dAcNpcBeeSingleBee* bee); void fn_14_20F0(dAcNpcBeeSingleBee* bee); private: diff --git a/include/d/a/npc/d_a_npc_insect_capture_game_kobun.h b/include/d/a/npc/d_a_npc_insect_capture_game_kobun.h index ffec4454..f4ace5eb 100644 --- a/include/d/a/npc/d_a_npc_insect_capture_game_kobun.h +++ b/include/d/a/npc/d_a_npc_insect_capture_game_kobun.h @@ -8,6 +8,7 @@ class dAcNpcIcgKobun_c : public dAcNpc_c { public: dAcNpcIcgKobun_c() : mStateMgr(*this) {} virtual ~dAcNpcIcgKobun_c() {} + void fn_66_30C0(u32 itemId); private: /* 0x??? */ STATE_MGR_DECLARE(dAcNpcIcgKobun_c); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index bd4cc4b0..bbde3920 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -272,10 +272,15 @@ public: return cM::atan2s(-y, absXZ()); } - s16 atan2sY_XZ() const { + // TODO: make sure this isn't bad + s32 atan2sY_XZ() const { return cM::atan2s(y, absXZ()); } + s32 atan2sXZ_Y() const { + return -atan2sY_XZ(); + } + f32 angle(const mVec3_c &other) const { return EGG::Vector3f::angle(other); } diff --git a/src/REL/d/a/npc/d_a_npc_bee.cpp b/src/REL/d/a/npc/d_a_npc_bee.cpp index b1b657f6..9b227616 100644 --- a/src/REL/d/a/npc/d_a_npc_bee.cpp +++ b/src/REL/d/a/npc/d_a_npc_bee.cpp @@ -2,14 +2,17 @@ #include "c/c_lib.h" #include "c/c_math.h" #include "common.h" +#include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/a/e/d_a_e_bc.h" #include "d/a/npc/d_a_npc_honeycomb.h" +#include "d/a/npc/d_a_npc_insect_capture_game_kobun.h" #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_spore.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_s_gnd_chk.h" #include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_d.h" #include "d/d_camera.h" #include "d/d_player_act.h" @@ -27,12 +30,15 @@ #include "nw4r/g3d/res/g3d_resmat.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resshp.h" +#include "nw4r/math/math_arithmetic.h" #include "nw4r/math/math_triangular.h" #include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" #include <cmath> SPECIAL_ACTOR_PROFILE(NPC_BEE, dAcNpcBee_c, fProfile::NPC_BEE, 0x123, 0, 0); +// non matching bool dAcNpcBee_c::createHeap() { mRes = nw4r::g3d::ResFile(getOarcResFile("Bee")); static const char* sModelNames[4] = { @@ -49,8 +55,9 @@ bool dAcNpcBee_c::createHeap() { return SUCCEEDED; } -static dCcD_SrcSph sph; +static dCcD_SrcSph sph; // TODO +// non matching int dAcNpcBee_c::create() { mSceneflag = getFromParams(0x10, 0xFF); // mRoom regalloc @@ -71,7 +78,7 @@ int dAcNpcBee_c::create() { bee->field_0x008 = 1; } } - // probably inline here + // probably inline here, regswaps mStts.SetRank(3); mInteractionFlags |= 0x80; mColliderList.SetStts(mStts); @@ -86,6 +93,11 @@ int dAcNpcBee_c::create() { return SUCCEEDED; } +int dAcNpcBee_c::doDelete() { + return SUCCEEDED; +} + +// hopefully equivalent void dAcNpcBee_c::actuallyUpdateSwarmBees() { if (mHiveRef.isLinked()) { setStartingPosition(mHiveRef.get()->field_0x928); @@ -229,6 +241,7 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { } } +// non matching void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { f32 fVar7 = 0.0f; dAcNpcHc_c* hive = mHiveRef.get(); @@ -331,8 +344,214 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { } } +// non matching void dAcNpcBee_c::fn_14_1350(dAcNpcBeeSingleBee* bee) { + bee->field_0x003 = 1; + dAcNpcHc_c* hive = mHiveRef.get(); + bee->mCollider.ClrAtSet(); + bool bVar11 = false; + bool bVar10 = false; + bool bVar9; + mMtx_c mtx; + mVec3_c local_8c; + mVec3_c local_98; + if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_CHASE) { + if (bee->field_0x009 != 0) { + bee->field_0x009--; + } + if (bee->field_0x007 != 0) { + bee->field_0x007--; + bee->mPos += bee->field_0x030; + bee->field_0x030 *= 0.8f; + } else { + if (mAttackActor == dAcPy_c::GetLink() && dAcPy_c::GetLink()->checkFlags0x354(4) && bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_CHASE) { + bVar9 = false; + local_98 = dAcPy_c::GetLink()->getPosition() - bee->mPos; + if (local_98.squareMagXZ() < 90000.f) { + if (dAcPy_c::GetLink()->getSpecificAttackDirection() == (s16)daPlayerActBase_c::ATTACK_DIRECTION_LEFT || + dAcPy_c::GetLink()->getSpecificAttackDirection() == (s16)daPlayerActBase_c::ATTACK_DIRECTION_RIGHT) { + local_98.y += 150.f; + if (std::fabsf(local_98.y) < 50.f) { + if (local_98.y < 0.f) { + bee->field_0x030.y = 10.f; + } else { + bee->field_0x030.y = -10.f; + } + bee->field_0x030.y *= (50.f - std::fabsf(local_98.y)) * (cM::rndF(0.02f) + 0.02f); + bee->field_0x030.x = cM::rndFX(5.f); + bee->field_0x030.z = cM::rndFX(5.f); + bVar9 = true; + } + } else { + mtx.YrotS(-dAcPy_c::GetLink()->mRotation.y); + mtx.multVec(local_98, local_98); + f32 xAbs = std::fabsf(local_98.x); + if (xAbs < 130.f) { + if (local_98.x > 0.f) { + local_98.x = -15.f; + } else { + local_98.x = 15.f; + } + local_98.x *= (130.f - xAbs) * (cM::rndF(0.005f) + 0.005f); + local_98.y = cM::rndFX(7.f); + local_98.z = cM::rndFX(7.f); + mtx.YrotS(dAcPy_c::GetLink()->mRotation.y); + mtx.multVec(local_98, bee->field_0x030); + bVar9 = true; + } + } + if (bVar9) { + bee->field_0x002 = bee->field_0x007 = cM::rndF(5.f) + 10.f; + bee->field_0x014 = 0.f; + } + } + } + } + local_8c = mAttackActor->mPositionCopy2 - bee->mPos; + f32 local_8cMagXZ = local_8c.squareMagXZ(); + if (local_8cMagXZ < 90000.f && mAttackActor->getSpeed() < 10.f) { + if ((bee->field_0x009 != 0 && bee->field_0x014 > 10.f) || local_8cMagXZ < 400.f) { + bee->field_0x002 = 0; + } + if (bee->field_0x002 == 0) { + bee->field_0x00A = 0; + if (bee->field_0x009 != 0 || cM::rnd() < 0.95f) { + bee->field_0x014 = cM::rndF(5.f) + 5.f; + bee->field_0x054.x = cM::rndFX(200.f); + bee->field_0x054.y = cM::rndFX(50.f); + bee->field_0x054.z = cM::rndF(50.f) + 100.f; + mtx.YrotS(mAttackActor->mRotation.y); + mtx.multVec(bee->field_0x054, bee->field_0x054); + bee->field_0x002 = cM::rndF(15.f) + 15.f; + } else { + bee->field_0x014 = cM::rndF(5.f) + 17.f; + bee->field_0x054.x = 0.f; + bee->field_0x054.y = 0.f; + bee->field_0x054.z = 0.f; + bee->field_0x002 = 0x14; + bee->field_0x00A = 1; + bVar10 = true; + } + } + } else { + bee->field_0x00A = 0; + if (bee->field_0x002 == 0) { + bee->field_0x002 = cM::rndF(15.f) + 15.f; + bee->field_0x014 = cM::rndF(5.f) + 17.f + 2.f; + bee->field_0x054.x = cM::rndFX(100.f); + bee->field_0x054.y = cM::rndFX(50.f); + bee->field_0x054.z = cM::rndFX(100.f); + } + bee->field_0x009 = 0x50; + + } + local_8c += bee->field_0x054; + if ((bee->field_0x00E == 0 || local_8cMagXZ > 1000000.f) || ( + mAttackActor == dAcPy_c::LINK && dAcPy_c::LINK->checkActionFlags(0x40000) + )) { + if (field_0xB840 == mAttackActor || (hive != nullptr && field_0x0380 < 300.f)) { + bee->field_0x00E = cM::rndF(30.f) + 20.f; + } else { + if (hive != nullptr) { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_FLY_UP; + bee->field_0x054 = mStartingPos; + } else { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_FLY_UP2; + mtx.YrotS(cM::rndF(65536.f)); + local_8c.y = cM::rndF(2000.f) + 6000.f; + local_8c.x = 0.f; + local_8c.z = 8000.f; + mtx.multVec(local_8c, local_98); + bee->field_0x054 = local_98 + mAttackActor->mPositionCopy2; + bee->field_0x00E = cM::rndF(55.f) + 200.f; + } + bee->field_0x014 = cM::rndF(5.f) + 17.f; + bee->field_0x00A = 0; + } + } + if (bee->field_0x014 >= 10.f && field_0xB840 != mAttackActor) { + bee->mCollider.OnAtSet(); + } + } else if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_UP || bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_UP2) { + bVar11 = true; + local_8c = bee->field_0x054 - bee->mPos; + f32 fVar16; + f32 fVar17; + if (hive != nullptr) { + fVar17 = hive->mScale.x * 55.f; + } else { + fVar17 = 55.f; + } + // local_8c = local_c8; + fVar16 = local_8c.mag(); + if (fVar17 < 55.f) { + fVar17 = 55.f; + } + if (fVar16 < fVar17) { + if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_UP) { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_CRAWL; + bee->field_0x014 = 0.f; + } + } else { + if (fVar16 > 500.f) { + fVar16 = 500.f; + } + // weird mul vs slwi + local_8c.x += fVar16 * nw4r::math::SinIdx(bee->mRotY * 0x300); + local_8c.y += fVar16 * nw4r::math::CosIdx(bee->mRotY * 0x300) * 0.5f; + local_8c.z += fVar16 * nw4r::math::CosIdx(bee->mRotY * 0x500); + } + if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_UP2 && bee->field_0x00E == 0) { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_DEAD; + } + } + if (bee->field_0x00B == 0) { + if (bVar10) { + bee->field_0x060.y = local_8c.atan2sX_Z(); + bee->field_0x060.x = -local_8c.atan2sY_XZ(); + } else { + s32 fVar17 = nw4r::math::SinIdx(bee->mRotY * 0xDAC) * 1500.f; + s32 fVar16 = nw4r::math::SinIdx(bee->mRotY * 3000) * 1500.f; + // non match + sLib::addCalcAngle(bee->field_0x060.y.ref(), fVar17 + local_8c.atan2sX_Z(), 1, 0x1000); + sLib::addCalcAngle(bee->field_0x060.x.ref(), fVar16 - local_8c.atan2sY_XZ(), 1, 0x1000); + } + } + mtx.YrotS(bee->field_0x060.y); + mtx.XrotM(bee->field_0x060.x); + local_8c.set(0.f, 0.f, bee->field_0x014); + mtx.multVec(local_8c, bee->field_0x048); + bee->mPos += bee->field_0x048; + if (bee->field_0x00E != 0) { + bee->field_0x00E--; + } + if (bVar11) { + sLib::addCalcAngle(bee->field_0x066.y.ref(), bee->field_0x060.y, 2, 0x800); + sLib::addCalcAngle(bee->field_0x066.x.ref(), bee->field_0x060.x, 2, 0x800); + } else { + // TODO: wrong stack thing + local_98 = mAttackActor->mPositionCopy2 - bee->mPos; + s16 sVar15 = local_98.atan2sX_Z(); + sLib::addCalcAngle(bee->field_0x066.y.ref(), sVar15, 2, 0x1000); + if (bee->field_0x00A != 0) { + sLib::addCalcAngle(bee->field_0x066.x.ref(), -0x4000, 2, 0x1000); + } else { + sLib::addCalcAngle(bee->field_0x066.x.ref(), 0, 2, 0x1000); + } + } + if (bee->field_0x00B == 0) { + if (fn_14_2690(bee) == 2) { + bee->field_0x00B = cM::rndF(5.f) + 10.f; + bee->field_0x060.y += ((s16)cM::rndFX(8000.f)) + 0x8000; + } + } else { + bee->field_0x00B--; + } + if ((bee->mRotY & 0xF) == 0 && cM::rnd() < 0.5f) { + bee->field_0x060.z = cM::rndFX(5000.f); + } + sLib::addCalcAngle(bee->field_0x066.z.ref(), bee->field_0x060.z, 2, 0x200); } void dAcNpcBee_c::fn_14_1F40(dAcNpcBeeSingleBee* bee) { @@ -358,6 +577,7 @@ void dAcNpcBee_c::fn_14_1F40(dAcNpcBeeSingleBee* bee) { } } +// TODO: data void dAcNpcBee_c::fn_14_20F0(dAcNpcBeeSingleBee* bee) { bee->mPos += bee->field_0x048; bee->mPos.x += nw4r::math::SinIdx(bee->mRotY * 0x900) * 10.f; @@ -392,8 +612,44 @@ int dAcNpcBee_c::actorExecute() { return SUCCEEDED; } -void dAcNpcBee_c::updateSwarmBeeColliders() { - +u32 dAcNpcBee_c::updateSwarmBeeColliders() { + mMtx_c mtx; + mtx.YrotS(dAcPy_c::LINK->mRotation.y); + dAcNpcBeeSingleBee* bee = &mBees[0]; + for (int i = 0; i < mSwarmBeeCount; i++, bee++) { + if (bee->mBeeState != dAcNpcBeeSingleBee::BEE_STATE_DEAD) { + if (bee->mCollider.ChkTgHit()) { + if (bee->mCollider.ChkTgAtHitType(AT_TYPE_BUGNET)) { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_DEAD; + dAcPy_c::LINK->bugNetCollectTreasure(ITEM_DEKU_HORNET); + dAcNpcIcgKobun_c* npc = static_cast<dAcNpcIcgKobun_c*>(fManager_c::searchBaseByProfName(fProfile::NPC_ICGK)); + if (npc != nullptr) { + npc->fn_66_30C0(ITEM_DEKU_HORNET); + } + } else if (bee->mCollider.ChkTgAtHitType(AT_TYPE_BOMB)) { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_DEAD; + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_394_, bee->mPos, nullptr, nullptr, nullptr, nullptr, 0, 0); + } else { + bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_UNK4; + bee->field_0x048 = bee->mCollider.GetTgAtHitDir(); + bee->field_0x048.normalize(); + if (bee->mCollider.ChkTgAtHitType(AT_TYPE_BELLOWS)) { + bee->field_0x048 *= cM::rndF(5.f) + 15.f; + bee->field_0x002 = cM::rndF(5.f) + 15.f; + field_0x0379 |= 8; + } else { + bee->field_0x048 *= cM::rndF(5.f) + 25.f; + bee->field_0x048.y = cM::rndF(5.f) +15.f; + mVec3_c local_b8(cM::rndFX(20.f), 0.f, 0.f); + mtx.multVec(local_b8, local_b8); + bee->field_0x048 += local_b8; + bee->field_0x002 = cM::rndF(50.f) + 200.f; + } + } + } + } + } + return 1; } int dAcNpcBee_c::draw() { @@ -404,7 +660,7 @@ int dAcNpcBee_c::draw() { return 1; } -u32 fn_14_2690(dAcNpcBeeSingleBee* bee) { +s32 fn_14_2690(dAcNpcBeeSingleBee* bee) { dBgS_ObjGndChk gndChk; dBgS_ObjLinChk linChk; u32 ret = 0; |
