1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
#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 "egg/gfx/eggPostEffectBlur.h"
#include "egg/gfx/eggScreenEffectBlur.h"
#include "m/m_allocator.h"
#include "m/m_fader_base.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:
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 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();
int fn_801B5970(const GXTexObj*);
/* 0x000 */ mHeapAllocator_c mAllocator;
/* 0x01C */ Child mChildren[8];
/* 0x0FC */ mVec3_c field_0x0FC;
/* 0x108 */ mVec3_c field_0x108;
/* 0x114 */ mVec3_c field_0x114;
/* 0x120 */ mVec3_c field_0x120;
/* 0x12C */ f32 field_0x12C;
/* 0x130 */ EGG::ScreenEffectBlur mScreenEffect;
/* 0x168 */ EGG::PostEffectBlur 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 */ s8 field_0x1EC;
/* 0x1ED */ u8 field_0x1ED;
/* 0x1EE */ u8 field_0x1EE;
/* 0x1EF */ u8 field_0x1EF;
/* 0x1F0 */ u8 field_0x1F0;
public:
s8 getField_0x1EC() const {
return field_0x1EC;
}
u8 getField_0x1EE() const {
return field_0x1EE;
}
void setField_0x1E8(u8 v) {
field_0x1E8 = v;
}
void setField_0x1EF(u8 v) {
field_0x1EF = v;
}
void init(MapRelated *);
void fn_801b4900();
void fn_801B4B80(u32 mapParams, const mVec3_c ¢er, const mVec3_c &size);
void fn_801B4C70(const mVec3_c &);
void fn_801B50C0(s32);
const mVec3_c &fn_801B4CB0() const;
s32 fn_801B4F10(s32 roomid, const mVec3_c &position) const;
};
// 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 fn_801B3C60(int roomId);
void drawMap(mMtx_c *mtx, int);
dRoom_c *getRoom(s32 idx);
void updateRoomFlags(int, int);
void setRoom(int roomid, dRoom_c *room);
void handleRoomChange(int roomid);
bool checkEnemyDefeatFlag(u16 flag);
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;
}
MapRelated *getMapRelated() {
return &mMapRelated;
}
bool isFadedOut() const {
return mFader.isStatus(mFaderBase_c::FADED_OUT);
}
bool isFadedIn() const {
return mFader.isStatus(mFaderBase_c::FADED_IN);
}
s8 getCurrRoomId() const {
return curr_room_id;
}
bool fn_801B3EE0();
void fn_801B3F20();
void fn_801B3F30();
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 mMapRelated;
/* 0x0394 */ u8 _0x394[0x39C - 0x394];
/* 0x039C */ u32 loaded_entities[2047];
/* 0x2398 */ s8 curr_room_id;
static dStage_c *sInstance;
};
#endif
|