summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-07-25 23:04:33 +0200
committerrobojumper <robojumper@gmail.com>2025-07-25 23:04:33 +0200
commit36898b4883a76f595737ef768f375541947f4607 (patch)
tree20dc42207713367b70a7de866162dfcdc5d9c497
parent27f670cf2af52034886d089fc49b2952121b1584 (diff)
Small cleanup
-rw-r--r--config/SOUE01/symbols.txt34
-rw-r--r--include/d/a/d_a_player.h3
-rw-r--r--include/d/a/obj/d_a_obj_boomerang.h10
-rw-r--r--include/d/d_pad.h17
-rw-r--r--include/m/m_vec.h2
-rw-r--r--src/d/a/obj/d_a_obj_boomerang.cpp27
6 files changed, 67 insertions, 26 deletions
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index 77591246..e18542d9 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -11885,7 +11885,7 @@ ActorLink__lookTowardsItem = .text:0x801D73A0; // type:function size:0x230
fn_801D75D0 = .text:0x801D75D0; // type:function size:0x8
fn_801D75E0 = .text:0x801D75E0; // type:function size:0xB8
fn_801D76A0 = .text:0x801D76A0; // type:function size:0x7F8
-fn_801D7EA0 = .text:0x801D7EA0; // type:function size:0x10
+getStateID__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801D7EA0; // type:function size:0x10
fn_801D7EB0 = .text:0x801D7EB0; // type:function size:0x3E0
fn_801D8290 = .text:0x801D8290; // type:function size:0x46C
fn_801D8700 = .text:0x801D8700; // type:function size:0x134
@@ -14155,23 +14155,23 @@ executeState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct
draw__14dAcBoomerang_cFv = .text:0x80264CE0; // type:function size:0x160
create__18dAcBoomerangProc_cFPQ23m3d5mdl_c6mColoriP12mAllocator_c = .text:0x80264E40; // type:function size:0x88
fn_80264ED0 = .text:0x80264ED0; // type:function size:0x80
-fn_80264F50 = .text:0x80264F50; // type:function size:0x60
-fn_80264FB0 = .text:0x80264FB0; // type:function size:0xC
-fn_80264FC0 = .text:0x80264FC0; // type:function size:0x1C
-fn_80264FE0 = .text:0x80264FE0; // type:function size:0x1C
-fn_80265000 = .text:0x80265000; // type:function size:0x1C
-fn_80265020 = .text:0x80265020; // type:function size:0x10
-fn_80265030 = .text:0x80265030; // type:function size:0x10
-fn_80265040 = .text:0x80265040; // type:function size:0x10
-fn_80265050 = .text:0x80265050; // type:function size:0x10
-fn_80265060 = .text:0x80265060; // type:function size:0x10
-fn_80265070 = .text:0x80265070; // type:function size:0x10
-fn_80265080 = .text:0x80265080; // type:function size:0x30
-fn_802650B0 = .text:0x802650B0; // type:function size:0x30
-fn_802650E0 = .text:0x802650E0; // type:function size:0x30
+build__30sFStateFct_c<14dAcBoomerang_c>FRC12sStateIDIf_c = .text:0x80264F50; // type:function size:0x60
+dispose__30sFStateFct_c<14dAcBoomerang_c>FRP10sStateIf_c = .text:0x80264FB0; // type:function size:0xC
+initialize__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80264FC0; // type:function size:0x1C
+execute__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80264FE0; // type:function size:0x1C
+finalize__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80265000; // type:function size:0x1C
+initializeState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80265020; // type:function size:0x10
+finalizeState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80265030; // type:function size:0x10
+refreshState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80265040; // type:function size:0x10
+getState__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80265050; // type:function size:0x10
+getNewStateID__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80265060; // type:function size:0x10
+getOldStateID__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80265070; // type:function size:0x10
+finalizeState__29sFStateID_c<14dAcBoomerang_c>CFR14dAcBoomerang_c = .text:0x80265080; // type:function size:0x30
+executeState__29sFStateID_c<14dAcBoomerang_c>CFR14dAcBoomerang_c = .text:0x802650B0; // type:function size:0x30
+initializeState__29sFStateID_c<14dAcBoomerang_c>CFR14dAcBoomerang_c = .text:0x802650E0; // type:function size:0x30
__sinit_\d_a_obj_boomerang_cpp = .text:0x80265110; // type:function size:0x41C
-AcBoomerang__dtor2 = .text:0x80265530; // type:function size:0x58
-fn_80265590 = .text:0x80265590; // type:function size:0x88
+__dt__29sFStateID_c<14dAcBoomerang_c>Fv = .text:0x80265530; // type:function size:0x58
+isSameName__29sFStateID_c<14dAcBoomerang_c>CFPCc = .text:0x80265590; // type:function size:0x88
dAcObjFairy_c_classInit__Fv = .text:0x80265620; // type:function size:0x144
__dt__26sFState_c<13dAcObjFairy_c>Fv = .text:0x80265770; // type:function size:0x58
__dt__29sFStateFct_c<13dAcObjFairy_c>Fv = .text:0x802657D0; // type:function size:0x6C
diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h
index e3b4a1cf..9050140b 100644
--- a/include/d/a/d_a_player.h
+++ b/include/d/a/d_a_player.h
@@ -102,6 +102,9 @@ public:
static s32 getCurrentBowType();
static s32 getCurrentSlingshotType();
static s32 getCurrentBeetleType();
+ static bool hasBeetleVariantOrBetter(s32 variant) {
+ return getCurrentBeetleType() >= variant;
+ }
static s32 getCurrentBugNetType();
static bool isInBambooCuttingMinigame() {
diff --git a/include/d/a/obj/d_a_obj_boomerang.h b/include/d/a/obj/d_a_obj_boomerang.h
index 00fa98d0..d172ff42 100644
--- a/include/d/a/obj/d_a_obj_boomerang.h
+++ b/include/d/a/obj/d_a_obj_boomerang.h
@@ -208,15 +208,19 @@ private:
/* 0x08B5 */ u8 mWindNodeID;
/* 0x08B6 */ u8 mLeftWingNodeID;
/* 0x08B7 */ u8 mRightWingNodeID;
- /* 0x08B8 */ u8 _0x8B8[0x8C8 - 0x8B8];
- /* 0x08CA */ u16 field_0x8C8;
+ /* 0x08B8 */ mAng field_0x8B8;
+ /* 0x08BA */ mAng field_0x8BA;
+ /* 0x08BC */ mAng field_0x8BC;
+ /* 0x08BE */ mAng field_0x8BE;
+ /* 0x08C0 */ u8 _0x8C0[0x8C8 - 0x8C0];
+ /* 0x08CA */ mAng field_0x8C8;
/* 0x08CA */ u16 mRemainingFlightTime;
/* 0x08CC */ u32 field_0x8CC;
/* 0x08D0 */ f32 field_0x8D0;
/* 0x08D4 */ f32 field_0x8D4;
/* 0x08D8 */ mVec3_c field_0x8D8;
/* 0x08E4 */ mVec3_c field_0x8E4;
- /* 0x08F0 */ u8 _0x8E4[0x8FC - 0x8F0];
+ /* 0x08F0 */ mVec3_c field_0x8F0;
/* 0x08FC */ dCcD_Sph mSph0;
/* 0x0A4C */ dCcD_Sph mSph1;
/* 0x0B9C */ EffectsStruct mEff0;
diff --git a/include/d/d_pad.h b/include/d/d_pad.h
index 0d4f4129..fbfca801 100644
--- a/include/d/d_pad.h
+++ b/include/d/d_pad.h
@@ -53,12 +53,29 @@ class ex_c {
/* 0x10D8 */ s32 field_0x10D8;
};
+ // Orthonormal Basis vectors of the Mpls attachment in 3D space.
+ // Z+ is forward, Y+ is up, and X+ is left. So a Wiimote pointing at
+ // the Screen will have vectors (1, 0, 0), (0, 1, 0), (0, 0, 1).
+ // Of particular interest here is mZ, which tells you in which direction
+ // the Wiimote points.
struct mpls_c {
mpls_c() : mX(mVec3_c::Ex), mY(mVec3_c::Ey), mZ(mVec3_c::Ez) {}
mMtx_c getMtx() const;
/* 0x00 */ mVec3_c mX;
/* 0x0C */ mVec3_c mY;
/* 0x18 */ mVec3_c mZ;
+
+ // vertical angle. 0 is forward, positive is pointing upwards,
+ // negative is pointing downwards
+ mAng getVerticalAngle() const {
+ return cM::atan2s(mZ.y, mZ.absXZ());
+ }
+
+ // horizontal angle. 0 is forward, positive is pointing to the left,
+ // negative is pointing to the right
+ mAng getHorizontalAngle() const {
+ return cM::atan2s(mZ.x, mZ.z);
+ }
};
public:
diff --git a/include/m/m_vec.h b/include/m/m_vec.h
index 341d9703..c540f470 100644
--- a/include/m/m_vec.h
+++ b/include/m/m_vec.h
@@ -243,6 +243,8 @@ public:
void rotY(const mAng &angle);
void rotZ(const mAng &angle);
+ void fromXY(const mAng &angleX, const mAng &angleY, f32);
+
void CopyTo(Vec *p) const {
p->x = x;
p->y = y;
diff --git a/src/d/a/obj/d_a_obj_boomerang.cpp b/src/d/a/obj/d_a_obj_boomerang.cpp
index 55c7f0ab..7cbde76a 100644
--- a/src/d/a/obj/d_a_obj_boomerang.cpp
+++ b/src/d/a/obj/d_a_obj_boomerang.cpp
@@ -8,6 +8,7 @@
#include "d/col/bg/d_bg_s_lin_chk.h"
#include "d/col/c/c_cc_d.h"
#include "d/d_pad.h"
+#include "d/d_player_act.h"
#include "d/d_rumble.h"
#include "d/snd/d_snd_wzsound.h"
#include "f/f_base.h"
@@ -60,7 +61,7 @@ void dAcBoomerang_c::areaCallback(mVec3_c *param1, u32 param2) {
void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {
if (i_actorB != nullptr && i_actorB->GetLinkage().checkFlag(0x80)) {
// Check if beetle can grab things
- if ((s32)(dAcPy_c::getCurrentBeetleType() >= HOOK_BEETLE) != FALSE) {
+ if (dAcPy_c::hasBeetleVariantOrBetter(HOOK_BEETLE)) {
// If beetle is already holding the object or is stationary
if (i_actorB == mGrabbedActor.get() || !mStateMgr.isState(StateID_Move)) {
return;
@@ -124,21 +125,21 @@ bool dAcBoomerang_c::createHeap() {
TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120, 1));
// Decide the Pincers
- if ((s32)(dAcPy_c::getCurrentBeetleType() >= HOOK_BEETLE) != FALSE) {
+ if (dAcPy_c::hasBeetleVariantOrBetter(HOOK_BEETLE)) {
hideModel(MDL_MOUTH_BASIC);
} else {
hideModel(MDL_MOUTH_HOOK);
}
// Decide the Body
- if ((s32)(dAcPy_c::getCurrentBeetleType() >= TOUGH_BEETLE) != FALSE) {
+ if (dAcPy_c::hasBeetleVariantOrBetter(TOUGH_BEETLE)) {
hideModel(MDL_BODY_BASIC);
} else {
hideModel(MDL_BODY_ADV);
}
// Decide the Wings
- if ((s32)(dAcPy_c::getCurrentBeetleType() >= QUICK_BEETLE) != FALSE) {
+ if (dAcPy_c::hasBeetleVariantOrBetter(QUICK_BEETLE)) {
hideModel(MDL_WINGS_BASIC);
} else {
hideModel(MDL_WINGS_ADV);
@@ -216,7 +217,7 @@ int dAcBoomerang_c::create() {
mSph1.SetCoGrp(0xE);
- if ((s32)(dAcPy_c::getCurrentBeetleType() >= HOOK_BEETLE) == FALSE) {
+ if (!dAcPy_c::hasBeetleVariantOrBetter(HOOK_BEETLE)) {
mSph0.OnAt_0x4000();
mSph1.OnAt_0x4000();
}
@@ -428,6 +429,20 @@ void dAcBoomerang_c::initializeState_Move() {
mOldPosition = position;
mOldPosition.y += 60.f;
+
+ field_0x8BC = dPad::ex_c::m_current_ex->mMPLS.getVerticalAngle();
+ field_0x8BA = dPad::ex_c::m_current_ex->mMPLS.getHorizontalAngle();
+ field_0x8B8 = daPlayerActBase_c::fn_8005BAA0();
+
+ // TODO regswap
+ field_0x8BE = angle.x - dPad::ex_c::m_current_ex->mMPLS.getVerticalAngle();
+
+ field_0x8E4.fromXY(angle.x, angle.y, forwardSpeed);
+
+ playSound(SE_BE_THROW);
+ dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_3_, mVec3_c::Zero, nullptr, nullptr, nullptr, nullptr);
+ field_0x8F0 = mVec3_c::Zero;
+ field_0x8D4 = 0.0f;
}
void dAcBoomerang_c::executeState_Move() {}
void dAcBoomerang_c::finalizeState_Move() {}
@@ -488,7 +503,7 @@ int dAcBoomerang_c::actorExecute() {
unsetField_0x8CC(FLAG_REQUEST_0x400);
}
- if (dAcPy_c::GetLink2()->checkModelUpdateFlag(0x10000 | 0x80)) {
+ if (player->checkModelUpdateFlag(0x10000 | 0x80)) {
deleteRequest();
unsetField_0x8CC(FLAG_REQUEST_0x400);
return SUCCEEDED;