SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
StageDataHolder.cpp
1#include "Game/Scene/StageDataHolder.hpp"
2#include "Game/Scene/StageResourceLoader.hpp"
3#include "Game/System/ScenarioDataParser.hpp"
4#include "JSystem/JKernel/JKRArchive.hpp"
5
7 if (!mZoneID) {
8 initTableData();
9 }
10
11 if (_E0) {
12 u32 commonLayer = ScenarioDataFunction::getCurrentCommonLayers(_A8);
13 initLayerJmpInfo(&_EC, "/jmp/Placement", "/jmp/MapParts", commonLayer);
14 }
15
16 createLocalStageDataHolder(_EC, 1);
17
18 if (!mZoneID) {
19 initPlacementInfoOrderedCommon();
20 }
21}
22
23void StageDataHolder::initAfterScenarioSelected() {
24 s32 curScenarioNo = MR::getCurrentScenarioNo();
25 u32 curLayers = ScenarioDataFunction::getCurrentScenarioLayers(_A8, curScenarioNo);
26
27 if (!_E0) {
28 curLayers |= ScenarioDataFunction::getCurrentCommonLayers(_A8);
29 }
30
31 initLayerJmpInfo(&_F4, "/jmp/Placement", "/jmp/MapParts", curLayers);
32 createLocalStageDataHolder(_F4, false);
33
34 for (s32 i = 0; i < mStageDataHolderCount; i++) {
35 mStageDataArray[i]->initAfterScenarioSelected();
36 }
37
38 if (!mZoneID) {
39 initPlacementInfoOrderedScenario();
40 }
41
42 initAllLayerJmpInfo(&mPlacementObjs, "/jmp/Placement", "/jmp/MapParts");
43 initAllLayerJmpInfo(&mStartObjs, "/jmp/Start");
44
45 s32 generalPosFileCount = mArchive->countFile("/jmp/GeneralPos");
46 generalPosFileCount -= 2;
47 s32 isValidGeneralPosCount = (generalPosFileCount > 0) ? generalPosFileCount : 0;
48
49 if (isValidGeneralPosCount) {
50 initAllLayerJmpInfo(&mGeneralPosObjs, "/jmp/GeneralPos");
51 }
52
53 s32 childObjFileCount = mArchive->countFile("/jmp/ChildObj");
54 childObjFileCount -= 2;
55 s32 isValidChildObjCount = (childObjFileCount > 0) ? childObjFileCount : 0;
56
57 if (isValidChildObjCount) {
58 initAllLayerJmpInfo(&mChildObjs, "/jmp/ChildObj");
59 }
60
61 initJmpInfo(&mListObjs, "/jmp/List");
62 initJmpInfo(&mPathObjs, "/jmp/Path");
63 calcDataAddress();
64}
65
66void StageDataHolder::requestFileLoadCommon() {
67 if (!MR::tryRequestLoadStageResource()) {
68 _FC->requestFileLoad();
69 _100->requestFileLoad();
70 }
71}
72
73void StageDataHolder::requestFileLoadScenario() {
74 if (MR::isLoadStageScenarioResource()) {
75 _104->requestFileLoad();
76 _108->requestFileLoad();
77 _10C->requestFileLoad();
78 }
79}
80
81void StageDataHolder::initPlacement() {
82 MR::setInitializeStatePlacementPlayer();
83 initPlacementMario();
84 MR::setInitializeStatePlacementHighPriority();
85 _FC->initPlacement();
86 _104->initPlacement();
87 MR::setInitializeStatePlacement();
88 _100->initPlacement();
89 _108->initPlacement();
90 _10C->initPlacement();
91}
92
93#ifdef NON_MATCHING
94JMapInfo StageDataHolder::getCommonPathPointInfo(const JMapInfo **pOut, int idx) const {
95 JMapInfo* inf = findJmpInfoFromArray(&mPathObjs, "CommonPathInfo");
96 JMapInfoIter pathIter = inf->findElement<s32>("l_id", idx, 0);
97 return getCommonPathPointInfoFromRailDataIndex(pOut, pathIter._4);
98}
99#endif
100
101s32 StageDataHolder::getCurrentStartCameraId() const {
102 JMapInfoIter marioIter = makeCurrentMarioJMapInfoIter();
103 s32 cameraID;
104 bool ret = marioIter.mInfo->getValue<s32>(marioIter._4, "Camera_id", &cameraID);
105
106 if (ret) {
107 return cameraID;
108 }
109
110 return -1;
111}
112
113void StageDataHolder::getStartCameraIdInfoFromStartDataIndex(JMapIdInfo *pInfo, int startDataIdx) const {
114 JMapInfoIter copy;
115 JMapInfoIter startIter = getStartJMapInfoIterFromStartDataIndex(startDataIdx);
116 copy = startIter;
117 s32 cameraID;
118 copy.mInfo->getValue<s32>(startIter._4, "Camera_id", &cameraID);
119 pInfo->initalize(cameraID, copy);
120}
121
122#ifdef NON_MATCHING
123const StageDataHolder* StageDataHolder::findPlacedStageDataHolder(const JMapInfoIter &rIter) const {
124 s32 data = (s32)rIter.mInfo->mData + rIter.mInfo->mData->mDataOffset + rIter.mInfo->mData->_C * rIter._4;
125
126 if (_E4 > data || data >= _E8) {
127 for (s32 i = 0; i < mStageDataHolderCount; i++) {
128 const StageDataHolder* holder = mStageDataArray[i]->findPlacedStageDataHolder(rIter);
129
130 if (holder) {
131 return holder;
132 }
133 }
134
135 return 0;
136 }
137
138 return this;
139}
140#endif
141
142const StageDataHolder* StageDataHolder::getStageDataHolderFromZoneId(int zoneID) const {
143 if (zoneID == 0) {
144 return this;
145 }
146
147 for (s32 i = 0; i < mStageDataHolderCount; i++) {
148 StageDataHolder* holder = mStageDataArray[i];
149 s32 curZoneID = holder->mZoneID;
150
151 if (zoneID == curZoneID) {
152 return holder;
153 }
154 }
155
156 return 0;
157}
158
159const StageDataHolder* StageDataHolder::getStageDataHolderFromZoneId(int zoneID) {
160 return getStageDataHolderFromZoneId(zoneID);
161}
162
163bool StageDataHolder::isPlacedZone(int zoneID) const {
164 if (!zoneID) {
165 return true;
166 }
167
168 for (s32 i = 0; i < mStageDataHolderCount; i++) {
169 if (zoneID != mStageDataArray[i]->mZoneID) {
170 return true;
171 }
172 }
173
174 return false;
175}
176
177#ifdef NON_MATCHING
178// stack nonsense
179const char* StageDataHolder::getJapaneseObjectName(const char *pName) const {
180 const JMapInfoIter englishName = mObjNameTbl->findElement<const char *>("en_name", pName, 0);
181 const JMapInfoIter copy = englishName;
182 const JMapInfoIter last = mObjNameTbl->end();
183
184 if (copy == last) {
185 return 0;
186 }
187
188 const char* japaneseName;
189 last.mInfo->getValue<const char *>(englishName._4, "jp_name", &japaneseName);
190 return japaneseName;
191}
192#endif
193
194void* StageDataHolder::getStageArchiveResource(const char *pName) {
195 return mArchive->getResource(0x3F3F3F3F, pName);
196}
197
198s32 StageDataHolder::getStageArchiveResourceSize(void *pData) {
199 return mArchive->getResSize(pData);
200}
201
202void StageDataHolder::initTableData() {
203 JKRArchive* archive = (JKRArchive*)MR::receiveArchive("/StageData/ObjTableTable.arc");
204 void* tableFile = archive->getResource(0x3F3F3F3F, "ObjNameTable.tbl");
205
206 mObjNameTbl = new JMapInfo();
207 mObjNameTbl->attach(tableFile);
208}
209
210JMapInfo* StageDataHolder::findJmpInfoFromArray(const MR::AssignableArray<JMapInfo> *pInfoArr, const char *pName) const {
211 JMapInfo* inf = pInfoArr->mArr;
212 while (inf != pInfoArr->mArr + pInfoArr->mMaxSize) {
213 if (MR::isEqualStringCase(inf->getName(), pName)) {
214 return inf;
215 }
216
217 inf++;
218 }
219
220 return 0;
221}
222
223JMapInfoIter StageDataHolder::getStartJMapInfoIterFromStartDataIndex(int idx_) const {
224 int idx = idx_;
225 int curIdx;
226 JMapInfo* pEnd = mStartObjs.mArr + mStartObjs.mMaxSize;
227 bool isValid;
228 s32 i;
229 JMapInfo* inf = mStartObjs.mArr;
230 StageDataHolder* locHolder;
231
232 while (inf != pEnd)
233 {
234 const JMapData * curData = inf->mData;
235 isValid = curData;
236
237 curIdx = isValid ? curData->mNumEntries : 0;
238
239 if (idx < curIdx) {
240 JMapInfoIter iter;
241 iter.mInfo = inf;
242 iter._4 = idx;
243 return iter;
244 }
245
246 curIdx = isValid ? curData->mNumEntries : 0;
247
248 idx -= curIdx;
249
250 inf++;
251 }
252
253 for (s32 i = 0; i < mStageDataHolderCount; i++) {
254 locHolder = mStageDataArray[i];
255 int startPosNum = locHolder->getStartPosNum();
256
257 if (idx < startPosNum) {
258 return locHolder->getStartJMapInfoIterFromStartDataIndex(idx);
259 }
260 idx -= startPosNum;
261 }
262
263 JMapInfoIter iter;
264 iter.mInfo = 0;
265 iter._4 = -1;
266 return iter;
267}
268
269void StageDataHolder::calcDataAddress() {
270 _E4 = -1;
271 _E8 = 0;
272 updateDataAddress(&mPlacementObjs);
273 updateDataAddress(&mStartObjs);
274 updateDataAddress(&mGeneralPosObjs);
275 updateDataAddress(&mChildObjs);
276 updateDataAddress(&mPathObjs);
277}
278
279void StageDataHolder::calcPlacementMtx(const JMapInfoIter &rIter) {
280 TVec3f pos;
281 rIter.getValue<f32>("pos_x", &pos.x);
282 rIter.getValue<f32>("pos_y", &pos.y);
283 rIter.getValue<f32>("pos_z", &pos.z);
284
285 TVec3f rot;
286 rIter.getValue<f32>("dir_x", &rot.x);
287 rIter.getValue<f32>("dir_y", &rot.y);
288 rIter.getValue<f32>("dir_z", &rot.z);
289
290 MR::makeMtxTR(mPlacementMtx, pos, rot);
291}
292
293void StageDataHolder::updateDataAddress(const MR::AssignableArray<JMapInfo> *pInfoArray) {
294 JMapInfo* inf = pInfoArray->mArr;
295
296 while (inf != pInfoArray->mArr + pInfoArray->mMaxSize) {
297 if ((u32)inf->mData < _E4) {
298 _E4 = (u32)inf->mData;
299 }
300
301 u32 addr = (inf->mData->mEntrySize * inf->mData->mNumEntries) + ((s32)inf->mData + inf->mData->mDataOffset);
302
303 if (_E8 < addr) {
304 _E8 = addr;
305 }
306
307 inf++;
308 }
309}
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.