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(sActorCreateData),
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->mRes.getResSilently(dScStage_c::mCdArcName, path);
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 < 64; i++) {
43 mArr1[i] = 0;
44 mArr2[i] = 0;
45 mArr3[i] = 0;
46 }
47 u32 count = mActorCreateCount;
48 if (count != 0) {
49 sActorCreateData *currB = mpActorCreates;
50 for (int i = 0; i < count; i++) {
51 u8 n = currB->m_0c;
52 if (n < 64) {
53 mArr2[n]++;
54 }
55 currB++;
56 }
57 int sum = 0;
58 currB = mpActorCreates;
59 for (int i = 0; i < 64; i++) {
60 mArr1[i] = (int) currB;
61 currB += mArr2[i];
62 mArr3[i] = sum;
63 sum += mArr2[i];
64 }
65 }
66}
67
68sScrollData *dCdFile_c::getScrollDataP(u8 id) {
69 sScrollData *curr = mpScrollData;
70 for (u32 i = 0; i < mScrollDataCount; i++) {
71 u8 currID = curr->mID;
72 if (currID == id) {
73 return curr;
74 }
75 curr++;
76 }
77 return mpScrollData;
78}
79
80sBgData *dCdFile_c::getBg2DataP(u8 id) {
81 sBgData *curr = mpBg2Data;
82 for (u32 i = 0; i < mBg2DataCount; i++) {
83 if (curr->mID == id) {
84 return curr;
85 }
86 curr++;
87 }
88 return nullptr;
89}
90
91sBgData *dCdFile_c::getBg3DataP(u8 id) {
92 sBgData *curr = mpBg3Data;
93 for (u32 i = 0; i < mBg3DataCount; i++) {
94 if (curr->mID == id) {
95 return curr;
96 }
97 curr++;
98 }
99 return nullptr;
100}
101
102sNextGotoData *dCdFile_c::getNextGotoP(u8 id) {
103 sNextGotoData *curr = mpNextGotos;
104 for (int i = 0; i < mNextGotoCount; i++) {
105 if (curr->mID == id) {
106 return curr;
107 }
108 curr++;
109 }
110 return nullptr;
111}
112
113sAreaData *dCdFile_c::getAreaDataP(u8 id, sRangeDataF *bound) {
114 sAreaData *curr = mpAreas;
115 for (u32 i = 0; i < mAreaCount; i++) {
116 if (curr->mID == id) {
117 if (bound != nullptr) {
118 bound->mOffset.x = curr->mRangeData.mX;
119 bound->mOffset.y = -curr->mRangeData.mY;
120 bound->mSize.x = curr->mRangeData.mWidth;
121 bound->mSize.y = curr->mRangeData.mHeight;
122 }
123 return curr;
124 }
125 curr++;
126 }
127 return nullptr;
128}
129
130u8 dCdFile_c::getAreaID(u8 id) {
131 return getAreaDataP(id, nullptr)->mID;
132}
133
134int dCdFile_c::getAreaScroll(u8 id) {
135 return getAreaDataP(id, nullptr)->mScroll;
136}
137
138int dCdFile_c::getAreaZoomType(u8 id) {
139 return getAreaDataP(id, nullptr)->mZoomType;
140}
141
142int dCdFile_c::getAreaZoomID(u8 id) {
143 return getAreaDataP(id, nullptr)->mZoomID;
144}
145
146int dCdFile_c::getAreaZoomChange(u8 id) {
147 return getAreaDataP(id, nullptr)->mZoomChange;
148}
149
150int dCdFile_c::getAreaBgm(u8 id) {
151 return getAreaDataP(id, nullptr)->mAreaBgm;
152}
153
154int dCdFile_c::getAreaBgmMode(u8 id) {
155 return getAreaDataP(id, nullptr)->mBgmMode;
156}
157
158int dCdFile_c::getAreaMaskNo(u8 id) {
159 return getAreaDataP(id, nullptr)->mMaskNo;
160}
161
162int dCdFile_c::getAreaBg2(u8 id) {
163 return getAreaDataP(id, nullptr)->mBg2;
164}
165
166int dCdFile_c::getAreaBg3(u8 id) {
167 return getAreaDataP(id, nullptr)->mBg3;
168}
169
170int dCdFile_c::getAreaColorOBJ(u8 id) {
171 return getAreaDataP(id, nullptr)->mColorObj;
172}
173
174int dCdFile_c::getAreaColorBG(u8 id) {
175 return getAreaDataP(id, nullptr)->mColorBG;
176}
177
178int dCdFile_c::getAreaDirection(u8 id) {
179 return getAreaDataP(id, nullptr)->mDirection;
180}
181
182int dCdFile_c::getAreaSizeX(u8 id) {
183 return getAreaDataP(id, nullptr)->mRangeData.mWidth;
184}
185
186u8 dCdFile_c::getAreaNo(mVec3_c *pos) {
187 sAreaData *curr = mpAreas;
188 for (u32 i = 0; i < mAreaCount; i++) {
189 if (checkRange(pos, (sRangeData *) &curr->mRangeData)) {
190 return curr->mID;
191 }
192 curr++;
193 }
194 return -1;
195}
196
197u8 dCdFile_c::getAreaNo(sRangePosSize *bound) {
198 sAreaData *curr = mpAreas;
199 for (u32 i = 0; i < mAreaCount; i++) {
200 if (checkRange(bound, &curr->mRangeData)) {
201 return curr->mID;
202 }
203 curr++;
204 }
205 return 0;
206}
207
208sRangeData *dCdFile_c::getRangeDataP(u8 id, sRangeDataF *bound) {
209 sRangeData *curr = mpRangeData;
210 for (u32 i = 0; i < mRangeCount; i++) {
211 if (curr->mID == id) {
212 if (bound != nullptr) {
213 bound->mOffset.x = curr->mX;
214 bound->mOffset.y = -curr->mY;
215 bound->mSize.x = curr->mWidth;
216 bound->mSize.y = curr->mHeight;
217 }
218 return curr;
219 }
220 curr++;
221 }
222 return nullptr;
223}
224
225bool dCdFile_c::checkRange(mVec3_c *pos, sRangeData *range) {
226 int x = dScStage_c::getLoopPosX(pos->x);
227 int y = -pos->y;
228 if (x < range->mX - 128) {
229 return false;
230 }
231 if (y < range->mY - 128) {
232 return false;
233 }
234 if (x >= range->mX + range->mWidth + 128) {
235 return false;
236 }
237 if (y >= range->mY + range->mHeight + 128) {
238 return false;
239 }
240 return true;
241}
242
243bool dCdFile_c::checkRange(sRangePosSize *a, sRangePosSize *b) {
244 short aCenterX = a->mX + a->mWidth / 2;
245 short bCenterX = b->mX + b->mWidth / 2;
246 short aCenterY = a->mY + a->mHeight / 2;
247 short bCenterY = b->mY + b->mHeight / 2;
248
249 short centerDistX = aCenterX - bCenterX;
250 if (centerDistX < 0) {
251 centerDistX = -centerDistX;
252 }
253
254 short centerDistY = aCenterY - bCenterY;
255 if (centerDistY < 0) {
256 centerDistY = -centerDistY;
257 }
258
259 short combinedHalfWidth = (a->mWidth + b->mWidth) / 2;
260 short combinedHalfHeight = (a->mHeight + b->mHeight) / 2;
261
262 if (centerDistX - (128 + combinedHalfWidth) < 0 && centerDistY - (128 + combinedHalfHeight) < 0) {
263 return true;
264 }
265 return false;
266}
267
268sScrollAreaData *dCdFile_c::getScrlAreaDataP(u8 id) {
269 if ((u32) mScrlAreaCount > id) {
270 return &mpScrlAreas[id];
271 }
272 return nullptr;
273}
274
275void dCd_c::createInstance(EGG::Heap *heap) {
276 EGG::Heap *prevHeap = mHeap::setCurrentHeap(heap);
277 new dCd_c();
278 mHeap::setCurrentHeap(prevHeap);
279}
280
281void dCd_c::deleteInstance() {
282 if (m_instance != nullptr) {
283 delete m_instance;
284 }
285}
286
287void dCd_c::loadCourseData() {
288 for (int i = 0; i < COURSE_FILE_COUNT; i++) {
289 mFiles[i].loadCourseData(i);
290 }
291}
292
293void dCd_c::setCourseArcName(int world, int course, char *buffer) {
294 sprintf(buffer, "%02d-%02d", world + 1, course + 1);
295}
static dResMng_c * m_instance
The instance of this class.
Definition d_res_mng.hpp:47
A three-dimensional floating point vector.
Definition m_vec.hpp:100
#define COURSE_FILE_COUNT
The number of files in a course.