Merge pull request #108 from robojumper/d_a_obj_tbox

dAcTbox_c
This commit is contained in:
robojumper
2024-11-28 10:52:31 +01:00
committed by GitHub
29 changed files with 3529 additions and 235 deletions
+2
View File
@@ -57,6 +57,8 @@ public:
*/
void prepend(cListNd_c *node);
void clear();
cListNd_c *getFirst() const {
return mpFirst;
}
+2 -1
View File
@@ -9,6 +9,7 @@
#include "toBeSorted/tlist.h"
class dAcBase_c;
struct cBgS_PolyInfo;
struct SoundSource {
// TODO
@@ -255,7 +256,7 @@ public:
/* 8002dd50 */ void FUN_8002dd50();
/* 8002dd90 */ void FUN_8002dd90();
/* 8002ddd0 */ void FUN_8002ddd0();
/* 8002de30 */ void FUN_8002de30();
/* 8002de30 */ void FUN_8002de30(cBgS_PolyInfo &p);
public:
/* 80571920 */ static u32 s_Create_RoomId;
+8
View File
@@ -55,6 +55,14 @@ public:
static int getTotalArrowCount();
static int getTotalSeedCount();
static bool isRupee(ITEM_ID item);
static bool isKeyPiece(ITEM_ID item);
static bool isTreasure(ITEM_ID item);
static bool getItemGetEventName(u16 item, const char **outName);
static void itemGetEventStart(dAcBase_c *);
static void itemGetEventEnd(dAcBase_c *);
private:
/* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system
/* 0x338 */ dShadowCircle_c mShdw;
+4 -1
View File
@@ -55,6 +55,9 @@ public:
virtual ~dAcPy_c();
void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD);
void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD);
// argument is always false in existing code, true doesn't seem to make a difference
void bonk(bool unk = false);
/* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD);
/* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD);
@@ -114,7 +117,7 @@ public:
/* vt 0x15C */ virtual void vt_0x15C();
/* vt 0x160 */ virtual void vt_0x160();
/* vt 0x164 */ virtual void vt_0x164();
/* vt 0x168 */ virtual void getCurrentAnimFrame();
/* vt 0x168 */ virtual f32 getCurrentAnimFrame() const;
/* vt 0x16C */ virtual void getFloatIfStruggling();
/* vt 0x170 */ virtual void isSwimming();
/* vt 0x174 */ virtual void isGustBellowsBeingBlown();
+8 -3
View File
@@ -18,7 +18,7 @@ class dBgS_Acch;
// Size: 0xA8
struct ActorCarryStruct {
/* 0x00 */ fLiNdBa_c actorLink;
/* 0x00 */ dAcRefBase_c actorLink;
/* 0x0C */ fLiNdBa_c *carriedActor;
/* 0x10 */ u32 carryFlags;
/* 0x14 */ int carryType;
@@ -32,7 +32,10 @@ struct ActorCarryStruct {
/* 0x90 */ f32 field_0x90;
/* 0x94 */ f32 field_0x94;
/* 0x98 */ f32 field_0x98;
/* 0x9C */ void *dtor; // ???
ActorCarryStruct();
/* vt 0x9C */
virtual ~ActorCarryStruct();
/* 0xA0 */ u32 field_0xA0;
/* 0xA4 */ u32 field_0xA4;
@@ -43,6 +46,8 @@ struct ActorCarryStruct {
void fn_80050EA0(dAcObjBase_c *);
void fn_800511E0(dAcObjBase_c *);
void fn_80051190(dAcObjBase_c *);
void fn_80050EB0(dAcObjBase_c *);
bool testCarryFlag(u32 flag) {
return (carryFlags & flag) != 0;
@@ -215,7 +220,7 @@ public:
if (!result) \
return result; \
} while (0)
// Use this in actors' createHeap functions
// Use this in actors' create functions
#define CREATE_ALLOCATOR(className) \
do { \
if (!initAllocatorWork1Heap(-1, #className "::m_allocator", 0x20)) { \
+212
View File
@@ -0,0 +1,212 @@
#ifndef D_A_OBJ_TBOX_H
#define D_A_OBJ_TBOX_H
#include "common.h"
#include "d/a/d_a_base.h"
#include "d/a/d_a_item.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_w.h"
#include "d/col/cc/d_cc_d.h"
#include "d/d_cc.h"
#include "d/d_shadow.h"
#include "m/m3d/m_anmchr.h"
#include "m/m3d/m_anmmatclr.h"
#include "m/m3d/m_anmmdl.h"
#include "m/m3d/m_anmtexpat.h"
#include "m/m3d/m_anmtexsrt.h"
#include "m/m3d/m_scnleaf.h"
#include "m/m3d/m_smdl.h"
#include "m/m_vec.h"
#include "nw4r/ut/ut_Color.h"
#include "s/s_State.hpp"
#include "toBeSorted/actor_event.h"
#include "toBeSorted/attention.h"
#include "toBeSorted/dowsing_target.h"
#include "toBeSorted/stage_render_stuff.h"
class dAcTbox_c : public dAcObjBase_c {
public:
enum TboxVariant_e {
NORMAL,
SMALL,
BOSS,
GODDESS,
};
dAcTbox_c();
virtual ~dAcTbox_c();
virtual bool createHeap() override;
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int actorExecuteInEvent() override;
virtual int draw() override;
virtual void registerInEvent() override;
virtual void unkVirtFunc_0x6C() override;
virtual void doInteraction(s32) override;
virtual void *getObjectListEntry() override;
STATE_FUNC_DECLARE(dAcTbox_c, DugOut);
STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear);
STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear);
STATE_FUNC_DECLARE(dAcTbox_c, WaitOpen);
STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOff);
STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOn);
STATE_FUNC_DECLARE(dAcTbox_c, DeleteArchive);
STATE_FUNC_DECLARE(dAcTbox_c, LoadArchive);
STATE_FUNC_DECLARE(dAcTbox_c, Open);
STATE_FUNC_DECLARE(dAcTbox_c, PresentItem);
STATE_FUNC_DECLARE(dAcTbox_c, Close);
STATE_FUNC_DECLARE(dAcTbox_c, Wait);
STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait);
private:
static f32 getSomeRate();
bool initBgW(dBgW &bg, const char *arcName, const char *fileName);
bool isNotSmall() const;
void setItemId(u16 item);
void setChestFlag();
void setDoObstructionCheck();
int isActualVisibleBox() const;
void fn_8026B380(mVec3_c &outResult) const;
const mVec3_c &fn_8026B3C0() const;
bool noObstructionCheck() const;
int fn_8026B370() const;
bool fn_8026D670() const;
bool getSomeCounter(u32 *outIndex) const;
bool checkTboxFlag() const;
bool fn_8026D560() const;
bool isItemRupee() const;
void getDowsingTargetOffset(mVec3_c *offset) const;
void initDowsingTarget(DowsingTarget *target, DowsingTarget::DowsingSlot slot, mVec3_c *offset);
void initDowsingTarget(DowsingTarget::DowsingSlot slot);
void initDowsingTargetCube();
void registerRupeeOrTreasureDowsing();
void registerKeyPieceDowsing();
void unregisterDowsing();
void noRegisterDowsing();
void noUnregisterDowsing();
bool checkForLinkBonk();
void fn_8026E630();
bool fn_8026D540();
void fn_8026D3C0();
void syncScaleToMdl(m3d::scnLeaf_c *lf);
void getCCBounds(mVec3_c *out1, mVec3_c *out2) const;
void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3) const;
void fn_8026DAD0(const mVec3_c *src, mVec3_c *dest) const;
void fn_8026DAC0(mAng &ang);
static bool hasCollectedAllTears();
static bool isValidVariant(int variant);
static bool tryGetDowsingTargetOffset(int variant, mVec3_c &out);
static void getDowsingTargetOffset(int variant, mVec3_c &out);
static bool isValidGroupIndex(int idx);
static bool getGroundHeight(f32 *height, const mVec3_c &pos);
static bool isBelowGroundAtPos(f32 height, const mVec3_c &pos);
void setActionState();
void setFlags(u32 flags);
bool fn_8026D120() const;
void fn_8026D130();
void fn_8026D140();
void spawnAppearEffect();
void fn_8026D370();
bool checkShouldClose();
void setShouldCloseFlag();
void unsetShouldCloseFlag();
void setTboxFlag();
bool checkIsClear() const;
const InteractionTargetDef &getInteractionTargetDef() const;
/* 0x0330 */ m3d::mdlAnmChr mMdl1;
/* 0x0398 */ m3d::smdl_c mOpenFxMdl;
/* 0x03B4 */ m3d::anmMatClr_c mAnmMatClr1;
/* 0x03E0 */ m3d::anmMatClr_c mAnmMatClr2;
/* 0x040C */ m3d::anmChr_c mAnmChr;
/* 0x0444 */ m3d::anmTexSrt_c mAnmTexSrt1;
/* 0x0470 */ m3d::anmTexSrt_c mAnmGoddessTexSrt;
/* 0x049C */ m3d::anmTexPat_c mAnmGoddessPat;
/* 0x04C8 */ dScnCallback_c mScnCallback;
/* 0x04D4 */ dShadowCircle_c mShadowCircle;
// Could be part of an aggregate structure
mVec3_c field_0x4DC;
nw4r::ut::Color field_0x4E8;
f32 field_0x4EC;
s32 field_0x4F0;
s32 field_0x4F4;
/* 0x04F8 */ dBgW mBgWs[2];
/* 0x0918 */ dCcD_Linked_Unk mCcD1;
/* 0x0B30 */ dCcD_Linked_Unk mCcD2;
/* 0x0D48 */ dColliderLinkedList field_0x0D48;
/* 0x0D54 */ dCcD_Unk mCcD3;
/* 0x0F5C */ dCcD_Cyl mCcD4;
/* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c);
/* 0x10E8 */ fLiNdBa_c mTboxListNode;
/* 0x10F4 */ ActorEventRelated mEvent;
/* 0x1144 */ dAcRef_c<dAcItem_c> mItemRef;
/* 0x1150 */ DowsingTarget mDowsingTarget;
/* 0x1170 */ DowsingTarget mGoddessDowsingTarget;
/* 0x1190 */ void (dAcTbox_c::*mRegisterDowsingTarget)();
/* 0x119C */ void (dAcTbox_c::*mUnregisterDowsingTarget)();
/* 0x11A8 */ u8 field_0x11A8[0x11C0 - 0x11A8];
/* 0x11C0 */ mVec3_c field_0x11C0;
/* 0x11CC */ mVec3_c field_0x11CC;
/* 0x11D8 */ mVec3_c field_0x11D8;
/* 0x11E4 */ u8 field_0x11E4[0x11E8 - 0x11E4];
/* 0x11E8 */ f32 field_0x11E8;
/* 0x11EC */ f32 field_0x11EC;
/* 0x11F0 */ UNKWORD field_0x11F0;
/* 0x11F4 */ UNKWORD field_0x11F4;
/* 0x11F8 */ UNKWORD field_0x11F8;
/* 0x11FC */ UNKWORD field_0x11FC;
/* 0x1200 */ u16 mItemId;
/* 0x1202 */ u16 mItemModelIdx;
/* 0x1204 */ bool mHasBeenOpened;
/* 0x1205 */ u8 mSpawnSceneFlag;
/* 0x1206 */ u8 mSetSceneFlag; // set when?
/* 0x1207 */ u8 field_0x1207;
/* 0x1208 */ u8 field_0x1208;
/* 0x1209 */ u8 mVariant;
/* 0x120A */ u8 field_0x120A;
/* 0x120B */ u8 field_0x120B;
/* 0x120C */ u8 field_0x120C;
/* 0x120D */ u8 field_0x120D;
/* 0x120E */ u8 field_0x120E;
/* 0x120F */ bool field_0x120F;
/* 0x1210 */ bool field_0x1210;
/* 0x1211 */ bool mDoObstructedCheck;
static const cCcD_SrcGObj sColSrc;
static fLiMgBa_c sTboxActorList;
};
#endif
+18
View File
@@ -883,6 +883,12 @@ public:
u32 ChkAtNoGaurd() const {
return mAt.MskSPrm(0x200000);
}
void SetAt_0x40000000() {
mAt.OnSPrm(0x40000000);
}
u32 ChkAt_0x40000000() {
return mAt.MskSPrm(0x40000000);
}
// Tg
@@ -908,6 +914,12 @@ public:
void SetTgInfo_0x2(u16 val) {
mTg.SetInfo_0x2(val);
}
void SetTg_0x40000000() {
mTg.OnSPrm(0x40000000);
}
u32 ChkTg_0x40000000() {
return mTg.MskSPrm(0x40000000);
}
// Co
@@ -929,6 +941,12 @@ public:
void SetCo_0x400() {
mCo.OnSPrm(0x400);
}
void SetCo_0x40000000() {
mCo.OnSPrm(0x40000000);
}
u32 ChkCo_0x40000000() {
return mCo.MskSPrm(0x40000000);
}
/**
* SET HIT
+3
View File
@@ -83,6 +83,9 @@ public:
virtual cCcD_ShapeAttr *GetShapeAttr() override;
// Have to bring these in scope. Consider renaming this
// Set function instead or create an inline?
using cM3dGUnk::Set;
void Set(const dCcD_SrcUnk &src);
};
+101
View File
@@ -0,0 +1,101 @@
#ifndef D_CC_H
#define D_CC_H
#include "c/c_list.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_d.h"
class LinkedColliderNode : public cListNd_c {
public:
LinkedColliderNode(cCcD_Obj *obj) : mpList(nullptr), mpCcDObj(obj) {}
void remove() {
if (mpList != nullptr) {
mpList->remove(this);
mpList = nullptr;
}
}
/* 0x08 */ cCcD_Obj *mpCcDObj;
/* 0x0C */ cListMg_c *mpList;
};
class dCcD_Linked_Unk : public dCcD_Unk {
public:
dCcD_Linked_Unk() : mNode(this) {}
virtual ~dCcD_Linked_Unk() {
mNode.remove();
}
/* 0x210 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Cyl : public dCcD_Cyl {
public:
dCcD_Linked_Cyl() : mNode(this) {}
virtual ~dCcD_Linked_Cyl() {
mNode.remove();
}
/* 0x150 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Sph : public dCcD_Sph {
public:
dCcD_Linked_Sph() : mNode(this) {}
virtual ~dCcD_Linked_Sph() {
mNode.remove();
}
/* 0x150 */ LinkedColliderNode mNode;
};
class dCcD_Linked_Cps : public dCcD_Cps {
public:
dCcD_Linked_Cps() : mNode(this) {}
virtual ~dCcD_Linked_Cps() {
mNode.remove();
}
/* 0x170 */ LinkedColliderNode mNode;
};
class dColliderLinkedList {
private:
cListMg_c mList;
static void Set(cCcD_Obj *obj, void *cbArg);
static void SetStts(cCcD_Obj *obj, void *cbArg);
static void AtSet(cCcD_Obj *obj, void *cbArg);
static void ClrAt(cCcD_Obj *obj, void *cbArg);
static void TgSet(cCcD_Obj *obj, void *cbArg);
static void ClrTg(cCcD_Obj *obj, void *cbArg);
static void CoSet(cCcD_Obj *obj, void *cbArg);
static void ClrCo(cCcD_Obj *obj, void *cbArg);
public:
virtual ~dColliderLinkedList();
void postInit(cCcD_Obj &ccD);
void addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src);
void addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src);
void addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src);
void addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src);
void SetStts(cCcD_Stts &stts);
void registerColliders();
typedef void (*ccCbFunc)(cCcD_Obj *obj, void *cbArg);
void foreachCc(ccCbFunc f, void *cbArg) const;
void foreachCc2(ccCbFunc f, void *cbArg) const;
// This find function is used by a lot of other
// TUs, all of which own the function passed as
// a ptmf. It's not immediately clear how this works,
// does every actor subclass the LinkedCollider___,
// or are the functions all added here for the other
// files to implement?
typedef bool (cCcD_Obj::*ccPtmf)();
cCcD_Obj *find(ccPtmf f) const;
void AtSet();
void ClrAt();
void TgSet();
void ClrTg();
void CoSet();
void ClrCo();
};
#endif
+1 -1
View File
@@ -21,7 +21,7 @@ public:
virtual ~TBoxflagManager() {}
void init();
void copyFromSave(u32 sceneIndex);
bool checkFlag(u16 sceneIndex, u16 flag);
u16 checkFlag(u16 sceneIndex, u16 flag);
virtual u16 getFlagCount() const;
void setFlag(u16 flag);
bool checkUncommittedFlag(u16 sceneIndex, u16 flag);
@@ -19,7 +19,7 @@ public:
bool checkIfObjectArcExistsOnDisk(const char *object);
bool loadObjectArcFromDisk(const char *object, EGG::Heap *heap);
bool addEntryFromSuperArc(const char *object, void *data, EGG::Heap *heap);
void ensureLoaded1(const char *object);
int ensureLoaded1(const char *object);
void ensureLoaded2(const char *object);
bool decrement(const char *path);
void *getData(const char *oarcName, const char *fileName);
@@ -0,0 +1,27 @@
#ifndef BLUR_AND_PALETTE_MANAGER_H
#define BLUR_AND_PALETTE_MANAGER_H
#include "common.h"
#include "m/m_vec.h"
class BlurAndPaletteManager {
public:
static BlurAndPaletteManager &GetInstance() {
return sInstance;
}
void fn_800247D0(mVec3_c, f32);
void fn_80022AF0(f32);
void setField_0x2F20(f32 arg) {
field_0x2F20 = arg;
}
void fn_800223A0(void *);
void fn_80022440(void *);
private:
u8 field_0x0000[0x2F20 - 0x0000];
f32 field_0x2F20;
static BlurAndPaletteManager sInstance;
};
#endif
+1 -1
View File
@@ -16,4 +16,4 @@ public:
u16 counterId;
};
#endif COUNTER_H
#endif
@@ -0,0 +1,19 @@
#ifndef GODDESS_CHEST_COUNTER_H
#define GODDESS_CHEST_COUNTER_H
#include "toBeSorted/counters/counter.h"
class GoddessChestCounter : public Counter {
public:
GoddessChestCounter() : Counter(0x43F) {}
virtual ~GoddessChestCounter() {};
virtual u16 getCommittedValue() override;
virtual u16 getMax() override;
virtual u16 getUncommittedValue() override;
virtual void setValue(u16 num) override;
static GoddessChestCounter sInstance;
};
#endif
+2 -1
View File
@@ -16,8 +16,9 @@ public:
public:
/** 0x800A0C40 */
Event(char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2);
Event(const char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2);
Event(u32 eventId, s32 roomId, u32 eventFlags, void *callback1, void *callback2);
Event(const char *eventName, void *zevDat, u32 unk, u32 eventFlags, void *callback1, void *callback2);
/** 0x800A1240 */
virtual ~Event();
};
+1
View File
@@ -12,6 +12,7 @@ class EventManager {
public:
static bool isInEvent(dAcBase_c *actor, const char *eventName);
static bool finishEvent(dAcBase_c *actor, const char *eventName);
static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD);
static bool alsoSetAsCurrentEvent(dAcBase_c *actor, Event *event, void *unknown);
static EventManager *sInstance;
+4
View File
@@ -60,6 +60,10 @@ public:
char _7[3];
bool hasAnmTexPat;
bool didAlreadyInit;
bool checkFlag(u32 flag) {
return flags & flag;
}
};
class dRoomTable {