1#include <game/bases/d_cd.hpp>
2#include <game/bases/d_s_stage.hpp>
4#include <game/mLib/m_heap.hpp>
7void dCdFile_c::loadCourseData(
int fileNo) {
11 sprintf(path,
"course/course%d.bin", fileNo + 1);
13 static const u32 c_data_size[CD_BLOCK_COUNT] = {
20 sizeof(sNextGotoData),
21 sizeof(sMapActorData),
25 sizeof(sScrollAreaData),
26 sizeof(sRailInfoData),
30 sBlockInfo *res = (sBlockInfo *)
dResMng_c::m_instance->getResSilently(dScStage_c::mCdArcName, path).ptr();
31 for (
int i = 0; i < CD_BLOCK_COUNT; i++) {
33 mpBlocks[i] = (u8 *) res + res[i].mOffset;
34 mBlockSizes[i] = res[i].mSize;
35 mBlockElementCounts[i] = mBlockSizes[i] / c_data_size[i];
37 mpBlocks[i] =
nullptr;
39 mBlockElementCounts[i] = 0;
47 u32 count = mMapActorCount;
50 sMapActorData *currCreate = mpMapActors;
51 for (
int i = 0; i < count; i++) {
52 u8 n = currCreate->mAreaNo;
59 currCreate = mpMapActors;
70 sScrollData *curr = mpScrollData;
71 for (u32 i = 0; i < mScrollDataCount; i++) {
72 u8 currID = curr->mID;
81sBgData *dCdFile_c::getBg2DataP(u8
id) {
82 sBgData *curr = mpBg2Data;
83 for (u32 i = 0; i < mBg2DataCount; i++) {
84 if (curr->mID ==
id) {
92sBgData *dCdFile_c::getBg3DataP(u8
id) {
93 sBgData *curr = mpBg3Data;
94 for (u32 i = 0; i < mBg3DataCount; i++) {
95 if (curr->mID ==
id) {
104 sNextGotoData *curr = mpNextGotos;
105 for (
int i = 0; i < mNextGotoCount; i++) {
106 if (curr->mID ==
id) {
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;
131u8 dCdFile_c::getAreaID(u8
id) {
132 return getAreaDataP(
id,
nullptr)->mID;
135int dCdFile_c::getAreaScroll(u8
id) {
136 return getAreaDataP(
id,
nullptr)->mScroll;
139int dCdFile_c::getAreaZoomType(u8
id) {
140 return getAreaDataP(
id,
nullptr)->mZoomType;
143int dCdFile_c::getAreaZoomID(u8
id) {
144 return getAreaDataP(
id,
nullptr)->mZoomID;
147int dCdFile_c::getAreaZoomChange(u8
id) {
148 return getAreaDataP(
id,
nullptr)->mZoomChange;
151int dCdFile_c::getAreaBgm(u8
id) {
152 return getAreaDataP(
id,
nullptr)->mAreaBgm;
155int dCdFile_c::getAreaBgmMode(u8
id) {
156 return getAreaDataP(
id,
nullptr)->mBgmMode;
159int dCdFile_c::getAreaMaskNo(u8
id) {
160 return getAreaDataP(
id,
nullptr)->mMaskNo;
163int dCdFile_c::getAreaBg2(u8
id) {
164 return getAreaDataP(
id,
nullptr)->mBg2;
167int dCdFile_c::getAreaBg3(u8
id) {
168 return getAreaDataP(
id,
nullptr)->mBg3;
171int dCdFile_c::getAreaColorOBJ(u8
id) {
172 return getAreaDataP(
id,
nullptr)->mColorObj;
175int dCdFile_c::getAreaColorBG(u8
id) {
176 return getAreaDataP(
id,
nullptr)->mColorBG;
179int dCdFile_c::getAreaDirection(u8
id) {
180 return getAreaDataP(
id,
nullptr)->mDirection;
183int dCdFile_c::getAreaSizeX(u8
id) {
184 return getAreaDataP(
id,
nullptr)->mRangeData.mWidth;
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)) {
199 sAreaData *curr = mpAreas;
200 for (u32 i = 0; i < mAreaCount; i++) {
201 if (checkRange(bound, &curr->mRangeData)) {
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;
227 int x = dScStage_c::getLoopPosX(pos->x);
229 if (x < range->mX - 128) {
232 if (y < range->mY - 128) {
235 if (x >= range->mX + range->mWidth + 128) {
238 if (y >= range->mY + range->mHeight + 128) {
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;
250 short centerDistX = aCenterX - bCenterX;
251 if (centerDistX < 0) {
252 centerDistX = -centerDistX;
255 short centerDistY = aCenterY - bCenterY;
256 if (centerDistY < 0) {
257 centerDistY = -centerDistY;
260 short combinedHalfWidth = (a->mWidth + b->mWidth) / 2;
261 short combinedHalfHeight = (a->mHeight + b->mHeight) / 2;
263 if (centerDistX - (128 + combinedHalfWidth) < 0 && centerDistY - (128 + combinedHalfHeight) < 0) {
270 if ((u32) mScrlAreaCount >
id) {
271 return &mpScrlAreas[id];
276void dCd_c::createInstance(EGG::Heap *heap) {
277 EGG::Heap *prevHeap = mHeap::setCurrentHeap(heap);
279 mHeap::setCurrentHeap(prevHeap);
282void dCd_c::deleteInstance() {
283 if (m_instance !=
nullptr) {
288void dCd_c::loadCourseData() {
290 mFiles[i].loadCourseData(i);
294void dCd_c::setCourseArcName(
int world,
int course,
char *buffer) {
295 sprintf(buffer,
"%02d-%02d", world + 1, course + 1);
sMapActorData * mMapActorsByArea[MAX_AREAS]
Pointers to the first map actor for an area.
u32 mMapActorCountByArea[MAX_AREAS]
Number of map actors per area.
u32 mMapActorIdxForArea[MAX_AREAS]
Index of the first map actor for an area.
static dResMng_c * m_instance
The instance of this class.
A three-dimensional floating point vector.
#define MAX_AREAS
The maximum number of areas per course file.
#define COURSE_FILE_COUNT
The number of files in a course.