diff options
| author | lepelog <25211966+lepelog@users.noreply.github.com> | 2026-06-29 00:18:39 +0200 |
|---|---|---|
| committer | lepelog <25211966+lepelog@users.noreply.github.com> | 2026-06-29 00:18:39 +0200 |
| commit | abfd3771a0bb5638f2aa0b05aa0b54f615f6c45d (patch) | |
| tree | b706e49256eaaeddf4829030e838d666e9835611 | |
| parent | c6ca28231d618bfeaae3866c42cd91c8b45fcddd (diff) | |
progress
| -rw-r--r-- | config/SOUE01/rels/d_a_npc_beeNP/symbols.txt | 4 | ||||
| -rw-r--r-- | config/SOUE01/rels/d_a_npc_insect_capture_game_kobunNP/symbols.txt | 2 | ||||
| -rw-r--r-- | config/SOUE01/symbols.txt | 2 | ||||
| -rw-r--r-- | include/d/a/npc/d_a_npc_bee.h | 8 | ||||
| -rw-r--r-- | include/d/a/obj/d_a_obj_spore.h | 8 | ||||
| -rw-r--r-- | include/m/m_vec.h | 3 | ||||
| -rw-r--r-- | src/REL/d/a/npc/d_a_npc_bee.cpp | 80 |
7 files changed, 53 insertions, 54 deletions
diff --git a/config/SOUE01/rels/d_a_npc_beeNP/symbols.txt b/config/SOUE01/rels/d_a_npc_beeNP/symbols.txt index fed3032c..88e47829 100644 --- a/config/SOUE01/rels/d_a_npc_beeNP/symbols.txt +++ b/config/SOUE01/rels/d_a_npc_beeNP/symbols.txt @@ -19,7 +19,7 @@ handleBeeBlownAway__11dAcNpcBee_cFP18dAcNpcBeeSingleBee = .text:0x000020F0; // t actorExecute__11dAcNpcBee_cFv = .text:0x000022B0; // type:function size:0x88 updateSwarmBeeColliders__11dAcNpcBee_cFv = .text:0x00002340; // type:function size:0x2E4 draw__11dAcNpcBee_cFv = .text:0x00002630; // type:function size:0x5C -beeCheckWallFloorCollision__FP18dAcNpcBeeSingleBee = .text:0x00002690; // type:function size:0x1D4 +beeCheckWallFloorCollision__11dAcNpcBee_cFP18dAcNpcBeeSingleBee = .text:0x00002690; // type:function size:0x1D4 vt_0x88__11dAcEnBase_cFi = .text:0x00002870; // type:function size:0x8 vt_0x84__11dAcEnBase_cFv = .text:0x00002880; // type:function size:0x4 vt_0x80__11dAcEnBase_cFv = .text:0x00002890; // type:function size:0x4 @@ -32,7 +32,7 @@ _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global lbl_14_rodata_0 = .rodata:0x00000000; // type:object size:0xC4 data:float g_profile_NPC_BEE = .data:0x00000000; // type:object size:0x10 data:4byte -sph = .data:0x00000010; // type:object size:0x2C +beeColliderSrc = .data:0x00000010; // type:object size:0x2C lbl_14_data_3C = .data:0x0000003C; // type:object size:0x6 data:string lbl_14_data_44 = .data:0x00000044; // type:object size:0x6 data:string lbl_14_data_4C = .data:0x0000004C; // type:object size:0x7 data:string diff --git a/config/SOUE01/rels/d_a_npc_insect_capture_game_kobunNP/symbols.txt b/config/SOUE01/rels/d_a_npc_insect_capture_game_kobunNP/symbols.txt index 03740a3a..273beb53 100644 --- a/config/SOUE01/rels/d_a_npc_insect_capture_game_kobunNP/symbols.txt +++ b/config/SOUE01/rels/d_a_npc_insect_capture_game_kobunNP/symbols.txt @@ -102,7 +102,7 @@ fn_66_2E30 = .text:0x00002E30; // type:function size:0x1C shouldEndBugMaybeMinigameTooLowHealthMaybeMaybe = .text:0x00002E50; // type:function size:0x70 fn_66_2EC0 = .text:0x00002EC0; // type:function size:0xC0 fn_66_2F80 = .text:0x00002F80; // type:function size:0x138 -fn_66_30C0 = .text:0x000030C0; // type:function size:0xB4 +fn_66_30C0__16dAcNpcIcgKobun_cFUl = .text:0x000030C0; // type:function size:0xB4 fn_66_3180 = .text:0x00003180; // type:function size:0x174 fn_66_3300 = .text:0x00003300; // type:function size:0x210 fn_66_3510 = .text:0x00003510; // type:function size:0xB4 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 09c67879..9a4ced8c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -17102,7 +17102,7 @@ AcOSpore__stateWaitEnter = .text:0x802D8B50; // type:function size:0x4 AcOSpore__stateWaitUpdate = .text:0x802D8B60; // type:function size:0x304 AcOSpore__stateWaitLeave = .text:0x802D8E70; // type:function size:0x4 fn_802D8E80 = .text:0x802D8E80; // type:function size:0x10 -fn_802D8E90 = .text:0x802D8E90; // type:function size:0x8 +getListHead__11dAcOSpore_cFv = .text:0x802D8E90; // type:function size:0x8 fBase__deleteRequest3 = .text:0x802D8EA0; // type:function size:0x4 fn_802D8EB0 = .text:0x802D8EB0; // type:function size:0x80 fn_802D8F30 = .text:0x802D8F30; // type:function size:0xE4 diff --git a/include/d/a/npc/d_a_npc_bee.h b/include/d/a/npc/d_a_npc_bee.h index 0ed39658..89899018 100644 --- a/include/d/a/npc/d_a_npc_bee.h +++ b/include/d/a/npc/d_a_npc_bee.h @@ -40,7 +40,7 @@ public: /* 0x00B */ u8 mWallReflectTimer; /* 0x00C */ s16 mTimer; // only counts up, used for kinda random calculations /* 0x00E */ s16 mFlyingStatesTimer; // used for vanishing after flying up and something else - /* 0x010 */ f32 field_0x010; + /* 0x010 */ f32 mCrawlingSpeed; /* 0x014 */ f32 mSpeed; /* 0x018 */ mVec3_c mPos; /* 0x024 */ mVec3_c field_0x024; @@ -75,11 +75,11 @@ private: /* 0x0378 */ u8 mSwarmBeeCount; /* 0x0379 */ u8 mRumbleTimer; // rumble timer /* 0x037A */ u8 mSceneflag; - /* 0x037B */ u8 field_0x037B; + /* 0x037B */ u8 field_0x037B; // padding /* 0x037C */ s16 mFrameCounter; // used to only search for new targets every 16 frames - /* 0x037E */ u8 field_0x037E[0x380-0x37E]; + /* 0x037E */ u8 field_0x037E[2]; // padding /* 0x0380 */ f32 mAttackActorDistFromHome; - /* 0x0384 */ u8 field_0x0384[0x388-0x384]; + /* 0x0384 */ u8 field_0x0384[4]; // padding? /* 0x0388 */ nw4r::g3d::ResFile mRes; /* 0x038C */ dShpProc1_c mBeeModels[4]; /* 0x045C */ dAcNpcBeeSingleBee mBees[100]; diff --git a/include/d/a/obj/d_a_obj_spore.h b/include/d/a/obj/d_a_obj_spore.h index 2f5418c7..74761989 100644 --- a/include/d/a/obj/d_a_obj_spore.h +++ b/include/d/a/obj/d_a_obj_spore.h @@ -1,6 +1,7 @@ #ifndef D_A_O_SPORE_H #define D_A_O_SPORE_H +#include "common.h" #include "d/a/obj/d_a_obj_base.h" #include "f/f_list_mg.h" class dAcOSpore_c : public dAcObjBase_c { @@ -9,7 +10,12 @@ public: virtual ~dAcOSpore_c() {} static fLiNdBa_c* getListHead(); - + s32 getSporeType() const { + return mParams & 0xF; + } + bool isGlitteringSpore() const { + return getSporeType() == 1; + } private: static fLiMgBa_c sSpores; diff --git a/include/m/m_vec.h b/include/m/m_vec.h index bbde3920..8a61d03f 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -272,8 +272,7 @@ public: return cM::atan2s(-y, absXZ()); } - // TODO: make sure this isn't bad - s32 atan2sY_XZ() const { + s16 atan2sY_XZ() const { return cM::atan2s(y, absXZ()); } 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 3f97b732..27670ca3 100644 --- a/src/REL/d/a/npc/d_a_npc_bee.cpp +++ b/src/REL/d/a/npc/d_a_npc_bee.cpp @@ -38,7 +38,6 @@ 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] = { @@ -54,7 +53,7 @@ bool dAcNpcBee_c::createHeap() { } return SUCCEEDED; } -static dCcD_SrcSph beeCcSrc = { +static dCcD_SrcSph beeColliderSrc = { /* mObjInf */ { /* mObjAt */ {AT_TYPE_0x2000000, 0x20000F, {0, 0, 0}, 1, 0, 0, 0, 0, 0}, /* mObjTg */ {AT_TYPE_BUGNET | AT_TYPE_BELLOWS | AT_TYPE_BOMB, 0x00004011, {0, 00, 0x40F}, 8, 0}, @@ -66,7 +65,7 @@ static dCcD_SrcSph beeCcSrc = { int dAcNpcBee_c::create() { mSceneflag = getFromParams(0x10, 0xFF); // mRoom regalloc - if (mSceneflag != 0xFF && SceneflagManager::sInstance && SceneflagManager::sInstance->checkFlag(mRoomID, mSceneflag)) { + if (mSceneflag != 0xFF && SceneflagManager::sInstance && SceneflagManager::sInstance->checkFlag(getRoomId(), mSceneflag)) { return FAILED; } CREATE_ALLOCATOR(dAcNpcBee_c); @@ -76,7 +75,7 @@ int dAcNpcBee_c::create() { bee->mBeeState = dAcNpcBeeSingleBee::BEE_STATE_CRAWL; bee->mPos = mPosition; bee->mTimer = cM::rndF(65536); - mColliderList.addCc(bee->mCollider, beeCcSrc); + mColliderList.addCc(bee->mCollider, beeColliderSrc); bee->mCollider.mTg.OffSPrm(0x100); bee->mCollider.mAt.OnSPrm(0x100); if (i < mSwarmBeeCount / 2) { @@ -107,7 +106,7 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { if (mHiveRef.isLinked()) { setStartingPosition(mHiveRef.get()->field_0x928); } - dAcPy_c *player = dAcPy_c::GetLink2(); + dAcPy_c *player = dAcPy_c::GetLinkM(); if ((mFrameCounter & 0xF) == 0) { mAttackRef.link(player); bool noSporeFound = true; @@ -115,7 +114,7 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { if (current != nullptr) { for (;current != nullptr;current = current->getNext()) { dAcOSpore_c* spore = static_cast<dAcOSpore_c*>(current->p_owner); - if (spore != nullptr && (s32)(spore->mParams & 0xF) == 1) { + if (spore != nullptr && spore->isGlitteringSpore()) { mVec3_c& sporePos = spore->mPosition; if (spore->mPosition.squareDistanceToXZ(mAliveBeePos) < 1000000.f && std::fabsf(spore->mPosition.y - mAliveBeePos.y) < 500.f) { @@ -149,10 +148,10 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { dAcNpcBeeSingleBee* bee = &mBees[0]; u8 beesAlive = 0; int beeModelIndex = 0; - static mVec3_c someVec(10000.f, -20000.f, 50000.f); + static mVec3_c colliderDisabledPos(10000.f, -20000.f, 50000.f); dCamera_c* camera = dScGame_c::getCamera(); - bool bVar3 = true; - int iVar12 = 0; + bool isFirst = true; + int flyingBeeCount = 0; mAttackActorDistFromHome = mStartingPos.distance(mAttackActor->mPositionCopy2); mPosition = mStartingPos; for (int i = 0; i < mSwarmBeeCount; i++, bee++) { @@ -174,9 +173,9 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { bee->mTimer++; if (bee->mBeeState <= dAcNpcBeeSingleBee::BEE_STATE_FLY_UP) { handleBeeFlyingStates(bee); - iVar12++; - if (bVar3) { - bVar3 = false; + flyingBeeCount++; + if (isFirst) { + isFirst = false; mPosition = bee->mPos; } } else if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_BLOWN_AWAY) { @@ -202,9 +201,7 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { beeModelIndex = 1; } } else { - s32 tmp = -(bee->mTimer >> 2 & 1); - tmp += 3; - beeModelIndex = tmp; + beeModelIndex = (bee->mTimer >> 2 & 1) ? 2 : 3; } if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_CRAWL) { mtx.transS(bee->mPos); @@ -235,11 +232,11 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { if (!hideBee && bee->mDisableAttackTimer == 0) { bee->mCollider.SetC(bee->mPos); } else { - bee->mCollider.SetC(someVec); + bee->mCollider.SetC(colliderDisabledPos); } } - if (iVar12 != 0) { - holdSoundWithIntParam(SE_Bee_FLY_LV, iVar12); + if (flyingBeeCount != 0) { + holdSoundWithIntParam(SE_Bee_FLY_LV, flyingBeeCount); } mColliderList.registerColliders(); if (!beesAlive) { @@ -247,7 +244,6 @@ void dAcNpcBee_c::actuallyUpdateSwarmBees() { } } -// non matching void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { #define CRAWLING_SUBSTATE_NONMOVING 0 #define CRAWLING_SUBSTATE_MOVE 1 @@ -270,8 +266,9 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { } } if (dAcPy_c::GetLink()->getRidingActorType() != daPlayerActBase_c::RIDING_LOFTWING && (mAttackActor->getPosition().y - getPosition().y) < 0.f && bee->mSubState != CRAWLING_SUBSTATE_PRE_RISE) { - f32 compSpeed = mAttackActor->getSpeed() * 20.f + 350.f; - if (hive->field_0x915 >= 5 || hive->mHealth == 1 || (hive->field_0x916 == 0 && mAttackActorDistFromHome < compSpeed)) { + // using getSpeed inline breaks the match + f32 aggroDistance = mAttackActor->mSpeed * 20.f + 350.f; + if (hive->field_0x915 >= 5 || hive->mHealth == 1 || (hive->field_0x916 == 0 && mAttackActorDistFromHome < aggroDistance)) { bee->mSubState = CRAWLING_SUBSTATE_PRE_RISE; bee->mActionTimer = cM::rndF(15.f); } else if (bee->mSubState != CRAWLING_SUBSTATE_FLY && hive->field_0x915 != 0) { @@ -279,12 +276,11 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { bee->mSubState = CRAWLING_SUBSTATE_FLY; } } - mVec3_c local_74; - mVec3_c local_80 = bee->mTargetPos - bee->field_0x024; bee->mIsFlying = 0; - local_74 = local_80; + mVec3_c local_74; + local_74 = bee->mTargetPos - bee->field_0x024; if (bee->mSubState == CRAWLING_SUBSTATE_NONMOVING) { - bee->field_0x010 = 0.f; + bee->mCrawlingSpeed = 0.f; if (bee->mActionTimer == 0) { if (cM::rnd() < 0.02f) { bee->mActionTimer = cM::rndF(70.f) + 30.f; @@ -306,7 +302,7 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { targetSpeed = 2.f; } else if (bee->mSubState == CRAWLING_SUBSTATE_FLY) { bee->mIsFlying = 1; - sLib::addCalcScaledDiff(&bee->field_0x010, 50.f, 0.1f, 5.f); + sLib::addCalcScaledDiff(&bee->mCrawlingSpeed, 50.f, 0.1f, 5.f); sLib::addCalcAngle(bee->mCrawlingRotation.y.ref(), local_74.atan2sX_Z(), 2, 0x800); if ((bee->mActionTimer & 0x7) == 0) { bee->mTargetPos.x = cM::rndFX(300.f); @@ -318,8 +314,8 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { targetSpeed = 5.f; } else if (bee->mSubState == CRAWLING_SUBSTATE_LAND) { bee->mIsFlying = 1; - sLib::addCalcScaled(&bee->field_0x010, 1.f, 5.f); - if (bee->field_0x010 <= 0.1f) { + sLib::addCalcScaled(&bee->mCrawlingSpeed, 1.f, 5.f); + if (bee->mCrawlingSpeed <= 0.1f) { bee->mSubState = CRAWLING_SUBSTATE_NONMOVING; } } else if (bee->mSubState == CRAWLING_SUBSTATE_PRE_RISE && bee->mActionTimer == 0) { @@ -334,10 +330,7 @@ void dAcNpcBee_c::handleBeeCrawlingOnHive(dAcNpcBeeSingleBee* bee) { bee->field_0x024 += bee->field_0x048; s16 xRot = -bee->field_0x024.x * 32768.f / 200.f; s16 zRot = bee->field_0x024.z * 32768.f / 200.f; - local_74.y = bee->field_0x010; - local_74.x = 0.f; - local_74.z = 0.f; - local_74.y = -68.f - local_74.y; + local_74.set(0.f, -68.f - bee->mCrawlingSpeed, 0.f); mtx.scaleS(1.f, 1.15f, 1.f); mtx.YrotM(hive->mRotation.y); mtx.ZrotM(xRot); @@ -360,7 +353,7 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { bee->mIsFlying = 1; dAcNpcHc_c* hive = mHiveRef.get(); bee->mCollider.ClrAtSet(); - bool bVar11 = false; + bool isFlyingAway = false; bool isAttacking = false; bool dodgedSword; mMtx_c mtx; @@ -458,7 +451,8 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { } offsetToTarget += bee->mTargetPos; - if ((bee->mFlyingStatesTimer == 0 || distToTarget > 1000000.f) || ( + f32 maxDist = 1000000.f; + if ((bee->mFlyingStatesTimer == 0 || distToTarget > maxDist) || ( mAttackActor == dAcPy_c::LINK && dAcPy_c::LINK->checkActionFlags(0x40000) )) { if (mSporeActor == mAttackActor || (hive != nullptr && mAttackActorDistFromHome < 300.f)) { @@ -485,7 +479,7 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { bee->mCollider.OnAtSet(); } } else if (bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_TO_HIVE || bee->mBeeState == dAcNpcBeeSingleBee::BEE_STATE_FLY_UP) { - bVar11 = true; + isFlyingAway = true; offsetToTarget = bee->mTargetPos - bee->mPos; f32 distToTarget; f32 fVar17; @@ -494,7 +488,6 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { } else { fVar17 = 55.f; } - // local_8c = local_c8; distToTarget = offsetToTarget.mag(); if (fVar17 < 55.f) { fVar17 = 55.f; @@ -520,7 +513,7 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { if (bee->mWallReflectTimer == 0) { if (isAttacking) { bee->mCrawlingRotation.y = offsetToTarget.atan2sX_Z(); - bee->mCrawlingRotation.x = -offsetToTarget.atan2sY_XZ(); + bee->mCrawlingRotation.x = offsetToTarget.atan2sXZ_Y(); } else { s32 fVar17 = nw4r::math::SinIdx(bee->mTimer * 0xDAC) * 1500.f; s32 fVar16 = nw4r::math::SinIdx(bee->mTimer * 3000) * 1500.f; @@ -537,11 +530,10 @@ void dAcNpcBee_c::handleBeeFlyingStates(dAcNpcBeeSingleBee* bee) { if (bee->mFlyingStatesTimer != 0) { bee->mFlyingStatesTimer--; } - if (bVar11) { + if (isFlyingAway) { sLib::addCalcAngle(bee->mModelRotation.y.ref(), bee->mCrawlingRotation.y, 2, 0x800); sLib::addCalcAngle(bee->mModelRotation.x.ref(), bee->mCrawlingRotation.x, 2, 0x800); } else { - // TODO: wrong stack thing local_98 = mAttackActor->mPositionCopy2 - bee->mPos; s16 sVar15 = local_98.atan2sX_Z(); sLib::addCalcAngle(bee->mModelRotation.y.ref(), sVar15, 2, 0x1000); @@ -678,14 +670,16 @@ int dAcNpcBee_c::draw() { /** * Returns bits when a collision is detected, 2 is wall, 1 is floor */ -s32 beeCheckWallFloorCollision(dAcNpcBeeSingleBee* bee) { +s32 dAcNpcBee_c::beeCheckWallFloorCollision(dAcNpcBeeSingleBee* bee) { dBgS_ObjGndChk gndChk; dBgS_ObjLinChk linChk; + mVec3_c local_148; + mVec3_c scaled; u32 ret = 0; - mVec3_c local_148 = bee->mPos - bee->mOldPos; + local_148 = bee->mPos - bee->mOldPos; local_148.y = 0.f; local_148.normalize(); - mVec3_c scaled = local_148 * 50.f; + scaled = local_148 * 50.f; local_148 = bee->mPos + scaled; linChk.Set(&bee->mPos, &local_148, nullptr); if (dBgS::GetInstance()->LineCross(&linChk)) { @@ -694,7 +688,7 @@ s32 beeCheckWallFloorCollision(dAcNpcBeeSingleBee* bee) { bee->mPos.z = linChk.GetLinEnd().z - scaled.z; } local_148 = bee->mPos; - local_148.z += 100.f; + local_148.y += 100.f; gndChk.SetPos(&local_148); if (bee->mPos.y <= dBgS::GetInstance()->GroundCross(&gndChk) + 15.f) { // imagine using temp variables... |
