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(sActorCreateData),
25 sizeof(sScrollAreaData),
26 sizeof(sRailInfoData),
30 sBlockInfo *res = (sBlockInfo *)
dResMng_c::m_instance->mRes.getResSilently(dScStage_c::mCdArcName, path);
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;
42 for (
int i = 0; i < 64; i++) {
47 u32 count = mActorCreateCount;
49 sActorCreateData *currB = mpActorCreates;
50 for (
int i = 0; i < count; i++) {
58 currB = mpActorCreates;
59 for (
int i = 0; i < 64; i++) {
60 mArr1[i] = (int) currB;
69 sScrollData *curr = mpScrollData;
70 for (u32 i = 0; i < mScrollDataCount; i++) {
71 u8 currID = curr->mID;
80sBgData *dCdFile_c::getBg2DataP(u8
id) {
81 sBgData *curr = mpBg2Data;
82 for (u32 i = 0; i < mBg2DataCount; i++) {
83 if (curr->mID ==
id) {
91sBgData *dCdFile_c::getBg3DataP(u8
id) {
92 sBgData *curr = mpBg3Data;
93 for (u32 i = 0; i < mBg3DataCount; i++) {
94 if (curr->mID ==
id) {
103 sNextGotoData *curr = mpNextGotos;
104 for (
int i = 0; i < mNextGotoCount; i++) {
105 if (curr->mID ==
id) {
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;
130u8 dCdFile_c::getAreaID(u8
id) {
131 return getAreaDataP(
id,
nullptr)->mID;
134int dCdFile_c::getAreaScroll(u8
id) {
135 return getAreaDataP(
id,
nullptr)->mScroll;
138int dCdFile_c::getAreaZoomType(u8
id) {
139 return getAreaDataP(
id,
nullptr)->mZoomType;
142int dCdFile_c::getAreaZoomID(u8
id) {
143 return getAreaDataP(
id,
nullptr)->mZoomID;
146int dCdFile_c::getAreaZoomChange(u8
id) {
147 return getAreaDataP(
id,
nullptr)->mZoomChange;
150int dCdFile_c::getAreaBgm(u8
id) {
151 return getAreaDataP(
id,
nullptr)->mAreaBgm;
154int dCdFile_c::getAreaBgmMode(u8
id) {
155 return getAreaDataP(
id,
nullptr)->mBgmMode;
158int dCdFile_c::getAreaMaskNo(u8
id) {
159 return getAreaDataP(
id,
nullptr)->mMaskNo;
162int dCdFile_c::getAreaBg2(u8
id) {
163 return getAreaDataP(
id,
nullptr)->mBg2;
166int dCdFile_c::getAreaBg3(u8
id) {
167 return getAreaDataP(
id,
nullptr)->mBg3;
170int dCdFile_c::getAreaColorOBJ(u8
id) {
171 return getAreaDataP(
id,
nullptr)->mColorObj;
174int dCdFile_c::getAreaColorBG(u8
id) {
175 return getAreaDataP(
id,
nullptr)->mColorBG;
178int dCdFile_c::getAreaDirection(u8
id) {
179 return getAreaDataP(
id,
nullptr)->mDirection;
182int dCdFile_c::getAreaSizeX(u8
id) {
183 return getAreaDataP(
id,
nullptr)->mRangeData.mWidth;
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)) {
198 sAreaData *curr = mpAreas;
199 for (u32 i = 0; i < mAreaCount; i++) {
200 if (checkRange(bound, &curr->mRangeData)) {
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;
226 int x = dScStage_c::getLoopPosX(pos->x);
228 if (x < range->mX - 128) {
231 if (y < range->mY - 128) {
234 if (x >= range->mX + range->mWidth + 128) {
237 if (y >= range->mY + range->mHeight + 128) {
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;
249 short centerDistX = aCenterX - bCenterX;
250 if (centerDistX < 0) {
251 centerDistX = -centerDistX;
254 short centerDistY = aCenterY - bCenterY;
255 if (centerDistY < 0) {
256 centerDistY = -centerDistY;
259 short combinedHalfWidth = (a->mWidth + b->mWidth) / 2;
260 short combinedHalfHeight = (a->mHeight + b->mHeight) / 2;
262 if (centerDistX - (128 + combinedHalfWidth) < 0 && centerDistY - (128 + combinedHalfHeight) < 0) {
269 if ((u32) mScrlAreaCount >
id) {
270 return &mpScrlAreas[id];
275void dCd_c::createInstance(
EGG::Heap *heap) {
276 EGG::Heap *prevHeap = mHeap::setCurrentHeap(heap);
278 mHeap::setCurrentHeap(prevHeap);
281void dCd_c::deleteInstance() {
282 if (m_instance !=
nullptr) {
287void dCd_c::loadCourseData() {
289 mFiles[i].loadCourseData(i);
293void dCd_c::setCourseArcName(
int world,
int course,
char *buffer) {
294 sprintf(buffer,
"%02d-%02d", world + 1, course + 1);
static dResMng_c * m_instance
The instance of this class.
A three-dimensional floating point vector.
#define COURSE_FILE_COUNT
The number of files in a course.