NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_cd.cpp
1#include <game/bases/d_cd.hpp>
2#include <game/bases/d_s_stage.hpp>
4#include <game/mLib/m_heap.hpp>
5#include <MSL/cstdio>
6
7void dCdFile_c::loadCourseData(int fileNo) {
8 mFileNo = fileNo;
9
10 char path[0x30];
11 sprintf(path, "course/course%d.bin", fileNo + 1);
12
13 static const u32 c_data_size[CD_BLOCK_COUNT] = {
14 sizeof(sTilesetData),
15 sizeof(sOptionData),
16 sizeof(sScrollData),
17 sizeof(sBlock4Data),
18 sizeof(sBgData),
19 sizeof(sBgData),
20 sizeof(sNextGotoData),
21 sizeof(sMapActorData),
22 sizeof(sBlock8Data),
23 sizeof(sAreaData),
24 sizeof(sRangeData),
25 sizeof(sScrollAreaData),
26 sizeof(sRailInfoData),
27 sizeof(sRailNodeData)
28 };
29
30 sBlockInfo *res = (sBlockInfo *) dResMng_c::m_instance->getResSilently(dScStage_c::mCdArcName, path).ptr();
31 for (int i = 0; i < CD_BLOCK_COUNT; i++) {
32 if (res != nullptr) {
33 mpBlocks[i] = (u8 *) res + res[i].mOffset;
34 mBlockSizes[i] = res[i].mSize;
35 mBlockElementCounts[i] = mBlockSizes[i] / c_data_size[i];
36 } else {
37 mpBlocks[i] = nullptr;
38 mBlockSizes[i] = 0;
39 mBlockElementCounts[i] = 0;
40 }
41 }
42 for (int i = 0; i < MAX_AREAS; i++) {
43 mMapActorsByArea[i] = 0;
46 }
47 u32 count = mMapActorCount;
48 if (count != 0) {
49 // This assumes that the actor creates are sorted by area already.
50 sMapActorData *currCreate = mpMapActors;
51 for (int i = 0; i < count; i++) {
52 u8 n = currCreate->mAreaNo;
53 if (n < MAX_AREAS) {
55 }
56 currCreate++;
57 }
58 int sum = 0;
59 currCreate = mpMapActors;
60 for (int i = 0; i < MAX_AREAS; i++) {
61 mMapActorsByArea[i] = currCreate;
62 currCreate += mMapActorCountByArea[i];
63 mMapActorIdxForArea[i] = sum;
64 sum += mMapActorCountByArea[i];
65 }
66 }
67}
68
69sScrollData *dCdFile_c::getScrollDataP(u8 id) {
70 sScrollData *curr = mpScrollData;
71 for (u32 i = 0; i < mScrollDataCount; i++) {
72 u8 currID = curr->mID;
73 if (currID == id) {
74 return curr;
75 }
76 curr++;
77 }
78 return mpScrollData;
79}
80
81sBgData *dCdFile_c::getBg2DataP(u8 id) {
82 sBgData *curr = mpBg2Data;
83 for (u32 i = 0; i < mBg2DataCount; i++) {
84 if (curr->mID == id) {
85 return curr;
86 }
87 curr++;
88 }
89 return nullptr;
90}
91
92sBgData *dCdFile_c::getBg3DataP(u8 id) {
93 sBgData *curr = mpBg3Data;
94 for (u32 i = 0; i < mBg3DataCount; i++) {
95 if (curr->mID == id) {
96 return curr;
97 }
98 curr++;
99 }
100 return nullptr;
101}
102
103sNextGotoData *dCdFile_c::getNextGotoP(u8 id) {
104 sNextGotoData *curr = mpNextGotos;
105 for (int i = 0; i < mNextGotoCount; i++) {
106 if (curr->mID == id) {
107 return curr;
108 }
109 curr++;
110 }
111 return nullptr;
112}
113
114sAreaData *dCdFile_c::getAreaDataP(u8 id, sRangeDataF *bound) {
115 sAreaData *curr = mpAreas;
116 for (u32 i = 0; i < mAreaCount; i++) {
117 if (curr->mID == id) {
118 if (bound != nullptr) {
119 bound->mOffset.x = curr->mRangeData.mX;
120 bound->mOffset.y = -curr->mRangeData.mY;
121 bound->mSize.x = curr->mRangeData.mWidth;
122 bound->mSize.y = curr->mRangeData.mHeight;
123 }
124 return curr;
125 }
126 curr++;
127 }
128 return nullptr;
129}
130
131u8 dCdFile_c::getAreaID(u8 id) {
132 return getAreaDataP(id, nullptr)->mID;
133}
134
135int dCdFile_c::getAreaScroll(u8 id) {
136 return getAreaDataP(id, nullptr)->mScroll;
137}
138
139int dCdFile_c::getAreaZoomType(u8 id) {
140 return getAreaDataP(id, nullptr)->mZoomType;
141}
142
143int dCdFile_c::getAreaZoomID(u8 id) {
144 return getAreaDataP(id, nullptr)->mZoomID;
145}
146
147int dCdFile_c::getAreaZoomChange(u8 id) {
148 return getAreaDataP(id, nullptr)->mZoomChange;
149}
150
151int dCdFile_c::getAreaBgm(u8 id) {
152 return getAreaDataP(id, nullptr)->mAreaBgm;
153}
154
155int dCdFile_c::getAreaBgmMode(u8 id) {
156 return getAreaDataP(id, nullptr)->mBgmMode;
157}
158
159int dCdFile_c::getAreaMaskNo(u8 id) {
160 return getAreaDataP(id, nullptr)->mMaskNo;
161}
162
163int dCdFile_c::getAreaBg2(u8 id) {
164 return getAreaDataP(id, nullptr)->mBg2;
165}
166
167int dCdFile_c::getAreaBg3(u8 id) {
168 return getAreaDataP(id, nullptr)->mBg3;
169}
170
171int dCdFile_c::getAreaColorOBJ(u8 id) {
172 return getAreaDataP(id, nullptr)->mColorObj;
173}
174
175int dCdFile_c::getAreaColorBG(u8 id) {
176 return getAreaDataP(id, nullptr)->mColorBG;
177}
178
179int dCdFile_c::getAreaDirection(u8 id) {
180 return getAreaDataP(id, nullptr)->mDirection;
181}
182
183int dCdFile_c::getAreaSizeX(u8 id) {
184 return getAreaDataP(id, nullptr)->mRangeData.mWidth;
185}
186
187u8 dCdFile_c::getAreaNo(mVec3_c *pos) {
188 sAreaData *curr = mpAreas;
189 for (u32 i = 0; i < mAreaCount; i++) {
190 if (checkRange(pos, (sRangeData *) &curr->mRangeData)) {
191 return curr->mID;
192 }
193 curr++;
194 }
195 return -1;
196}
197
198u8 dCdFile_c::getAreaNo(sRangePosSize *bound) {
199 sAreaData *curr = mpAreas;
200 for (u32 i = 0; i < mAreaCount; i++) {
201 if (checkRange(bound, &curr->mRangeData)) {
202 return curr->mID;
203 }
204 curr++;
205 }
206 return 0;
207}
208
209sRangeData *dCdFile_c::getRangeDataP(u8 id, sRangeDataF *bound) {
210 sRangeData *curr = mpRangeData;
211 for (u32 i = 0; i < mRangeCount; i++) {
212 if (curr->mID == id) {
213 if (bound != nullptr) {
214 bound->mOffset.x = curr->mX;
215 bound->mOffset.y = -curr->mY;
216 bound->mSize.x = curr->mWidth;
217 bound->mSize.y = curr->mHeight;
218 }
219 return curr;
220 }
221 curr++;
222 }
223 return nullptr;
224}
225
226bool dCdFile_c::checkRange(mVec3_c *pos, sRangeData *range) {
227 int x = dScStage_c::getLoopPosX(pos->x);
228 int y = -pos->y;
229 if (x < range->mX - 128) {
230 return false;
231 }
232 if (y < range->mY - 128) {
233 return false;
234 }
235 if (x >= range->mX + range->mWidth + 128) {
236 return false;
237 }
238 if (y >= range->mY + range->mHeight + 128) {
239 return false;
240 }
241 return true;
242}
243
244bool dCdFile_c::checkRange(sRangePosSize *a, sRangePosSize *b) {
245 short aCenterX = a->mX + a->mWidth / 2;
246 short bCenterX = b->mX + b->mWidth / 2;
247 short aCenterY = a->mY + a->mHeight / 2;
248 short bCenterY = b->mY + b->mHeight / 2;
249
250 short centerDistX = aCenterX - bCenterX;
251 if (centerDistX < 0) {
252 centerDistX = -centerDistX;
253 }
254
255 short centerDistY = aCenterY - bCenterY;
256 if (centerDistY < 0) {
257 centerDistY = -centerDistY;
258 }
259
260 short combinedHalfWidth = (a->mWidth + b->mWidth) / 2;
261 short combinedHalfHeight = (a->mHeight + b->mHeight) / 2;
262
263 if (centerDistX - (128 + combinedHalfWidth) < 0 && centerDistY - (128 + combinedHalfHeight) < 0) {
264 return true;
265 }
266 return false;
267}
268
269sScrollAreaData *dCdFile_c::getScrlAreaDataP(u8 id) {
270 if ((u32) mScrlAreaCount > id) {
271 return &mpScrlAreas[id];
272 }
273 return nullptr;
274}
275
276void dCd_c::createInstance(EGG::Heap *heap) {
277 EGG::Heap *prevHeap = mHeap::setCurrentHeap(heap);
278 new dCd_c();
279 mHeap::setCurrentHeap(prevHeap);
280}
281
282void dCd_c::deleteInstance() {
283 if (m_instance != nullptr) {
284 delete m_instance;
285 }
286}
287
288void dCd_c::loadCourseData() {
289 for (int i = 0; i < COURSE_FILE_COUNT; i++) {
290 mFiles[i].loadCourseData(i);
291 }
292}
293
294void dCd_c::setCourseArcName(int world, int course, char *buffer) {
295 sprintf(buffer, "%02d-%02d", world + 1, course + 1);
296}
sMapActorData * mMapActorsByArea[MAX_AREAS]
Pointers to the first map actor for an area.
Definition d_cd.hpp:83
u32 mMapActorCountByArea[MAX_AREAS]
Number of map actors per area.
Definition d_cd.hpp:84
u32 mMapActorIdxForArea[MAX_AREAS]
Index of the first map actor for an area.
Definition d_cd.hpp:85
static dResMng_c * m_instance
The instance of this class.
Definition d_res_mng.hpp:61
A three-dimensional floating point vector.
Definition m_vec.hpp:107
#define MAX_AREAS
The maximum number of areas per course file.
#define COURSE_FILE_COUNT
The number of files in a course.