* Dowsing.

* d_t_dowsing

* d_t_holy_water OK
This commit is contained in:
robojumper
2024-09-12 22:23:11 +02:00
committed by GitHub
parent 9aa30ee499
commit e2c4bb7be7
40 changed files with 1041 additions and 160 deletions
+1 -15
View File
@@ -10,6 +10,7 @@
#include "m/m_angle.h"
#include "m/m_vec.h"
#include "toBeSorted/room_manager.h"
#include "toBeSorted/tlist.h"
class dAcBase_c;
@@ -60,21 +61,6 @@ public:
}
};
template <typename T, int offset>
struct TList {
T *GetOffset() {
return (T *)((u8 *)this - offset);
}
TList() {
sound_info_next = GetOffset();
sound_info_tail = GetOffset();
count = 0;
}
T *sound_info_tail;
T *sound_info_next;
s32 count;
};
// Ghidra: ActorBase
// size: 0xFC
// non-official name
+3 -3
View File
@@ -7,9 +7,9 @@
class dPlayer: public dAcObjBase_c {
public:
/* 0x330 */ u8 unk_0x330[0x350 - 0x330];
/* 0x350 */ u32 someFlags;
/* 0x350 */ u32 someFlags_0x350;
u8 UNK_0x354[0x35C - 0x354];
/* 0x35C */ u32 mForceOrPreventActionFlags;
static dPlayer *LINK;
};
+66
View File
@@ -0,0 +1,66 @@
#ifndef D_T_DOWSING_H
#define D_T_DOWSING_H
#include <d/tg/d_tg.h>
#include <toBeSorted/dowsing_target.h>
class dTgDowsing_c : public dTg_c {
public:
dTgDowsing_c();
virtual ~dTgDowsing_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
bool checkDowsing() const;
private:
enum DowsingOption {
TRIAL_0,
TRIAL_1,
TRIAL_2,
TRIAL_3,
PROPELLER,
WATER_BASIN,
CRYSTAL_BALL,
PUMPKIN,
NEW_PLANT_SPECIES,
PARTY_WHEEL,
ZELDA,
DOWSING_MAX
};
DowsingTarget mDowsingTarget; // 0x0FC
DowsingOption mDowsingOption; // 0x11C
u16 mUntriggerStoryFlag; // 0x120
u16 mTriggerStoryFlag; // 0x122
bool mTargetActive; // 0x124
u16 getTriggerSceneFlag() {
return params & 0xFF;
}
u16 getUntriggerSceneFlag() {
return params >> 0x8 & 0xFF;
}
DowsingOption getDowsingOption() {
return (DowsingOption)(params >> 0x10 & 0xF);
}
u32 getDowsingOptionNum() {
return mDowsingOption;
}
u16 getUntriggerStoryFlag() {
return params >> 0x14 & 0x7FF;
}
u16 getTriggerStoryFlag() {
return rotation.z.mVal & 0x7FF;
}
};
#endif
+23
View File
@@ -0,0 +1,23 @@
#ifndef D_T_GENKI_DWS_TGT_H
#define D_T_GENKI_DWS_TGT_H
#include <d/tg/d_tg.h>
#include <toBeSorted/dowsing_target.h>
class dTgGenkiDwsTgt_c : public dTg_c {
public:
dTgGenkiDwsTgt_c() : mDowsingTarget(this, DowsingTarget::SLOT_NONE) {}
virtual ~dTgGenkiDwsTgt_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
private:
u16 getSceneFlagFromParams();
DowsingTarget mDowsingTarget; // 0xFC
};
#endif
+24
View File
@@ -0,0 +1,24 @@
#ifndef D_T_HOLY_WATER_H
#define D_T_HOLY_WATER_H
#include <d/tg/d_tg.h>
#include <toBeSorted/dowsing_target.h>
class dTgHolyWater_c : public dTg_c {
public:
dTgHolyWater_c() : mDowsingTarget(this, DowsingTarget::SLOT_NONE) {}
virtual ~dTgHolyWater_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
bool isLinkNearby();
bool dowsingActive();
private:
DowsingTarget mDowsingTarget; // 0x0FC
};
#endif
+5
View File
@@ -7,6 +7,11 @@ class dTgLightShaftEff_c : public dTg_c {
public:
dTgLightShaftEff_c() {}
virtual ~dTgLightShaftEff_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
};
#endif
+3
View File
@@ -9,6 +9,9 @@ public:
virtual ~dTgMapInst_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
u8 field_0xfc;
};
+5
View File
@@ -7,6 +7,11 @@ class dTgTackle_c : public dTg_c {
public:
dTgTackle_c() {}
virtual ~dTgTackle_c() {}
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
};
#endif
-12
View File
@@ -6,18 +6,6 @@
class dTg_c : public dAcBase_c {
public:
virtual ~dTg_c() {}
virtual int draw() override {
return 1;
}
virtual int actorExecute() override {
return 1;
}
virtual int doDelete() override {
return 1;
}
virtual int create() override {
return 1;
}
};
#endif
+13 -1
View File
@@ -122,7 +122,7 @@ public:
/// @brief Scalar product operator.
mVec3_c operator*(f32 f) const {
return mVec3_c(f * x, f * y, f * z);
return mVec3_c(x * f, y * f, z * f);
}
/// @brief Scalar division operator.
@@ -140,6 +140,18 @@ public:
bool operator!=(const mVec3_c &v) const {
return x != v.x || y != v.y || z != v.z;
}
void normalize();
bool normalizeRS();
inline f32 mag() const {
return PSVECMag(*this);
}
static mVec3_c Zero;
static mVec3_c Ex;
static mVec3_c Ey;
static mVec3_c Ez;
};
#endif
+71
View File
@@ -0,0 +1,71 @@
#ifndef DOWSING_TARGET_H
#define DOWSING_TARGET_H
#include <d/a/d_a_base.h>
#include <f/f_list_nd.h>
#include <m/m_vec.h>
class DowsingTarget {
public:
TListNode mLink; // 0x00
private:
dAcBase_c *mpActor; // 0x08
u8 mDowsingSlot; // 0x0C
u16 field_0x0E; // 0x0E
mVec3_c mOffset; // 0x10
public:
enum DowsingSlot {
SLOT_STORY_EVENT = 0,
SLOT_RUPEE = 1,
SLOT_QUEST = 2,
SLOT_CRYSTAL = 3,
SLOT_HEART = 4,
SLOT_GODDESS_CUBE = 5,
SLOT_LOOK = 6,
SLOT_TREASURE = 7,
SLOT_NONE = 8,
};
DowsingTarget(dAcBase_c *ac, u8 dowsingSlot) : mpActor(ac), mDowsingSlot(dowsingSlot) {}
// vt offset 0x1C
virtual ~DowsingTarget(); // 0x08
virtual void getPosition(mVec3_c &); // 0x0C
bool doRegister();
bool doUnregister();
void initialize(DowsingSlot type, u16 unk, const mVec3_c *offset, f32 f);
void reinitialize(DowsingSlot type);
inline DowsingSlot getSlot() {
return (DowsingSlot)mDowsingSlot;
}
static bool hasZeldaDowsing();
static bool hasKikwiDowsing();
static bool hasKeyPieceDowsing();
static bool hasDesertNodeDowsing();
static bool hasAnyTrialDowsing();
static bool hasSacredWaterDowsing();
static bool hasSandshipDowsing();
static bool hasTadtoneDowsing();
static bool hasPropellerDowsing();
static bool hasWaterBasinDowsing();
static bool hasCrystalBallDowsing();
static bool hasPumpkinDowsing();
static bool hasNewPlantSpeciesDowsing();
static bool hasPartyWheelDowsing();
static bool hasDowsingInSlot(int slot);
static DowsingTarget *getDowsingInfo(const mVec3_c &playerPosition, const mVec3_c &dowsingDirection, f32 *, f32 *,
f32 *intensity, int slot);
static void init();
static void execute();
static u8 getTopDowsingIcon();
static u8 getLeftDowsingIcon();
};
#endif
@@ -0,0 +1,46 @@
#ifndef ITEM_STORY_FLAG_MANAGER_H
#define ITEM_STORY_FLAG_MANAGER_H
#include <toBeSorted/flag_space.h>
#include <toBeSorted/unk_flag_stuff.h>
// TODO These classes have an interesting relation and there are like 5 vtables, so
// the stuff in this header should not be relied upon for actually implementing these,
// but we need the interface
class ItemStoryManagerBase {
public:
ItemStoryManagerBase();
/** 0x08 */ virtual ~ItemStoryManagerBase();
/** 0x0C */ virtual void setFlagszptr();
/** 0x10 */ virtual void onDirty();
/** 0x14 */ virtual void copyFlagsFromSave() = 0;
/** 0x18 */ virtual void setupUnkFlagsStuff() = 0;
/** 0x1C */ virtual bool doCommit() = 0;
/** 0x20 */ virtual void setFlag(u16 flag);
/** 0x24 */ virtual void unsetFlag(u16 flag);
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value);
/** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const;
/** 0x30 */ virtual u16 getUncommittedValue(u16 flag);
/** 0x34 */ virtual void unk3();
/** 0x38 */ virtual u16 *getSaveFlagSpace() = 0;
u16 getFlag(u16 flag) const;
};
class StoryFlagManager : public ItemStoryManagerBase {
FlagSpace storyFlags;
public:
static StoryFlagManager *sInstance;
};
class ItemFlagManager : public ItemStoryManagerBase {
FlagSpace itemFlags;
public:
static ItemFlagManager *sInstance;
};
#endif
+3 -3
View File
@@ -21,7 +21,7 @@ class dRoomCollision {
char todo[352];
};
class dRoom : dBase_c {
class dRoom : public dBase_c {
public:
mAllocator_c allocator;
nw4r::g3d::ResFile *roomRes;
@@ -94,8 +94,8 @@ public:
/* 80575760 */ static RoomManager *m_Instance;
public:
dRoom *GetRoomByIndex(int roomid);
/* 801b42b0 */ static dBase_c *getRoom(int roomid);
/* 801b3970 */ dRoom *GetRoomByIndex(int roomid);
/* 801b42b0 */ static dRoom *getRoom(int roomid);
/* 801b42d0 */ static void bindStageResToFile(nw4r::g3d::ResFile *);
/* 801b4320 */ static void bindSkyCmnToResFile(nw4r::g3d::ResFile *);
/* 801b4380 */ static bool getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *, char *);
+5
View File
@@ -58,6 +58,11 @@ public:
void unsetSceneflagGlobal(u16 sceneIdx, u16 flag);
void unsetTempOrSceneflag(u16 flag);
s32 doCommit();
bool checkBoolFlag(u16 roomid, u16 flag) {
return checkFlag(roomid, flag);
}
};
#endif
+4
View File
@@ -13,6 +13,10 @@ struct SpawnInfo {
/* 0x26 */ s8 trial;
/* 0x27 */ s8 transitionType;
/* 0x28 */ s32 unk;
bool isNight() {
return night == 1;
}
};
class ScGame {
+130
View File
@@ -0,0 +1,130 @@
#ifndef T_LIST_H
#define T_LIST_H
// A templated list, similar to nw4r::ut::LinkList.
// Notable differences are:
// * No dtor
// * Entirely in headers
// * Swapped node and count members
// Used in DowsingTarget, maybe also in dAcBase_c.soundStuff
// It's not immediately clear whether this stores pointers to nodes
// or pointers to objects. DowsingTarget's node offset is 0, so there's
// no observable difference, but the SoundSource stuff makes it
// look like it stores object pointers
class TListNode {
public:
TListNode() : mpPrev(nullptr), mpNext(nullptr) {}
void *GetNext() const {
return mpNext;
}
void *GetPrev() const {
return mpPrev;
}
void *mpPrev;
void *mpNext;
};
template <typename T, int offset>
class TList {
public:
class Iterator {
public:
Iterator() : mNode(NULL) {}
Iterator(TListNode *node) : mNode(node) {}
Iterator &operator++() {
mNode = GetNodeFromPointer(mNode->GetNext());
return *this;
}
Iterator &operator--() {
mNode = mNode->GetPrev();
return *this;
}
T *operator->() const {
return GetPointerFromNode(mNode);
}
T &operator*() {
return *this->operator->();
}
friend bool operator==(Iterator lhs, Iterator rhs) {
return lhs.mNode == rhs.mNode;
}
friend bool operator!=(Iterator lhs, Iterator rhs) {
return !(lhs.mNode == rhs.mNode);
}
private:
TListNode *mNode; // at 0x0
};
TList() {
this->mNode.mpNext = GetPointerFromNode(&mNode);
this->mNode.mpPrev = GetPointerFromNode(&mNode);
mCount = 0;
}
Iterator GetBeginIter() {
return GetNodeFromPointer(&mNode) != mNode.GetNext() ? Iterator(GetNodeFromPointer(mNode.GetNext())) :
Iterator(&mNode);
}
Iterator GetEndIter() {
return Iterator(&mNode);
}
static TListNode *GetNodeFromPointer(void *p) {
return reinterpret_cast<TListNode *>(reinterpret_cast<char *>(p) + offset);
}
static T *GetPointerFromNode(TListNode *node) {
return reinterpret_cast<T *>(reinterpret_cast<char *>(node) - offset);
}
void insert(T *value) {
TListNode *node = GetNodeFromPointer(value);
if (GetPointerFromNode(&mNode) == this->mNode.mpNext) {
node->mpNext = GetPointerFromNode(&mNode);
node->mpPrev = GetPointerFromNode(&mNode);
this->mNode.mpNext = value;
this->mNode.mpPrev = value;
mCount++;
} else {
node->mpPrev = this->mNode.mpPrev;
node->mpNext = GetPointerFromNode(&mNode);
GetNodeFromPointer(this->mNode.mpPrev)->mpNext = value;
this->mNode.mpPrev = value;
mCount++;
}
}
void remove(T *value) {
TListNode *node = GetNodeFromPointer(value);
T *next = reinterpret_cast<T *>(node->mpNext);
if (GetPointerFromNode(&mNode) == node->mpPrev) {
this->mNode.mpNext = next;
} else {
GetNodeFromPointer(node->mpPrev)->mpNext = next;
}
if (GetPointerFromNode(&mNode) == node->mpNext) {
this->mNode.mpPrev = node->mpPrev;
} else {
GetNodeFromPointer(node->mpNext)->mpPrev = node->mpPrev;
}
node->mpPrev = nullptr;
node->mpNext = nullptr;
mCount--;
}
TListNode mNode;
s32 mCount;
};
#endif