summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-08-21 23:10:18 +0200
committerrobojumper <robojumper@gmail.com>2025-09-15 22:11:23 +0200
commitcbe298e99a8da9ff2ddd66a651c852d5eeca914e (patch)
tree9343f8c8290e38ae55fd000ea598f94fb548090d /include
parenta416cab97e7999f8d4fc590ac69b7f4d3efc1389 (diff)
d_a_salbage_obj OK
Diffstat (limited to 'include')
-rw-r--r--include/d/a/d_a_salbage_obj.h167
-rw-r--r--include/d/a/npc/d_a_npc_salbage_robot.h17
-rw-r--r--include/d/a/npc/d_a_npc_talk_kensei.h16
-rw-r--r--include/d/a/obj/d_a_obj_base.h4
-rw-r--r--include/d/a/obj/d_a_obj_pot_sal.h11
-rw-r--r--include/toBeSorted/attention.h4
-rw-r--r--include/toBeSorted/dowsing_target.h5
-rw-r--r--include/toBeSorted/salvage_mgr.h39
8 files changed, 249 insertions, 14 deletions
diff --git a/include/d/a/d_a_salbage_obj.h b/include/d/a/d_a_salbage_obj.h
new file mode 100644
index 00000000..e00732e3
--- /dev/null
+++ b/include/d/a/d_a_salbage_obj.h
@@ -0,0 +1,167 @@
+#ifndef D_A_SALBAGE_OBJ_H
+#define D_A_SALBAGE_OBJ_H
+
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/col/bg/d_bg_s_acch.h"
+#include "d/col/cc/d_cc_d.h"
+#include "d/d_shadow.h"
+#include "m/m3d/m_smdl.h"
+#include "m/m_mtx.h"
+#include "m/m_quat.h"
+#include "m/m_vec.h"
+#include "s/s_State.hpp"
+#include "toBeSorted/dowsing_target.h"
+
+class dAcSalbageObj_c;
+
+class SalbageRelated {
+public:
+ SalbageRelated(dAcSalbageObj_c *obj) : mpObj(obj), mSalvageObjId(6) {}
+
+ /* vt 0x08 */ virtual ~SalbageRelated() {}
+ /* vt 0x0C */ virtual void setCarried() {
+ mCarried = true;
+ }
+ /* vt 0x10 */ virtual void setNotCarried() {
+ mCarried = false;
+ }
+ /* vt 0x14 */ virtual bool isCarried() const {
+ return mCarried;
+ }
+ /* vt 0x18 */ virtual void setHidden() {
+ mHidden = true;
+ }
+ /* vt 0x1C */ virtual void setNotHidden() {
+ mHidden = false;
+ }
+ /* vt 0x20 */ virtual bool isHidden() const {
+ return mHidden;
+ }
+ /* vt 0x24 */ virtual s32 getSalvageObjId() const {
+ return mSalvageObjId;
+ }
+ /* vt 0x28 */ virtual void doDemoThrow();
+
+private:
+ /* 0x04 */ dAcSalbageObj_c *mpObj;
+ /* 0x08 */ bool mCarried;
+ /* 0x09 */ bool mHidden;
+ /* 0x0C */ s32 mSalvageObjId;
+};
+
+/**
+ * Actor - Object - Salvage
+ *
+ * Base class for objects that can be carried by
+ * the Salvage Robot NPC, AKA Scrapper.
+ */
+class dAcSalbageObj_c : public dAcObjBase_c {
+ friend class SalbageRelated;
+
+ enum Behavior_e {
+ /// The object is stationary and disappears when picked up
+ BEHAVIOR_STATIONARY,
+ /// The object is being carried and disappears when dropped
+ BEHAVIOR_CARRY,
+ /// The object is being carried in the Sky by the salvage robot
+ BEHAVIOR_FLY,
+ };
+
+public:
+ dAcSalbageObj_c() : mStateMgr(*this), mSalbageRelated(this), mDowsingTarget(this, DowsingTarget::SLOT_NONE) {}
+ virtual ~dAcSalbageObj_c() {}
+
+ virtual int preExecute() override;
+ virtual int draw() override;
+ virtual int preDraw() override;
+
+ virtual int actorExecute() override;
+ virtual void doInteraction(s32) override;
+
+ /* vt 0x80 */ virtual bool vt_0x80() const {
+ return false;
+ }
+
+protected:
+ bool shouldBeActiveDowsingTarget() const;
+ void initSalbageObj();
+ void loadBehaviorFromParams();
+ void calcMtxFromSalbageNpc(mMtx_c &ret);
+ void addAttentionTargetIfNeeded();
+ void addAttentionTarget();
+
+ void initCcAndBg();
+
+ void executeInternal();
+ void updateCc();
+ void updateBgAcchCir();
+ void updateMdl();
+
+ /* vt 0x84-0x8C */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Wait);
+ /* vt 0x90-0x98 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Carried);
+ /* vt 0x9C-0xA4 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Demo);
+ /* vt 0xA8-0xB0 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, DemoThrow);
+ /* vt 0xB4-0xBC */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, Fly);
+ /* vt 0xC0-0xC8 */ STATE_VIRTUAL_FUNC_DECLARE(dAcSalbageObj_c, After);
+ STATE_FUNC_DECLARE(dAcSalbageObj_c, Kill);
+
+ /* vt 0xCC */ virtual mMtx_c calcWorldMtx();
+ /* vt 0xD0 */ virtual void vt_0xD0() {}
+
+ /* vt 0xD4 */ virtual bool isInStateWait() const {
+ return mStateMgr.isState(StateID_Wait);
+ }
+ /* vt 0xD8 */ virtual bool isInStateWaitOrDemoThrow() const {
+ return mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_DemoThrow);
+ }
+ /* vt 0xDC */ virtual DowsingTarget::DowsingSlot getDowsingSlot() const {
+ return DowsingTarget::SLOT_QUEST;
+ }
+ /* vt 0xE0 */ virtual f32 getCcRadius() const {
+ return 0.0f;
+ }
+ /* vt 0xE4 */ virtual f32 getCcHeight() const {
+ return 0.0f;
+ }
+ /* vt 0xE8 */ virtual f32 getBgAcchCirRadius() const {
+ return 0.0f;
+ }
+ /* vt 0xEC */ virtual f32 getBgAcchCirHeight() const {
+ return 0.0f;
+ }
+ /* vt 0xF0 */ virtual f32 getPoscopy2YOffset() const {
+ return 0.0f;
+ }
+ /* vt 0xF4 */ virtual f32 getPoscopy3YOffset() const {
+ return 0.0f;
+ }
+ /* vt 0xF8 */ virtual f32 getDowsingUnusedF32() const {
+ return 1500.0f;
+ }
+ /* vt 0xFC */ virtual f32 getDowsingTargetYOffset() const {
+ return 50.0f;
+ }
+
+ /* 0x330 */ u8 _0x330[0x334 - 0x330];
+
+ /* 0x334 */ m3d::smdl_c *mpMdl;
+ /* 0x338 */ dShadowCircle_c mShadow;
+ /* 0x340 */ mQuat_c mShadowRot;
+ /* 0x350 */ dBgS_AcchCir mBgAcchCir;
+ /* 0x3AC */ dBgS_ObjAcch mBgObjAcch;
+ /* 0x75C */ dCcD_Cyl mCcCyl;
+ /* 0x8AC */ STATE_MGR_DECLARE(dAcSalbageObj_c);
+ /* 0x8E8 */ s32 mBehavior;
+ /* 0x8EC */ bool mIsDemoState;
+ /* 0x8F0 */ SalbageRelated mSalbageRelated;
+ /* 0x900 */ f32 field_0x900;
+ /* 0x904 */ s16 field_0x904;
+ /* 0x908 */ mMtx_c mWorldSRMtx;
+ /* 0x938 */ f32 field_0x938;
+ /* 0x93C */ DowsingTarget mDowsingTarget;
+ /* 0x95C */ mVec3_c field_0x95C;
+ /* 0x968 */ bool mIsDowsingRegistered;
+ /* 0x96C */ const sStateID_c *mpNextStateId;
+};
+
+#endif
diff --git a/include/d/a/npc/d_a_npc_salbage_robot.h b/include/d/a/npc/d_a_npc_salbage_robot.h
index b1267b30..f23d7dfb 100644
--- a/include/d/a/npc/d_a_npc_salbage_robot.h
+++ b/include/d/a/npc/d_a_npc_salbage_robot.h
@@ -1,13 +1,13 @@
#ifndef D_A_NPC_SALBAGE_ROBOT_H
#define D_A_NPC_SALBAGE_ROBOT_H
-#include "d/a/npc/d_a_npc.h"
+#include "d/a/npc/d_a_ordinary_npc.h"
+#include "m/m_mtx.h"
#include "s/s_State.hpp"
-#include "s/s_StateMgr.hpp"
-class dAcNpcSlb_c : public dAcNpc_c {
+class dAcNpcSlb_c : public dAcOrdinaryNpc_c {
public:
- dAcNpcSlb_c() : mStateMgr(*this, sStateID::null) {}
+ dAcNpcSlb_c() {}
virtual ~dAcNpcSlb_c() {}
STATE_FUNC_DECLARE(dAcNpcSlb_c, Hide);
@@ -16,8 +16,15 @@ public:
STATE_FUNC_DECLARE(dAcNpcSlb_c, Kill);
STATE_FUNC_DECLARE(dAcNpcSlb_c, Kill2);
+ // ouch
+ mMtx_c getCarriedObjMtx() const {
+ return mCarryObjMtx;
+ }
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcNpcSlb_c);
+ u8 _pad[0xD50 - sizeof(dAcOrdinaryNpc_c)];
+
+ /* 0xD50 */ mMtx_c mCarryObjMtx;
};
#endif
diff --git a/include/d/a/npc/d_a_npc_talk_kensei.h b/include/d/a/npc/d_a_npc_talk_kensei.h
new file mode 100644
index 00000000..614bb4a6
--- /dev/null
+++ b/include/d/a/npc/d_a_npc_talk_kensei.h
@@ -0,0 +1,16 @@
+#ifndef D_A_NPC_TALK_KENSEI_H
+#define D_A_NPC_TALK_KENSEI_H
+
+#include "d/a/npc/d_a_ordinary_npc.h"
+
+class dAcSalbageObj_c;
+
+class dAcNpcTalkKensei_c : public dAcOrdinaryNpc_c {
+public:
+ static dAcNpcTalkKensei_c *GetInstance();
+ void triggerSalvageQuestion(dAcSalbageObj_c *);
+
+private:
+};
+
+#endif
diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h
index 2b0c75d8..1f950092 100644
--- a/include/d/a/obj/d_a_obj_base.h
+++ b/include/d/a/obj/d_a_obj_base.h
@@ -18,6 +18,8 @@
#include "m/m_vec.h"
#include "m/types_m.h"
+class SalbageRelated;
+
// Ghidra: ActorObjectBase
// size: 0x330
@@ -52,7 +54,7 @@ public:
/* 0x210 */ dLinkage_c mLinkage;
/* 0x2B8 */ u32 mField_0x2B8;
/* 0x2BC */ ActorLighting mLightingInfo;
- /* 0x32C */ u32 mField_0x32C;
+ /* 0x32C */ SalbageRelated *mpSalbageRelated;
public:
mVec3_c &GetOldPosition() {
diff --git a/include/d/a/obj/d_a_obj_pot_sal.h b/include/d/a/obj/d_a_obj_pot_sal.h
index f9d6e50c..5a4a6e49 100644
--- a/include/d/a/obj/d_a_obj_pot_sal.h
+++ b/include/d/a/obj/d_a_obj_pot_sal.h
@@ -1,17 +1,18 @@
#ifndef D_A_OBJ_POT_SAL_H
#define D_A_OBJ_POT_SAL_H
-#include "d/a/obj/d_a_obj_base.h"
+#include "d/a/d_a_salbage_obj.h"
#include "s/s_State.hpp"
-#include "s/s_StateMgr.hpp"
-class dAcOpotSal_c : public dAcObjBase_c {
+class dAcOpotSal_c : public dAcSalbageObj_c {
public:
- dAcOpotSal_c() : mStateMgr(*this, sStateID::null) {}
+ dAcOpotSal_c() {}
virtual ~dAcOpotSal_c() {}
+ STATE_VIRTUAL_OVERRIDE_FUNC_DECLARE(dAcOpotSal_c, dAcSalbageObj_c, DemoThrow);
+ STATE_VIRTUAL_OVERRIDE_FUNC_DECLARE(dAcOpotSal_c, dAcSalbageObj_c, After);
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcOpotSal_c);
};
#endif
diff --git a/include/toBeSorted/attention.h b/include/toBeSorted/attention.h
index 96a8ed3e..45a59c8c 100644
--- a/include/toBeSorted/attention.h
+++ b/include/toBeSorted/attention.h
@@ -169,10 +169,10 @@ public:
private:
/* 0xBDC */ u8 field_0xBDC;
-
+
+public:
static AttentionManager *sInstance;
-public:
bool create();
bool createHeap();
bool execute();
diff --git a/include/toBeSorted/dowsing_target.h b/include/toBeSorted/dowsing_target.h
index d988e86c..90e1763f 100644
--- a/include/toBeSorted/dowsing_target.h
+++ b/include/toBeSorted/dowsing_target.h
@@ -2,7 +2,6 @@
#define DOWSING_TARGET_H
#include "d/a/d_a_base.h"
-#include "f/f_list_nd.h"
#include "m/m_vec.h"
class DowsingTarget {
@@ -32,6 +31,10 @@ public:
virtual ~DowsingTarget(); // 0x08
virtual void getPosition(mVec3_c &); // 0x0C
+ void setOffset(const mVec3_c &offset) {
+ mOffset = offset;
+ }
+
bool doRegister();
bool doUnregister();
void initialize(DowsingSlot type, u16 unk, const mVec3_c *offset, f32 f);
diff --git a/include/toBeSorted/salvage_mgr.h b/include/toBeSorted/salvage_mgr.h
new file mode 100644
index 00000000..3e268936
--- /dev/null
+++ b/include/toBeSorted/salvage_mgr.h
@@ -0,0 +1,39 @@
+#ifndef D_SALVAGE_MGR_H
+#define D_SALVAGE_MGR_H
+
+#include "common.h"
+#include "d/a/d_a_base.h"
+#include "m/m_mtx.h"
+
+class dAcSalbageObj_c;
+class dAcNpcSlb_c;
+
+class dSalvageMgr_c {
+public:
+ // Directly accessing seems to be required
+ // static dSalvageMgr_c *GetInstance() {
+ // return sInstance;
+ // }
+
+ bool checkDeliveredStoryflag(const s32& id) const;
+ bool startedQuestForSalvageObj(const dAcSalbageObj_c *obj) const;
+ bool hasDowsingForSalvageObj(const dAcSalbageObj_c *obj) const;
+ mMtx_c getCarryRotMtx(const s32 &id) const;
+ mMtx_c getCarryRotMtx2(const s32 &id) const {
+ return getCarryRotMtx(id);
+ }
+ s32 getCurrentSalvageObjId() const;
+ void deleteObjAndSlb();
+
+ static dSalvageMgr_c *sInstance;
+
+ bool hasObjAndSlb() const {
+ return mObjRef.isLinked() && mSlbRef.isLinked();
+ }
+
+ /* 0x00 */ dAcRef_c<dAcSalbageObj_c> mObjRef;
+ /* 0x0C */ dAcRef_c<dAcNpcSlb_c> mSlbRef;
+private:
+};
+
+#endif