mirror of
https://github.com/zeldaret/ss
synced 2026-08-09 10:53:09 -04:00
more progress
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
+6
-1
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user