Some train decomp and move seg2 files to ending (#423)

* Some train decomp

* Move seg2 to ending/

* move racing code files into racing folder

* Fix progress

* Rename segments
This commit is contained in:
MegaMech
2023-09-17 16:57:18 -06:00
committed by GitHub
parent 3f221d6f25
commit 91fc8ea473
52 changed files with 429 additions and 1219 deletions
+291 -367
View File
@@ -535,17 +535,17 @@ void set_places(void) {
s32 temp_a0;
s32 var_t1_3;
switch (gModeSelection) { /* irregular */
case BATTLE:
default:
return; // HEY! returns, not breaks
case GRAND_PRIX:
case TIME_TRIALS:
var_t4 = 8;
break;
case VERSUS:
var_t4 = D_8018EDF3;
break;
switch (gModeSelection) {
case BATTLE:
default:
return; // HEY! returns, not breaks
case GRAND_PRIX:
case TIME_TRIALS:
var_t4 = 8;
break;
case VERSUS:
var_t4 = D_8018EDF3;
break;
}
if (D_8016348C == 0) {
@@ -623,17 +623,17 @@ void func_800070F4(void) {
s32 var_a3;
s32 var_a2;
switch (gModeSelection) { /* irregular */
case BATTLE:
default:
return; // HEY! returns, not breaks
case GRAND_PRIX:
case TIME_TRIALS:
var_a2 = 8;
break;
case VERSUS:
var_a2 = D_8018EDF3;
break;
switch (gModeSelection) {
case BATTLE:
default:
return; // HEY! returns, not breaks
case GRAND_PRIX:
case TIME_TRIALS:
var_a2 = 8;
break;
case VERSUS:
var_a2 = D_8018EDF3;
break;
}
for (var_a3 = 0; var_a3 < var_a2; var_a3++) {
@@ -1624,13 +1624,13 @@ void func_800097E0(void) {
}
switch(gCurrentCourseId) {
case 11:
case COURSE_KALAMARI_DESERT:
func_80012AC0();
break;
case 18:
case COURSE_DK_JUNGLE:
func_800133C4();
break;
case 10:
case COURSE_TOADS_TURNPIKE:
func_8001487C();
func_800149D0();
func_80014B24();
@@ -4137,6 +4137,7 @@ extern uintptr_t *D_80163598;
// An array of 21 items. The final element is for podium ceremony.
extern struct _struct_D_800DD9D0_0x10 D_800DD9D0[];
// Appears to allocate memory for each course.
void func_8000F2DC(void) {
struct _struct_D_800DD9D0_0x10 *ptr = &D_800DD9D0[gCurrentCourseId];
@@ -4176,7 +4177,7 @@ void func_8000F2DC(void) {
func_8000F2BC(D_80164570[i], D_80163368[i]);
}
// Skips several cpu cycles.
// Skip several cpu cycles.
for (i = 0; i < 4; i++) {}
for (i = 0; i < 4; i++) {
@@ -4191,15 +4192,15 @@ void func_8000F2DC(void) {
D_80164430 = *gWaypointCountByPathIndex;
switch (gCurrentCourseId) {
case 11:
case COURSE_KALAMARI_DESERT:
func_800120C8();
func_800127E0();
break;
case 18:
case COURSE_DK_JUNGLE:
func_80012190();
func_800132F4();
break;
case 10:
case COURSE_TOADS_TURNPIKE:
func_800147E0();
func_80014934();
func_80014A88();
@@ -4700,64 +4701,59 @@ void func_8000F628(void) {
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_8000F628.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit bece1d6db17040749f77dbbd090363cc6fb926f9
u16 func_80011014(struct TrackWayPoint *, u16 *, s32, s32); /* extern */
static ? D_800DC8D0; /* unable to generate initializer */
static ? gCoursePathTable; /* unable to generate initializer */
s16 gCurrentCourseId; /* unable to generate initializer */
// dest src size pathIndex
u16 func_80011014(struct TrackWayPoint *, struct TrackWayPoint *, s32, s32); /* extern */
extern uintptr_t gCoursePathTable[20][4];
extern uintptr_t D_800DC8D0[20][4];
// @arg index from 0 to 3.
// Processes course path by index.
// @arg index from 0 to 3.
// Each course can have 1-4 course paths.
void func_800100F0(s32 pathIndex) {
struct TrackWayPoint *sp30;
u16 *sp2C;
s32 sp24;
s16 sp1A;
s16 temp_v0;
s16 var_a2;
s32 temp_t9;
s32 var_v0;
s32 var_v1;
u16 *temp_v0_2;
u16 *var_a0;
u16 *var_at;
temp_v0 = gCurrentCourseId;
temp_t9 = pathIndex * 4;
if ((s32) D_800DCA4C[temp_v0] >= 0) {
sp30 = D_80164550[pathIndex];
if (temp_v0 != 0x0014) {
var_v0 = process_path_data(sp30, segmented_to_virtual_dupe_2(*(&D_800DC8D0 + ((temp_v0 * 0x10) + temp_t9))));
var_at = &gWaypointCountByPathIndex[pathIndex];
goto block_9;
}
sp1A = 1;
temp_v0_2 = segmented_to_virtual_dupe_2(*(&gCoursePathTable + ((temp_v0 * 0x10) + temp_t9)));
sp2C = temp_v0_2;
var_a0 = temp_v0_2;
var_a2 = 1;
var_v1 = 0;
loop_4:
if (*var_a0 == 0x8000) {
sp24 = var_v1 - 1;
var_a2 = 0;
struct TrackWayPoint *ptr;
struct TrackWayPoint *pathDest;
struct TrackWayPoint *path;
s32 var_v0;
s32 sp24;
s32 pad[2];
s16 bInvalidPath;
s32 i;
// cast required
if ((s32)D_800DCA4C[gCurrentCourseId] >= 0) {
pathDest = D_80164550[pathIndex];
bInvalidPath = 1;
if (gCurrentCourseId != COURSE_AWARD_CEREMONY) {
var_v0 = process_path_data(pathDest, segmented_to_virtual_dupe_2(D_800DC8D0[gCurrentCourseId][pathIndex]));
gWaypointCountByPathIndex[pathIndex] = (u16) var_v0;
} else {
var_v1 += 1;
var_a0 += 8;
if (var_v1 != 0xBB8) {
goto loop_4;
// Course path included in course_data which has already been loaded into memory.
// This is how we get the addr to our path data.
path = segmented_to_virtual_dupe_2(gCoursePathTable[gCurrentCourseId][pathIndex]);
ptr = path;
for (i = 0; i < 3000; i++, ptr++) {
if ((u16)ptr->wayPointX == 0x8000 ) {
sp24 = i - 1;
bInvalidPath = 0;
break;
}
}
// If path data higher than 3000 something has gone wrong.
// Skip processing the data.
// todo: Confirm this comment
if (!bInvalidPath) {
var_v0 = func_80011014(pathDest, path, sp24, pathIndex);
gWaypointCountByPathIndex[pathIndex] = (u16) var_v0;
}
}
if (var_a2 == 0) {
var_v0 = func_80011014(sp30, sp2C, sp24, pathIndex);
var_at = &gWaypointCountByPathIndex[pathIndex];
block_9:
*var_at = (u16) var_v0;
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_800100F0.s")
#endif
void func_80010218(s32 pathIndex) {
f32 wayPointWidth;
@@ -5180,6 +5176,7 @@ block_29:
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80011014.s")
#endif
// Returns number of waypoints processed.
s32 process_path_data(struct TrackWayPoint *dest, struct TrackWayPoint *src) {
s16 temp_a0;
s16 temp_a2;
@@ -5214,6 +5211,7 @@ s32 process_path_data(struct TrackWayPoint *dest, struct TrackWayPoint *src) {
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
extern f64 D_800ED078;
// blank memory segmented waypoints waypoint size
s32 func_8001168C(s16 *arg0, void *arg1, s32 arg2) {
f32 spC8;
f32 spC4;
@@ -5599,39 +5597,30 @@ void func_80011EC0(s32 arg0, Player *player, s32 arg2, s32 arg3) {
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80011EC0.s")
#endif
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
s32 func_8001168C(void *, u16 *, s32); // extern
extern ? d_course_kalimari_desert_track_unknown_waypoints;
extern s16 D_80162EB0;
extern void *D_80163598;
extern s32 D_8016359C;
extern uintptr_t gSegmentTable;
f32 func_802AE1C0(f32, f32, f32);
s32 func_8001168C(void *, struct TrackWayPoint *, s32);
void func_800120C8(void) {
void *sp18;
u16 *temp_a1;
void *temp_a0;
u16 *phi_v0;
s32 phi_v1;
s32 i;
s16 *temp;
struct TrackWayPoint *waypoint = (struct TrackWayPoint *) VIRTUAL_TO_PHYSICAL2(
gSegmentTable[SEGMENT_NUMBER2(d_course_kalimari_desert_track_unknown_waypoints)]
+ SEGMENT_OFFSET(d_course_kalimari_desert_track_unknown_waypoints));
temp_a1 = *(&gSegmentTable + ((&d_course_kalimari_desert_track_unknown_waypoints >> 0x18) * 4)) + (&d_course_kalimari_desert_track_unknown_waypoints & 0xFFFFFF) + 0x80000000;
phi_v0 = temp_a1;
phi_v1 = 0;
loop_1:
phi_v0 += 8;
if (*phi_v0 != 0x8000) {
phi_v1 += 1;
goto loop_1;
for (i = 0; ; i++) {
if ((u16)waypoint[i].wayPointX == 0x8000) {
break;
}
}
temp_a0 = D_80163598;
sp18 = temp_a0;
D_8016359C = func_8001168C(temp_a0, temp_a1, phi_v1 - 1);
D_80162EB0 = func_802AE1C0(temp_a0->unk0, 2000.0f, temp_a0->unk2);
temp = (s16 *)D_80163598;
D_8016359C = func_8001168C(temp , waypoint, i - 1);
D_80162EB0 = func_802AE1C0(temp[0], 2000.0f, temp[1]);
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_800120C8.s")
#endif
#ifdef MIPS_TO_C
//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
@@ -5706,20 +5695,20 @@ void func_800122D8(void) {
switch (gCurrentCourseId) {
case COURSE_KALAMARI_DESERT:
for(loopIndex = 0; loopIndex < NUM_TRAINS; loopIndex++) {
tempLocomotive = &D_801635A0[loopIndex].locomotive;
tempLocomotive = &sTrains[loopIndex].locomotive;
origXPos = tempLocomotive->position[0];
origZPos = tempLocomotive->position[2];
trainCarYRot = func_8000DBAC(tempLocomotive->position, &tempLocomotive->wayPointIndex, D_801635A0[loopIndex].someMultiplier);
trainCarYRot = func_8000DBAC(tempLocomotive->position, &tempLocomotive->wayPointIndex, sTrains[loopIndex].someMultiplier);
tempLocomotive->velocity[0] = tempLocomotive->position[0] - origXPos;
tempLocomotive->velocity[2] = tempLocomotive->position[2] - origZPos;
vec3s_set(trainCarRot, 0, trainCarYRot, 0);
tempLocomotive->actorIndex = addActorToEmptySlot(tempLocomotive->position, trainCarRot, tempLocomotive->velocity, ACTOR_TRAIN_ENGINE);
tempTender = &D_801635A0[loopIndex].tender;
tempTender = &sTrains[loopIndex].tender;
if (tempTender->isActive == 1) {
origXPos = tempTender->position[0];
origZPos = tempTender->position[2];
trainCarYRot = func_8000DBAC(tempTender->position, &tempTender->wayPointIndex, D_801635A0[loopIndex].someMultiplier);
trainCarYRot = func_8000DBAC(tempTender->position, &tempTender->wayPointIndex, sTrains[loopIndex].someMultiplier);
tempTender->velocity[0] = tempTender->position[0] - origXPos;
tempTender->velocity[2] = tempTender->position[2] - origZPos;
vec3s_set(trainCarRot, 0, trainCarYRot, 0);
@@ -5727,11 +5716,11 @@ void func_800122D8(void) {
}
for(loopIndex2 = 0; loopIndex2 < NUM_PASSENGER_CAR_ENTRIES; loopIndex2++) {
tempPassengerCar = &D_801635A0[loopIndex].passengerCars[loopIndex2];
tempPassengerCar = &sTrains[loopIndex].passengerCars[loopIndex2];
if (tempPassengerCar->isActive == 1) {
origXPos = tempPassengerCar->position[0];
origZPos = tempPassengerCar->position[2];
trainCarYRot = func_8000DBAC(tempPassengerCar->position, &tempPassengerCar->wayPointIndex, D_801635A0[loopIndex].someMultiplier);
trainCarYRot = func_8000DBAC(tempPassengerCar->position, &tempPassengerCar->wayPointIndex, sTrains[loopIndex].someMultiplier);
tempPassengerCar->velocity[0] = tempPassengerCar->position[0] - origXPos;
tempPassengerCar->velocity[2] = tempPassengerCar->position[2] - origZPos;
vec3s_set(trainCarRot, 0, trainCarYRot, 0);
@@ -5779,122 +5768,99 @@ void func_800122D8(void) {
}
}
#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
extern s16 D_80162EB0;
// arg1 struct tbd
void func_80012780(TrainCarStuff *trainCar, void *arg1, s16 arg2) {
trainCar->position[0] = (f32) arg1->unk0;
void func_80012780(TrainCarStuff *trainCar, s16 *arg1, u16 arg2) {
trainCar->position[0] = (f32) arg1[0];
trainCar->position[1] = (f32) D_80162EB0;
trainCar->position[2] = (f32) arg1[1];
trainCar->actorIndex = -1;
trainCar->wayPointIndex = arg2;
trainCar->isActive = 0;
trainCar->velocity[0] = 0.0f;
trainCar->velocity[1] = 0.0f;
trainCar->velocity[2] = 0.0f;
trainCar->position[2] = (f32) arg1->unk2;
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80012780.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
void func_80012780(TrainStuff *, s32, s32); /* extern */
//void func_80012780(TrainStuff *, s32, s32); /* extern */
extern s16 D_80162FCC;
extern s32 D_80163598;
//extern s32 D_80163598
extern s32 D_8016359C;
extern TrainStuff D_801635C4;
extern s32 gScreenModeSelection;
//extern TrainStuff D_801635C4;
//extern s32 gScreenModeSelection;
// This is really Vec2s D_80163598[465] but that does not match.
// Likely because this is a shared pointer between courses.
extern uintptr_t *D_80163598;
/**
* Set waypoint spawn locations for each rolling stock
* The railroad has 465 waypoints
*/
void func_800127E0(void) {
TrainStuff *sp4C;
TrainCarStuff *var_s2;
TrainStuff *var_a2;
TrainStuff *var_s6;
TrainStuff *var_s6_2;
TrainStuff *var_s6_3;
TrainStuff *var_s7;
TrainStuff *var_s7_2;
s32 temp_t3;
s32 temp_t4;
s32 temp_t6;
s32 temp_t9;
s32 temp_v0;
s32 temp_v0_2;
s32 var_fp;
s32 var_s0;
s32 var_s1;
void *temp_v0_3;
u16 waypointOffset;
TrainCarStuff * ptr1;
s32 * ptr2;
s32 i;
s32 j;
sp4C = &D_801635C4;
var_s6 = D_801635A0;
var_s7 = D_801635A0;
var_fp = 0;
do {
temp_v0 = D_8016359C;
var_s6->someMultiplier = 5.0f;
var_s1 = 0;
var_s2 = var_s7->passengerCars;
var_s0 = ((s32) (((s32) (var_fp * temp_v0) / 2) + 0xA0) % temp_v0) & 0xFFFF;
loop_2:
temp_t3 = (var_s0 + 4) & 0xFFFF;
temp_t4 = temp_t3 * 4;
var_s0 = temp_t3;
func_80012780((TrainStuff *) var_s2, temp_t4 + D_80163598, temp_t3 & 0xFFFF);
var_s1 += 0x24;
var_s2 += 0x24;
if (var_s1 != 0xB4) {
goto loop_2;
for (i = 0; i < 2; i++) {
// outputs 160 or 392 depending on the train
// Wraps the value around to always output a valid waypoint.
waypointOffset = (((i * D_8016359C) / 2) + 160) % D_8016359C;
// 120.0f is about the maximum usable value
sTrains[i].someMultiplier = 5.0f;
for (j = 0; j < 5; j++) {
waypointOffset += 4;
ptr1 = &sTrains[i].passengerCars[j];
ptr2 = &D_80163598[waypointOffset];
func_80012780(ptr1, ptr2, waypointOffset);
}
temp_t6 = (var_s0 + 3) & 0xFFFF;
func_80012780(sp4C, (temp_t6 * 4) + D_80163598, temp_t6 & 0xFFFF);
temp_t9 = (temp_t6 + 4) & 0xFFFF;
func_80012780(var_s6, (temp_t9 * 4) + D_80163598, temp_t9 & 0xFFFF);
var_fp += 1;
sp4C += 0x10C;
var_s6 += 0x10C;
var_s7 += 0x10C;
var_s6->unk-8 = 0;
} while (var_fp < 2);
var_a2 = D_801635A0;
var_s6_2 = D_801635A0;
switch (gScreenModeSelection) { /* irregular */
case SCREEN_MODE_1P:
var_s7_2 = D_801635A0;
do {
var_s6_2->tender.isActive = 1;
var_a2->passengerCars[0].isActive = 1;
var_a2 += 0x10C;
var_s6_2 += 0x10C;
temp_v0_3 = var_s7_2 + (1 * 0x24);
var_s7_2->passengerCars[1].isActive = 1;
temp_v0_3->unk6C = 1;
temp_v0_3->unk90 = 1;
temp_v0_3->unkB4 = 1;
var_s7_2 += 0x10C;
var_s6_2->unk-8 = 6;
} while (var_a2 != D_801637B8);
break;
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
var_s6_3 = D_801635A0;
if (gModeSelection != GRAND_PRIX) {
do {
var_s6_3 += 0x10C;
var_s6_3->unk-E8 = 1;
var_s6_3->unk-34 = 1;
var_s6_3->unk-8 = 2;
} while (var_s6_3 != D_801637B8);
}
break;
// Smaller offset for the tender
waypointOffset += 3;
ptr1 = &sTrains[i].tender;
ptr2 = &D_80163598[waypointOffset];
func_80012780(ptr1, ptr2, waypointOffset);
waypointOffset += 4;
ptr1 = &sTrains[i].locomotive;
ptr2 = &D_80163598[waypointOffset];
func_80012780(&sTrains[i].locomotive, ptr2, waypointOffset);
sTrains[i].numCars = 0;
}
// Spawn all rolling stock in single player mode.
switch (gScreenModeSelection) {
case 0: // single player
for (i = 0; i < 2; i++) {
sTrains[i].tender.isActive = 1;
// Same line required for matching...
for (j = 0; j < 5; j++) { sTrains[i].passengerCars[j].isActive = 1; }
sTrains[i].numCars = 6;
}
break;
// Spawn locomotive, tender, and one passenger car in versus 2/3 player mode.
case 1: // multiplayer fall-through
case 2:
if (gModeSelection != 0) {
for (i = 0; i < 2; i++) {
sTrains[i].tender.isActive = 1;
sTrains[i].passengerCars[4].isActive = 1;
sTrains[i].numCars = 2;
}
}
break;
}
D_80162FCC = 0;
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_800127E0.s")
#endif
void func_80012A48(TrainCarStuff *trainCar, s16 arg1) {
struct TrainCar *trainCarActor;
@@ -5912,108 +5878,88 @@ void func_80012A48(TrainCarStuff *trainCar, s16 arg1) {
trainCarActor->velocity[2] = trainCar->velocity[2];
}
#ifdef MIPS_TO_C
//#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
s32 func_800755FC(s32, f32 *, f32); /* extern */
s32 func_800755FC(s32, Vec3f, f32); /* extern */
s16 func_800DBAC(Vec3f, Vec3s, f32);
extern s16 D_80162FCC;
extern f32 D_801635A4;
extern s16 D_801635BC;
extern Vec3f D_801635A4;
extern Vec3s D_801635BC;
void func_80012AC0(void) {
f32 sp98;
f32 sp94;
f32 sp90;
TrainStuff *sp7C;
TrainCarStuff *temp_s0_2;
TrainCarStuff *temp_s0_3;
TrainStuff *var_s1;
TrainStuff *var_s3;
f32 *var_s6;
s32 pad[3];
f32 temp_f20;
f32 temp_f20_2;
f32 temp_f20_3;
f32 temp_f22;
f32 temp_f22_2;
f32 temp_f22_3;
s16 *var_fp;
s16 temp_a1;
s16 temp_a1_2;
s16 temp_s1;
s16 temp_t0;
s16 temp_v0;
s32 temp_v0_3;
s32 var_s2;
s32 var_s7;
TrainCarStuff *car;
u16 temp_s0;
u16 temp_v0_2;
s16 temp_v0;
f32 temp_f22;
s32 i;
s32 j;
Vec3f sp90;
D_80162FCC += 1;
var_s3 = D_801635A0;
var_fp = &D_801635BC;
var_s6 = &D_801635A4;
sp7C = D_801635A0;
var_s7 = 0;
do {
temp_s0 = (u16) var_s3->locomotive.wayPointIndex;
temp_f20 = var_s3->locomotive.position[0];
temp_f22 = var_s3->locomotive.position[2];
temp_v0 = func_8000DBAC(var_s6, var_fp, var_s3->someMultiplier);
temp_t0 = temp_v0;
temp_s1 = temp_v0;
var_s3->locomotive.velocity[0] = var_s3->locomotive.position[0] - temp_f20;
var_s3->locomotive.velocity[2] = var_s3->locomotive.position[2] - temp_f22;
func_80012A48(&var_s3->locomotive, temp_t0);
temp_v0_2 = (u16) var_s3->locomotive.wayPointIndex;
if ((temp_s0 != temp_v0_2) && ((temp_v0_2 == 0x00BE) || (temp_v0_2 == 0x0140))) {
func_800C98B8(var_s6, var_s3->locomotive.velocity, 0x1901800EU);
} else if (random_int(0x0064U) == 0) {
func_800C98B8(var_s6, var_s3->locomotive.velocity, 0x1901800DU);
for (i = 0; i < 2; i++) {
temp_s0 = (u16) sTrains[i].locomotive.wayPointIndex;
temp_f20 = sTrains[i].locomotive.position[0];
temp_f22 = sTrains[i].locomotive.position[2];
temp_v0 = func_8000DBAC(sTrains[i].locomotive.position, &sTrains[i].locomotive.wayPointIndex, sTrains[i].someMultiplier);
sTrains[i].locomotive.velocity[0] = sTrains[i].locomotive.position[0] - temp_f20;
sTrains[i].locomotive.velocity[2] = sTrains[i].locomotive.position[2] - temp_f22;
func_80012A48(&sTrains[i].locomotive, temp_v0);
//temp_v0_2 = (u16) sTrains[i].locomotive.wayPointIndex;
if ((temp_s0 != sTrains[i].locomotive.wayPointIndex)
&& ((sTrains[i].locomotive.wayPointIndex == 0x00BE)
|| (sTrains[i].locomotive.wayPointIndex == 0x0140))) {
func_800C98B8(sTrains[i].locomotive.position, sTrains[i].locomotive.velocity, 0x1901800E);
} else if (random_int(100) == 0) {
func_800C98B8(sTrains[i].locomotive.position, sTrains[i].locomotive.velocity, 0x1901800D);
//if ((sTrains && sTrains) && sTrains) {}
}
temp_v0_3 = func_800061DC(var_s6, 2000.0f, var_s3->someFlags);
var_s3->someFlags = temp_v0_3;
if ((((s16) D_80162FCC % 5) == 0) && (temp_v0_3 != 0)) {
sp90 = var_s3->locomotive.position[0];
sp94 = (f32) ((f64) var_s3->locomotive.position[1] + 65.0);
sp98 = (f32) ((f64) var_s3->locomotive.position[2] + 25.0);
func_80006114(&sp90, var_s6, temp_s1);
func_800755FC(var_s7, &sp90, 1.1f);
// temp_v0_3 = func_800061DC(&D_801635A4, 2000.0f, sTrains[i].someFlags);
sTrains[i].someFlags = func_800061DC(sTrains[i].locomotive.position, 2000.0f, sTrains[i].someFlags);
if ((((s16) D_80162FCC % 5) == 0) && (sTrains[i].someFlags != 0)) {
sp90[0] = sTrains[i].locomotive.position[0];
sp90[1] = (f32) ((f64) sTrains[i].locomotive.position[1] + 65.0);
sp90[2] = (f32) ((f64) sTrains[i].locomotive.position[2] + 25.0);
func_80006114(sp90, sTrains[i].locomotive.position, temp_v0);
func_800755FC(i, sp90, 1.1f);
}
temp_s0_2 = &var_s3->tender;
if (var_s3->tender.isActive == 1) {
temp_f20_2 = temp_s0_2->position[0];
temp_f22_2 = temp_s0_2->position[2];
temp_a1 = func_8000DBAC(temp_s0_2->position, &temp_s0_2->wayPointIndex, var_s3->someMultiplier);
temp_s0_2->velocity[0] = temp_s0_2->position[0] - temp_f20_2;
temp_s0_2->velocity[2] = temp_s0_2->position[2] - temp_f22_2;
func_80012A48(temp_s0_2, temp_a1);
car = &sTrains[i].tender;
if (car->isActive == 1) {
temp_f20 = car->position[0];
temp_f22 = car->position[2];
temp_v0 = func_8000DBAC(car->position, &car->wayPointIndex, sTrains[i].someMultiplier);
car->velocity[0] = car->position[0] - temp_f20;
car->velocity[2] = car->position[2] - temp_f22;
func_80012A48(car, temp_v0);
}
var_s2 = 0;
var_s1 = sp7C;
loop_13:
temp_s0_3 = var_s1->passengerCars;
if (var_s1->passengerCars[0].isActive == 1) {
temp_f20_3 = temp_s0_3->position[0];
temp_f22_3 = temp_s0_3->position[2];
temp_a1_2 = func_8000DBAC(temp_s0_3->position, &temp_s0_3->wayPointIndex, var_s3->someMultiplier);
temp_s0_3->velocity[0] = temp_s0_3->position[0] - temp_f20_3;
temp_s0_3->velocity[2] = temp_s0_3->position[2] - temp_f22_3;
func_80012A48(temp_s0_3, temp_a1_2);
for (j = 0; j < 5; j++) {
car = &sTrains[i].passengerCars[j];
if (car->isActive == 1) {
temp_f20 = car->position[0];
temp_f22 = car->position[2];
temp_v0 = func_8000DBAC(car->position, &car->wayPointIndex, sTrains[i].someMultiplier);
car->velocity[0] = car->position[0] - temp_f20;
car->velocity[2] = car->position[2] - temp_f22;
func_80012A48(car, temp_v0);
}
}
var_s2 += 0x24;
var_s1 += 0x24;
if (var_s2 != 0xB4) {
goto loop_13;
}
var_s7 += 1;
sp7C += 0x10C;
var_s3 += 0x10C;
var_s6 += 0x10C;
var_fp += 0x10C;
} while (var_s7 != 2);
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80012AC0.s")
#endif
//#else
//GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80012AC0.s")
//#endif
void func_80012DC0(s32 playerId, Player *player) {
TrainCarStuff *trainCar;
@@ -6029,7 +5975,7 @@ void func_80012DC0(s32 playerId, Player *player) {
playerPosX = player->pos[0];
playerPosZ = player->pos[2];
for (trainIndex = 0; trainIndex < NUM_TRAINS; trainIndex++) {
trainCar = &D_801635A0[trainIndex].locomotive;
trainCar = &sTrains[trainIndex].locomotive;
x_dist = playerPosX - trainCar->position[0];
z_dist = playerPosZ - trainCar->position[2];
if ((x_dist > -100.0) && (x_dist < 100.0)) {
@@ -6037,7 +5983,7 @@ void func_80012DC0(s32 playerId, Player *player) {
if (func_80006018(trainCar->position[0], trainCar->position[2], trainCar->velocity[0], trainCar->velocity[2], 60.0f, 20.0f, playerPosX, playerPosZ) == 1) {
player->statusEffects |= 0x400000;
}
trainCar = &D_801635A0[trainIndex].tender;
trainCar = &sTrains[trainIndex].tender;
if (trainCar->isActive == 1) {
if (func_80006018(trainCar->position[0], trainCar->position[2], trainCar->velocity[0], trainCar->velocity[2], 30.0f, 20.0f, playerPosX, playerPosZ) == 1) {
player->statusEffects |= 0x400000;
@@ -6047,7 +5993,7 @@ void func_80012DC0(s32 playerId, Player *player) {
}
for (passengerCarIndex = 0; passengerCarIndex < NUM_PASSENGER_CAR_ENTRIES; passengerCarIndex++) {
trainCar = &D_801635A0[trainIndex].passengerCars[passengerCarIndex];
trainCar = &sTrains[trainIndex].passengerCars[passengerCarIndex];
x_dist = playerPosX - trainCar->position[0];
z_dist = playerPosZ - trainCar->position[2];
if (trainCar->isActive == 1) {
@@ -6065,93 +6011,71 @@ void func_80012DC0(s32 playerId, Player *player) {
}
}
#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
extern s32 D_8016359C;
extern u16 D_801637BC;
extern u16 D_801637BC[2];
/**
* Appears to check if the train is close to the crossing.
* Implements D_801637BC as a counter
*/
void func_80013054(void) {
TrainStuff *var_v1;
f32 var_f8;
f64 temp_f12;
f64 temp_f16;
f64 temp_f18;
u16 *var_a0;
u16 *var_v1_2;
u16 temp_t7;
f32 temp_f16;
f32 temp_f18;
f32 temp_f12;
s32 i;
isCrossingTriggeredByIndex[0] = 0;
isCrossingTriggeredByIndex[1] = 0;
D_801637B8->unk0 = 0;
D_801637B8->unk2 = 0U;
temp_f12 = (f64) 0.42299348f;
temp_f18 = (f64) 0.72017354f;
var_v1 = D_801635A0;
do {
temp_t7 = (u16) var_v1->locomotive.wayPointIndex;
var_f8 = (f32) temp_t7;
if ((s32) temp_t7 < 0) {
var_f8 += 4294967296.0f;
for (i = 0; i < 2; i++) {
temp_f16 = sTrains[i].locomotive.wayPointIndex / ((f32) D_8016359C);
temp_f18 = 0.72017354f;
temp_f12 = 0.42299348f;
if (((temp_f12 - 0.1) < temp_f16)
&& (temp_f16 < ((((f64) sTrains[i].numCars) * 0.01) + (temp_f12 + 0.01)))) {
isCrossingTriggeredByIndex[0] = 1;
}
temp_f16 = (f64) (var_f8 / (f32) D_8016359C);
if (((temp_f12 - 0.1) < temp_f16) && (temp_f16 < (((f64) var_v1->numCars * 0.01) + (temp_f12 + 0.01)))) {
D_801637B8->unk0 = 1;
if (((temp_f18 - 0.1) < temp_f16)
&& (temp_f16 < ((((f64) sTrains[i].numCars) * 0.01) + (temp_f18 + 0.01)))) {
isCrossingTriggeredByIndex[1] = 1;
}
if (((temp_f18 - 0.1) < temp_f16) && (temp_f16 < (((f64) var_v1->numCars * 0.01) + (temp_f18 + 0.01)))) {
D_801637B8->unk2 = 1U;
}
var_v1 += 0x10C;
} while ((u32) var_v1 < (u32) D_801637B8);
var_a0 = &D_801637BC;
var_v1_2 = D_801637B8;
do {
if (*var_v1_2 == 1) {
*var_a0 += 1;
}
for (i = 0; i < 2; i++) {
if (isCrossingTriggeredByIndex[i] == 1) {
D_801637BC[i] += 1;
} else {
*var_a0 = 0;
D_801637BC[i] = 0;
}
var_a0 += 2;
var_v1_2 += 2;
} while (var_a0 != D_801637C0);
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_80013054.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
extern s16 D_801631E0;
extern ? D_801634D8;
extern u16 D_801637BC;
extern s16 D_801634D8[8];
extern u16 D_801637BE;
s16 gCurrentCourseId; /* unable to generate initializer */
void func_800131DC(s32 playerId) {
u16 *sp18;
s16 temp_v0_2;
s16 temp_v0_3;
s32 temp_v0;
u16 *temp_v1;
D_801634D8[playerId] = 0;
if (gCurrentCourseId == COURSE_KALAMARI_DESERT) {
if ((!(D_801631E0[playerId] != 0))
|| (func_800061DC(gPlayers[playerId].pos, 1000.0f, 0))) {
temp_v0 = playerId * 2;
temp_v1 = temp_v0 + &D_801634D8;
*temp_v1 = 0;
if ((gCurrentCourseId == 0x000B) && ((*(&D_801631E0 + temp_v0) == 0) || (sp18 = temp_v1, (func_800061DC((playerId * 0xDD8) + 0x14 + gPlayers, 1000.0f, 0) != 0)))) {
if ((D_801637B8->unk2 == 1) && ((s32) D_801637BE >= 0xF1)) {
temp_v0_2 = D_80162FCE;
if ((temp_v0_2 >= 0xB1) && (temp_v0_2 < 0xB6)) {
*temp_v1 = 1;
if ((isCrossingTriggeredByIndex[1] == 1)
&& ((D_801637BE) > 240)) {
if ((D_80162FCE > 176) && (D_80162FCE < 182)) {
D_801634D8[playerId] = 1;
}
}
}
if ((D_801637B8->unk0 == 1) && ((s32) D_801637BC >= 0xF1)) {
temp_v0_3 = D_80162FCE;
if ((temp_v0_3 >= 0x132) && (temp_v0_3 < 0x136)) {
*temp_v1 = 1;
if ((isCrossingTriggeredByIndex[0] == 1) && (( D_801637BC[0]) > 240)) {
if ((D_80162FCE >= 306) && (D_80162FCE < 0x136)) {
D_801634D8[playerId] = 1;
}
}
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_800131DC.s")
#endif
#ifdef MIPS_TO_C
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
@@ -10511,7 +10435,7 @@ extern Struct80163418 D_80163428;
extern Struct80163418 D_80163438;
void func_8001C05C(void) {
init_seg_8028DF00();
init_segment_racing();
gCurrentCourseId = COURSE_AWARD_CEREMONY;
D_8016347C = 0;
D_8016347E = 0;
+3 -1
View File
@@ -29,7 +29,9 @@ struct unexpiredActors {
/* Function Prototypes */
s16 func_80005FD0(Vec3f, Vec3f);
void func_800100F0(s32);
void func_800120C8(void);
void func_800127E0(void);
s32 func_80006018(f32, f32, f32, f32, f32, f32, f32, f32);
void func_80006114(Vec3f, Vec3f, s16);
s32 func_800061DC(Vec3f, f32, s32);
+22
View File
@@ -53,6 +53,28 @@ variableWatchAttributes gMainVariableWatchList[] = {
DISPLAY_FLOAT_NUMBER,
0, 0
},
{
"Torque 9C: ",
&gPlayers[0].unk_09C,
sizeof(gPlayerOne->unk_09C),
DISPLAY_FLOAT_NUMBER,
0, 0
},
{
"Top Speed 214: ",
&gPlayers[0].unk_214,
sizeof(gPlayerOne->unk_214),
DISPLAY_FLOAT_NUMBER,
0, 0
},
{
"Accel Offset C4: ",
&gPlayers[0].unk_0C4,
sizeof(gPlayerOne->unk_0C4),
DISPLAY_SIGNED_NUMBER,
0, 0
},
};
#endif
+18 -18
View File
@@ -459,20 +459,20 @@ void display_and_vsync(void) {
gGlobalTimer++;
}
void init_seg_80280000(void) {
bzero((void *) SEG_80280000, 0xDF00);
void init_segment_ending_sequences(void) {
bzero((void *) SEG_ENDING_SEQUENCES, 0xDF00);
osWritebackDCacheAll();
dma_copy((u8 *) SEG_80280000, (u8 *) &_code_80280000SegmentRomStart, ALIGN16((u32)&_code_80280000SegmentRomEnd - (u32)&_code_80280000SegmentRomStart));
osInvalICache((void *) SEG_80280000, 0xDF00);
osInvalDCache((void *) SEG_80280000, 0xDF00);
dma_copy((u8 *) SEG_ENDING_SEQUENCES, (u8 *) &_endingSequencesSegmentRomStart, ALIGN16((u32)&_endingSequencesSegmentRomEnd - (u32)&_endingSequencesSegmentRomStart));
osInvalICache((void *) SEG_ENDING_SEQUENCES, 0xDF00);
osInvalDCache((void *) SEG_ENDING_SEQUENCES, 0xDF00);
}
void init_seg_8028DF00(void) {
bzero((void *) SEG_8028DF00, 0x2C470);
void init_segment_racing(void) {
bzero((void *) SEG_RACING, 0x2C470);
osWritebackDCacheAll();
dma_copy((u8 *) SEG_8028DF00, (u8 *) &_code_8028DF00SegmentRomStart, ALIGN16((u32)&_code_8028DF00SegmentRomEnd - (u32)&_code_8028DF00SegmentRomStart));
osInvalICache((void *) SEG_8028DF00, 0x2C470);
osInvalDCache((void *) SEG_8028DF00, 0x2C470);
dma_copy((u8 *) SEG_RACING, (u8 *) &_racingSegmentRomStart, ALIGN16((u32)&_racingSegmentRomEnd - (u32)&_racingSegmentRomStart));
osInvalICache((void *) SEG_RACING, 0x2C470);
osInvalDCache((void *) SEG_RACING, 0x2C470);
}
void dma_copy(u8 *dest, u8 *romAddr, u32 size) {
@@ -502,8 +502,8 @@ void setup_game_memory(void) {
u32 sp38;
UNUSED s32 unknown_padding;
init_seg_8028DF00();
gHeapEndPtr = SEG_8028DF00;
init_segment_racing();
gHeapEndPtr = SEG_RACING;
set_segment_base_addr(0, (void *) SEG_START);
// Memory pool size of 0xAB630
// todo: is it possible to shift this value?
@@ -519,7 +519,7 @@ void setup_game_memory(void) {
set_segment_base_addr(2, (void *) load_data((uintptr_t) &_data_segment2SegmentRomStart, (uintptr_t) &_data_segment2SegmentRomEnd));
sp2C = (u32)&_common_texturesSegmentRomEnd - (u32)&_common_texturesSegmentRomStart;
sp2C = ALIGN16(sp2C);
texture_seg = SEG_8028DF00-sp2C;
texture_seg = SEG_RACING-sp2C;
osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_common_texturesSegmentRomStart, (void *) texture_seg, sp2C, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
@@ -1127,19 +1127,19 @@ void update_gamestate(void) {
break;
case RACING:
// @bug Reloading this segment makes random_u16() deterministic for player spawn order.
// In laymens terms, random_u16() outputs the same value everytime.
init_seg_8028DF00();
// In laymens terms, random_u16() outputs the same value every time.
init_segment_racing();
setup_race();
break;
case ENDING_SEQUENCE:
gCurrentlyLoadedCourseId = COURSE_NULL;
init_seg_80280000();
init_segment_ending_sequences();
load_ceremony_cutscene();
break;
case CREDITS_SEQUENCE:
gCurrentlyLoadedCourseId = COURSE_NULL;
init_seg_8028DF00();
init_seg_80280000();
init_segment_racing();
init_segment_ending_sequences();
load_credits();
break;
}
+2 -2
View File
@@ -82,8 +82,8 @@ void *clear_framebuffer(s32);
void rendering_init(void);
void config_gfx_pool(void);
void display_and_vsync(void);
void init_seg_80280000(void);
void init_seg_8028DF00(void);
void init_segment_ending_sequences(void);
void init_segment_racing(void);
void dma_copy(u8*, u8*, u32);
void setup_game_memory(void);
void game_init_clear_framebuffer(void);
+1 -1
View File
@@ -295,4 +295,4 @@ s32 __osPfsSelectBank(OSPfs *pfs)
}
ret = __osContRamWrite(pfs->queue, pfs->channel, 1024, (u8*)temp, FALSE);
return ret;
}
}
+1 -1
View File
@@ -48,4 +48,4 @@ s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8
}
*file_no = -1;
return PFS_ERR_INVALID;
}
}
+2 -2
View File
@@ -1314,7 +1314,7 @@ void update_obj_wario_stadium_sign(struct Actor *arg0) {
**/
void update_obj_railroad_crossing(struct RailroadCrossing *crossing) {
// If train close?
if (D_801637B8[crossing->crossingId] != 0) {
if (isCrossingTriggeredByIndex[crossing->crossingId] != 0) {
// Timer++
crossing->someTimer++;
// Reset timer
@@ -3920,7 +3920,7 @@ void func_802A2AD0(Camera *arg0, struct RailroadCrossing *rr_crossing) {
gSPSetGeometryMode(gDisplayListHead++, G_LIGHTING);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
if (D_801637B8[rr_crossing->crossingId]) {
if (isCrossingTriggeredByIndex[rr_crossing->crossingId]) {
if (rr_crossing->someTimer < 20) {
gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_crossing_right_active);
+1 -1
View File
@@ -142,7 +142,7 @@ extern Gfx *gDisplayListHead;
extern s32 gModeSelection;
extern s16 gCurrentCourseId;
extern f32 D_80150130[];
extern u16 D_801637B8[];
extern u16 isCrossingTriggeredByIndex[];
extern Lights1 D_800DC610[];
extern u16 gMatrixObjectCount;
@@ -636,7 +636,6 @@ void func_802AC114(Vec3f pos1, f32 boundingBoxSize, Vec3f pos2, UNUSED f32 unk)
// m2c removed because no need to match.
// UNUSED mk64_surface_map_ram *func_802AC22C(void *arg)
// todo: Remove this asm from non_matchings.
GLOBAL_ASM("asm/unused/collision/func_802AC22C.s")
s32 is_colliding_with_drivable_surface(Collision *collision, f32 boundingBoxSize, f32 x1, f32 y1, f32 z1, u16 index, f32 posX, f32 posY, f32 posZ) {
+2 -2
View File
@@ -1353,9 +1353,9 @@ u8 *load_course(s32 courseId) {
unknown1 = gCourseTable[courseId].unknown1;
if ((gGamestate == ENDING_SEQUENCE) || (gGamestate == CREDITS_SEQUENCE)) {
gHeapEndPtr = SEG_80280000;
gHeapEndPtr = SEG_ENDING_SEQUENCES;
} else {
gHeapEndPtr = SEG_8028DF00;
gHeapEndPtr = SEG_RACING;
}
set_segment_base_addr(9, load_data((uintptr_t)offsetRomStart, (uintptr_t) offsetRomEnd));