d_stage progress

This commit is contained in:
robojumper
2025-03-08 18:54:53 +01:00
parent 03c99fc37c
commit c558c88f25
37 changed files with 885 additions and 200 deletions
+163
View File
@@ -0,0 +1,163 @@
#ifndef D_STAGE_TYPES_H
#define D_STAGE_TYPES_H
#include "common.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
// Size 0x20
struct AREA {
/* 0x00 */ mVec3_c mPos;
/* 0x0C */ mVec3_c mScale;
/* 0x18 */ mAng mAngleY;
/* 0x1A */ mAng mAngleLink;
/* 0x1C */ u8 field_0x1C;
};
// TODO: double check, copied from ss-tools
// Size 0x28
struct BPNT {
/* 0x00 */ mVec3_c position1;
/* 0x0C */ mVec3_c position2;
/* 0x18 */ mVec3_c position3;
/* 0x24 */ u8 _0x24[4];
};
// TODO: double check, copied from ss-tools
// Size 0x2C
struct CAM {
/* 0x00 */ u8 _0x00[4];
/* 0x04 */ mVec3_c position;
/* 0x10 */ f32 angle;
/* 0x14 */ u8 _0x14[8];
/* 0x1C */ char name[16];
};
// Size 0x38
struct EVNT {
/* 0x00 */ u8 _0x00[2];
/* 0x02 */ u16 storyFlag1;
/* 0x04 */ u16 storyFlag2;
/* 0x06 */ u8 _0x06[3];
/* 0x09 */ u8 exitId;
/* 0x0A */ u8 _0x0A[3];
/* 0x0D */ u8 skipEvent;
/* 0x0E */ u8 _0x0E[1];
/* 0x0F */ u8 sceneFlag1;
/* 0x10 */ u8 sceneFlag2;
/* 0x11 */ u8 skipFlag;
/* 0x12 */ u8 _0x12[2];
/* 0x14 */ u16 item;
/* 0x16 */ u16 _0x16[2];
/* 0x18 */ char name[32];
};
// Size 0x04
struct LYLT {
/* 0x0 */ u8 layer;
/* 0x1 */ u8 demoHigh;
/* 0x2 */ u8 demoLow;
/* 0x3 */ u8 dummy;
};
// Size 0x04
struct LYSE {
/* 0x0 */ u16 storyFlag;
/* 0x2 */ u8 night;
/* 0x3 */ u8 layer;
};
// Size 0x24
struct OBJ {
/* 0x00 */ u32 params1;
/* 0x04 */ u32 params2;
/* 0x08 */ mVec3_c position;
/* 0x14 */ mAng3_c angle;
/* 0x1A */ u16 id;
/* 0x1C */ char name[8];
};
// Size 0xC
struct PATH {
/* 0x00 */ u8 field_0x00;
/* 0x01 */ u8 field_0x01;
/* 0x02 */ u16 pointStartIndex;
/* 0x04 */ u16 pointCount;
/* 0x06 */ u8 _0x06[4];
/* 0x0A */ u8 firstBitIsWrapAround;
/* 0x0B */ u8 _0x0B[1];
};
// Size 0x24
struct PCAM {
/* 0x00 */ mVec3_c position1;
/* 0x0C */ mVec3_c position2;
/* 0x18 */ f32 field_0x18;
/* 0x1C */ f32 field_0x1C;
/* 0x20 */ u8 id;
/* 0x21 */ u8 _0x21[3];
};
// Size 0x18
struct PLY {
/* 0x00 */ u16 storyFlag;
/* 0x02 */ u8 playCutscene;
/* 0x03 */ u8 _0x03[1];
/* 0x04 */ mVec3_c position;
/* 0x10 */ mAng3_c angle;
/* 0x16 */ u16 entranceId;
};
// Size 0x10
struct PNT {
/* 0x00 */ mVec3_c position;
/* 0x0C */ u8 _0x0C[4];
};
// Size 0x4
struct RMPL {
/* 0x0 */ u8 roomId;
/* 0x1 */ u8 count;
/* 0x2 */ u16 offset;
};
// Size 0x28
struct SCEN {
/* 0x00 */ char name[32];
/* 0x20 */ u8 room;
/* 0x21 */ u8 layer;
/* 0x22 */ u8 entrance;
/* 0x23 */ u8 night;
/* 0x24 */ u8 transitionType;
/* 0x25 */ u8 transitionFadeFrames;
/* 0x26 */ u8 zero;
/* 0x27 */ u8 savePrompt;
};
// Size 0x30
struct SOBJ {
/* 0x00 */ u32 params1;
/* 0x04 */ u32 params2;
/* 0x08 */ mVec3_c position;
/* 0x14 */ mVec3_c scale;
/* 0x20 */ mAng3_c angle;
/* 0x26 */ u16 id;
/* 0x28 */ char name[8];
};
// Size 0x14
struct STIF {
/* 0x00 */ f32 field_0x00;
/* 0x04 */ f32 field_0x04;
/* 0x08 */ f32 defaultCullingDistance;
/* 0x0C */ u16 flagIndex;
/* 0x0E */ u8 areaType;
/* 0x0F */ u8 field_0x0F;
/* 0x10 */ u8 field_0x10;
/* 0x11 */ u8 field_0x11;
/* 0x12 */ u8 mapNameId;
/* 0x13 */ u8 field_0x13;
};
#endif
+4
View File
@@ -59,6 +59,10 @@ public:
mFadeInFrame = frame;
}
void setFadeOutFrame(u16 frame) {
mFadeOutFrame = frame;
}
private:
/* 0x08 */ mColorFader_c *mpColorFader;
/* 0x0C */ dLytFader_c *mpLytFader;
+17 -16
View File
@@ -5,6 +5,7 @@
#include "d/a/d_a_base.h"
#include "d/col/bg/d_bg_w_kcol.h"
#include "d/d_base.h"
#include "d/d_bzs_types.h"
#include "m/m3d/m_anmmatclr.h"
#include "m/m3d/m_anmtexpat.h"
#include "m/m3d/m_anmtexsrt.h"
@@ -115,13 +116,13 @@ public:
dRoom_c()
: mStateMgr(*this, sStateID::null),
field_0x15C(nullptr),
SCEN(nullptr),
PLY(nullptr),
CAM(nullptr),
EVNT(nullptr),
PATH(nullptr),
PNT(nullptr),
BPNT(nullptr),
scen(nullptr),
ply(nullptr),
cam(nullptr),
evnt(nullptr),
path(nullptr),
pnt(nullptr),
bpnt(nullptr),
AREA(nullptr),
unkCount(0),
scenCount(0),
@@ -175,17 +176,17 @@ private:
/* 0x4E0 */ STATE_MGR_DECLARE(dRoom_c);
/* 0x51C */ void *field_0x15C;
/* 0x520 */ void *SCEN;
/* 0x524 */ void *PLY;
/* 0x528 */ void *CAM;
/* 0x52C */ void *EVNT;
/* 0x530 */ void *PATH;
/* 0x534 */ void *PNT;
/* 0x538 */ void *BPNT;
/* 0x53C */ void *SPTH;
/* 0x520 */ SCEN *scen;
/* 0x524 */ PLY *ply;
/* 0x528 */ CAM *cam;
/* 0x52C */ EVNT *evnt;
/* 0x530 */ PATH *path;
/* 0x534 */ PNT *pnt;
/* 0x538 */ BPNT *bpnt;
/* 0x53C */ PATH *spth;
/* 0x540 */ void *field_0x540;
/* 0x544 */ void *field_0x544;
/* 0x548 */ void *AREA;
/* 0x548 */ AREA *AREA;
/* 0x54C */ u16 unkCount;
/* 0x54E */ u16 scenCount;
/* 0x550 */ u16 plyCount;
+4
View File
@@ -152,6 +152,10 @@ public:
void clearSpawnInfo();
const SpawnInfoExt &getSpawnInfo() const;
static void resetUpdateFrameCount() {
sUpdateFrameCount = 0;
}
protected:
static u32 sUpdateFrameCount;
static u8 sCurrentLayer;
+174
View File
@@ -0,0 +1,174 @@
#ifndef D_STAGE_H
#define D_STAGE_H
#include "common.h"
#include "d/d_base.h"
#include "d/d_fader.h"
#include "d/d_room.h"
#include "m/m_allocator.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "s/s_FPhase.h"
#define MAX_ROOM_NUMBER 64
class dRoomTable_c {
public:
/* 801b4670 */ dRoomTable_c();
virtual ~dRoomTable_c() {}
void setRoom(int roomid, dRoom_c *room) {
mRooms[roomid] = room;
}
dRoom_c *getRoom(s32 idx) {
return mRooms[idx];
}
private:
dRoom_c *mRooms[MAX_ROOM_NUMBER - 1];
};
class EggScreenEffectBlur {
public:
EggScreenEffectBlur();
~EggScreenEffectBlur();
private:
u8 _0x00[0x38 - 0x00];
};
class EggPostEffectBlur {
public:
EggPostEffectBlur();
~EggPostEffectBlur() {}
void setField0x30(f32 val) {
field_0x30 = val;
}
private:
u8 _0x00[0x30 - 0x00];
f32 field_0x30;
u8 _0x03[0x78 - 0x34];
};
class MapRelated {
friend class dStage_c;
struct Child {
Child() : a(mVec3_c::Zero), b(mVec3_c::Zero), c(false) {}
~Child() {}
mVec3_c a;
mVec3_c b;
bool c;
};
public:
MapRelated();
~MapRelated();
/* 0x000 */ mHeapAllocator_c mAllocator;
/* 0x01C */ Child mChildren[8];
/* 0x0FC */ mVec3_c field_0x0FC;
/* 0x108 */ f32 field_0x108;
/* 0x10C */ f32 field_0x10C;
/* 0x110 */ f32 field_0x110;
/* 0x114 */ f32 field_0x114;
/* 0x118 */ f32 field_0x118;
/* 0x11C */ f32 field_0x11C;
/* 0x120 */ f32 field_0x120;
/* 0x124 */ f32 field_0x124;
/* 0x128 */ f32 field_0x128;
/* 0x12C */ f32 field_0x12C;
/* 0x130 */ EggScreenEffectBlur mScreenEffect;
/* 0x168 */ EggPostEffectBlur mPostEffect;
/* 0x1E0 */ u32 field_0x1E0;
/* 0x1E4 */ u16 field_0x1E4;
/* 0x1E6 */ u16 field_0x1E6;
/* 0x1E8 */ u8 field_0x1E8;
/* 0x1E9 */ u8 field_0x1E9;
/* 0x1EA */ s8 field_0x1EA;
/* 0x1EB */ u8 field_0x1EB;
/* 0x1EC */ u8 field_0x1EC;
/* 0x1ED */ u8 field_0x1ED;
/* 0x1EE */ u8 field_0x1EE;
/* 0x1EF */ u8 field_0x1EF;
/* 0x1F0 */ u8 field_0x1F0;
public:
/* 801b4780 */ void init(MapRelated *);
/* 801b4900 */ void fn_801b4900();
void fn_801B4B80(u32 mapParams, const mVec3_c &center, const mVec3_c &size);
void fn_801B4C70(const mVec3_c &);
void fn_801B50C0(s32);
};
// OBJ NAME: STAGE
// Ghidra: RoomManager
// size: 0x239c
// vtable: 8052dff4
class dStage_c : public dBase_c {
public:
dStage_c();
virtual ~dStage_c() {
sInstance = nullptr;
}
int create() override;
int doDelete() override;
int execute() override;
int draw() override;
void deleteReady() override;
void drawMap(mMtx_c *mtx, int);
dRoom_c *getRoom(s32 idx);
void setRoom(int roomid, dRoom_c *room);
bool fadeIn(s32 fadeType, u16 frames);
bool fadeOut(s32 fadeType, u16 frames);
void forceFadeIn();
void forceFadeOut();
bool hasVisitedRoom(int roomid) const;
void setRoomVisited(int roomid);
static void bindStageResToFile(nw4r::g3d::ResFile *file);
static void bindSkyCmnToResFile(nw4r::g3d::ResFile *file);
static bool getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *, const char *matName);
static bool getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *, const nw4r::g3d::ResMdl &mdl);
/** Returns stage if idx == -1, otherwise room */
static dBase_c *getParentForRoom(s32 idx);
void changeLoadedEntities(u32 index_shift, bool set);
static dStage_c *GetInstance() {
return sInstance;
}
u8 getCurrRoomId() const {
return curr_room_id;
}
private:
dRoom_c *createRoom(int roomid, bool flag0x40);
void createLytSeekerStone();
sFPhaseBase::sFPhaseState createRooms();
sFPhaseBase::sFPhaseState waitForRooms();
static sFPhase<dStage_c>::phaseCallback sCallbacks[];
/* 0x0068 */ sFPhase<dStage_c> mPhase;
/* 0x007C */ dRoomTable_c rooms;
/* 0x017C */ dFader_c mFader;
/* 0x01A0 */ MapRelated mapRelated;
/* 0x0394 */ u8 _0x394[0x39C - 0x394];
/* 0x039C */ u32 loaded_entities[2047];
/* 0x2398 */ u8 curr_room_id;
/* 80575760 */ static dStage_c *sInstance;
};
#endif
+1 -1
View File
@@ -48,7 +48,7 @@ public:
}
u16 checkFlag(u16 roomId, u16 flag);
bool checkSceneflagGlobal(u16 sceneIdx, u16 flag);
bool checkTempOrSceneflag(u16 flag);
u16 checkTempOrSceneflag(u16 flag);
u16 checkUncommittedFlag(u16 roomId, u16 flag);
void setZoneflag(u16 roomId, u16 flag);
void setFlag(u16 roomId, u16 flag);
+6 -2
View File
@@ -8,14 +8,18 @@ public:
void draw();
bool setFader(mFaderBase_c *fader);
bool isStatus(mFaderBase_c::EStatus status) {
bool isStatus(mFaderBase_c::EStatus status) const {
return mpFader->getStatus() == status;
}
bool isNotStatus(mFaderBase_c::EStatus status) {
bool isNotStatus(mFaderBase_c::EStatus status) const {
return isStatus(status) != true;
}
mFaderBase_c::EStatus getStatus() const {
return mpFader->getStatus();
}
void setStatus(mFaderBase_c::EStatus status) {
mpFader->setStatus(status);
}
+4
View File
@@ -565,6 +565,10 @@ public:
return ResTexPlttInfo(&pData[id]);
}
const char *GetName() const {
return ofs_to_ptr<const char>(ref().name);
}
ResMatDLData *GetResMatDLData() {
return ofs_to_ptr<ResMatDLData>(ref().toResMatDLData);
}
+1 -9
View File
@@ -1,16 +1,8 @@
#ifndef AREA_UTILS_H
#define AREA_UTILS_H
#include "m/m_angle.h"
#include "m/m_vec.h"
struct AREA {
/* 0x00 */ mVec3_c mPos;
/* 0x0C */ mVec3_c mScale;
/* 0x18 */ mAng mAngleY;
/* 0x1A */ mAng mAngleLink;
/* 0x1C */ u8 field_0x1C;
};
#include "d/d_bzs_types.h"
/* 800a9b00 */ bool checkPosInArea(AREA **area, const mVec3_c &pos);
/* 800a9bd0 */ AREA *getAreaForIndexInRoom(s32 areaIndex, s32 roomId);
+2
View File
@@ -6,6 +6,8 @@
#include "sized_string.h"
#include "toBeSorted/event.h"
#include <cstring>
class dAcBase_c;
class EventManager {
+3
View File
@@ -10,4 +10,7 @@ extern "C" void fn_8035E310(void *);
extern "C" void *ENEMY_SOUND_MGR;
extern "C" void fn_80362150(void *, u16);
extern "C" void *ENEMY_BGM_RELATED_MGR;
extern "C" void fn_80384570(void *, bool);
#endif
-61
View File
@@ -1,61 +0,0 @@
#ifndef ROOM_MANAGER_H
#define ROOM_MANAGER_H
#include "common.h"
#include "d/d_base.h"
#include "d/d_room.h"
#include "m/m_allocator.h"
#include "m/types_m.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
#define MAX_ROOM_NUMBER 64
class dRoomTable {
/* 801b4670 */ dRoomTable(dRoomTable *roomTable);
virtual ~dRoomTable();
dRoom_c *rooms[MAX_ROOM_NUMBER - 1];
};
class MapRelated {
public:
mAllocator_c allocator;
char unk[472];
public:
/* 801b4780 */ void init(MapRelated *);
/* 801b4900 */ void fn_801b4900();
};
// OBJ NAME: STAGE
// Ghidra: RoomManager
// size: 0x239c
// vtable: 8052dff4
class RoomManager : public dBase_c {
public:
/* 0068 */ char field_0x68[0x7C - 0x68];
/* 007C */ dRoomTable rooms;
/* 017c */ char fader[0x1a0 - 0x174]; // size unk
/* 01a0 */ MapRelated mapRelated;
/* 039c */ u32 loaded_entities[2047];
/* 2398 */ u8 curr_room_id;
public:
/* 80575760 */ static RoomManager *m_Instance;
public:
/* 801b3970 */ dRoom_c *GetRoomByIndex(int roomid);
/* 801b42b0 */ static dRoom_c *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 *);
/* 801b4420 */ static bool getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *, const nw4r::g3d::ResMdl &mdl);
/* 801b44c0 */ static void changeLoadedEntities(RoomManager *mgr, u32 index_shift, bool set);
/* 801b4510 */ static u32 checkRoomFlag(RoomManager *mgr, u32 flag);
/* 801b4550 */ static bool checkEnemyDefeatFlag(RoomManager *mgr, u32 flag);
/* 801b45c0 */ static bool fn_801B45C0(RoomManager *mgr /* plus others */);
/* 801b6c60 */ bool hasVisitedRoomId(s32 roomid) const;
void setRoom(int roomid, dRoom_c *room);
};
#endif
+4
View File
@@ -69,6 +69,10 @@ public:
return field_0x78;
}
void setField0x78(bool val) {
field_0x78 = val;
}
void setField0x7A(bool val) {
field_0x7A = val;
}