diff --git a/CMakeLists.txt b/CMakeLists.txt index 488caefd9..e44571372 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -385,14 +385,14 @@ if(MSVC) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") target_compile_options(${PROJECT_NAME} PRIVATE $<$: - /w; + /Wall; /Od; /MTd > $<$: /Oi; /Gy; - /W3; + /Wall; /MT > /permissive-; diff --git a/include/actor_types.h b/include/actor_types.h index 2b600ec13..e4998ae4f 100644 --- a/include/actor_types.h +++ b/include/actor_types.h @@ -83,11 +83,11 @@ enum ActorType { ACTOR_CAR, ACTOR_KIWANO_FRUIT }; -size_t m_GetActorSize(void); -#define ACTOR_LIST_SIZE m_GetActorSize() +size_t CM_GetActorSize(void); +#define ACTOR_LIST_SIZE CM_GetActorSize() -struct Actor* m_GetActor(size_t); -#define GET_ACTOR(index) m_GetActor(index) +struct Actor* CM_GetActor(size_t); +#define GET_ACTOR(index) CM_GetActor(index) // Actor flags #define ACTOR_IS_NOT_EXPIRED 0xF // The actor possesses some kind of collision and can be removed diff --git a/include/defines.h b/include/defines.h index e088066cb..c982a7bdd 100644 --- a/include/defines.h +++ b/include/defines.h @@ -195,6 +195,19 @@ enum { COURSE_ONE, COURSE_TWO, COURSE_THREE, COURSE_FOUR }; #define ENDING 5 #define CREDITS_SEQUENCE 9 +/** + * @brief Options for gRaceState + */ +#define RACE_INIT 0 +#define RACE_SETUP 1 +#define RACE_STAGING 2 +#define RACE_IN_PROGRESS 3 +#define RACE_CALCULATE_RANKS 4 +#define RACE_FINISHED 5 // End of race and score screen +#define RACE_UNK 6 +#define RACE_EXIT 7 + + /** * @brief Options for gScreenModeSelection and gActiveScreenMode */ diff --git a/src/actors/blue_and_red_shells/update.inc.c b/src/actors/blue_and_red_shells/update.inc.c index c09d30d64..277ec2075 100644 --- a/src/actors/blue_and_red_shells/update.inc.c +++ b/src/actors/blue_and_red_shells/update.inc.c @@ -294,9 +294,9 @@ void update_actor_red_blue_shell(struct ShellActor* shell) { func_800C90F4(shell->playerId, (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00)); if (pad13 == ACTOR_RED_SHELL) { - add_red_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_red_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); } else { - add_blue_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_blue_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); func_800C9D80(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x08)); } } @@ -308,9 +308,9 @@ void update_actor_red_blue_shell(struct ShellActor* shell) { func_800C90F4(shell->playerId, (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00)); if (pad13 == ACTOR_RED_SHELL) { - add_red_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_red_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); } else { - add_blue_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_blue_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); func_800C9D80(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x08)); } } diff --git a/src/actors/green_shell/update.inc.c b/src/actors/green_shell/update.inc.c index 4e4c8f9e8..8499bddc4 100644 --- a/src/actors/green_shell/update.inc.c +++ b/src/actors/green_shell/update.inc.c @@ -75,7 +75,7 @@ void update_actor_green_shell(struct ShellActor* shell) { func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04)); func_800C90F4(shell->playerId, (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00)); - add_green_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_green_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); return; } else { shell->state = 1; @@ -98,7 +98,7 @@ void update_actor_green_shell(struct ShellActor* shell) { func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04)); func_800C90F4(shell->playerId, (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00)); - add_green_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_green_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); } } else { shell->rotAngle += 0xE38; @@ -108,7 +108,7 @@ void update_actor_green_shell(struct ShellActor* shell) { func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04)); func_800C90F4(shell->playerId, (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00)); - add_green_shell_in_unexpired_actor_list(m_FindActorIndex(shell)); + add_green_shell_in_unexpired_actor_list(CM_FindActorIndex(shell)); } } if (shell->state == 2) { diff --git a/src/actors/railroad_crossing/render.inc.c b/src/actors/railroad_crossing/render.inc.c index adbe7a7e5..10ca253f0 100644 --- a/src/actors/railroad_crossing/render.inc.c +++ b/src/actors/railroad_crossing/render.inc.c @@ -27,7 +27,7 @@ void render_actor_railroad_crossing(Camera* arg0, struct RailroadCrossing* rr_cr gSPSetGeometryMode(gDisplayListHead++, G_LIGHTING); gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); - if (CourseManager_GetCrossingOnTriggered(rr_crossing->crossingTrigger)) { + if (CM_GetCrossingOnTriggered(rr_crossing->crossingTrigger)) { if (rr_crossing->someTimer < 20) { gSPDisplayList(gDisplayListHead++, d_course_kalimari_desert_dl_crossing_right_active); diff --git a/src/actors/railroad_crossing/update.inc.c b/src/actors/railroad_crossing/update.inc.c index 5e1c54ca1..9c96a044a 100644 --- a/src/actors/railroad_crossing/update.inc.c +++ b/src/actors/railroad_crossing/update.inc.c @@ -9,7 +9,7 @@ */ void update_actor_railroad_crossing(struct RailroadCrossing* crossing) { // If train close? - if (CourseManager_GetCrossingOnTriggered(crossing->crossingTrigger)) { + if (CM_GetCrossingOnTriggered(crossing->crossingTrigger)) { // Timer++ crossing->someTimer++; // Reset timer diff --git a/src/camera.c b/src/camera.c index ef298f55b..5410b33fc 100644 --- a/src/camera.c +++ b/src/camera.c @@ -58,6 +58,8 @@ void camera_init(f32 posX, f32 posY, f32 posZ, UNUSED s16 rot, u32 arg4, s32 cam Player* player = gPlayerOne; Camera* camera = &cameras[cameraId]; + camera->cameraId = cameraId; + D_80152300[cameraId] = arg4; switch (arg4) { case 0: diff --git a/src/camera.h b/src/camera.h index 299954594..6abeb3aad 100644 --- a/src/camera.h +++ b/src/camera.h @@ -55,6 +55,7 @@ typedef struct { /* 0xB0 */ s16 unk_B0; /* 0xB2 */ s16 unk_B2; /* 0xB4 */ f32 unk_B4; + size_t cameraId; } Camera; /* size = 0xB8 */ void camera_init(f32, f32, f32, s16, u32, s32); diff --git a/src/code_800029B0.c b/src/code_800029B0.c index 32aa3137d..a75691622 100644 --- a/src/code_800029B0.c +++ b/src/code_800029B0.c @@ -212,7 +212,7 @@ void setup_race(void) { func_80005310(); func_8003D080(); init_hud(); - D_800DC510 = 0; + gRaceState = RACE_INIT; gNumSpawnedShells = 0; D_800DC5B8 = 0; D_80152308 = 0; @@ -254,7 +254,7 @@ void setup_race(void) { void func_80002DAC(void) { - CourseManager_SomeSounds(); + CM_SomeSounds(); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -324,7 +324,7 @@ void credits_spawn_actors(void) { destroy_all_actors(); CM_CleanWorld(); - CourseManager_CreditsSpawnActors(); + CM_CreditsSpawnActors(); gNumPermanentActors = gNumActors; } diff --git a/src/code_80005FD0.c b/src/code_80005FD0.c index d28138366..011117424 100644 --- a/src/code_80005FD0.c +++ b/src/code_80005FD0.c @@ -37,7 +37,6 @@ #include #include -#include "engine/Engine.h" #include "port/Game.h" #include "engine/courses/Course.h" @@ -1226,7 +1225,7 @@ s32 func_800088D8(s32 playerId, s16 arg1, s16 arg2) { return true; } arg1_times_8 = arg1 * 8; - temp_a3 = &CourseManager_GetProps()->SomePtr[arg1_times_8]; + temp_a3 = &CM_GetProps()->SomePtr[arg1_times_8]; if (arg2 == 0) { if (gDemoMode == 1) { temp_a2 = D_80164450[playerId] - D_80164450[D_80164378[7]]; @@ -1539,8 +1538,8 @@ void update_vehicles(void) { generate_player_smoke(); D_8016337C++; - CourseManager_TickBombKarts(); - CourseManager_VehiclesTick(); + //CM_TickBombKarts(); + //CM_VehiclesTick(); } void func_800098FC(s32 arg0, Player* player) { @@ -1633,7 +1632,7 @@ void func_80009B60(s32 playerId) { f32 athing = 1.5f; player = &gPlayers[playerId]; - if (CourseManager_GetProps()->AIMaximumSeparation >= 0.0f) { + if (CM_GetProps()->AIMaximumSeparation >= 0.0f) { D_80163100[playerId] += 1; if (playerId == 0) { D_80163378++; @@ -1665,10 +1664,10 @@ void func_80009B60(s32 playerId) { D_80163448 = gPathIndexByPlayerId[playerId]; func_80008DC0(D_80163448); //if (GetCourse() == GetKalimariDesert()) { - CourseManager_VehiclesCollision(playerId, player); + CM_VehicleCollision(playerId, player); //func_80012DC0(playerId, player); if (playerId == 0) { - CourseManager_CrossingTrigger(); + CM_CrossingTrigger(); //func_80013054(); } //} @@ -1729,7 +1728,7 @@ void func_80009B60(s32 playerId) { } D_801631F8[playerId] = D_801631E0[playerId]; - CourseManager_DrawVehicles(playerId); + // Old vehicle draw method was here if ((GetCourse() == GetYoshiValley()) || (GetCourse() == GetPodiumCeremony())) { D_801634F8[playerId].unk4 = 0.0f; @@ -1752,14 +1751,14 @@ void func_80009B60(s32 playerId) { (D_8016334C[playerId] < gGPCurrentRaceRankByPlayerId[playerId])) { D_80163210[playerId] = 8.333333f; } else if (D_80162FD0 == (s16) 1U) { - D_80163210[playerId] = CourseManager_GetProps()->D_0D0096B8[gCCSelection]; + D_80163210[playerId] = CM_GetProps()->D_0D0096B8[gCCSelection]; D_801634F8[playerId].unk4 = -0.5f; } else if (D_801645E0[sSomeNearestWaypoint] > 0) { - D_80163210[playerId] = CourseManager_GetProps()->D_0D009418[gCCSelection]; + D_80163210[playerId] = CM_GetProps()->D_0D009418[gCCSelection]; } else { - D_80163210[playerId] = CourseManager_GetProps()->D_0D009568[gCCSelection]; + D_80163210[playerId] = CM_GetProps()->D_0D009568[gCCSelection]; } - CourseManager_AICrossingBehaviour(playerId); + CM_AICrossingBehaviour(playerId); //check_ai_crossing_distance(playerId); func_8000D3B8(playerId); func_8000D438(playerId, D_801630E0); @@ -1911,7 +1910,7 @@ void func_80009B60(s32 playerId) { var_a2 = temp_f6; } - var_v1 = CourseManager_GetProps()->AISteeringSensitivity; + var_v1 = CM_GetProps()->AISteeringSensitivity; switch (D_801631D8[playerId]) { /* switch 4; irregular */ case 2: /* switch 4 */ @@ -1957,15 +1956,15 @@ void func_80009B60(s32 playerId) { D_80163050[playerId] = var_a1; if ((D_801630B8[playerId] == 1) || (D_801630E8[playerId] == 1) || (D_801630E8[playerId] == -1) || (player->effects & 0x1000000C)) { - D_80163028[playerId] = CourseManager_GetProps()->D_0D009418[gCCSelection]; + D_80163028[playerId] = CM_GetProps()->D_0D009418[gCCSelection]; } else { - D_80163028[playerId] = CourseManager_GetProps()->D_0D009568[gCCSelection]; + D_80163028[playerId] = CM_GetProps()->D_0D009568[gCCSelection]; } if ((D_80163068[playerId] > 0.9f) || (D_80163068[playerId] < -0.9f)) { - D_80163028[playerId] = CourseManager_GetProps()->D_0D009808[gCCSelection]; + D_80163028[playerId] = CM_GetProps()->D_0D009808[gCCSelection]; } if (D_80162FD0 == 1) { - D_80163028[playerId] = CourseManager_GetProps()->D_0D0096B8[gCCSelection]; + D_80163028[playerId] = CM_GetProps()->D_0D0096B8[gCCSelection]; } if ((D_801630E8[playerId] == 2) || (D_801630E8[playerId] == -2) || (D_801630E8[playerId] == 3)) { D_80163028[playerId] = 3.3333333f; @@ -1973,7 +1972,7 @@ void func_80009B60(s32 playerId) { D_8016320C = D_80163028[playerId]; player->effects &= ~0x00200000; D_80163210[playerId] = D_8016320C; - CourseManager_AICrossingBehaviour(playerId); + CM_AICrossingBehaviour(playerId); //check_ai_crossing_distance(playerId); func_80008424(playerId, D_8016320C, player); } @@ -2150,7 +2149,7 @@ f32 func_8000B874(f32 posX, f32 posZ, u16 waypointIndex, s32 pathIndex) { void func_8000B95C(s32 playerId, u16 waypointIndex, s32 pathIndex) { UNUSED Vec3f pad; D_80163068[playerId] = 0.0f; - if (CourseManager_GetProps()->AIMaximumSeparation >= 0.0f) { + if (CM_GetProps()->AIMaximumSeparation >= 0.0f) { if ((gPlayers[playerId].type & 0x8000) != 0) { D_80163068[playerId] = func_8000B874(gPlayers[playerId].pos[0], gPlayers[playerId].pos[2], waypointIndex, pathIndex); @@ -3240,7 +3239,7 @@ s32 add_actor_in_unexpired_actor_list(s32 actorIndex, s16 arg1) { } s32 add_red_shell_in_unexpired_actor_list(s32 actorIndex) { - struct Actor* actor = m_GetActor(actorIndex); + struct Actor* actor = CM_GetActor(actorIndex); if (actor->type != ACTOR_RED_SHELL) { return -1; } @@ -3248,7 +3247,7 @@ s32 add_red_shell_in_unexpired_actor_list(s32 actorIndex) { } s32 add_green_shell_in_unexpired_actor_list(s32 actorIndex) { - struct Actor* actor = m_GetActor(actorIndex); + struct Actor* actor = CM_GetActor(actorIndex); if (actor->type != ACTOR_GREEN_SHELL) { return -1; } @@ -3256,7 +3255,7 @@ s32 add_green_shell_in_unexpired_actor_list(s32 actorIndex) { } s32 add_blue_shell_in_unexpired_actor_list(s32 arg0) { - struct Actor* actor = m_GetActor(arg0); + struct Actor* actor = CM_GetActor(arg0); if (actor->type != ACTOR_BLUE_SPINY_SHELL) { return -1; } @@ -3393,7 +3392,7 @@ void func_8000F2BC(TrackWaypoint* arg0, size_t size) { // Appears to allocate memory for each course. void func_8000F2DC(void) { - _struct_gCoursePathSizes_0x10* ptr = &CourseManager_GetProps()->PathSizes; + _struct_gCoursePathSizes_0x10* ptr = &CM_GetProps()->PathSizes; s32 temp; s32 i; @@ -3445,9 +3444,7 @@ void func_8000F2DC(void) { D_80164430 = *gWaypointCountByPathIndex; - CourseManager_ClearVehicles(); - - CourseManager_SpawnVehicles(); + CM_ClearVehicles(); //set_bomb_kart_spawn_positions(); func_8000EEDC(); @@ -3472,7 +3469,7 @@ void func_8000F628(void) { func_8000B95C(i, 0, 0); } //! todo: @BUG this doesn't seem right. This variable is metadata. - D_80163028[i] = CourseManager_GetProps()->D_0D009418[gCCSelection]; + D_80163028[i] = CM_GetProps()->D_0D009418[gCCSelection]; D_801630E8[i] = 0; D_80163100[i] = 0; D_80163178[i] = 0.0f; @@ -3504,7 +3501,7 @@ void func_8000F628(void) { D_80163068[i] = 0.0f; D_80163090[i] = 0.0f; var_s5 = &D_801634F8[i]; - var_s5->unkC = CourseManager_GetProps()->AIMinimumSeparation * (f32) (((i + 1) % 3) - 1); + var_s5->unkC = CM_GetProps()->AIMinimumSeparation * (f32) (((i + 1) % 3) - 1); var_s5->unk4 = var_s5->unkC; var_s5->unk0 = 0.0f; var_s5->unk8 = 0.015f; @@ -3634,16 +3631,16 @@ void func_800100F0(s32 pathIndex) { s16 bInvalidPath; s32 i; - if (CourseManager_GetProps()->AIMaximumSeparation >= 1.0f) { + if (CM_GetProps()->AIMaximumSeparation >= 1.0f) { pathDest = D_80164550[pathIndex]; bInvalidPath = 1; if (GetCourse() != GetPodiumCeremony()) { - var_v0 = process_path_data(pathDest, CourseManager_GetProps()->PathTable2[pathIndex]); + var_v0 = process_path_data(pathDest, CM_GetProps()->PathTable2[pathIndex]); gWaypointCountByPathIndex[pathIndex] = (u16) var_v0; } else { // 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 = CourseManager_GetProps()->PathTable[pathIndex]; + path = CM_GetProps()->PathTable[pathIndex]; ptr = path; for (i = 0; i < 3000; i++, ptr++) { @@ -3685,8 +3682,8 @@ void func_80010218(s32 pathIndex) { TrackWaypoint* var_s1; TrackWaypoint* var_s2; - if (CourseManager_GetProps()->AIMaximumSeparation >= 0.0f) { - waypointWidth = CourseManager_GetProps()->AIMaximumSeparation; + if (CM_GetProps()->AIMaximumSeparation >= 0.0f) { + waypointWidth = CM_GetProps()->AIMaximumSeparation; waypoint = &D_80164550[pathIndex][0]; var_s1 = &D_80164560[pathIndex][0]; var_s2 = &D_80164570[pathIndex][0]; @@ -3736,7 +3733,7 @@ f32 func_80010480(s32 pathIndex, u16 waypointIndex) { f32 root2; f32 root1; - if (CourseManager_GetProps()->AIMaximumSeparation <= -1.0f) { + if (CM_GetProps()->AIMaximumSeparation <= -1.0f) { return 0.0f; } waypointCount = gWaypointCountByPathIndex[pathIndex]; @@ -3778,7 +3775,7 @@ void func_800107C4(s32 pathIndex) { s32 var_a3; s16* wut; - if (CourseManager_GetProps()->AIMaximumSeparation >= 0.0f) { + if (CM_GetProps()->AIMaximumSeparation >= 0.0f) { var_a3 = gWaypointCountByPathIndex[pathIndex]; var_t4 = &D_80164580[pathIndex][0]; for (var_s0 = 0; var_s0 < var_a3; var_s0++, var_t4++) { @@ -3846,7 +3843,7 @@ void func_80010DBC(s32 pathIndex) { s32 waypointIndex; u16* angle; - if (CourseManager_GetProps()->AIMaximumSeparation >= 0.0f) { + if (CM_GetProps()->AIMaximumSeparation >= 0.0f) { for (angle = (u16*) &D_80164590[pathIndex][0], waypointIndex = 0; waypointIndex < gWaypointCountByPathIndex[pathIndex]; waypointIndex++, angle++) { *angle = func_80010CB0(pathIndex, waypointIndex); @@ -4125,7 +4122,7 @@ s32 generate_2d_path(Path2D* pathDest, TrackWaypoint* pathSrc, s32 numWaypoints) void copy_courses_kart_ai_behaviour(void) { s32 i; for (i = 0; i < NUM_COURSES - 1; i++) { - gCoursesKartAIBehaviour[i] = LOAD_ASSET(CourseManager_GetProps()->AIBehaviour); + gCoursesKartAIBehaviour[i] = LOAD_ASSET(CM_GetProps()->AIBehaviour); } } @@ -4148,10 +4145,10 @@ void kart_ai_behaviour_start(s32 playerId, Player* player) { s32 behaviourType; UNUSED s32 test; - KartAIBehaviour *beh = (KartAIBehaviour*)LOAD_ASSET(CourseManager_GetProps()->AIBehaviour); + KartAIBehaviour *beh = (KartAIBehaviour*)LOAD_ASSET(CM_GetProps()->AIBehaviour); sCurrentKartAIBehaviour = - &((KartAIBehaviour*)LOAD_ASSET(CourseManager_GetProps()->AIBehaviour))[gCurrentKartAIBehaviourId[playerId]]; + &((KartAIBehaviour*)LOAD_ASSET(CM_GetProps()->AIBehaviour))[gCurrentKartAIBehaviourId[playerId]]; playerWaypoint = gNearestWaypointByPlayerId[playerId]; @@ -4160,7 +4157,7 @@ void kart_ai_behaviour_start(s32 playerId, Player* player) { behaviourType = sCurrentKartAIBehaviour->type; if ((waypointStart == -1) && (waypointEnd == -1)) { - sCurrentKartAIBehaviour = &((KartAIBehaviour*) LOAD_ASSET(CourseManager_GetProps()->AIBehaviour))[0]; + sCurrentKartAIBehaviour = &((KartAIBehaviour*) LOAD_ASSET(CM_GetProps()->AIBehaviour))[0]; reset_kart_ai_behaviour_none(playerId); return; } @@ -4216,7 +4213,7 @@ void kart_ai_behaviour_end(s32 playerIndex, Player* player) { s32 behaviourType; sCurrentKartAIBehaviour = &( - (KartAIBehaviour*) LOAD_ASSET(CourseManager_GetProps()->AIBehaviour))[gPreviousKartAIBehaviourId[playerIndex]]; + (KartAIBehaviour*) LOAD_ASSET(CM_GetProps()->AIBehaviour))[gPreviousKartAIBehaviourId[playerIndex]]; nearestWaypoint = gNearestWaypointByPlayerId[playerIndex]; behaviourType = sCurrentKartAIBehaviour->type; waypointEnd = sCurrentKartAIBehaviour->waypointEnd; @@ -4350,55 +4347,6 @@ void spawn_vehicle_on_road(Vec3f position, Vec3s rotation, Vec3f velocity, s32 w velocity[2] = position[2] - origZPos; } -void spawn_course_vehicles(void) { - s16 trainCarYRot; - UNUSED Vec3f pad; - TrainCarStuff* tempLocomotive; - TrainCarStuff* tempTender; - TrainCarStuff* tempPassengerCar; - Vec3s trainCarRot; - VehicleStuff* tempBoxTruck; - VehicleStuff* tempSchoolBus; - VehicleStuff* tempTankerTruck; - VehicleStuff* tempCar; - PaddleBoatStuff* tempPaddleWheelBoat; - Vec3s paddleWheelBoatRot; - s32 loopIndex; - s32 loopIndex2; - f32 origXPos; - f32 origZPos; - - CourseManager_SpawnVehicles(); - - // if (GetCourse() == GetToadsTurnpike()) { - // for (loopIndex = 0; loopIndex < NUM_RACE_BOX_TRUCKS; loopIndex++) { - // tempBoxTruck = &gBoxTruckList[loopIndex]; - // spawn_vehicle_on_road(tempBoxTruck); - // tempBoxTruck->actorIndex = add_actor_to_empty_slot(tempBoxTruck->position, tempBoxTruck->rotation, - // tempBoxTruck->velocity, ACTOR_BOX_TRUCK); - // } - // for (loopIndex = 0; loopIndex < NUM_RACE_SCHOOL_BUSES; loopIndex++) { - // tempSchoolBus = &gSchoolBusList[loopIndex]; - // spawn_vehicle_on_road(tempSchoolBus); - // tempSchoolBus->actorIndex = add_actor_to_empty_slot(tempSchoolBus->position, tempSchoolBus->rotation, - // tempSchoolBus->velocity, ACTOR_SCHOOL_BUS); - // } - // for (loopIndex = 0; loopIndex < NUM_RACE_TANKER_TRUCKS; loopIndex++) { - // tempTankerTruck = &gTankerTruckList[loopIndex]; - // spawn_vehicle_on_road(tempTankerTruck); - // tempTankerTruck->actorIndex = - // add_actor_to_empty_slot(tempTankerTruck->position, tempTankerTruck->rotation, - // tempTankerTruck->velocity, ACTOR_TANKER_TRUCK); - // } - // for (loopIndex = 0; loopIndex < NUM_RACE_CARS; loopIndex++) { - // tempCar = &gCarList[loopIndex]; - // spawn_vehicle_on_road(tempCar); - // tempCar->actorIndex = - // add_actor_to_empty_slot(tempCar->position, tempCar->rotation, tempCar->velocity, ACTOR_CAR); - // } - // } -} - void set_vehicle_pos_waypoint(TrainCarStuff* trainCar, Path2D* posXZ, u16 waypoint) { trainCar->position[0] = (f32) posXZ->x; trainCar->position[1] = (f32) D_80162EB0; diff --git a/src/code_80005FD0.h b/src/code_80005FD0.h index f675556a8..402be420b 100644 --- a/src/code_80005FD0.h +++ b/src/code_80005FD0.h @@ -156,7 +156,6 @@ void generate_train_waypoints(void); void generate_ferry_waypoints(void); void spawn_vehicle_on_road(Vec3f position, Vec3s rotation, Vec3f velocity, s32 waypointIndex, s32 someMultiplierTheSequel, f32 speed); -void spawn_course_vehicles(void); void set_vehicle_pos_waypoint(TrainCarStuff*, Path2D*, u16); void init_vehicles_trains(size_t, size_t, f32); void sync_train_components(TrainCarStuff*, s16); diff --git a/src/code_8003DC40.c b/src/code_8003DC40.c index 845b2bda3..c710a7b5d 100644 --- a/src/code_8003DC40.c +++ b/src/code_8003DC40.c @@ -232,7 +232,7 @@ void func_8003F46C(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4 player->kartHopVelocity = 0.0f; return; } else { - CourseManager_SomeCollisionThing(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + CM_SomeCollisionThing(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: // //func_8003E048(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); diff --git a/src/code_80057C60.c b/src/code_80057C60.c index fcd46116a..d9807e954 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -557,8 +557,6 @@ void render_object_p1(void) { gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - CourseManager_DrawBombKarts(PLAYER_ONE); // render_bomb_karts_wrap(PLAYER_ONE); - // if (gGamestate == ENDING) { // //func_80055F48(PLAYER_ONE); // //func_80056160(PLAYER_ONE); @@ -576,7 +574,6 @@ void render_object_p2(void) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[1]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - CourseManager_DrawBombKarts(PLAYER_TWO); // render_bomb_karts_wrap(PLAYER_TWO); render_object_for_player(PLAYER_TWO); } @@ -587,7 +584,6 @@ void render_object_p3(void) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[2]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - CourseManager_DrawBombKarts(PLAYER_THREE); // render_bomb_karts_wrap(PLAYER_THREE); render_object_for_player(PLAYER_THREE); } @@ -599,7 +595,6 @@ void render_object_p4(void) { G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[3]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION); - CourseManager_DrawBombKarts(PLAYER_FOUR); // render_bomb_karts_wrap(PLAYER_FOUR); if ((!gDemoMode) && (gPlayerCountSelection1 == 4)) { // render_lakitu(PLAYER_FOUR); @@ -689,9 +684,9 @@ void render_player_snow_effect_four(void) { } void render_object_for_player(s32 cameraId) { - CourseManager_DrawObjects(cameraId); + CM_DrawObjects(cameraId); CM_DrawParticles(cameraId); - CourseManager_RenderCourseObjects(cameraId); + CM_RenderCourseObjects(cameraId); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -785,8 +780,7 @@ void render_object_for_player(s32 cameraId) { render_balloons_grand_prix(cameraId); } if (gModeSelection == BATTLE) { - CourseManager_DrawBattleBombKarts(cameraId); - // render_battle_bomb_karts(cameraId); + CM_DrawBattleBombKarts(cameraId); } } @@ -800,7 +794,7 @@ void render_snowing_effect(s32 playerId) { render_object_snowflakes_particles(); } } - if (CourseManager_GetProps()->LakituTowType == 1) { + if (CM_GetProps()->LakituTowType == 1) { render_ice_block(playerId); } } @@ -1241,7 +1235,7 @@ void func_8005995C(void) { void func_80059A88(s32 playerId) { func_80059820(playerId); if (!gDemoMode) { - // update_object_lakitu(playerId); // Moved to CourseManager_TickObjects60fps + // update_object_lakitu(playerId); // Moved to CM_TickObjects60fps func_8007BB9C(playerId); } } @@ -1283,7 +1277,7 @@ void func_80059AC8(void) { break; } - CourseManager_TickObjects60fps(); + CM_TickObjects60fps(); } } @@ -1400,7 +1394,7 @@ void func_80059D00(void) { break; } update_object(); - CourseManager_TickObjects(); + CM_TickObjects(); CM_TickParticles(); func_800744CC(); } @@ -1418,12 +1412,12 @@ void func_8005A070(void) { // func_80086D80(); // update_cheep_cheep(1); // func_80077640(); - CourseManager_TickObjects(); + CM_TickObjects(); CM_TickParticles(); } else if (gGamestate == CREDITS_SEQUENCE) { func_80059820(PLAYER_ONE); func_80078C70(0); - CourseManager_TickObjects(); + CM_TickObjects(); CM_TickParticles(); } else { // normal gameplay func_80059D00(); @@ -1572,7 +1566,7 @@ void func_8005A71C(void) { void update_object(void) { - CourseManager_UpdateCourseObjects(); + CM_UpdateCourseObjects(); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -2718,7 +2712,7 @@ void func_8005D18C(void) { void func_8005D1F4(s32 cameraId) { - CourseManager_BombKartsWaypoint(cameraId); + CM_BombKartsWaypoint(cameraId); // s32 playerWaypoint; // s32 bombWaypoint; // s32 var_a2; diff --git a/src/code_8006E9C0.c b/src/code_8006E9C0.c index dba0d21a7..e5cc43887 100644 --- a/src/code_8006E9C0.c +++ b/src/code_8006E9C0.c @@ -29,7 +29,6 @@ #include #include "port/Game.h" -#include "engine/Engine.h" #include "engine/courses/Course.h" void init_hud(void) { @@ -164,11 +163,11 @@ void init_item_window(s32 objectIndex) { } void func_8006EEE8(s32 courseId) { - D_8018D240 = (uintptr_t) CourseManager_GetProps()->MinimapTexture; + D_8018D240 = (uintptr_t) CM_GetProps()->MinimapTexture; // This is incredibly dumb. MinimapDimensions ought to be something more like // `u16 MinimapDimensions[][2]` but that doesn't match for some insane reason - gMinimapWidth = CourseManager_GetProps()->MinimapDimensions.X; // MinimapDimensions[courseId * 2]; - gMinimapHeight = CourseManager_GetProps()->MinimapDimensions.Z; // MinimapDimensions[courseId * 2 + 1]; + gMinimapWidth = CM_GetProps()->MinimapDimensions.X; // MinimapDimensions[courseId * 2]; + gMinimapHeight = CM_GetProps()->MinimapDimensions.Z; // MinimapDimensions[courseId * 2 + 1]; } void func_8006EF60(void) { @@ -182,7 +181,7 @@ void func_8006EF60(void) { // clang-format off // God forgive me for my sins... - // huh = 0x14; if (0) {} for (i = 0; i < huh; i++) {D_8018D248[i] = CourseManager_GetProps()->MinimapTexture; wut += ResourceGetTexSizeByName(CourseManager_GetProps()->MinimapTexture); } + // huh = 0x14; if (0) {} for (i = 0; i < huh; i++) {D_8018D248[i] = CM_GetProps()->MinimapTexture; wut += ResourceGetTexSizeByName(CM_GetProps()->MinimapTexture); } // clang-format on } @@ -201,7 +200,7 @@ void func_8006F008(void) { if (GetCourse() != GetPodiumCeremony()) { func_8006EEE8((s32) gCurrentCourseId); } - CourseManager_MinimapSettings(); + CM_MinimapSettings(); switch (gCurrentCourseId) { case COURSE_MARIO_RACEWAY: @@ -625,8 +624,6 @@ void init_object_list_index(void) { find_unused_obj_index(&indexObjectList4[loopIndex]); } - CourseManager_SpawnBombKarts(); - // for (loopIndex = 0; loopIndex < NUM_BOMB_KARTS_VERSUS; loopIndex++) { // find_unused_obj_index(&gIndexObjectBombKart[loopIndex]); // } @@ -707,7 +704,7 @@ void func_8007055C(void) { s32 var_s0; s32 var_s4; - CourseManager_InitClouds(); + CM_InitClouds(); switch (gCurrentCourseId) { case COURSE_MARIO_RACEWAY: @@ -777,7 +774,7 @@ void init_course_object(void) { s32 objectId; s32 i; - CourseManager_InitCourseObjects(); + CM_InitCourseObjects(); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: diff --git a/src/effects.c b/src/effects.c index bff1803ff..06e476117 100644 --- a/src/effects.c +++ b/src/effects.c @@ -1510,7 +1510,7 @@ void func_8008FC1C(Player* player) { if ((player->type & PLAYER_UNKNOWN_0x40) != 0) { playerIndex = get_player_index_for_player(player); - player->type = 0x7000; + player->type = PLAYER_HUMAN | PLAYER_START_SEQUENCE | PLAYER_KART_AI; func_80056A94(playerIndex); } } @@ -1522,7 +1522,6 @@ void func_8008FC64(Player* player, s8 arg1) { player->soundEffects &= 0xFBFFFFFF; player->soundEffects |= 0x08000000; player->type |= PLAYER_UNKNOWN_0x40; - func_8008FDA8(player, arg1); func_800569F4(arg1); } @@ -1534,7 +1533,6 @@ void func_8008FCDC(Player* player, s8 arg1) { player->unk_0C6 = 0xFF; player->soundEffects &= ~0x08000000; } - func_80056A40(arg1, (u32) player->unk_0C6); } @@ -1588,12 +1586,12 @@ void func_8008FEDC(Player* player, UNUSED s8 arg1) { player->kartHopAcceleration = 0.0f; } -void CourseManager_Waypoints(Player*, s8); +void CM_Waypoints(Player*, s8); void func_8008FF08(Player* player, s8 playerId) { s16 waypoint; - CourseManager_Waypoints(player, playerId); + CM_Waypoints(player, playerId); // switch (gCurrentCourseId) { // case COURSE_BOWSER_CASTLE: diff --git a/src/ending/code_80280000.c b/src/ending/code_80280000.c index 8075d2daf..b4d5ca103 100644 --- a/src/ending/code_80280000.c +++ b/src/ending/code_80280000.c @@ -25,7 +25,6 @@ #include "main.h" #include "render_player.h" -#include "engine/Engine.h" #include "engine/courses/Course.h" #include "engine/Matrix.h" #include "port/Game.h" @@ -57,7 +56,7 @@ void func_80280038(void) { func_80057FC4(0); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CourseManager_GetProps()->NearPersp, CourseManager_GetProps()->FarPersp, 1.0f); + guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); diff --git a/src/ending/code_80281780.c b/src/ending/code_80281780.c index 1c2fbe324..e7c55de1a 100644 --- a/src/ending/code_80281780.c +++ b/src/ending/code_80281780.c @@ -164,7 +164,7 @@ void setup_podium_ceremony(void) { balloons_and_fireworks_init(); init_camera_podium_ceremony(); func_80093E60(); - CourseManager_SpawnActors(); + CM_BeginPlay(); D_801625F8 = (uintptr_t) gHeapEndPtr - gNextFreeMemoryAddress; D_801625FC = ((f32) D_801625F8 / 1000.0f); } diff --git a/src/ending/code_80281C40.c b/src/ending/code_80281C40.c index 1e4c63e79..18507f23b 100644 --- a/src/ending/code_80281C40.c +++ b/src/ending/code_80281C40.c @@ -15,8 +15,8 @@ #include "defines.h" #include "memory.h" -#include "engine/Engine.h" #include "engine/courses/Course.h" +#include "port/Game.h" struct UnkStruct80287560 { s16 unk0; @@ -72,7 +72,7 @@ void func_80281D00(void) { } func_8028150C(); gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH); - guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CourseManager_GetProps()->NearPersp, CourseManager_GetProps()->FarPersp, + guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), diff --git a/src/engine/Actor.cpp b/src/engine/Actor.cpp index 8bd472b08..be86d2a5f 100644 --- a/src/engine/Actor.cpp +++ b/src/engine/Actor.cpp @@ -8,6 +8,7 @@ AActor::AActor() {} void AActor::Tick() { } void AActor::Draw(Camera *camera) { } void AActor::Collision(Player* player, AActor* actor) {} +void AActor::VehicleCollision(s32 playerId, Player* player){} void AActor::Destroy() { // Set uuid to zero. memset(uuid, 0, sizeof(uuid)); diff --git a/src/engine/Actor.h b/src/engine/Actor.h index 88f5b34a0..a74ed74e0 100644 --- a/src/engine/Actor.h +++ b/src/engine/Actor.h @@ -32,6 +32,8 @@ public: virtual void Tick(); virtual void Draw(Camera*); virtual void Collision(Player* player, AActor* actor); + virtual void VehicleCollision(s32 playerId, Player* player); + virtual void Destroy(); virtual bool IsMod(); }; diff --git a/src/engine/CoreMath.h b/src/engine/CoreMath.h index c5f3211f4..ea74dd9a4 100644 --- a/src/engine/CoreMath.h +++ b/src/engine/CoreMath.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef CORE_MATH_H +#define CORE_MATH_H #include @@ -13,6 +14,7 @@ struct FVector { float x, y, z; +#ifdef __cplusplus FVector& operator=(const FVector& other) { x = other.x; y = other.y; @@ -22,6 +24,7 @@ struct FVector { FVector() : x(0), y(0), z(0) {} FVector(float x, float y, float z) : x(x), y(y), z(z) {} +#endif // __cplusplus }; /** @@ -33,6 +36,7 @@ struct FVector { struct FVector2D { float x, z; +#ifdef __cplusplus FVector2D& operator=(const FVector2D& other) { x = other.x; z = other.z; @@ -41,12 +45,14 @@ struct FVector2D { FVector2D() : x(0), z(0) {} FVector2D(float x, float z) : x(x), z(z) {} +#endif // __cplusplus }; // Sets integer X Z coordinates -struct IVector2D { +typedef struct IVector2D { int32_t X, Z; +#ifdef __cplusplus IVector2D() : X(0), Z(0) {} // Default constructor IVector2D(int32_t x, int32_t z) : X(x), Z(z) {} // Constructor to initialize with values @@ -57,11 +63,13 @@ struct IVector2D { Z = other.Z; return *this; } -}; +#endif // __cplusplus +} IVector2D; struct FRotation { float pitch, yaw, roll; +#ifdef __cplusplus FRotation& operator=(const FRotation& other) { pitch = other.pitch; yaw = other.yaw; @@ -71,6 +79,7 @@ struct FRotation { FRotation() : pitch(0), yaw(0), roll(0) {} FRotation(float p, float y, float r) : pitch(p), yaw(y), roll(r) {} +#endif // __cplusplus }; /** @@ -80,6 +89,7 @@ struct FRotation { struct IPathSpan { int Start, End; +#ifdef __cplusplus // Default Constructor IPathSpan() : Start(0), End(0) {} @@ -105,4 +115,7 @@ struct IPathSpan { bool operator!=(const IPathSpan& Other) const { return !(*this == Other); } +#endif // __cplusplus }; + +#endif // CORE_MATH_H \ No newline at end of file diff --git a/src/engine/Engine.h b/src/engine/Engine.h deleted file mode 100644 index 98e9a99fc..000000000 --- a/src/engine/Engine.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef __ENGINE_H__ -#define __ENGINE_H__ - -#include "common_structs.h" -#include "bomb_kart.h" -#include "objects.h" -#include "path_spawn_metadata.h" -#include "waypoints.h" -#include "sounds.h" -#include "course_offsets.h" - -typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; -} SkyboxColours; - -typedef struct { - int32_t X; - int32_t Z; -} IVector2D_C; - -typedef struct { - const char* Id; - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - const char* MinimapTexture; - s32 LakituTowType; - IVector2D_C MinimapDimensions; - float AIMaximumSeparation; - float AIMinimumSeparation; - float NearPersp; - float FarPersp; - s16 *SomePtr; - u32 AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - TrackWaypoint* PathTable[4]; - TrackWaypoint* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - s32 MinimapFinishlineX; - s32 MinimapFinishlineY; - SkyboxColours Skybox; - const course_texture *textures; - enum MusicSeq Sequence; -} CProperties; - -#endif // __ENGINE_H__ \ No newline at end of file diff --git a/src/engine/PlayerBombKart.cpp b/src/engine/PlayerBombKart.cpp new file mode 100644 index 000000000..9ab3b74e1 --- /dev/null +++ b/src/engine/PlayerBombKart.cpp @@ -0,0 +1,95 @@ +#include "PlayerBombKart.h" +#include "Matrix.h" + +extern "C" { +#include "common_structs.h" +#include "assets/common_data.h" +#include "camera.h" +#include "render_objects.h" +#include "math_util_2.h" +#include "code_80057C60.h" +#include "menus.h" +} + +void PlayerBombKart::Draw(size_t playerId, s32 cameraId) { // render_player_bomb_kart + Player* player = &gPlayerOne[playerId]; + if (state != PlayerBombKartState::DISABLED) { + pos.x = player->pos[0]; + pos.y = player->pos[1] - 2.0; + pos.z = player->pos[2]; + surfaceHeight = player->unk_074; + PlayerBombKart::func_800563DC(cameraId, _primAlpha); + PlayerBombKart::func_8005669C(_primAlpha); + PlayerBombKart::func_800568A0(cameraId); + } +} + +void PlayerBombKart::func_800563DC(s32 cameraId, s32 arg2) { + s32 temp_s0; + s32 temp_v0; + s32 residue; + Camera* camera = &camera1[cameraId]; + + residue = D_801655CC % 4U; + D_80183E40[0] = pos.x; + D_80183E40[1] = pos.y + 1.0; + D_80183E40[2] = pos.z; + D_80183E80[0] = 0; + D_80183E80[1] = func_800418AC(pos.x, pos.z, camera->pos); + D_80183E80[2] = 0x8000; + rsp_set_matrix_transformation(D_80183E40, D_80183E80, 0.2f); + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007E98); + func_8004B310(arg2); + draw_rectangle_texture_overlap((u8*) common_tlut_bomb, (u8*)common_texture_bomb[residue], (Vtx*)D_0D005AE0, 0x00000020, + 0x00000020, 0x00000020, 0x00000020); + temp_s0 = D_8018D400; + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007B00); + func_8004B414(0, 0, 0, arg2); + D_80183E40[1] = D_80183E40[1] + 4.0; + D_80183E80[2] = 0; + func_800562E4(temp_s0 % 3, temp_s0 % 4, arg2); + temp_v0 = temp_s0 + 1; + D_80183E80[2] = 0x6000; + func_800562E4(temp_v0 % 3, temp_v0 % 4, arg2); + temp_v0 = temp_s0 + 2; + D_80183E80[2] = 0xA000; + func_800562E4(temp_v0 % 3, temp_v0 % 4, arg2); + gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); +} + +void PlayerBombKart::func_8005669C(s32 arg2) { + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D0079E8); + func_8004B310(arg2); + load_texture_block_rgba16_mirror((u8*) D_0D02AA58, 0x00000010, 0x00000010); + D_80183E40[1] = pos.y - 2.0; + D_80183E40[0] = pos.x + 2.0; + D_80183E40[2] = pos.z + 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x + 2.0; + D_80183E40[2] = pos.z - 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x - 2.0; + D_80183E40[2] = pos.z - 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + D_80183E40[0] = pos.x - 2.0; + D_80183E40[2] = pos.z + 2.0; + func_800431B0(D_80183E40, D_80183E80, 0.15f, (Vtx*)common_vtx_rectangle); + gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); +} + +void PlayerBombKart::func_800568A0(s32 cameraId) { + Mat4 mtx; + Player* player; + + player = &gPlayerOne[cameraId]; + D_80183E50[0] = pos.x; + D_80183E50[1] = surfaceHeight + 0.8; + D_80183E50[2] = pos.z; + set_transform_matrix(mtx, player->collision.orientationVector, D_80183E50, 0U, 0.5f); + // convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], mtx); + // gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]), + // G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + AddHudMatrix(mtx, G_MTX_LOAD | G_MTX_NOPUSH | G_MTX_MODELVIEW); + gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007B98); +} \ No newline at end of file diff --git a/src/engine/PlayerBombKart.h b/src/engine/PlayerBombKart.h new file mode 100644 index 000000000..c1e58d815 --- /dev/null +++ b/src/engine/PlayerBombKart.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include "CoreMath.h" + +class PlayerBombKart { +public: + + enum PlayerBombKartState { + DISABLED, + ACTIVE, + }; + + s16 state = PlayerBombKartState::DISABLED; + FVector pos = {0, 0, 0}; + f32 surfaceHeight = 0; + s32 _primAlpha = 0; + + void Draw(size_t playerId, s32 cameraId); + void func_800563DC(s32 cameraId, s32 arg2); + void func_8005669C(s32 arg2); + void func_800568A0(s32 cameraId); +}; diff --git a/src/engine/Smoke.cpp b/src/engine/Smoke.cpp index 9841bfffb..5fb0c0c39 100644 --- a/src/engine/Smoke.cpp +++ b/src/engine/Smoke.cpp @@ -3,7 +3,6 @@ #include "Smoke.h" #include "World.h" -#include "vehicles/Vehicle.h" #include "vehicles/Train.h" #include "vehicles/Boat.h" @@ -23,8 +22,8 @@ void TrainSmokeTick() { s32 temp_a0; Object* object; - for (auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast(vehicle)) { + for (auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast(actor)) { if (train->SmokeTimer != 0) { train->SmokeTimer -= 1; } @@ -48,7 +47,7 @@ void TrainSmokeTick() { train->SmokeTimer = 100; } } - } else if (auto boat = dynamic_cast(vehicle)) { + } else if (auto boat = dynamic_cast(actor)) { if (boat->SmokeTimer != 0) { boat->SmokeTimer -= 1; } @@ -78,8 +77,9 @@ void TrainSmokeTick() { void TrainSmokeDraw(s32 cameraId) { Camera* camera = &camera1[cameraId]; - for (auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast(vehicle)) { + + for (auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast(actor)) { gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007AE0); load_texture_block_i8_nomirror((uint8_t*)D_0D029458, 32, 32); func_8004B72C(255, 255, 255, 255, 255, 255, 255); @@ -92,7 +92,7 @@ void TrainSmokeDraw(s32 cameraId) { render_object_train_smoke_particle(train->SmokeParticles[i], cameraId); } } - } else if (auto boat = dynamic_cast(vehicle)) { + } else if (auto boat = dynamic_cast(actor)) { gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D007AE0); load_texture_block_i8_nomirror((uint8_t*)D_0D029458, 32, 32); diff --git a/src/engine/TrainCrossing.cpp b/src/engine/TrainCrossing.cpp index 98c7c766b..2d4442a30 100644 --- a/src/engine/TrainCrossing.cpp +++ b/src/engine/TrainCrossing.cpp @@ -1,7 +1,7 @@ #include #include "TrainCrossing.h" #include "World.h" -#include "vehicles/Vehicle.h" +#include "engine/Actor.h" #include "vehicles/Train.h" #include @@ -29,8 +29,8 @@ void TrainCrossing::CrossingTrigger() { OnTriggered = 0; - for (const auto& vehicle : gWorldInstance.Vehicles) { - if (auto train = dynamic_cast(vehicle)) {; + for (const auto& actor : gWorldInstance.Actors) { + if (auto train = dynamic_cast(actor)) {; f32 radius = DynamicRadius(train->Locomotive.position, train->Locomotive.velocity, Position); if (Distance(train->Locomotive.position, Position) < radius) { diff --git a/src/engine/World.cpp b/src/engine/World.cpp index 5617efd39..d67a2577c 100644 --- a/src/engine/World.cpp +++ b/src/engine/World.cpp @@ -2,7 +2,6 @@ #include "World.h" #include "Cup.h" #include "courses/Course.h" -#include "vehicles/Vehicle.h" #include "objects/BombKart.h" #include "TrainCrossing.h" #include @@ -12,7 +11,6 @@ extern "C" { #include "camera.h" #include "objects.h" #include "main.h" - #include "engine/Engine.h" #include "defines.h" #include "audio/external.h" #include "menus.h" @@ -35,26 +33,12 @@ void World::SetCourseFromCup() { CurrentCourse = CurrentCup->GetCourse(); } - -AVehicle* World::AddVehicle(AVehicle* vehicle) { - Vehicles.push_back(vehicle); - return Vehicles.back(); -} - -void World::ClearVehicles(void) { - Vehicles.clear(); -} - TrainCrossing* World::AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius) { auto crossing = std::make_shared(position, waypointMin, waypointMax, approachRadius, exitRadius); Crossings.push_back(crossing); return crossing.get(); } -void World::AddBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C) { - BombKarts.push_back(new OBombKart(pos, waypoint, waypointIndex, state, unk_3C)); -} - u32 World::GetCupIndex() { return this->CupIndex; } @@ -97,13 +81,6 @@ void World::SetCup(Cup* cup) { } } -CProperties* World::GetCourseProps() { - if (Courses[CourseIndex]) { - return (CProperties*) &Courses[CourseIndex]->Props; - } - return nullptr; -} - void World::SetCourse(const char* name) { //! @todo Use content dictionary instead for (size_t i = 0; i < Courses.size(); i++) { @@ -168,6 +145,7 @@ AActor* World::GetActor(size_t index) { } void World::TickActors() { + // This only ticks modded actors for (AActor* actor : Actors) { if (actor->IsMod()) { actor->Tick(); diff --git a/src/engine/World.h b/src/engine/World.h index a8e9932f5..3ba6e0437 100644 --- a/src/engine/World.h +++ b/src/engine/World.h @@ -2,12 +2,13 @@ #include #include "CoreMath.h" +#include "engine/courses/Course.h" #include "objects/Object.h" #include "Cup.h" -#include "vehicles/Vehicle.h" #include "vehicles/Train.h" #include "vehicles/Car.h" #include "objects/BombKart.h" +#include "PlayerBombKart.h" #include "vehicles/Train.h" #include "TrainCrossing.h" #include "objects/Thwomp.h" @@ -22,7 +23,6 @@ extern "C" { #include "camera.h" #include "objects.h" -#include "engine/Engine.h" }; class OObject; @@ -34,47 +34,6 @@ class TrainCrossing; class OLakitu; class World { - - typedef struct { - uint8_t r, g, b; - } RGB8; - - typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; - } SkyboxColours; - - - typedef struct { - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - float AIMaximumSeparation; - float AIMinimumSeparation; - int16_t *SomePtr; - uint32_t AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - const char* PathTable[4]; - const char* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - int32_t MinimapFinishlineX; - int32_t MinimapFinishlineY; - SkyboxColours Skybox; - MusicSeq Sequence; - } Properties; - typedef struct { std::vector Hud; std::vector Objects; @@ -98,7 +57,6 @@ public: OObject* AddObject(OObject* object); - CProperties* GetCourseProps(); void TickObjects(); void TickObjects60fps(); void DrawObjects(s32 cameraId); @@ -136,18 +94,12 @@ public: std::vector Actors; std::vector Objects; - std::vector Vehicles; - std::vector BombKarts; std::vector Emitters; std::unordered_map Lakitus; - AVehicle* AddVehicle(AVehicle* vehicle); - - void ClearVehicles(void); - /** Objects **/ - void AddBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, uint16_t state, f32 unk_3C); + PlayerBombKart playerBombKart[4]; // Used in battle mode TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius); std::vector> Crossings; diff --git a/src/engine/courses/BansheeBoardwalk.cpp b/src/engine/courses/BansheeBoardwalk.cpp index 03b4a9bd2..4ff92d107 100644 --- a/src/engine/courses/BansheeBoardwalk.cpp +++ b/src/engine/courses/BansheeBoardwalk.cpp @@ -149,7 +149,7 @@ void BansheeBoardwalk::Load() { void BansheeBoardwalk::LoadTextures() { } -void BansheeBoardwalk::SpawnActors() { +void BansheeBoardwalk::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_banshee_boardwalk_item_box_spawns)); @@ -175,19 +175,17 @@ void BansheeBoardwalk::SpawnActors() { gWorldInstance.AddObject(new OBoos(5, IPathSpan(180, 190), IPathSpan(200, 210), IPathSpan(280, 290))); gWorldInstance.AddObject(new OBoos(5, IPathSpan(490, 500), IPathSpan(510, 520), IPathSpan(620, 630))); } -} -void BansheeBoardwalk::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][110], 110, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][475], 475, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][610], 610, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][110], 110, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][475], 475, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][610], 610, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/BansheeBoardwalk.h b/src/engine/courses/BansheeBoardwalk.h index 612597578..f1b98538d 100644 --- a/src/engine/courses/BansheeBoardwalk.h +++ b/src/engine/courses/BansheeBoardwalk.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BigDonut.cpp b/src/engine/courses/BigDonut.cpp index c0d4b1f7f..5bdf76a23 100644 --- a/src/engine/courses/BigDonut.cpp +++ b/src/engine/courses/BigDonut.cpp @@ -123,19 +123,19 @@ void BigDonut::Load() { void BigDonut::LoadTextures() { } -void BigDonut::SpawnActors() {} +void BigDonut::BeginPlay() { + spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_big_donut_item_box_spawns)); -void BigDonut::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/BigDonut.h b/src/engine/courses/BigDonut.h index 732a9a568..bc076ecf2 100644 --- a/src/engine/courses/BigDonut.h +++ b/src/engine/courses/BigDonut.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BlockFort.cpp b/src/engine/courses/BlockFort.cpp index 61eb3c0b1..136ffeef5 100644 --- a/src/engine/courses/BlockFort.cpp +++ b/src/engine/courses/BlockFort.cpp @@ -120,21 +120,19 @@ void BlockFort::Load() { void BlockFort::LoadTextures() { } -void BlockFort::SpawnActors() { +void BlockFort::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_block_fort_item_box_spawns)); -} -void BlockFort::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/BlockFort.h b/src/engine/courses/BlockFort.h index b3d2fdc3c..c985b9546 100644 --- a/src/engine/courses/BlockFort.h +++ b/src/engine/courses/BlockFort.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/BowsersCastle.cpp b/src/engine/courses/BowsersCastle.cpp index 5174c5ea1..6f4ecccc5 100644 --- a/src/engine/courses/BowsersCastle.cpp +++ b/src/engine/courses/BowsersCastle.cpp @@ -148,7 +148,7 @@ void BowsersCastle::LoadTextures() { dma_textures(gTextureShrub, 0x000003FFU, 0x00000800U); } -void BowsersCastle::SpawnActors() { +void BowsersCastle::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_bowsers_castle_tree_spawn)); @@ -194,19 +194,17 @@ void BowsersCastle::SpawnActors() { gWorldInstance.AddObject(new OThwomp(0x073a, 0xf9f2, 0x4000, 1.0f, 5, 1)); break; } -} -void BowsersCastle::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][260], 260, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][260], 260, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/BowsersCastle.h b/src/engine/courses/BowsersCastle.h index bbbd4c75e..767bbdb8c 100644 --- a/src/engine/courses/BowsersCastle.h +++ b/src/engine/courses/BowsersCastle.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/ChocoMountain.cpp b/src/engine/courses/ChocoMountain.cpp index 04065dff5..4406159e9 100644 --- a/src/engine/courses/ChocoMountain.cpp +++ b/src/engine/courses/ChocoMountain.cpp @@ -163,23 +163,21 @@ void ChocoMountain::Load() { void ChocoMountain::LoadTextures() { } -void ChocoMountain::SpawnActors() { +void ChocoMountain::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_choco_mountain_item_box_spawns)); spawn_falling_rocks((struct ActorSpawnData*)LOAD_ASSET_RAW((const char*)d_course_choco_mountain_falling_rock_spawns)); -} -void ChocoMountain::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][165], 165, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][330], 330, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][550], 550, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][595], 595, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][165], 165, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][330], 330, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][550], 550, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][595], 595, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/ChocoMountain.h b/src/engine/courses/ChocoMountain.h index 718b40202..45926ed61 100644 --- a/src/engine/courses/ChocoMountain.h +++ b/src/engine/courses/ChocoMountain.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/Course.cpp b/src/engine/courses/Course.cpp index 0dd1ba33a..3b2ac641d 100644 --- a/src/engine/courses/Course.cpp +++ b/src/engine/courses/Course.cpp @@ -16,7 +16,6 @@ extern "C" { #include "render_objects.h" #include "save.h" #include "staff_ghosts.h" -#include "Engine.h" #include "code_800029B0.h" #include "render_courses.h" extern StaffGhost* d_mario_raceway_staff_ghost; @@ -153,7 +152,7 @@ void Course::Init() { void Course::LoadTextures() { } -void Course::SpawnActors() { +void Course::BeginPlay() { } void Course::InitClouds() { diff --git a/src/engine/courses/Course.h b/src/engine/courses/Course.h index f7bca6809..d4f637073 100644 --- a/src/engine/courses/Course.h +++ b/src/engine/courses/Course.h @@ -1,85 +1,77 @@ -#ifndef COURSE_H -#define COURSE_H +#ifndef ENGINE_COURSE_H +#define ENGINE_COURSE_H #include - -// C-compatible function declaration -#ifdef __cplusplus #include "CoreMath.h" + +#ifdef __cplusplus #include "engine/objects/Lakitu.h" extern "C" { #endif - #include "camera.h" - #include "course_offsets.h" - #include "data/some_data.h" - #include "defines.h" - #include "bomb_kart.h" - #include "path_spawn_metadata.h" - #include "Engine.h" - #include "waypoints.h" - -CProperties *CourseManager_GetProps(); +#include "camera.h" +#include "course_offsets.h" +#include "data/some_data.h" +#include "defines.h" +#include "bomb_kart.h" +#include "path_spawn_metadata.h" +#include "waypoints.h" +#include "sounds.h" +#include "common_structs.h" #ifdef __cplusplus } #endif +typedef struct SkyboxColours { + RGB8 TopRight; + RGB8 BottomRight; + RGB8 BottomLeft; + RGB8 TopLeft; + RGB8 FloorTopRight; + RGB8 FloorBottomRight; + RGB8 FloorBottomLeft; + RGB8 FloorTopLeft; +} SkyboxColours; + +typedef struct Properties { + const char* Id; + const char* Name; + const char* DebugName; + const char* CourseLength; + const char* AIBehaviour; + const char* MinimapTexture; + s32 LakituTowType; + IVector2D MinimapDimensions; + float AIMaximumSeparation; + float AIMinimumSeparation; + float NearPersp; + float FarPersp; + int16_t *SomePtr; + uint32_t AISteeringSensitivity; + _struct_gCoursePathSizes_0x10 PathSizes; + Vec4f D_0D009418; + Vec4f D_0D009568; + Vec4f D_0D0096B8; + Vec4f D_0D009808; + TrackWaypoint* PathTable[4]; + TrackWaypoint* PathTable2[4]; + CloudData *Clouds; + CloudData *CloudList; + int32_t MinimapFinishlineX; + int32_t MinimapFinishlineY; + SkyboxColours Skybox; + const course_texture *textures; + enum MusicSeq Sequence; +} Properties; + #ifdef __cplusplus class World; // <-- Forward declare - class Course { public: - typedef struct { - uint8_t r, g, b; - } RGB8; - - typedef struct { - RGB8 TopRight; - RGB8 BottomRight; - RGB8 BottomLeft; - RGB8 TopLeft; - RGB8 FloorTopRight; - RGB8 FloorBottomRight; - RGB8 FloorBottomLeft; - RGB8 FloorTopLeft; - } SkyboxColours; - - - typedef struct { - const char* Id; - const char* Name; - const char* DebugName; - const char* CourseLength; - const char* AIBehaviour; - const char* MinimapTexture; - s32 LakituTowType; - IVector2D MinimapDimensions; - float AIMaximumSeparation; - float AIMinimumSeparation; - float NearPersp; - float FarPersp; - int16_t *SomePtr; - uint32_t AISteeringSensitivity; - _struct_gCoursePathSizes_0x10 PathSizes; - Vec4f D_0D009418; - Vec4f D_0D009568; - Vec4f D_0D0096B8; - Vec4f D_0D009808; - TrackWaypoint* PathTable[4]; - TrackWaypoint* PathTable2[4]; - CloudData *Clouds; - CloudData *CloudList; - int32_t MinimapFinishlineX; - int32_t MinimapFinishlineY; - SkyboxColours Skybox; - const course_texture *textures; - MusicSeq Sequence; - } Properties; - Properties Props; const char* vtx = nullptr; @@ -94,7 +86,12 @@ public: virtual void Load(); // Decompress and load stock courses. Must be overridden for custom courses virtual void Load(Vtx* vtx, Gfx *gfx); // Load custom course virtual void LoadTextures(); - virtual void SpawnActors(); + + /** + * @brief BeginPlay This function is called once at the start of gameplay. + * Actor spawning should go here. + */ + virtual void BeginPlay(); virtual void InitClouds(); virtual void UpdateClouds(s32, Camera*); virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7); @@ -124,4 +121,4 @@ private: #endif -#endif // COURSE_H \ No newline at end of file +#endif // ENGINE_COURSE_H diff --git a/src/engine/courses/DKJungle.cpp b/src/engine/courses/DKJungle.cpp index e3e7bf3f5..a49a029c3 100644 --- a/src/engine/courses/DKJungle.cpp +++ b/src/engine/courses/DKJungle.cpp @@ -150,12 +150,31 @@ void DKJungle::LoadTextures() { dma_textures(gTextureDksJungleParkwayKiwanoFruit3, 0x00000364U, 0x00000400U); } -void DKJungle::SpawnActors() { +void DKJungle::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_dks_jungle_parkway_item_box_spawns)); init_kiwano_fruit(); func_80298D10(); + + + generate_ferry_waypoints(); + + // The original game only ran vehicle logic every second frame. + // Thus the speed gets divided by two to set speed to match properly + gWorldInstance.AddActor(new ABoat((0.6666666f)/4, 0)); + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } // Likely sets minimap boundaries @@ -273,26 +292,6 @@ void DKJungle::SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f func_8003F138(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); } -void DKJungle::SpawnVehicles() { - generate_ferry_waypoints(); - - // The original game only ran vehicle logic every second frame. - // Thus the speed gets divided by two to set speed to match properly - gWorldInstance.AddVehicle(new ABoat((0.6666666f)/4, 0)); - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][190], 190, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void DKJungle::Waypoints(Player* player, int8_t playerId) { s16 waypoint = gNearestWaypointByPlayerId[playerId]; if ((waypoint >= 0xB9) && (waypoint < 0x119)) { diff --git a/src/engine/courses/DKJungle.h b/src/engine/courses/DKJungle.h index 389213c1f..71cc1e582 100644 --- a/src/engine/courses/DKJungle.h +++ b/src/engine/courses/DKJungle.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; @@ -38,7 +38,6 @@ public: virtual void MinimapFinishlinePosition() override; virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; - virtual void SpawnVehicles() override; virtual void Collision() override; virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7) override; virtual void Waypoints(Player* player, int8_t playerId) override; diff --git a/src/engine/courses/DoubleDeck.cpp b/src/engine/courses/DoubleDeck.cpp index 1d5e16c60..fea83005d 100644 --- a/src/engine/courses/DoubleDeck.cpp +++ b/src/engine/courses/DoubleDeck.cpp @@ -117,21 +117,19 @@ void DoubleDeck::Load() { void DoubleDeck::LoadTextures() { } -void DoubleDeck::SpawnActors() { +void DoubleDeck::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_double_deck_item_box_spawns)); -} -void DoubleDeck::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/DoubleDeck.h b/src/engine/courses/DoubleDeck.h index bb1a8f98c..d821187c8 100644 --- a/src/engine/courses/DoubleDeck.h +++ b/src/engine/courses/DoubleDeck.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/FrappeSnowland.cpp b/src/engine/courses/FrappeSnowland.cpp index 5c0b4df43..61527d685 100644 --- a/src/engine/courses/FrappeSnowland.cpp +++ b/src/engine/courses/FrappeSnowland.cpp @@ -127,7 +127,7 @@ void FrappeSnowland::LoadTextures() { dma_textures(gTextureFrappeSnowlandTreeRight, 0x00000432U, 0x00000800U); } -void FrappeSnowland::SpawnActors() { +void FrappeSnowland::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_frappe_snowland_tree_spawns)); @@ -154,19 +154,17 @@ void FrappeSnowland::SpawnActors() { gWorldInstance.AddObject(new OSnowman(FVector(-701, 3, 853))); gWorldInstance.AddObject(new OSnowman(FVector(-602, 0, 929))); } -} -void FrappeSnowland::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][290], 290, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][350], 350, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][290], 290, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][350], 350, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/FrappeSnowland.h b/src/engine/courses/FrappeSnowland.h index 5c53dafae..8ecbdbf46 100644 --- a/src/engine/courses/FrappeSnowland.h +++ b/src/engine/courses/FrappeSnowland.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32 sp1C, Camera* camera) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/KalimariDesert.cpp b/src/engine/courses/KalimariDesert.cpp index ffd19a86e..e783d4e0f 100644 --- a/src/engine/courses/KalimariDesert.cpp +++ b/src/engine/courses/KalimariDesert.cpp @@ -11,7 +11,6 @@ #include "engine/vehicles/Utils.h" #include "engine/vehicles/Train.h" -#include "engine/vehicles/Vehicle.h" extern "C" { #include "main.h" @@ -136,7 +135,7 @@ void KalimariDesert::LoadTextures() { dma_textures(gTextureCactus3, 0x000003AFU, 0x00000800U); } -void KalimariDesert::SpawnActors() { +void KalimariDesert::BeginPlay() { struct RailroadCrossing* rrxing; Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; @@ -173,6 +172,45 @@ void KalimariDesert::SpawnActors() { rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity, ACTOR_RAILROAD_CROSSING)); rrxing->crossingTrigger = crossing1; + + + + generate_train_waypoints(); + + s32 centerWaypoint = 160; + + // Spawn two trains + for (size_t i = 0; i < _numTrains; ++i) { + uint32_t waypoint = CalculateWaypointDistribution(i, _numTrains, gVehicle2DWaypointLength, centerWaypoint); + + if (CVarGetInteger("gMultiplayerNoFeatureCuts", 0) == false) { + // Multiplayer modes have no tender and no carriages + if (gActiveScreenMode != SCREEN_MODE_1P) { + _tender = ATrain::TenderStatus::NO_TENDER; + _numCarriages = 0; + } + + // 2 player versus mode has a tender and a carriage + if ((gModeSelection == VERSUS) && (gPlayerCountSelection1 == 2)) { + _tender = ATrain::TenderStatus::HAS_TENDER; + _numCarriages = 1; + } + } + + gWorldInstance.AddActor(new ATrain(_tender, _numCarriages, 2.5f, waypoint)); + } + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][138], 138, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][280], 280, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][404], 404, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][510], 510, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } // Likely sets minimap boundaries @@ -214,45 +252,6 @@ void KalimariDesert::MinimapFinishlinePosition() { draw_hud_2d_texture_8x8(this->Props.MinimapFinishlineX, this->Props.MinimapFinishlineY, (u8*) common_texture_minimap_finish_line); } -void KalimariDesert::SpawnVehicles() { - generate_train_waypoints(); - - s32 centerWaypoint = 160; - - // Spawn two trains - for (size_t i = 0; i < _numTrains; ++i) { - uint32_t waypoint = CalculateWaypointDistribution(i, _numTrains, gVehicle2DWaypointLength, centerWaypoint); - - if (CVarGetInteger("gMultiplayerNoFeatureCuts", 0) == false) { - // Multiplayer modes have no tender and no carriages - if (gActiveScreenMode != SCREEN_MODE_1P) { - _tender = ATrain::TenderStatus::NO_TENDER; - _numCarriages = 0; - } - - // 2 player versus mode has a tender and a carriage - if ((gModeSelection == VERSUS) && (gPlayerCountSelection1 == 2)) { - _tender = ATrain::TenderStatus::HAS_TENDER; - _numCarriages = 1; - } - } - - gWorldInstance.AddVehicle(new ATrain(_tender, _numCarriages, 2.5f, waypoint)); - } - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][138], 138, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][280], 280, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][404], 404, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][510], 510, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void KalimariDesert::Render(struct UnkStruct_800DC5EC* arg0) { func_802B5D64(D_800DC610, D_802B87D4, 0, 1); diff --git a/src/engine/courses/KalimariDesert.h b/src/engine/courses/KalimariDesert.h index c4fed1d8f..0a07fcbb3 100644 --- a/src/engine/courses/KalimariDesert.h +++ b/src/engine/courses/KalimariDesert.h @@ -28,7 +28,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; @@ -37,7 +37,6 @@ public: virtual void MinimapFinishlinePosition() override; virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; - virtual void SpawnVehicles() override; virtual void Collision() override; virtual void Destroy() override; diff --git a/src/engine/courses/KoopaTroopaBeach.cpp b/src/engine/courses/KoopaTroopaBeach.cpp index 6beca16b6..4e017912e 100644 --- a/src/engine/courses/KoopaTroopaBeach.cpp +++ b/src/engine/courses/KoopaTroopaBeach.cpp @@ -139,7 +139,7 @@ void KoopaTroopaBeach::Load() { void KoopaTroopaBeach::LoadTextures() { } -void KoopaTroopaBeach::SpawnActors() { +void KoopaTroopaBeach::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); init_actor_hot_air_balloon_item_box(328.0f * gCourseDirection, 70.0f, 2541.0f); @@ -178,19 +178,17 @@ void KoopaTroopaBeach::SpawnActors() { gWorldInstance.AddObject(new OSeagull(pos2)); } } -} -void KoopaTroopaBeach::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][280], 280, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][280], 280, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][435], 435, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/KoopaTroopaBeach.h b/src/engine/courses/KoopaTroopaBeach.h index c10b5cede..490dfe8ab 100644 --- a/src/engine/courses/KoopaTroopaBeach.h +++ b/src/engine/courses/KoopaTroopaBeach.h @@ -29,8 +29,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/LuigiRaceway.cpp b/src/engine/courses/LuigiRaceway.cpp index 78522df74..a821ec2d9 100644 --- a/src/engine/courses/LuigiRaceway.cpp +++ b/src/engine/courses/LuigiRaceway.cpp @@ -164,7 +164,7 @@ void LuigiRaceway::LoadTextures() { dma_textures(gTextureTrees5Right, 0x000003E8U, 0x00000800U); } -void LuigiRaceway::SpawnActors() { +void LuigiRaceway::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*) LOAD_ASSET_RAW(d_course_luigi_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*) LOAD_ASSET_RAW(d_course_luigi_raceway_item_box_spawns)); @@ -174,19 +174,17 @@ void LuigiRaceway::SpawnActors() { } else { // Normal gameplay gWorldInstance.AddObject(new OHotAirBalloon(FVector(-176.0, 0.0f, -2323.0f))); } -} -void LuigiRaceway::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = { 0, 0, 0 }; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][305], 305, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][440], 440, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][515], 515, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][305], 305, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][440], 440, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][515], 515, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/LuigiRaceway.h b/src/engine/courses/LuigiRaceway.h index 7166278c3..c5e089d81 100644 --- a/src/engine/courses/LuigiRaceway.h +++ b/src/engine/courses/LuigiRaceway.h @@ -28,8 +28,7 @@ class LuigiRaceway : public Course { // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/MarioRaceway.cpp b/src/engine/courses/MarioRaceway.cpp index d98065ed8..a2cc96525 100644 --- a/src/engine/courses/MarioRaceway.cpp +++ b/src/engine/courses/MarioRaceway.cpp @@ -6,6 +6,7 @@ #include "MarioRaceway.h" #include "World.h" #include "engine/actors/AFinishline.h" +#include "engine/objects/Object.h" #include "engine/objects/BombKart.h" extern "C" { @@ -173,7 +174,7 @@ void MarioRaceway::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void MarioRaceway::SpawnActors() { +void MarioRaceway::BeginPlay() { struct Actor* actor; Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; @@ -190,20 +191,21 @@ void MarioRaceway::SpawnActors() { vec3f_set(position, 2520.0f, 0.0f, 1240.0f); position[0] *= gCourseDirection; add_actor_to_empty_slot(position, rotation, velocity, ACTOR_MARIO_SIGN); + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][265], 265, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][285], 285, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][420], 420, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } void MarioRaceway::SpawnVehicles() { - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][265], 265, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][285], 285, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][420], 420, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } } // Likely sets minimap boundaries diff --git a/src/engine/courses/MarioRaceway.h b/src/engine/courses/MarioRaceway.h index ef0fb904b..9714fd0f5 100644 --- a/src/engine/courses/MarioRaceway.h +++ b/src/engine/courses/MarioRaceway.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void SpawnVehicles() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/MooMooFarm.cpp b/src/engine/courses/MooMooFarm.cpp index 109857353..5adaeb2a6 100644 --- a/src/engine/courses/MooMooFarm.cpp +++ b/src/engine/courses/MooMooFarm.cpp @@ -159,26 +159,24 @@ void MooMooFarm::LoadTextures() { dma_textures(gTextureCow05Right, 0x00000400U, 0x00000800U); } -void MooMooFarm::SpawnActors() { +void MooMooFarm::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); if (gPlayerCountSelection1 != 4) { spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_moo_moo_farm_tree_spawn)); } spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_moo_moo_farm_item_box_spawns)); -} -void MooMooFarm::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][225], 225, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][316], 316, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][434], 434, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][225], 225, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][316], 316, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][434], 434, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/MooMooFarm.h b/src/engine/courses/MooMooFarm.h index 5815db8c7..0293b1b04 100644 --- a/src/engine/courses/MooMooFarm.h +++ b/src/engine/courses/MooMooFarm.h @@ -29,8 +29,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/PodiumCeremony.cpp b/src/engine/courses/PodiumCeremony.cpp index 631a187dc..736a3ed9f 100644 --- a/src/engine/courses/PodiumCeremony.cpp +++ b/src/engine/courses/PodiumCeremony.cpp @@ -159,7 +159,7 @@ void PodiumCeremony::Load() { void PodiumCeremony::LoadTextures() { } -void PodiumCeremony::SpawnActors() { +void PodiumCeremony::BeginPlay() { spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_item_box_spawns)); spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_piranha_plant_spawn)); @@ -187,18 +187,15 @@ void PodiumCeremony::SpawnActors() { } gWorldInstance.AddObject(new OTrophy(pos, type, OTrophy::Behaviour::PODIUM_CEREMONY)); -} -void PodiumCeremony::SpawnVehicles() { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[3][3], 3, 5, 1.25f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[3][140], 140, 0, 1.0f); + Vec3f kart = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][3], 3, 5, 1.25f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[3][140], 140, 0, 1.0f)); } // Likely sets minimap boundaries diff --git a/src/engine/courses/PodiumCeremony.h b/src/engine/courses/PodiumCeremony.h index bb17e8f8d..140d95889 100644 --- a/src/engine/courses/PodiumCeremony.h +++ b/src/engine/courses/PodiumCeremony.h @@ -27,8 +27,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/RainbowRoad.cpp b/src/engine/courses/RainbowRoad.cpp index 7dd4bcdf7..b878eebfb 100644 --- a/src/engine/courses/RainbowRoad.cpp +++ b/src/engine/courses/RainbowRoad.cpp @@ -133,7 +133,7 @@ void RainbowRoad::Load() { void RainbowRoad::LoadTextures() { } -void RainbowRoad::SpawnActors() { +void RainbowRoad::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_rainbow_road_item_box_spawns)); @@ -147,19 +147,17 @@ void RainbowRoad::SpawnActors() { gWorldInstance.AddObject(new OChainChomp()); gWorldInstance.AddObject(new OChainChomp()); } -} -void RainbowRoad::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/RainbowRoad.h b/src/engine/courses/RainbowRoad.h index 5f6b0e5e7..e5262f170 100644 --- a/src/engine/courses/RainbowRoad.h +++ b/src/engine/courses/RainbowRoad.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/RoyalRaceway.cpp b/src/engine/courses/RoyalRaceway.cpp index 2ea0022ca..de1ab164b 100644 --- a/src/engine/courses/RoyalRaceway.cpp +++ b/src/engine/courses/RoyalRaceway.cpp @@ -170,25 +170,23 @@ void RoyalRaceway::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void RoyalRaceway::SpawnActors() { +void RoyalRaceway::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_tree_spawn)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_item_box_spawns)); spawn_piranha_plants((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_royal_raceway_piranha_plant_spawn)); -} -void RoyalRaceway::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][296], 296, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][400], 400, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][746], 746, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][296], 296, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][400], 400, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][746], 746, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/RoyalRaceway.h b/src/engine/courses/RoyalRaceway.h index 0a7cd3e6a..2a3095bc8 100644 --- a/src/engine/courses/RoyalRaceway.h +++ b/src/engine/courses/RoyalRaceway.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/SherbetLand.cpp b/src/engine/courses/SherbetLand.cpp index bfcacca4a..7e77ecdbb 100644 --- a/src/engine/courses/SherbetLand.cpp +++ b/src/engine/courses/SherbetLand.cpp @@ -129,7 +129,7 @@ void SherbetLand::Load() { void SherbetLand::LoadTextures() { } -void SherbetLand::SpawnActors() { +void SherbetLand::BeginPlay() { gWorldInstance.AddActor(new AFinishline()); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_sherbet_land_item_box_spawns)); @@ -199,19 +199,15 @@ void SherbetLand::SpawnActors() { auto penguin14 = reinterpret_cast(gWorldInstance.AddObject(new OPenguin(pos11, 0x9000, OPenguin::PenguinType::CHICK, OPenguin::Behaviour::SLIDE6))); penguin14->MirrorModeAngleOffset = -0x4000; -} - -void SherbetLand::SpawnVehicles() { if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + Vec3f kart = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(kart, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/SherbetLand.h b/src/engine/courses/SherbetLand.h index 177410ca7..13e41e592 100644 --- a/src/engine/courses/SherbetLand.h +++ b/src/engine/courses/SherbetLand.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/courses/Skyscraper.cpp b/src/engine/courses/Skyscraper.cpp index f7c092bee..abf622ae2 100644 --- a/src/engine/courses/Skyscraper.cpp +++ b/src/engine/courses/Skyscraper.cpp @@ -142,21 +142,19 @@ void Skyscraper::Load() { void Skyscraper::LoadTextures() { } -void Skyscraper::SpawnActors() { +void Skyscraper::BeginPlay() { spawn_all_item_boxes((ActorSpawnData*)LOAD_ASSET_RAW(d_course_skyscraper_item_box_spawns)); -} -void Skyscraper::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][20], 20, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][40], 40, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][60], 60, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][80], 80, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][120], 120, 0, 1.0f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][140], 140, 0, 1.0f)); } } diff --git a/src/engine/courses/Skyscraper.h b/src/engine/courses/Skyscraper.h index 6658b43e6..b9b998f73 100644 --- a/src/engine/courses/Skyscraper.h +++ b/src/engine/courses/Skyscraper.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; //virtual void InitClouds() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; diff --git a/src/engine/courses/TestCourse.cpp b/src/engine/courses/TestCourse.cpp index cf35a062b..30a925d80 100644 --- a/src/engine/courses/TestCourse.cpp +++ b/src/engine/courses/TestCourse.cpp @@ -151,7 +151,7 @@ void TestCourse::LoadTextures() { dma_textures(gTexturePiranhaPlant9, 0x000003E8U, 0x00000800U); } -void TestCourse::SpawnActors() { +void TestCourse::BeginPlay() { struct ActorSpawnData itemboxes[] = { { 200, 1500, 200 , 0}, { 350, 2500, 300 , 1}, @@ -304,9 +304,8 @@ void TestCourse::SpawnVehicles() { Vec3f pos = {0, 0, 0}; - gWorldInstance.AddBombKart(pos, &D_80164550[0][25], 25, 4, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][45], 45, 4, 0.8333333f); - + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][25], 25, 4, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][45], 45, 4, 0.8333333f)); } void TestCourse::UpdateVehicles() { diff --git a/src/engine/courses/TestCourse.h b/src/engine/courses/TestCourse.h index 8bcffb131..2ba8a9f49 100644 --- a/src/engine/courses/TestCourse.h +++ b/src/engine/courses/TestCourse.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void SomeSounds() override; diff --git a/src/engine/courses/ToadsTurnpike.cpp b/src/engine/courses/ToadsTurnpike.cpp index 88371411f..f6aa3f738 100644 --- a/src/engine/courses/ToadsTurnpike.cpp +++ b/src/engine/courses/ToadsTurnpike.cpp @@ -148,7 +148,7 @@ void ToadsTurnpike::Load() { void ToadsTurnpike::LoadTextures() { } -void ToadsTurnpike::SpawnActors() { +void ToadsTurnpike::BeginPlay() { Vec3f pos; pos[0] = (gIsMirrorMode != 0) ? D_80164490->posX + 138.0f : D_80164490->posX - 138.0f; pos[1] = (f32) (D_80164490->posY - 15); @@ -157,6 +157,51 @@ void ToadsTurnpike::SpawnActors() { gWorldInstance.AddActor(new AFinishline(pos)); spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_toads_turnpike_item_box_spawns)); + + uint32_t waypoint; + f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333; + f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665; + a /= 2; // Normally vehicle logic is only ran every 2 frames. This slows the vehicles down to match. + b /= 2; + + // Other game modes spawn seven of each vehicle + if (gModeSelection == TIME_TRIALS) { + _numTrucks = 8; + _numBuses = 8; + _numTankerTrucks = 8; + _numCars = 8; + } + + for (size_t i = 0; i < _numTrucks; i++) { + waypoint = CalculateWaypointDistribution(i, _numTrucks, gWaypointCountByPathIndex[0], 0); + gWorldInstance.AddActor(new ATruck(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numBuses; i++) { + waypoint = CalculateWaypointDistribution(i, _numBuses, gWaypointCountByPathIndex[0], 75); + gWorldInstance.AddActor(new ABus(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numTankerTrucks; i++) { + waypoint = CalculateWaypointDistribution(i, _numTankerTrucks, gWaypointCountByPathIndex[0], 50); + gWorldInstance.AddActor(new ATankerTruck(a, b, &D_80164550[0][0], waypoint)); + } + + for (size_t i = 0; i < _numCars; i++) { + waypoint = CalculateWaypointDistribution(i, _numCars, gWaypointCountByPathIndex[0], 25); + gWorldInstance.AddActor(new ACar(a, b, &D_80164550[0][0], waypoint)); + } + + if (gModeSelection == VERSUS) { + Vec3f pos = {0, 0, 0}; + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + } } void ToadsTurnpike::InitClouds() { @@ -243,52 +288,4 @@ void ToadsTurnpike::RenderCredits() { void ToadsTurnpike::Collision() {} -void ToadsTurnpike::SpawnVehicles() { - uint32_t waypoint; - f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333; - f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665; - a /= 2; // Normally vehicle logic is only ran every 2 frames. This slows the vehicles down to match. - b /= 2; - - // Other game modes spawn seven of each vehicle - if (gModeSelection == TIME_TRIALS) { - _numTrucks = 8; - _numBuses = 8; - _numTankerTrucks = 8; - _numCars = 8; - } - - for (size_t i = 0; i < _numTrucks; i++) { - waypoint = CalculateWaypointDistribution(i, _numTrucks, gWaypointCountByPathIndex[0], 0); - gWorldInstance.AddVehicle(new ATruck(a, b, &D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numBuses; i++) { - waypoint = CalculateWaypointDistribution(i, _numBuses, gWaypointCountByPathIndex[0], 75); - gWorldInstance.AddVehicle(new ABus(a, b,&D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numTankerTrucks; i++) { - waypoint = CalculateWaypointDistribution(i, _numTankerTrucks, gWaypointCountByPathIndex[0], 50); - gWorldInstance.AddVehicle(new ATankerTruck(a, b, &D_80164550[0][0], waypoint)); - } - - for (size_t i = 0; i < _numCars; i++) { - waypoint = CalculateWaypointDistribution(i, _numCars, gWaypointCountByPathIndex[0], 25); - gWorldInstance.AddVehicle(new ACar(a, b, &D_80164550[0][0], waypoint)); - } - - if (gModeSelection == VERSUS) { - Vec3f pos = {0, 0, 0}; - - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - } -} - void ToadsTurnpike::Destroy() { } diff --git a/src/engine/courses/ToadsTurnpike.h b/src/engine/courses/ToadsTurnpike.h index bbb2df9c3..a73e3829f 100644 --- a/src/engine/courses/ToadsTurnpike.h +++ b/src/engine/courses/ToadsTurnpike.h @@ -26,7 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; @@ -37,7 +37,6 @@ public: virtual void Render(struct UnkStruct_800DC5EC*) override; virtual void RenderCredits() override; virtual void Collision() override; - virtual void SpawnVehicles() override; virtual void Destroy() override; private: size_t _numTrucks = 7; diff --git a/src/engine/courses/WarioStadium.cpp b/src/engine/courses/WarioStadium.cpp index 522a6509d..44a8d5d1a 100644 --- a/src/engine/courses/WarioStadium.cpp +++ b/src/engine/courses/WarioStadium.cpp @@ -155,7 +155,7 @@ void WarioStadium::Load() { void WarioStadium::LoadTextures() { } -void WarioStadium::SpawnActors() { +void WarioStadium::BeginPlay() { Vec3f finish; finish[0] = (gIsMirrorMode != 0) ? D_80164490->posX + 12.0f : D_80164490->posX - 12.0f; (gIsMirrorMode != 0) ? D_80164490->posX + 12.0f : D_80164490->posX - 12.0f; @@ -177,19 +177,17 @@ void WarioStadium::SpawnActors() { Vec3f pos3 = { -2622.0f, 79.0f, 739.0f }; pos3[0] *= gCourseDirection; gWorldInstance.AddActor(new AWarioSign(pos3)); -} -void WarioStadium::SpawnVehicles() { if (gModeSelection == VERSUS) { Vec3f pos = { 0, 0, 0 }; - gWorldInstance.AddBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); - gWorldInstance.AddBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][50], 50, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][100], 100, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][150], 150, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][200], 200, 1, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][250], 250, 3, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); + gWorldInstance.AddObject(new OBombKart(pos, &D_80164550[0][0], 0, 0, 0.8333333f)); } } diff --git a/src/engine/courses/WarioStadium.h b/src/engine/courses/WarioStadium.h index 088e81b72..72f796cc7 100644 --- a/src/engine/courses/WarioStadium.h +++ b/src/engine/courses/WarioStadium.h @@ -28,8 +28,7 @@ class WarioStadium : public Course { // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void InitClouds() override; virtual void UpdateClouds(s32, Camera*) override; virtual void MinimapSettings() override; diff --git a/src/engine/courses/YoshiValley.cpp b/src/engine/courses/YoshiValley.cpp index f7f3d1871..9366f45ea 100644 --- a/src/engine/courses/YoshiValley.cpp +++ b/src/engine/courses/YoshiValley.cpp @@ -137,7 +137,7 @@ void YoshiValley::LoadTextures() { dma_textures(gTextureTrees2, 0x000003E8U, 0x00000800U); } -void YoshiValley::SpawnActors() { +void YoshiValley::BeginPlay() { Vec3f position; Vec3f velocity = { 0.0f, 0.0f, 0.0f }; Vec3s rotation = { 0, 0, 0 }; @@ -173,6 +173,27 @@ void YoshiValley::SpawnActors() { gWorldInstance.AddObject(new OHedgehog(FVector(-2493, 94, -454), FVector2D(-2505, -397), 28)); gWorldInstance.AddObject(new OHedgehog(FVector(-2477, 3, -57), FVector2D(-2539, -66), 28)); } + + if (gModeSelection == VERSUS) { + // Note that the waypoint values might be unused for Yoshi's Valley. Entered them because + // the original data has values here. + + // Note that the Y height is calculated automatically to place the kart on the surface + Vec3f pos = {-1533, 0, -682}; + gWorldInstance.AddObject(new OBombKart(pos, NULL, 0, 0, 0.8333333f)); + Vec3f pos2 = {-1565, 0, -619}; + gWorldInstance.AddObject(new OBombKart(pos2, NULL, 10, 0, 0.8333333f)); + Vec3f pos3 = {-1529, 0, -579}; + gWorldInstance.AddObject(new OBombKart(pos3, NULL, 20, 0, 0.8333333f)); + Vec3f pos4 = {-1588, 0, -534}; + gWorldInstance.AddObject(new OBombKart(pos4, NULL, 30, 0, 0.8333333f)); + Vec3f pos5 = {-1598, 0, -207}; + gWorldInstance.AddObject(new OBombKart(pos5, NULL, 40, 0, 0.8333333f)); + Vec3f pos6 = {-1646, 0, -147}; + gWorldInstance.AddObject(new OBombKart(pos6, NULL, 50, 0, 0.8333333f)); + Vec3f pos7 = {-2532, 0, -445}; + gWorldInstance.AddObject(new OBombKart(pos7, NULL, 60, 0, 0.8333333f)); + } } // Likely sets minimap boundaries @@ -186,30 +207,6 @@ void YoshiValley::MinimapSettings() { void YoshiValley::InitCourseObjects() { } -void YoshiValley::SpawnVehicles() { - if (gModeSelection == VERSUS) { - - // Note that the waypoint values might be unused for Yoshi's Valley. Entered them because - // the original data has values here. - - // Note that the Y height is calculated automatically to place the kart on the surface - Vec3f pos = {-1533, 0, -682}; - gWorldInstance.AddBombKart(pos, NULL, 0, 0, 0.8333333f); - Vec3f pos2 = {-1565, 0, -619}; - gWorldInstance.AddBombKart(pos2, NULL, 10, 0, 0.8333333f); - Vec3f pos3 = {-1529, 0, -579}; - gWorldInstance.AddBombKart(pos3, NULL, 20, 0, 0.8333333f); - Vec3f pos4 = {-1588, 0, -534}; - gWorldInstance.AddBombKart(pos4, NULL, 30, 0, 0.8333333f); - Vec3f pos5 = {-1598, 0, -207}; - gWorldInstance.AddBombKart(pos5, NULL, 40, 0, 0.8333333f); - Vec3f pos6 = {-1646, 0, -147}; - gWorldInstance.AddBombKart(pos6, NULL, 50, 0, 0.8333333f); - Vec3f pos7 = {-2532, 0, -445}; - gWorldInstance.AddBombKart(pos7, NULL, 60, 0, 0.8333333f); - } -} - void YoshiValley::UpdateCourseObjects() { } diff --git a/src/engine/courses/YoshiValley.h b/src/engine/courses/YoshiValley.h index d0de64752..a986cd902 100644 --- a/src/engine/courses/YoshiValley.h +++ b/src/engine/courses/YoshiValley.h @@ -26,8 +26,7 @@ public: // course_texture* textures, const char* displaylists, size_t dlSize); virtual void Load() override; virtual void LoadTextures() override; - virtual void SpawnActors() override; - virtual void SpawnVehicles() override; + virtual void BeginPlay() override; virtual void MinimapSettings() override; virtual void InitCourseObjects() override; virtual void UpdateCourseObjects() override; diff --git a/src/engine/items/Items.cpp b/src/engine/items/Items.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/engine/items/Items.h b/src/engine/items/Items.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/engine/objects/BombKart.cpp b/src/engine/objects/BombKart.cpp index c33b4b107..fc27103ed 100644 --- a/src/engine/objects/BombKart.cpp +++ b/src/engine/objects/BombKart.cpp @@ -1,4 +1,5 @@ #include +#include "engine/objects/Object.h" #include "BombKart.h" #include @@ -71,15 +72,9 @@ OBombKart::OBombKart(Vec3f pos, TrackWaypoint* waypoint, uint16_t waypointIndex, WheelPos[3][2] = _pos[2]; check_bounding_collision(&_Collision, 2.0f, _pos[0], _pos[1], _pos[2]); - _count++; -} - -void OBombKart::Spawn() { find_unused_obj_index(&ObjectIndex); -} - -void OBombKart::BeginPlay() { + _count++; } void OBombKart::Tick() { @@ -332,8 +327,21 @@ void OBombKart::Tick() { } void OBombKart::Draw(s32 cameraId) { - if (gModeSelection == BATTLE) { + for (size_t playerId = 0; playerId < NUM_BOMB_KARTS_BATTLE; playerId++) { + Object* object = &gObjectList[ObjectIndex]; + if (object->state != 0) { + s32 primAlpha = object->primAlpha; + Player* player = &gPlayerOne[playerId]; + object->pos[0] = player->pos[0]; + object->pos[1] = player->pos[1] - 2.0; + object->pos[2] = player->pos[2]; + object->surfaceHeight = player->unk_074; + func_800563DC(ObjectIndex, cameraId, primAlpha); + func_8005669C(ObjectIndex, cameraId, primAlpha); + func_800568A0(ObjectIndex, cameraId); + } + } return; } @@ -345,15 +353,10 @@ void OBombKart::Draw(s32 cameraId) { } } - Camera* camera; - s32 temp_s4; - s32 i; - s32 state; - if (gGamestate == ENDING) { cameraId = 0; } - camera = &camera1[cameraId]; + Camera* camera = &camera1[cameraId]; if (cameraId == PLAYER_ONE) { if (is_obj_flag_status_active(ObjectIndex, 0x00200000) != 0) { Unk_4A = 0; @@ -364,12 +367,12 @@ void OBombKart::Draw(s32 cameraId) { } // huh??? - state = State; + s32 state = State; if (State != States::DISABLED) { gObjectList[ObjectIndex].pos[0] = Pos[0]; gObjectList[ObjectIndex].pos[1] = Pos[1]; gObjectList[ObjectIndex].pos[2] = Pos[2]; - temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4); + s32 temp_s4 = func_8008A364(ObjectIndex, cameraId, 0x31C4U, 0x000001F4); if (is_obj_flag_status_active(ObjectIndex, VISIBLE) != 0) { set_object_flag(ObjectIndex, 0x00200000); D_80183E80[0] = 0; @@ -385,28 +388,7 @@ void OBombKart::Draw(s32 cameraId) { } void OBombKart::DrawBattle(s32 cameraId) { - if (gModeSelection != BATTLE) { - return; - } - Player* temp_v0; - s32 temp_s1; - s32 playerId; - Object* object; - for (playerId = 0; playerId < gPlayerCount; playerId++) { - object = &gObjectList[ObjectIndex]; - if (object->state != 0) { - temp_s1 = object->primAlpha; - temp_v0 = &gPlayerOne[playerId]; - object->pos[0] = temp_v0->pos[0]; - object->pos[1] = temp_v0->pos[1] - 2.0; - object->pos[2] = temp_v0->pos[2]; - object->surfaceHeight = temp_v0->unk_074; - func_800563DC(ObjectIndex, cameraId, temp_s1); - func_8005669C(ObjectIndex, cameraId, temp_s1); - func_800568A0(ObjectIndex, cameraId); - } - } } void OBombKart::SomeRender(Vec3f arg1) { @@ -455,10 +437,6 @@ void OBombKart::Waypoint(s32 screenId) { playerHUD[screenId].unk_74 = 1; } -void OBombKart::Collision(s32 playerId, Player* player) { - -} - Player* OBombKart::FindTarget() { for (size_t i = 0; i < NUM_PLAYERS; i++) { if (gPlayers[i].type & PLAYER_HUMAN) { diff --git a/src/engine/objects/BombKart.h b/src/engine/objects/BombKart.h index 7ceba7ecb..3663ee664 100644 --- a/src/engine/objects/BombKart.h +++ b/src/engine/objects/BombKart.h @@ -1,7 +1,7 @@ #pragma once #include -#include "src/engine/vehicles/Vehicle.h" +#include "engine/objects/Object.h" #include #include "engine/Matrix.h" @@ -22,8 +22,8 @@ extern "C" { * This differs from the other vehicle classes in that it does not get added to the standard actor list * So this is sort of its own thing. Draw call in different place too. */ -class OBombKart { -private: +class OBombKart : public OObject { +public: enum States : uint16_t { // 0,1,3,5 DISABLED, CCW, @@ -34,8 +34,6 @@ private: PODIUM_CEREMONY, }; -public: - const char* Type; Vec3f Pos; @@ -63,12 +61,9 @@ public: return _count; } - void Spawn(); - void BeginPlay(); - void Tick(); - void Draw(s32 cameraId); + virtual void Tick() override; + virtual void Draw(s32 cameraId) override; void DrawBattle(s32 cameraId); - void Collision(s32 playerId, Player* player); void SomeRender(Vec3f arg1); void LoadMtx(); void Waypoint(s32 screenId); diff --git a/src/engine/objects/Boos.cpp b/src/engine/objects/Boos.cpp index 0e64c673e..f06abc8f7 100644 --- a/src/engine/objects/Boos.cpp +++ b/src/engine/objects/Boos.cpp @@ -115,7 +115,6 @@ void OBoos::func_8007CA70(void) { if (_isActive == false) { _playerId = OBoos::func_8007C9F8(); point = &gNearestWaypointByPlayerId[_playerId]; - printf("point %d\n", *point); if ((*point > _active.Start) && (*point < _active.End)) { // First group entrance OBoos::BooStart(0, _playerId); @@ -123,7 +122,6 @@ void OBoos::func_8007CA70(void) { } if (_isActive == true) { point = &gNearestWaypointByPlayerId[_playerId]; - printf("point %d\n", *point); if ((*point > _leftBoundary.Start) && (*point < _leftBoundary.End)) { // First group exit reverse direction @@ -240,7 +238,6 @@ void OBoos::BooStart(s32 group, s32 playerId) { s16 temp_s4; s16 temp_s5; SplineData* spline; -printf("Boo Start\n"); for (size_t i = 0; i < _numBoos; i++) { objectIndex = _indices[i]; // indexObjectList3[group + i]; init_object(objectIndex, 1); @@ -262,7 +259,6 @@ printf("Boo Start\n"); void OBoos::BooExit(s32 group) { s32 objectIndex; -printf("Boo Exit\n"); for (size_t i = 0; i < _numBoos; i++) { objectIndex = _indices[i]; //indexObjectList3[group + temp_a0]; gObjectList[objectIndex].unk_0DC += 1; diff --git a/src/engine/objects/Lakitu.cpp b/src/engine/objects/Lakitu.cpp index 1c8547bc8..93a87f5e1 100644 --- a/src/engine/objects/Lakitu.cpp +++ b/src/engine/objects/Lakitu.cpp @@ -160,12 +160,12 @@ void OLakitu::func_800791F0(s32 objectIndex, s32 playerId) { if ((gObjectList[objectIndex].unk_0D8 != 3) && (gObjectList[objectIndex].unk_0D8 != 7)) { func_800722CC(objectIndex, 1); - if (CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) { + if (CM_GetProps()->LakituTowType == LakituTowType::ICE) { player->unk_0CA &= 0xFFEF; } } - if (CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) { + if (CM_GetProps()->LakituTowType == LakituTowType::ICE) { func_800722CC(objectIndex, 0x00000010); player->unk_0CA &= 0xFFDF; } @@ -362,7 +362,7 @@ void OLakitu::func_800797AC(s32 playerId) { objectIndex = gIndexLakituList[playerId]; player = &gPlayerOne[playerId]; //if ((GetCourse() == GetSherbetLand()) && (player->unk_0CA & 1)) { - if ((CourseManager_GetProps()->LakituTowType == LakituTowType::ICE) && (player->unk_0CA & 1)) { + if ((CM_GetProps()->LakituTowType == LakituTowType::ICE) && (player->unk_0CA & 1)) { init_object(objectIndex, 7); player->unk_0CA |= 0x10; } else { diff --git a/src/engine/objects/Object.cpp b/src/engine/objects/Object.cpp index eab390aa1..eb23b853e 100644 --- a/src/engine/objects/Object.cpp +++ b/src/engine/objects/Object.cpp @@ -16,7 +16,6 @@ OObject::OObject() {} void OObject::Tick() { } void OObject::Tick60fps() {} void OObject::Draw(s32 cameraId) { } -void OObject::Collision() {} void OObject::Expire() { } void OObject::Destroy() { PendingDestroy = true; diff --git a/src/engine/objects/Object.h b/src/engine/objects/Object.h index af2df81b5..c02deda23 100644 --- a/src/engine/objects/Object.h +++ b/src/engine/objects/Object.h @@ -20,7 +20,6 @@ public: virtual void Tick(); virtual void Tick60fps(); virtual void Draw(s32 cameraId); - virtual void Collision(); virtual void Expire(); virtual void Destroy(); // Mark object for deletion at the start of the next frame }; diff --git a/src/engine/vehicles/Boat.cpp b/src/engine/vehicles/Boat.cpp index 6a3c2beb1..460331f97 100644 --- a/src/engine/vehicles/Boat.cpp +++ b/src/engine/vehicles/Boat.cpp @@ -39,10 +39,6 @@ ABoat::ABoat(f32 speed, u32 waypoint) { Velocity[1] = 0.0f; Velocity[2] = 0.0f; - _count++; -} - -void ABoat::Spawn() { Vec3s paddleWheelBoatRot; if (IsActive == 1) { f32 origXPos = Position[0]; @@ -56,10 +52,18 @@ void ABoat::Spawn() { ActorIndex = add_actor_to_empty_slot(Position, paddleWheelBoatRot, Velocity, ACTOR_PADDLE_BOAT); } + + _count++; +} + +void ABoat::Draw(Camera* camera) { + +} + +bool ABoat::IsMod() { + return true; } -void ABoat::BeginPlay() {} -void ABoat::Draw(s32 playerId) {} void ABoat::Tick() { Path2D* waypoint; struct Actor* paddleBoatActor; @@ -159,7 +163,7 @@ void ABoat::Tick() { } } -void ABoat::Collision(s32 playerId, Player* player) { +void ABoat::VehicleCollision(s32 playerId, Player* player) { f32 x_diff; f32 y_diff; f32 z_diff; diff --git a/src/engine/vehicles/Boat.h b/src/engine/vehicles/Boat.h index 4a1e2d124..dcdd89977 100644 --- a/src/engine/vehicles/Boat.h +++ b/src/engine/vehicles/Boat.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -9,9 +9,7 @@ extern "C" { #include "vehicles.h" } -class AVehicle; // Forward declare - -class ABoat : public AVehicle { +class ABoat : public AActor { public: const char* Type = "mk:boat"; @@ -40,12 +38,11 @@ class ABoat : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; virtual s32 AddSmoke(size_t, Vec3f, f32); + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Bus.cpp b/src/engine/vehicles/Bus.cpp index c8b81b4c5..43b6e7406 100644 --- a/src/engine/vehicles/Bus.cpp +++ b/src/engine/vehicles/Bus.cpp @@ -57,31 +57,29 @@ ABus::ABus(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_SCHOOL_BUS); + _count++; } -void ABus::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_SCHOOL_BUS); +bool ABus::IsMod() { + return true; } -void ABus::BeginPlay() { - -} - -void ABus::Draw(s32 playerId) { +void ABus::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -153,7 +151,7 @@ void ABus::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ABus::Collision(s32 playerId, Player* player) { +void ABus::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Bus.h b/src/engine/vehicles/Bus.h index a7ba3d3e5..c7f3f475e 100644 --- a/src/engine/vehicles/Bus.h +++ b/src/engine/vehicles/Bus.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ABus : public AVehicle { +class ABus : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ABus : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Car.cpp b/src/engine/vehicles/Car.cpp index 8f8d24d1f..a5dd49007 100644 --- a/src/engine/vehicles/Car.cpp +++ b/src/engine/vehicles/Car.cpp @@ -57,17 +57,15 @@ ACar::ACar(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; - _count++; -} - -void ACar::Spawn() { spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, Speed); ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_CAR); + + _count++; } -void ACar::BeginPlay() { - +bool ACar::IsMod() { + return true; } void ACar::Tick() { @@ -135,25 +133,25 @@ void ACar::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ACar::Draw(s32 playerId) { +void ACar::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } } } -void ACar::Collision(s32 playerId, Player* player) { +void ACar::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Car.h b/src/engine/vehicles/Car.h index 6613e4c56..97bd47e2e 100644 --- a/src/engine/vehicles/Car.h +++ b/src/engine/vehicles/Car.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ACar : public AVehicle { +class ACar : public AActor { public: explicit ACar(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint); @@ -43,11 +41,10 @@ class ACar : public AVehicle { f32 SomeArg4 = 8.5f; u32 SoundBits = SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x05); - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera*) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; }; \ No newline at end of file diff --git a/src/engine/vehicles/TankerTruck.cpp b/src/engine/vehicles/TankerTruck.cpp index 2c32d5bd6..a6b94429f 100644 --- a/src/engine/vehicles/TankerTruck.cpp +++ b/src/engine/vehicles/TankerTruck.cpp @@ -57,31 +57,29 @@ ATankerTruck::ATankerTruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t } D_801631C8 = 10; + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_TANKER_TRUCK); + _count++; } -void ATankerTruck::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_TANKER_TRUCK); +bool ATankerTruck::IsMod() { + return true; } -void ATankerTruck::BeginPlay() { - -} - -void ATankerTruck::Draw(s32 playerId) { +void ATankerTruck::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -153,7 +151,7 @@ void ATankerTruck::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ATankerTruck::Collision(s32 playerId, Player* player) { +void ATankerTruck::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/TankerTruck.h b/src/engine/vehicles/TankerTruck.h index fdf838d99..e109115a9 100644 --- a/src/engine/vehicles/TankerTruck.h +++ b/src/engine/vehicles/TankerTruck.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ATankerTruck : public AVehicle { +class ATankerTruck : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ATankerTruck : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Train.cpp b/src/engine/vehicles/Train.cpp index 0e9af21ed..14d9c9763 100644 --- a/src/engine/vehicles/Train.cpp +++ b/src/engine/vehicles/Train.cpp @@ -76,10 +76,6 @@ ATrain::ATrain(ATrain::TenderStatus tender, size_t numCarriages, f32 speed, uint AnotherSmokeTimer = 0; - _count++; -} - -void ATrain::Spawn() { TrainCarStuff* tempLocomotive; TrainCarStuff* tempTender; TrainCarStuff* tempPassengerCar; @@ -128,9 +124,12 @@ void ATrain::Spawn() { ACTOR_TRAIN_PASSENGER_CAR); } } + + _count++; } -void ATrain::BeginPlay() { +bool ATrain::IsMod() { + return true; } void ATrain::SyncComponents(TrainCarStuff* trainCar, s16 orientationY) { @@ -223,7 +222,7 @@ void ATrain::Tick() { } } -void ATrain::Collision(s32 playerId, Player* player) { +void ATrain::VehicleCollision(s32 playerId, Player* player) { TrainCarStuff* trainCar; f32 playerPosX; f32 playerPosZ; @@ -274,7 +273,7 @@ void ATrain::Collision(s32 playerId, Player* player) { } -void ATrain::Draw(s32 playerId) { +void ATrain::Draw(Camera* camera) { } s32 ATrain::AddSmoke(s32 trainIndex, Vec3f pos, f32 velocity) { diff --git a/src/engine/vehicles/Train.h b/src/engine/vehicles/Train.h index e2c1d89f4..b5100586e 100644 --- a/src/engine/vehicles/Train.h +++ b/src/engine/vehicles/Train.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -9,13 +9,11 @@ extern "C" { #include "vehicles.h" } -class AVehicle; // Forward declare - /** * Note that you can only remove the tender if there are no carriages * @arg waypoint initial waypoint to spawn at. */ -class ATrain : public AVehicle { +class ATrain : public AActor { public: enum TenderStatus { @@ -49,11 +47,10 @@ class ATrain : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; s32 AddSmoke(s32 trainIndex, Vec3f pos, f32 velocity); void SyncComponents(TrainCarStuff* trainCar, s16 orientationY); diff --git a/src/engine/vehicles/Truck.cpp b/src/engine/vehicles/Truck.cpp index c865fed70..68ef87353 100644 --- a/src/engine/vehicles/Truck.cpp +++ b/src/engine/vehicles/Truck.cpp @@ -57,48 +57,29 @@ ATruck::ATruck(f32 speedA, f32 speedB, TrackWaypoint* path, uint32_t waypoint) { } D_801631C8 = 10; + spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, + Speed); + ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_BOX_TRUCK); + _count++; } -void ATruck::Spawn() { - spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, - Speed); - ActorIndex = add_actor_to_empty_slot(Position, Rotation, Velocity, ACTOR_BOX_TRUCK); - //if (Compare(Dict[Type], "mk:bus")) { - // spawn_vehicle_on_road(Position, Rotation, Velocity, WaypointIndex, SomeMultiplierTheSequel, Speed); - // ActorIndex = add_actor_to_empty_slot(Position, Rotation, - // Velocity, ACTOR_SCHOOL_BUS); - //} - // if (Compare(Dict[Type], "mk:tanker")) { - // spawn_vehicle_on_road(tempTankerTruck); - // tempTankerTruck->actorIndex = - // add_actor_to_empty_slot(tempTankerTruck->position, tempTankerTruck->rotation, - // tempTankerTruck->velocity, ACTOR_TANKER_TRUCK); - // } - // if (Compare(Dict[Type], "mk:car")) { - // tempCar = &gCarList[loopIndex]; - // spawn_vehicle_on_road(tempCar); - // tempCar->actorIndex = - // add_actor_to_empty_slot(tempCar->position, tempCar->rotation, tempCar->velocity, ACTOR_CAR); - // } +bool ATruck::IsMod() { + return true; } -void ATruck::BeginPlay() { - -} - -void ATruck::Draw(s32 playerId) { +void ATruck::Draw(Camera* camera) { s32 var_v0; s32 var_s2; s32 waypointCount; u16 temp_a1; waypointCount = gWaypointCountByPathIndex[0]; - if (!(gPlayers[playerId].unk_094 < 1.6666666666666667)) { + if (!(gPlayers[camera->playerId].unk_094 < 1.6666666666666667)) { temp_a1 = WaypointIndex; for (var_v0 = 0; var_v0 < 0x18; var_v0 += 3) { if (((sSomeNearestWaypoint + var_v0) % waypointCount) == temp_a1) { - D_801634F8[playerId].unk4 = func_800145A8(SomeType, D_80163068[playerId], temp_a1); + D_801634F8[camera->playerId].unk4 = func_800145A8(SomeType, D_80163068[camera->playerId], temp_a1); return; } } @@ -170,7 +151,7 @@ void ATruck::Tick() { vehicleActor->velocity[2] = Velocity[2]; } -void ATruck::Collision(s32 playerId, Player* player) { +void ATruck::VehicleCollision(s32 playerId, Player* player) { f32 temp_f12; f32 temp_f14; f32 temp_f22; diff --git a/src/engine/vehicles/Truck.h b/src/engine/vehicles/Truck.h index f9f65b2fc..c18ce86a5 100644 --- a/src/engine/vehicles/Truck.h +++ b/src/engine/vehicles/Truck.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Vehicle.h" +#include "Actor.h" #include extern "C" { @@ -11,9 +11,7 @@ extern "C" { #include "sounds.h" } -class AVehicle; // Forward declare - -class ATruck : public AVehicle { +class ATruck : public AActor { public: const char* Type; @@ -43,11 +41,10 @@ class ATruck : public AVehicle { return _count; } - virtual void Spawn() override; - virtual void BeginPlay() override; virtual void Tick() override; - virtual void Draw(s32 playerId) override; - virtual void Collision(s32 playerId, Player* player) override; + virtual void Draw(Camera* camera) override; + virtual void VehicleCollision(s32 playerId, Player* player) override; + virtual bool IsMod() override; private: static size_t _count; diff --git a/src/engine/vehicles/Vehicle.cpp b/src/engine/vehicles/Vehicle.cpp deleted file mode 100644 index 6c0890511..000000000 --- a/src/engine/vehicles/Vehicle.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "Vehicle.h" - - -AVehicle::AVehicle() {} - -void AVehicle::Spawn() { -} - -void AVehicle::BeginPlay() { -} - -void AVehicle::Tick() { -} - -void AVehicle::Draw(s32 playerId) { -} - -void AVehicle::Collision(s32 playerId, Player* player) { -} diff --git a/src/engine/vehicles/Vehicle.h b/src/engine/vehicles/Vehicle.h deleted file mode 100644 index 0b79d06aa..000000000 --- a/src/engine/vehicles/Vehicle.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef VEHICLE_H -#define VEHICLE_H - -#include - -extern "C" { -#include "common_structs.h" -} - -// Base class -class AVehicle { -public: - virtual ~AVehicle() = default; // Virtual destructor for proper cleanup in derived classes - - explicit AVehicle(); - - const char* Type; - uint8_t uuid[16]; - - virtual void Spawn(); - virtual void BeginPlay(); - virtual void Tick(); - virtual void Draw(s32 playerId); - virtual void Collision(s32 playerId, Player* player); -}; - -#endif // VEHICLE_H \ No newline at end of file diff --git a/src/enhancements/freecam/freecam.cpp b/src/enhancements/freecam/freecam.cpp index 709cc6f1d..00d8ee84a 100644 --- a/src/enhancements/freecam/freecam.cpp +++ b/src/enhancements/freecam/freecam.cpp @@ -23,7 +23,6 @@ extern "C" { #include "freecam.h" } -#include "engine/Engine.h" #include "engine/courses/Course.h" typedef struct { @@ -375,7 +374,7 @@ void freecam_render_setup(void) { gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH); gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK | G_CULL_BOTH | G_CULL_FRONT); guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, gCameraZoom[0], gScreenAspect, - CourseManager_GetProps()->NearPersp, CourseManager_GetProps()->FarPersp, 1.0f); + CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, (&gGfxPool->mtxPersp[0]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); guLookAt(&gGfxPool->mtxLookAt[0], camera1->pos[0], camera1->pos[1], camera1->pos[2], camera1->lookAt[0], diff --git a/src/main.c b/src/main.c index c3484a651..e4e49d155 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ #ifndef GCC -#define D_800DC510_AS_U16 +#define gRaceState_AS_U16 #endif #include #include @@ -177,8 +177,8 @@ OSMesg gPIMesgBuf[32]; OSMesgQueue gPIMesgQueue; s32 gGamestate = 0xFFFF; -// D_800DC510 is externed as an s32 in other files. D_800DC514 is only used in main.c, likely a developer mistake. -u16 D_800DC510 = 0; +// gRaceState is externed as an s32 in other files. D_800DC514 is only used in main.c, likely a developer mistake. +u16 gRaceState = RACE_INIT; u16 D_800DC514 = 0; u16 creditsRenderMode = 0; // Renders the whole track. Displays red if used in normal race mode. u16 gDemoMode = DEMO_MODE_INACTIVE; @@ -775,7 +775,7 @@ void process_game_tick(void) { func_8028F474(); func_80059AC8(); update_course_actors(); - CourseManager_TickActors(); + CM_TickActors(); func_802966A0(); func_8028FCBC(); } diff --git a/src/main.h b/src/main.h index af9b2d6eb..80871e653 100644 --- a/src/main.h +++ b/src/main.h @@ -207,13 +207,13 @@ extern OSMesg gPIMesgBuf[]; extern OSMesgQueue gPIMesgQueue; void race_logic_loop(void); extern s32 gGamestate; -#ifndef D_800DC510_AS_U16 +#ifndef gRaceState_AS_U16 // Prevent overlapping writes in gcc -// Whether D_800DC510 was intended to be a separate variable in main.c from the rest of the game is unknown +// Whether gRaceState was intended to be a separate variable in main.c from the rest of the game is unknown #ifdef GCC -extern u16 D_800DC510; +extern u16 gRaceState; #else -extern s32 D_800DC510; +extern s32 gRaceState; #endif #endif diff --git a/src/math_util_2.h b/src/math_util_2.h index a62c9697b..de82c003c 100644 --- a/src/math_util_2.h +++ b/src/math_util_2.h @@ -11,7 +11,7 @@ void operator_or(s32*, s32); void operator_and_not(s32*, s32); void operator_xor(s32*, s32); -UNUSED bool func_80040E84(s32*, s32); +bool func_80040E84(s32*, s32); // UNUSED s32 func_80040EA4(s32*, s32); s32 f32_step_up_towards_alternate(f32*, f32, f32*); s32 f32_step_down_towards_alternate(f32*, f32, f32*); diff --git a/src/menu_items.c b/src/menu_items.c index 1cba05399..81638f217 100644 --- a/src/menu_items.c +++ b/src/menu_items.c @@ -44,7 +44,6 @@ #include "port/Engine.h" #include "port/Game.h" -#include "engine/Engine.h" #include "engine/courses/Course.h" #include "engine/Matrix.h" @@ -2502,8 +2501,6 @@ void setup_menus(void) { } } -CProperties* GetCoursePropsA(void); - void func_80095574(void) { s32 var_v0; @@ -2551,7 +2548,7 @@ void func_80095574(void) { } else { var_v0 = 8; } - debug_print_str2(var_v0 + 0xB9, 0x0000006E, GetCoursePropsA()->DebugName); + debug_print_str2(var_v0 + 0xB9, 0x0000006E, CM_GetProps()->DebugName); debug_print_str2(80, 120, "cc_mode"); debug_print_str2(170, 120, gDebugCCModeNames[gCCSelection]); @@ -4924,7 +4921,7 @@ void func_8009CE64(s32 arg0) { switch (gNextDemoId) { /* switch 4 */ case 0: /* switch 4 */ SetCourseByClass(GetMarioRaceway()); - CourseManager_SetCup(GetFlowerCup()); + CM_SetCup(GetFlowerCup()); SetCupCursorPosition(COURSE_FOUR); gCurrentCourseId = 0; gScreenModeSelection = 0; @@ -4935,7 +4932,7 @@ void func_8009CE64(s32 arg0) { break; case 1: /* switch 4 */ SetCourseByClass(GetLuigiRaceway()); - CourseManager_SetCup(GetMushroomCup()); + CM_SetCup(GetMushroomCup()); SetCupCursorPosition(COURSE_ONE); gCurrentCourseId = (s16) 1; gScreenModeSelection = (s32) 1; @@ -4947,7 +4944,7 @@ void func_8009CE64(s32 arg0) { break; case 2: /* switch 4 */ SetCourseByClass(GetKalimariDesert()); - CourseManager_SetCup(GetMushroomCup()); + CM_SetCup(GetMushroomCup()); SetCupCursorPosition(COURSE_FOUR); gCurrentCourseId = COURSE_KALIMARI_DESERT; gScreenModeSelection = 0; @@ -4958,7 +4955,7 @@ void func_8009CE64(s32 arg0) { break; case 3: /* switch 4 */ SetCourseByClass(GetWarioStadium()); - CourseManager_SetCup(GetStarCup()); + CM_SetCup(GetStarCup()); SetCupCursorPosition(COURSE_ONE); gCurrentCourseId = 0x000E; gScreenModeSelection = 3; @@ -4971,7 +4968,7 @@ void func_8009CE64(s32 arg0) { break; case 4: /* switch 4 */ SetCourseByClass(GetBowsersCastle()); - CourseManager_SetCup(GetStarCup()); + CM_SetCup(GetStarCup()); SetCupCursorPosition(COURSE_FOUR); gCurrentCourseId = 2; gScreenModeSelection = 0; @@ -4982,7 +4979,7 @@ void func_8009CE64(s32 arg0) { break; case 5: /* switch 4 */ SetCourseByClass(GetSherbetLand()); - CourseManager_SetCup(GetFlowerCup()); + CM_SetCup(GetFlowerCup()); SetCupCursorPosition(COURSE_TWO); gCurrentCourseId = 0x000C; gScreenModeSelection = 3; @@ -6009,11 +6006,11 @@ void render_menus(MenuItem* arg0) { } break; case MENU_ITEM_UI_START_RECORD_TIME: - var_t0 = (s32) ((f32) (get_string_width(CourseManager_GetProps()->Name) + 5) * 0.9f) / 2; + var_t0 = (s32) ((f32) (get_string_width(CM_GetProps()->Name) + 5) * 0.9f) / 2; gDisplayListHead = draw_box(gDisplayListHead, 0xA0 - var_t0, 0x0000007B, var_t0 + 0xA0, 0x000000A4, 0, 0, 0, 0x00000096); set_text_color(TEXT_GREEN); - print_text1_center_mode_1(0x0000009B, 0x0000008C, CourseManager_GetProps()->Name, 0, 0.9f, 0.9f); + print_text1_center_mode_1(0x0000009B, 0x0000008C, CM_GetProps()->Name, 0, 0.9f, 0.9f); temp_v1 = func_800B4EB4(0, 7) & 0xFFFFF; if (temp_v1 < 0x1EAA) { set_text_color((s32) gGlobalTimer % 2); @@ -6316,7 +6313,7 @@ void render_menus(MenuItem* arg0) { break; case MENU_ITEM_TYPE_097: set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2); - print_text_mode_1(arg0->column, arg0->row, CourseManager_GetProps()->Name, arg0->param1, arg0->paramf, + print_text_mode_1(arg0->column, arg0->row, CM_GetProps()->Name, arg0->param1, arg0->paramf, 1.0f); break; case MENU_ITEM_TYPE_098: @@ -6827,12 +6824,12 @@ void render_menu_item_data_course_info(MenuItem* arg0) { arg0->column = 0x14; // name of the course set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1); - print_text1_center_mode_1(0x69, arg0->row + 0x19, CourseManager_GetProps()->Name, 0, 0.75f, 0.75f); + print_text1_center_mode_1(0x69, arg0->row + 0x19, CM_GetProps()->Name, 0, 0.75f, 0.75f); // distance set_text_color(TEXT_RED); print_text_mode_1(0x2D, arg0->row + 0x28, (char*) &gTextDistance, 0, 0.75f, 0.75f); - print_text1_left(0xA5, arg0->row + 0x28, CourseManager_GetProps()->CourseLength, 1, 0.75f, 0.75f); + print_text1_left(0xA5, arg0->row + 0x28, CM_GetProps()->CourseLength, 1, 0.75f, 0.75f); // Best lap record set_text_color(TEXT_YELLOW); @@ -7076,7 +7073,7 @@ void func_800A1FB0(MenuItem* arg0) { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f); } else { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), - CourseManager_GetProps()->Name, 0, 0.5f, 0.5f); + CM_GetProps()->Name, 0, 0.5f, 0.5f); } } } @@ -7113,7 +7110,7 @@ void func_800A1FB0(MenuItem* arg0) { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f); } else { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), - CourseManager_GetProps()->Name, 0, 0.5f, 0.5f); + CM_GetProps()->Name, 0, 0.5f, 0.5f); } } } @@ -7163,7 +7160,7 @@ void func_800A1FB0(MenuItem* arg0) { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), D_800E7A44, 0, 0.5f, 0.5f); } else { print_text_mode_1(0x2A + (var_s1 * 0x89), 0x96 + (0x1E * var_s2), - CourseManager_GetProps()->Name, 0, 0.5f, 0.5f); + CM_GetProps()->Name, 0, 0.5f, 0.5f); } } } @@ -7454,7 +7451,7 @@ void time_trials_finish_text_render(MenuItem* arg0) { s32 rowOffset; set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1); - print_text1_center_mode_1(arg0->column + 0x43, arg0->row + 0x19, CourseManager_GetProps()->Name, 0, 0.6f, 0.6f); + print_text1_center_mode_1(arg0->column + 0x43, arg0->row + 0x19, CM_GetProps()->Name, 0, 0.6f, 0.6f); set_text_color(TEXT_YELLOW); print_text1_center_mode_1(arg0->column + 0x46, arg0->row + 0x28, gLapTimeText, 0, 0.75f, 0.75f); for (recordType = 0, rowOffset = 0; recordType < TIME_TRIAL_3LAP_RECORD_5; recordType += 1, rowOffset += 0xF) { @@ -7493,7 +7490,7 @@ void func_800A3E60(MenuItem* arg0) { } set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_1); - print_text1_center_mode_1(arg0->column + 0x55, 0x19 - arg0->row, CourseManager_GetProps()->Name, 0, 0.6f, 0.6f); + print_text1_center_mode_1(arg0->column + 0x55, 0x19 - arg0->row, CM_GetProps()->Name, 0, 0.6f, 0.6f); set_text_color(TEXT_YELLOW); print_text1_center_mode_1(arg0->column + 0x55, 0x28 - arg0->row, gLapTimeText, 0, 0.75f, 0.75f); for (var_s1 = 0; var_s1 < 4; var_s1++) { @@ -7559,7 +7556,7 @@ void func_800A3E60(MenuItem* arg0) { if (D_8018EE10[var_s1].ghostDataSaved == 0) { print_text_mode_1(0xBB - arg0->column, 0xAA + (0x1E * var_s1), D_800E7A44, 0, 0.45f, 0.45f); } else { - print_text_mode_1(0xBB - arg0->column, 0xAA + (0x1E * var_s1), CourseManager_GetProps()->Name, 0, + print_text_mode_1(0xBB - arg0->column, 0xAA + (0x1E * var_s1), CM_GetProps()->Name, 0, 0.45f, 0.45f); } } @@ -7781,7 +7778,7 @@ void render_pause_menu_time_trials(MenuItem* arg0) { gDisplayListHead = draw_box_wide(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, 0x0000008C); set_text_color(TEXT_YELLOW); - print_text1_center_mode_1(0x000000A0, 0x00000050, CourseManager_GetProps()->Name, 0, 1.0f, 1.0f); + print_text1_center_mode_1(0x000000A0, 0x00000050, CM_GetProps()->Name, 0, 1.0f, 1.0f); set_text_color(TEXT_RED); print_text1_center_mode_1(0x0000009D, 0x00000060, gBestTimeText[0], 0, 0.8f, 0.8f); temp_a0 = func_800B4E24(TIME_TRIAL_3LAP_RECORD_1); @@ -7923,7 +7920,7 @@ void render_pause_grand_prix(MenuItem* arg0) { set_text_color(TEXT_YELLOW); print_text1_center_mode_1(160 + temp_s0, temp_s3->row - 50, D_800E76CC[gCCSelection], 0, 1.0f, 1.0f); set_text_color(TEXT_YELLOW); - print_text1_center_mode_1(160, temp_s3->row - 30, CourseManager_GetProps()->Name, 0, 1.0f, 1.0f); + print_text1_center_mode_1(160, temp_s3->row - 30, CM_GetProps()->Name, 0, 1.0f, 1.0f); for (var_s0 = 0; var_s0 < 2; var_s0++) { text_rainbow_effect(arg0->state - 31, var_s0, TEXT_YELLOW); print_text_mode_1(temp_s3->column, temp_s3->row + (var_s0 * 13), gTextPauseButton[var_s0 * 4], 0, 0.75f, 0.75f); @@ -8068,7 +8065,7 @@ void render_menu_item_end_course_option(MenuItem* arg0) { gDisplayListHead = draw_box_wide(gDisplayListHead, 0, 0, 0x0000013F, 0x000000EF, 0, 0, 0, var_s1); gDPSetPrimColor(gDisplayListHead++, 0, 0, 0x00, 0x00, 0x00, var_s2); set_text_color(TEXT_YELLOW); - print_text1_center_mode_2(0x000000A0, 0x00000050, CourseManager_GetProps()->Name, 0, 1.0f, 1.0f); + print_text1_center_mode_2(0x000000A0, 0x00000050, CM_GetProps()->Name, 0, 1.0f, 1.0f); switch (arg0->state) { case 1: case 11: @@ -8132,7 +8129,7 @@ void render_menu_item_end_course_option(MenuItem* arg0) { if (D_8018EE10[var_s1].ghostDataSaved == 0) { print_text_mode_1(0x69 - arg0->column, (0x96 + (0x14 * var_s1)), D_800E7A44, 0, 0.75f, 0.75f); } else { - print_text_mode_1(0x69 - arg0->column, (0x96 + (0x14 * var_s1)), CourseManager_GetProps()->Name, + print_text_mode_1(0x69 - arg0->column, (0x96 + (0x14 * var_s1)), CM_GetProps()->Name, 0, 0.75f, 0.75f); } } @@ -8202,7 +8199,7 @@ void func_800A6034(MenuItem* arg0) { text = gCupNames[D_800DC540]; set_text_color(TEXT_BLUE_GREEN_RED_CYCLE_2); print_text1_center_mode_2(arg0->column + 0x41, arg0->row + 0xA0, text, 0, 0.85f, 1.0f); - text = CourseManager_GetProps()->Name; + text = CM_GetProps()->Name; set_text_color((s32) gCurrentCourseId % 4); print_text1_center_mode_2(arg0->column + 0x41, arg0->row + 0xC3, text, 0, 0.65f, 0.85f); } @@ -10823,7 +10820,7 @@ void func_800ABF68(MenuItem* arg0) { case 0: arg0->column = 0x140; arg0->state = 1; - arg0->param2 = 0xA0 - (get_string_width(CourseManager_GetProps()->Name) / 2); + arg0->param2 = 0xA0 - (get_string_width(CM_GetProps()->Name) / 2); /* fallthrough */ case 1: func_800A9208(arg0, arg0->param2); diff --git a/src/menus.c b/src/menus.c index 11fd21c97..746809480 100644 --- a/src/menus.c +++ b/src/menus.c @@ -1885,7 +1885,7 @@ void load_menu_states(s32 menuSelection) { case START_MENU: { gIsMirrorMode = 0; gEnableDebugMode = CVarGetInteger("gEnableDebugMode", 0); - CourseManager_SetCup(GetMushroomCup()); + CM_SetCup(GetMushroomCup()); gCupSelection = MUSHROOM_CUP; gCourseIndexInCup = 0; gTimeTrialDataCourseIndex = 0; @@ -1996,13 +1996,13 @@ void load_menu_states(s32 menuSelection) { case 3: case COURSE_SELECT_MENU: { if (gModeSelection == BATTLE) { - CourseManager_SetCup(GetBattleCup()); + CM_SetCup(GetBattleCup()); // gCupSelection = BATTLE_CUP; D_800DC540 = 4; gSubMenuSelection = SUB_MENU_MAP_SELECT_BATTLE_COURSE; } else { if (GetCup() == GetBattleCup()) { - CourseManager_SetCup(GetMushroomCup()); + CM_SetCup(GetMushroomCup()); // gCupSelection = MUSHROOM_CUP; } gSubMenuSelection = SUB_MENU_MAP_SELECT_CUP; diff --git a/src/player_controller.c b/src/player_controller.c index 6c72935d1..fa0d53c13 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -249,7 +249,7 @@ void func_80027EDC(Player* player, s8 playerId) { if (((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) && ((player->type & PLAYER_INVISIBLE_OR_BOMB) != PLAYER_INVISIBLE_OR_BOMB)) { - CourseManager_WhatDoesThisDo(player, playerId); + CM_WhatDoesThisDo(player, playerId); // switch (gCurrentCourseId) { // // case COURSE_MARIO_RACEWAY: @@ -383,7 +383,7 @@ void func_80027EDC(Player* player, s8 playerId) { // } } else { - CourseManager_WhatDoesThisDoAI(player, playerId); + CM_WhatDoesThisDoAI(player, playerId); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -585,7 +585,7 @@ void func_80028C44(Player* player, Camera* camera, s8 playerId, s8 screenId) { } void func_80028D3C(Player* player, Camera* camera, s8 playerId, s8 screenId) { - if ((((player->type & PLAYER_START_SEQUENCE) == 0) && (D_800DC510 != 5)) || (player->unk_0CA & 2) != 0 || + if ((((player->type & PLAYER_START_SEQUENCE) == 0) && (gRaceState != RACE_FINISHED)) || (player->unk_0CA & 2) != 0 || (player->unk_0CA & 8) != 0 || (player->effects & 0x4F010CC0) != 0) { player->effects &= ~0x1000; @@ -1974,7 +1974,7 @@ void apply_effect(Player* player, s8 arg1, s8 arg2) { func_8008D8B4(player, arg1); decelerate_ai_player(player, 10.0f); } - if (D_800DC510 != 5) { + if (gRaceState != RACE_FINISHED) { if (player->soundEffects & 0x04000000) { func_8008FC64(player, arg1); } diff --git a/src/port/Game.cpp b/src/port/Game.cpp index 34cf84d52..d73f5ccdf 100644 --- a/src/port/Game.cpp +++ b/src/port/Game.cpp @@ -1,9 +1,9 @@ #include #include "Game.h" +#include "port/Engine.h" #include -#include "Engine.h" #include "engine/World.h" #include "engine/courses/Course.h" #include "engine/courses/MarioRaceway.h" @@ -49,6 +49,7 @@ extern "C" { #include "networking/networking.h" #include "render_courses.h" #include "menus.h" +#include "update_objects.h" //#include "engine/wasm.h" } @@ -159,19 +160,21 @@ void CustomEngineInit() { gWorldInstance.CurrentCup->CursorPosition = 3; gWorldInstance.CupIndex = 0; - ModelLoader::LoadModelList bowserStatueList = { - .course = gBowsersCastle, - .gfxBuffer = &gBowserStatueGfx[0], - .gfxBufferSize = 162, - .gfxStart = (0x2BB8 / 8), // 0x2BB8 / sizeof(OldGfx) - .vtxBuffer = &gBowserStatueVtx[0], - .vtxBufferSize = 717, - .vtxStart = 1942, - }; + // ModelLoader::LoadModelList bowserStatueList = { + // .course = gBowsersCastle, + // .gfxBuffer = &gBowserStatueGfx[0], + // .gfxBufferSize = 162, + // .gfxStart = (0x2BB8 / 8), // 0x2BB8 / sizeof(OldGfx) + // .vtxBuffer = &gBowserStatueVtx[0], + // .vtxBufferSize = 717, + // .vtxStart = 1942, + // }; - gModelLoader.Add(bowserStatueList); + // Model loader systems allows cutting pieces out of courses and making them actors. + // Commented out due to alleged stability issues. + //gModelLoader.Add(bowserStatueList); - gModelLoader.Load(); + //gModelLoader.Load(); } extern "C" { @@ -188,7 +191,7 @@ extern "C" { return gWorldInstance.PreviousCup(); } - void CourseManager_SetCup(void* cup) { + void CM_SetCup(void* cup) { gWorldInstance.SetCup((Cup*)cup); } @@ -210,9 +213,6 @@ extern "C" { } } - CProperties* GetCoursePropsA() { - return (CProperties*) gWorldInstance.GetCourseProps(); - } size_t GetCourseIndex() { return gWorldInstance.CourseIndex; @@ -239,91 +239,50 @@ extern "C" { gWorldInstance.CurrentCourse = gWorldInstance.Courses[gWorldInstance.CourseIndex]; } - void CourseManager_SpawnVehicles() { - if (gWorldInstance.CurrentCourse) { - gWorldInstance.CurrentCourse->SpawnVehicles(); - } - } - - void CourseManager_VehiclesSpawn() { - for (auto& vehicle : gWorldInstance.Vehicles) { - if (vehicle) { - vehicle->Spawn(); + void CM_VehicleCollision(s32 playerId, Player* player) { + for (auto& actor : gWorldInstance.Actors) { + if (actor) { + actor->VehicleCollision(playerId, player); } } } - void CourseManager_VehiclesTick() { - for (auto& vehicle : gWorldInstance.Vehicles) { - if (vehicle) { - vehicle->Tick(); + void CM_BombKartsWaypoint(s32 cameraId) { + for (auto& object : gWorldInstance.Objects) { + if (auto kart = dynamic_cast(object)) {; + if (kart) { + kart->Waypoint(cameraId); + } } } } - void CourseManager_VehiclesCollision(s32 playerId, Player* player) { - for (auto& vehicle : gWorldInstance.Vehicles) { - if (vehicle) { - vehicle->Collision(playerId, player); - } + void CM_DisplayBattleBombKart(s32 playerId, s32 primAlpha) { + + if ((playerId < 0) || (playerId > 4)) { + return; + } + + if (primAlpha == 0) { + gWorldInstance.playerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::DISABLED; + gWorldInstance.playerBombKart[playerId]._primAlpha = primAlpha; + } else { + gWorldInstance.playerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::ACTIVE; + gWorldInstance.playerBombKart[playerId]._primAlpha = primAlpha; } } - void CourseManager_SpawnBombKarts() { - for (auto& kart : gWorldInstance.BombKarts) { - if (kart) { - kart->Spawn(); - } + void CM_DrawBattleBombKarts(s32 cameraId) { + for (size_t i = 0; i < gPlayerCount; i++) { + gWorldInstance.playerBombKart[i].Draw(i, cameraId); } } - void CourseManager_TickBombKarts() { - for (auto& kart : gWorldInstance.BombKarts) { - if (kart) { - kart->Tick(); - } - } - } - - void CourseManager_DrawBombKarts(s32 cameraId) { - for (auto& kart : gWorldInstance.BombKarts) { - if (kart) { - kart->Draw(cameraId); - } - } - } - - void CourseManager_DrawBattleBombKarts(s32 cameraId) { - for (auto& kart : gWorldInstance.BombKarts) { - if (kart) { - kart->DrawBattle(cameraId); - } - } - } - - void CourseManager_BombKartsWaypoint(s32 cameraId) { - for (auto& kart : gWorldInstance.BombKarts) { - if (kart) { - kart->Waypoint(cameraId); - } - } - } - - void CourseManager_DrawVehicles(s32 playerId) { - for (auto& vehicle : gWorldInstance.Vehicles) { - if (vehicle) { - vehicle->Draw(playerId); - } - } - } - - void CourseManager_ClearVehicles(void) { - gWorldInstance.ClearVehicles(); + void CM_ClearVehicles(void) { gWorldInstance.Crossings.clear(); - gWorldInstance.BombKarts.clear(); } - void CourseManager_CrossingTrigger() { + void CM_CrossingTrigger() { for (auto& crossing : gWorldInstance.Crossings) { if (crossing) { crossing->CrossingTrigger(); @@ -331,7 +290,7 @@ extern "C" { } } - void CourseManager_AICrossingBehaviour(s32 playerId) { + void CM_AICrossingBehaviour(s32 playerId) { for (auto& crossing : gWorldInstance.Crossings) { if (crossing) { crossing->AICrossingBehaviour(playerId); @@ -339,28 +298,20 @@ extern "C" { } } - s32 CourseManager_GetCrossingOnTriggered(uintptr_t* crossing) { + s32 CM_GetCrossingOnTriggered(uintptr_t* crossing) { TrainCrossing* ptr = (TrainCrossing*) crossing; if (ptr) { return ptr->OnTriggered; } } - void CourseManager_TrainSmokeTick(void) { - TrainSmokeTick(); - } - - void CourseManager_TrainSmokeDraw(s32 cameraId) { - TrainSmokeDraw(cameraId); - } - - void CourseManager_LoadTextures() { + void CM_LoadTextures() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->LoadTextures(); } } - void CourseManager_RenderCourse(struct UnkStruct_800DC5EC* arg0) { + void CM_RenderCourse(struct UnkStruct_800DC5EC* arg0) { if (gWorldInstance.CurrentCourse->IsMod() == false) { if ((CVarGetInteger("gFreecam", 0) == true)) { // Render credits courses @@ -374,32 +325,32 @@ extern "C" { } } - void CourseManager_RenderCredits() { + void CM_RenderCredits() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->RenderCredits(); } } - void CourseManager_TickActors() { + void CM_TickActors() { if (gWorldInstance.CurrentCourse) { gWorldInstance.TickActors(); } } - void CourseManager_DrawActors(Camera* camera, struct Actor* actor) { + void CM_DrawActors(Camera* camera, struct Actor* actor) { AActor* a = gWorldInstance.ConvertActorToAActor(actor); if (a->IsMod()) { a->Draw(camera); } } - void CourseManager_SpawnActors() { + void CM_BeginPlay() { if (gWorldInstance.CurrentCourse) { - gWorldInstance.CurrentCourse->SpawnActors(); + gWorldInstance.CurrentCourse->BeginPlay(); } } - void CourseManager_TickObjects() { + void CM_TickObjects() { if (gWorldInstance.CurrentCourse) { gWorldInstance.TickObjects(); } @@ -407,13 +358,13 @@ extern "C" { // A couple objects such as lakitu are ticked inside of process_game_tick which support 60fps. // This is a fallback to support that. - void CourseManager_TickObjects60fps() { + void CM_TickObjects60fps() { if (gWorldInstance.CurrentCourse) { gWorldInstance.TickObjects60fps(); } } - void CourseManager_DrawObjects(s32 cameraId) { + void CM_DrawObjects(s32 cameraId) { if (gWorldInstance.CurrentCourse) { gWorldInstance.DrawObjects(cameraId); } @@ -432,7 +383,7 @@ extern "C" { } // Helps prevents users from forgetting to add a finishline to their course - bool cm_DoesFinishlineExist() { + bool CM_DoesFinishlineExist() { for (AActor* actor : gWorldInstance.Actors) { if (dynamic_cast(actor)) { return true; @@ -441,104 +392,108 @@ extern "C" { return false; } - void CourseManager_InitClouds() { + void CM_InitClouds() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->InitClouds(); } } - void CourseManager_UpdateClouds(s32 arg0, Camera* camera) { + void CM_UpdateClouds(s32 arg0, Camera* camera) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->UpdateClouds(arg0, camera); } } - void CourseManager_Waypoints(Player* player, int8_t playerId) { + void CM_Waypoints(Player* player, int8_t playerId) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->Waypoints(player, playerId); } } - void CourseManager_SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, + void CM_SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->SomeCollisionThing(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7); } } - void CourseManager_MinimapSettings() { + void CM_MinimapSettings() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->MinimapSettings(); } } - void CourseManager_InitCourseObjects() { + void CM_InitCourseObjects() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->InitCourseObjects(); } } - void CourseManager_UpdateCourseObjects() { + void CM_UpdateCourseObjects() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->UpdateCourseObjects(); } + TrainSmokeTick(); } - void CourseManager_RenderCourseObjects(s32 cameraId) { + void CM_RenderCourseObjects(s32 cameraId) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->RenderCourseObjects(cameraId); } + + TrainSmokeDraw(cameraId); } - void CourseManager_SomeSounds() { + void CM_SomeSounds() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->SomeSounds(); } } - void CourseManager_CreditsSpawnActors() { + void CM_CreditsSpawnActors() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->CreditsSpawnActors(); } } - void CourseManager_WhatDoesThisDo(Player* player, int8_t playerId) { + void CM_WhatDoesThisDo(Player* player, int8_t playerId) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->WhatDoesThisDo(player, playerId); } } - void CourseManager_WhatDoesThisDoAI(Player* player, int8_t playerId) { + void CM_WhatDoesThisDoAI(Player* player, int8_t playerId) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->WhatDoesThisDoAI(player, playerId); } } - void CourseManager_MinimapFinishlinePosition() { + void CM_MinimapFinishlinePosition() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->MinimapFinishlinePosition(); } } - void CourseManager_SetStaffGhost() { + void CM_SetStaffGhost() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->SetStaffGhost(); } } - CProperties* CourseManager_GetProps() { + Properties* CM_GetProps() { if (gWorldInstance.CurrentCourse) { - return (CProperties*) &gWorldInstance.CurrentCourse->Props; + return &gWorldInstance.CurrentCourse->Props; } + return NULL; } - void CourseManager_ScrollingTextures() { + void CM_ScrollingTextures() { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->ScrollingTextures(); } } - void CourseManager_DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) { + void CM_DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) { if (gWorldInstance.CurrentCourse) { gWorldInstance.CurrentCourse->DrawWater(screen, pathCounter, cameraRot, playerDirection); } @@ -613,7 +568,7 @@ extern "C" { gWorldInstance.CurrentCourse = (Course*) course; } - struct Actor* m_GetActor(size_t index) { + struct Actor* CM_GetActor(size_t index) { if (index < gWorldInstance.Actors.size()) { AActor* actor = gWorldInstance.Actors[index]; return reinterpret_cast(reinterpret_cast(actor) + sizeof(void*)); @@ -623,7 +578,7 @@ extern "C" { } } - size_t m_FindActorIndex(Actor* actor) { + size_t CM_FindActorIndex(Actor* actor) { // Move the ptr back to look at the vtable. // This gets us the proper C++ class instead of just the variables used in C. AActor* a = reinterpret_cast((char*)actor - sizeof(void*)); @@ -637,7 +592,7 @@ extern "C" { return 0; } - void m_DeleteActor(size_t index) { + void CM_DeleteActor(size_t index) { std::vector actors = gWorldInstance.Actors; if (index < actors.size()) { actors.erase(actors.begin() + index); @@ -654,15 +609,15 @@ extern "C" { gWorldInstance.Lakitus.clear(); } - struct Actor* m_AddBaseActor(void) { + struct Actor* CM_AddBaseActor(void) { return (struct Actor*) gWorldInstance.AddBaseActor(); } - size_t m_GetActorSize() { + size_t CM_GetActorSize() { return gWorldInstance.Actors.size(); } - void m_ActorCollision(Player* player, Actor* actor) { + void CM_ActorCollision(Player* player, Actor* actor) { AActor* a = gWorldInstance.ConvertActorToAActor(actor); if (a->IsMod()) { diff --git a/src/port/Game.h b/src/port/Game.h index ba4e1d359..832cfc10d 100644 --- a/src/port/Game.h +++ b/src/port/Game.h @@ -2,14 +2,20 @@ #define _GAME_H #include -#include "engine/Engine.h" +#include "engine/courses/Course.h" #ifdef __cplusplus +class Course; extern "C" { -#include "camera.h" #endif +#include "camera.h" #include "actor_types.h" +Properties* CM_GetProps(); + +void CM_DisplayBattleBombKart(s32 playerId, s32 primAlpha); +void CM_DrawBattleBombKarts(s32 cameraId); + u32 WorldNextCup(void); u32 WorldPreviousCup(void); @@ -20,8 +26,6 @@ const char* GetCupName(void); void LoadCourse(); -CProperties* GetCoursePropsA(); - size_t GetCourseIndex(); void SetCourse(const char* name); @@ -29,19 +33,13 @@ void SetCourse(const char* name); void NextCourse(); void PreviousCourse(); -void CourseManager_SetCup(void*); +void CM_SetCup(void*); -void CourseManager_SpawnVehicles(); +void CM_LoadTextures(); -void CourseManager_UpdateVehicles(); +void CM_RenderCourse(struct UnkStruct_800DC5EC* arg0); -void CourseManager_LoadTextures(); - -void CourseManager_RenderCourse(struct UnkStruct_800DC5EC* arg0); - -void CourseManager_RenderCredits(); - -void CourseManager_SpawnActors(); +void CM_RenderCredits(); void CM_SpawnStarterLakitu(); void CM_ActivateFinishLakitu(s32 playerId); @@ -49,83 +47,67 @@ void CM_ActivateSecondLapLakitu(s32 playerId); void CM_ActivateFinalLapLakitu(s32 playerId); void CM_ActivateReverseLakitu(s32 playerId); -bool cm_DoesFinishlineExist(); +bool CM_DoesFinishlineExist(); -void CourseManager_InitClouds(); +void CM_InitClouds(); -void CourseManager_DrawActors(Camera* camera, struct Actor* actor); +void CM_DrawActors(Camera* camera, struct Actor* actor); -void CourseManager_TickObjects(); -void CourseManager_TickObjects60fps(); -void CourseManager_DrawObjects(s32 cameraId); +void CM_TickObjects(); +void CM_TickObjects60fps(); +void CM_DrawObjects(s32 cameraId); void CM_TickParticles(void); void CM_DrawParticles(s32 cameraId); -void CourseManager_UpdateClouds(s32 arg0, Camera* camera); +void CM_UpdateClouds(s32 arg0, Camera* camera); -void CourseManager_Waypoints(Player* player, int8_t playerId); +void CM_Waypoints(Player* player, int8_t playerId); -void CourseManager_SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, +void CM_SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7); -void CourseManager_MinimapSettings(); +void CM_MinimapSettings(); -void CourseManager_InitCourseObjects(); +void CM_InitCourseObjects(); -void CourseManager_UpdateCourseObjects(); +void CM_UpdateCourseObjects(); -void CourseManager_RenderCourseObjects(s32 cameraId); +void CM_RenderCourseObjects(s32 cameraId); -void CourseManager_SomeSounds(); +void CM_SomeSounds(); -void CourseManager_CreditsSpawnActors(); +void CM_CreditsSpawnActors(); -void CourseManager_WhatDoesThisDo(Player* player, int8_t playerId); +void CM_WhatDoesThisDo(Player* player, int8_t playerId); -void CourseManager_WhatDoesThisDoAI(Player* player, int8_t playerId); +void CM_WhatDoesThisDoAI(Player* player, int8_t playerId); -void CourseManager_MinimapFinishlinePosition(); +void CM_MinimapFinishlinePosition(); -void CourseManager_SetStaffGhost(); +void CM_SetStaffGhost(); -CProperties* CourseManager_GetProps(); +void CM_BombKartsWaypoint(s32 cameraId); -void CourseManager_SpawnBombKarts(); +void CM_ScrollingTextures(); -void CourseManager_BombKartsWaypoint(s32 cameraId); +s32 CM_GetCrossingOnTriggered(uintptr_t* crossing); -void CourseManager_ScrollingTextures(); +void CM_BeginPlay(); -s32 CourseManager_GetCrossingOnTriggered(uintptr_t* crossing); +void CM_DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection); -void CourseManager_VehiclesSpawn(); +void CM_AICrossingBehaviour(s32 playerId); -void CourseManager_DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection); +void CM_ClearVehicles(void); -void CourseManager_AICrossingBehaviour(s32 playerId); +void CM_CrossingTrigger(); -void CourseManager_ClearVehicles(void); +void CM_VehicleCollision(s32 playerId, Player* player); -void CourseManager_DrawVehicles(s32 playerId); +void CM_TickActors(); -void CourseManager_CrossingTrigger(); - -void CourseManager_VehiclesCollision(s32 playerId, Player* player); - -void CourseManager_VehiclesTick(); - -void CourseManager_TickBombKarts(); - -void CourseManager_TickActors(); - -void CourseManager_TrainSmokeTick(void); - -void CourseManager_DrawBattleBombKarts(s32 cameraId); - -void CourseManager_DrawBombKarts(s32 cameraId); - -void CourseManager_TrainSmokeDraw(s32 cameraId); +void CM_DrawBombKarts(s32 cameraId); size_t GetCupCursorPosition(); @@ -141,12 +123,12 @@ void SetCourseById(s32 course); void SetCourseByClass(void* course); -struct Actor* m_GetActor(size_t index); -void m_DeleteActor(size_t index); -struct Actor* m_AddBaseActor(void); -size_t m_GetActorSize(); -size_t m_FindActorIndex(struct Actor* actor); -void m_ActorCollision(Player* player, struct Actor* actor); +struct Actor* CM_GetActor(size_t index); +void CM_DeleteActor(size_t index); +struct Actor* CM_AddBaseActor(void); +size_t CM_GetActorSize(); +size_t CM_FindActorIndex(struct Actor* actor); +void CM_ActorCollision(Player* player, struct Actor* actor); void CM_CleanWorld(void); void* GetMarioRaceway(void); diff --git a/src/racing/actors.c b/src/racing/actors.c index caf623554..4b586cf75 100644 --- a/src/racing/actors.c +++ b/src/racing/actors.c @@ -55,7 +55,7 @@ void cleanup_red_and_green_shells(struct ShellActor* shell) { // try finding the dead green shell for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); if ((shell != compare) && !(compare->flags & ACTOR_IS_NOT_EXPIRED) && (compare->type == ACTOR_GREEN_SHELL)) { if (compare->state == MOVING_SHELL) { delete_actor_in_unexpired_actor_list(actorIndex); @@ -68,7 +68,7 @@ void cleanup_red_and_green_shells(struct ShellActor* shell) { // try finding the dead red shell for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); if ((shell != compare) && !(compare->flags & ACTOR_IS_NOT_EXPIRED) && (compare->type == ACTOR_RED_SHELL)) { switch (compare->state) { case MOVING_SHELL: @@ -90,7 +90,7 @@ void cleanup_red_and_green_shells(struct ShellActor* shell) { // try finding the green shell for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); if ((shell != compare) && (compare->type == ACTOR_GREEN_SHELL)) { switch (compare->state) { case MOVING_SHELL: @@ -105,7 +105,7 @@ void cleanup_red_and_green_shells(struct ShellActor* shell) { // try finding the red or blue shell for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); if ((shell != compare) && (compare->type == ACTOR_RED_SHELL)) { switch (compare->state) { case MOVING_SHELL: @@ -838,7 +838,7 @@ void spawn_piranha_plants(struct ActorSpawnData* spawnData) { startingPos[1] = temp_s0->pos[1]; startingPos[2] = temp_s0->pos[2]; temp = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_PIRANHA_PLANT); - temp_v1 = (struct PiranhaPlant*) m_GetActor(temp); + temp_v1 = (struct PiranhaPlant*) CM_GetActor(temp); temp_v1->visibilityStates[0] = 0; temp_v1->visibilityStates[1] = 0; temp_v1->visibilityStates[2] = 0; @@ -867,7 +867,7 @@ void spawn_palm_trees(struct ActorSpawnData* spawnData) { startingPos[1] = temp_s0->pos[1]; startingPos[2] = temp_s0->pos[2]; temp = add_actor_to_empty_slot(startingPos, startingRot, startingVelocity, ACTOR_PALM_TREE); - temp_v1 = (struct PalmTree*) m_GetActor(temp); + temp_v1 = (struct PalmTree*) CM_GetActor(temp); temp_v1->variant = temp_s0->someId; check_bounding_collision((Collision*) &temp_v1->unk30, 5.0f, temp_v1->pos[0], temp_v1->pos[1], temp_v1->pos[2]); @@ -934,7 +934,7 @@ void spawn_foliage(struct ActorSpawnData* actor) { } } - temp_s0 = m_GetActor(add_actor_to_empty_slot(position, rotation, velocity, actorType)); + temp_s0 = CM_GetActor(add_actor_to_empty_slot(position, rotation, velocity, actorType)); if (gGamestate == CREDITS_SEQUENCE) { func_802976D8(temp_s0->rot); } else { @@ -977,13 +977,13 @@ void spawn_all_item_boxes(struct ActorSpawnData* spawnData) { // It's either the ItemBox or the SEGMENT/OFFSET variables. // itemBox = (struct ItemBox *) GET_ACTOR(temp_s1); - m_GetActor(temp_s1)->unk_08 = temp_f0; + CM_GetActor(temp_s1)->unk_08 = temp_f0; // itemBox->resetDistance = temp_f0; - m_GetActor(temp_s1)->velocity[0] = startingPos[1]; + CM_GetActor(temp_s1)->velocity[0] = startingPos[1]; // itemBox->origY = startingPos[1]; - m_GetActor(temp_s1)->pos[1] = temp_f0 - 20.0f; + CM_GetActor(temp_s1)->pos[1] = temp_f0 - 20.0f; // itemBox->pos[1] = temp_f0 - 20.0f; temp_s0++; @@ -1011,7 +1011,7 @@ void init_kiwano_fruit(void) { } phi_s0 = add_actor_to_empty_slot(sp64, sp50, sp58, ACTOR_KIWANO_FRUIT); - actor = m_GetActor(phi_s0); + actor = CM_GetActor(phi_s0); actor->unk_04 = i; } } @@ -1025,7 +1025,7 @@ void destroy_all_actors(void) { s32 i; gNumActors = 0; for (i = 0; i < ACTOR_LIST_SIZE; i++) { - struct Actor* actor = m_GetActor(i); + struct Actor* actor = CM_GetActor(i); actor->flags = 0; actor->type = 0; actor->unk_04 = 0; @@ -1044,12 +1044,11 @@ void spawn_course_actors(void) { struct RailroadCrossing* rrxing; gNumPermanentActors = 0; - CourseManager_SpawnActors(); if (gModeSelection != BATTLE) { - if (!cm_DoesFinishlineExist()) { + if (!CM_DoesFinishlineExist()) { printf("\n[actors.c] COURSE MISSING THE FINISHLINE\n"); - printf(" In the course class SpawnActors() function make sure to include:\n"); + printf(" In the Course class BeginPlay() function make sure to include:\n"); printf(" gWorldInstance.AddActor(new AFinishline());\n\n"); printf("\n Otherwise, course textures may glitch out or other strange issues may occur.\n"); } @@ -1211,16 +1210,14 @@ void init_actors_and_load_textures(void) { dma_textures(gTexture671A88, 0x00000400U, 0x00000800U); dma_textures(gTexture6774D8, 0x00000400U, 0x00000800U); - CourseManager_LoadTextures(); + CM_LoadTextures(); init_red_shell_texture(); destroy_all_actors(); CM_CleanWorld(); + + CM_BeginPlay(); spawn_course_actors(); - - CourseManager_VehiclesSpawn(); - - // spawn_course_vehicles(); } void play_sound_before_despawn(struct Actor* actor) { @@ -1265,7 +1262,7 @@ s16 try_remove_destructable_item(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actor // try removing a red shell, green shell, banana, or a fake item box if the actor is expired for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); if (!(compare->flags & ACTOR_IS_NOT_EXPIRED)) { switch (compare->type) { case ACTOR_RED_SHELL: @@ -1322,7 +1319,7 @@ s16 try_remove_destructable_item(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actor // will remove the oldest destructable actor in the list for (actorIndex = gNumPermanentActors; actorIndex < ACTOR_LIST_SIZE; actorIndex++) { - compare = (struct ShellActor*) m_GetActor(actorIndex); + compare = (struct ShellActor*) CM_GetActor(actorIndex); switch (compare->type) { case ACTOR_RED_SHELL: switch (compare->state) { @@ -1382,22 +1379,22 @@ s16 try_remove_destructable_item(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actor s16 add_actor_to_empty_slot(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actorType) { size_t index; - // if (gNumActors >= m_GetActorSize()) { + // if (gNumActors >= CM_GetActorSize()) { // return try_remove_destructable_item(pos, rot, velocity, actorType); // } // Cleanup unused actors - for (index = 0; index < m_GetActorSize(); index++) { - // if (m_GetActor(index)->flags == 0) { + for (index = 0; index < CM_GetActorSize(); index++) { + // if (CM_GetActor(index)->flags == 0) { //! @todo Commented out because deletes too soon. - // m_DeleteActor(index); + // CM_DeleteActor(index); // gNumActors--; //} } gNumActors++; - struct Actor* actor = m_AddBaseActor(); + struct Actor* actor = CM_AddBaseActor(); actor_init(actor, pos, rot, velocity, actorType); - return (s16) m_GetActorSize() - 1; // Return current index; + return (s16) CM_GetActorSize() - 1; // Return current index; } UNUSED s16 spawn_actor_at_pos(Vec3f pos, s16 actorType) { @@ -1818,7 +1815,7 @@ void destroy_destructable_actor(struct Actor* actor) { if (shell->state != GREEN_SHELL_HIT_A_RACER) { switch (shell->state) { case MOVING_SHELL: - delete_actor_in_unexpired_actor_list(m_FindActorIndex(actor)); + delete_actor_in_unexpired_actor_list(CM_FindActorIndex(actor)); /* fallthrough */ case HELD_SHELL: case RELEASED_SHELL: @@ -1847,7 +1844,7 @@ void destroy_destructable_actor(struct Actor* actor) { case BLUE_SHELL_LOCK_ON: case BLUE_SHELL_TARGET_ELIMINATED: func_800C9EF4(shell->pos, SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x08)); - delete_actor_in_unexpired_actor_list(m_FindActorIndex(actor)); + delete_actor_in_unexpired_actor_list(CM_FindActorIndex(actor)); /* fallthrough */ case HELD_SHELL: case RELEASED_SHELL: @@ -1872,7 +1869,7 @@ void destroy_destructable_actor(struct Actor* actor) { case GREEN_SHELL_HIT_A_RACER: case BLUE_SHELL_LOCK_ON: case BLUE_SHELL_TARGET_ELIMINATED: - delete_actor_in_unexpired_actor_list(m_FindActorIndex(actor)); + delete_actor_in_unexpired_actor_list(CM_FindActorIndex(actor)); /* fallthrough */ case HELD_SHELL: case RELEASED_SHELL: @@ -2006,7 +2003,7 @@ void evaluate_collision_between_player_actor(Player* player, struct Actor* actor f32 temp_f0; f32 temp_f2; - m_ActorCollision(player, actor); + CM_ActorCollision(player, actor); temp_lo = player - gPlayerOne; switch (actor->type) { @@ -2223,7 +2220,7 @@ void evaluate_collision_for_players_and_actors(void) { if (((phi_s1->type & 0x8000) != 0) && ((phi_s1->effects & 0x4000000) == 0)) { func_802977E4(phi_s1); for (j = 0; j < ACTOR_LIST_SIZE; j++) { - temp_a1 = m_GetActor(j); + temp_a1 = CM_GetActor(j); if ((phi_s1->effects & 0x4000000) == 0) { // temp_v0 = temp_a1->unk2; @@ -2244,7 +2241,7 @@ void evaluate_collision_for_destructible_actors(void) { UNUSED s32 pad; for (i = gNumPermanentActors; i < (ACTOR_LIST_SIZE); i++) { - actor1 = m_GetActor(i); + actor1 = CM_GetActor(i); if ((actor1->flags & 0x8000) == 0) { continue; @@ -2261,7 +2258,7 @@ void evaluate_collision_for_destructible_actors(void) { case ACTOR_FAKE_ITEM_BOX: for (j = i + 1; j < ACTOR_LIST_SIZE; j++) { - actor2 = m_GetActor(j); + actor2 = CM_GetActor(j); if ((actor1->flags & 0x8000) == 0) { continue; @@ -2313,7 +2310,7 @@ void evaluate_collision_for_destructible_actors(void) { } void func_802A1064(struct FakeItemBox* fake_item_box) { - if ((u32) (m_FindActorIndex(fake_item_box)) <= (u32) ACTOR_LIST_SIZE) { + if ((u32) (CM_FindActorIndex(fake_item_box)) <= (u32) ACTOR_LIST_SIZE) { if (((fake_item_box->flags & 0x8000) != 0) && (fake_item_box->type == ACTOR_FAKE_ITEM_BOX)) { fake_item_box->state = 1; fake_item_box->targetY = func_802ABEAC(&fake_item_box->unk30, fake_item_box->pos) + 8.66f; @@ -2340,7 +2337,7 @@ void init_actor_hot_air_balloon_item_box(f32 x, f32 y, f32 z) { pos[1] = y; pos[2] = z; id = add_actor_to_empty_slot(pos, rot, velocity, ACTOR_HOT_AIR_BALLOON_ITEM_BOX); - gActorHotAirBalloonItemBox = m_GetActor(id); + gActorHotAirBalloonItemBox = CM_GetActor(id); } #include "actors/item_box/update.inc.c" @@ -2365,8 +2362,8 @@ void render_item_boxes(struct UnkStruct_800DC5EC* arg0) { s32 i; D_8015F8DC = 0; - for (i = 0; i < m_GetActorSize(); i++) { - actor = m_GetActor(i); + for (i = 0; i < CM_GetActorSize(); i++) { + actor = CM_GetActor(i); if (actor->flags == 0) { continue; @@ -2420,15 +2417,15 @@ void render_course_actors(struct UnkStruct_800DC5EC* arg0) { } D_8015F8E0 = 0; - for (i = 0; i < m_GetActorSize(); i++) { - actor = m_GetActor(i); + for (i = 0; i < CM_GetActorSize(); i++) { + actor = CM_GetActor(i); if (actor->flags == 0) { continue; } switch (actor->type) { default: // Draw custom actor - CourseManager_DrawActors(D_800DC5EC->camera, actor); + CM_DrawActors(D_800DC5EC->camera, actor); break; case ACTOR_TREE_MARIO_RACEWAY: render_actor_tree_mario_raceway(camera, sBillBoardMtx, actor); @@ -2541,9 +2538,9 @@ void render_course_actors(struct UnkStruct_800DC5EC* arg0) { void update_course_actors(void) { struct Actor* actor; s32 i; - for (i = 0; i < m_GetActorSize(); i++) { + for (i = 0; i < CM_GetActorSize(); i++) { - actor = m_GetActor(i); + actor = CM_GetActor(i); if (actor->flags == 0) { continue; } diff --git a/src/racing/actors_extended.c b/src/racing/actors_extended.c index b25d5bf04..5493a4efa 100644 --- a/src/racing/actors_extended.c +++ b/src/racing/actors_extended.c @@ -592,9 +592,9 @@ s32 init_triple_shell(TripleShellParent* parent, Player* player, s16 shellType, shell->rotVelocity = 0; shell->rotAngle = -0x8000; shell->playerId = player - gPlayerOne; - shell->parentIndex = m_FindActorIndex(parent); + shell->parentIndex = CM_FindActorIndex(parent); shell->shellId = shellId; - parent->shellIndices[shellId] = (f32) m_FindActorIndex(shell); + parent->shellIndices[shellId] = (f32) CM_FindActorIndex(shell); return 1; } @@ -721,7 +721,7 @@ void func_802B2914(struct BananaBunchParent* banana_bunch, Player* player, s16 b func_802B4E30((struct Actor*) newBanana); newBanana->flags = 0x9000; newBanana->playerId = player - gPlayerOne; - newBanana->parentIndex = (struct Actor*) m_FindActorIndex(banana_bunch); + newBanana->parentIndex = (struct Actor*) CM_FindActorIndex(banana_bunch); newBanana->youngerIndex = -1; newBanana->unk_04 = 0x0014; newBanana->bananaId = bananaId; diff --git a/src/racing/memory.c b/src/racing/memory.c index d54915a3d..1b5f02510 100644 --- a/src/racing/memory.c +++ b/src/racing/memory.c @@ -823,7 +823,7 @@ void unpack_tile_sync(Gfx* gfx, u8* args, s8 opcode) { } uintptr_t get_texture(size_t offset) { - course_texture* textures = CourseManager_GetProps()->textures; + course_texture* textures = CM_GetProps()->textures; size_t totalOffset = 0; while (textures->addr) { diff --git a/src/racing/race_logic.c b/src/racing/race_logic.c index a65ff4c85..4b9cf1af9 100644 --- a/src/racing/race_logic.c +++ b/src/racing/race_logic.c @@ -80,7 +80,7 @@ void func_8028E028(void) { break; } func_800CA118((u8) gPlayerWinningIndex); - D_800DC510 = 5; + gRaceState = RACE_FINISHED; D_802BA038 = 10; } @@ -225,7 +225,7 @@ void func_8028E438(void) { func_80019DF4(); } else { func_80092564(); - D_800DC510 = 7; + gRaceState = RACE_EXIT; } } break; @@ -399,7 +399,7 @@ void func_8028E678(void) { case 4: gIsInQuitToMenuTransition = 1; gQuitToMenuTransitionCounter = 5; - D_800DC510 = 7; + gRaceState = RACE_EXIT; set_next_course(); break; } @@ -407,7 +407,7 @@ void func_8028E678(void) { void func_8028EC38(s32 arg0) { gGotoMode = arg0; - D_800DC510 = 6; + gRaceState = RACE_UNK; func_800CA330(25); func_800CA388(25); D_800DC5B4 = 1; @@ -418,13 +418,14 @@ void func_8028EC38(s32 arg0) { void func_8028EC98(s32 arg0) { - if (gScreenModeSelection == SCREEN_MODE_3P_4P_SPLITSCREEN) { - return; - } + // We want music in mutilplayer + //if (gScreenModeSelection == SCREEN_MODE_3P_4P_SPLITSCREEN) { + // return; + //} func_800029B0(); - enum MusicSeq sequence = CourseManager_GetProps()->Sequence; + enum MusicSeq sequence = CM_GetProps()->Sequence; if(sequence != MUSIC_SEQ_UNKNOWN){ play_sequence(sequence); @@ -439,8 +440,8 @@ void start_race(void) { func_8028EC98(gCurrentCourseId); } - if (D_800DC510 == 2) { - D_800DC510 = 3; + if (gRaceState == RACE_STAGING) { + gRaceState = RACE_IN_PROGRESS; } for (i = 0; i < NUM_PLAYERS; i++) { @@ -504,7 +505,7 @@ void func_8028EF28(void) { D_802BA048 = 1; } if ((gPlayers[i].type & PLAYER_INVISIBLE_OR_BOMB) == 0) { - D_800DC510 = 4; + gRaceState = RACE_CALCULATE_RANKS; } if (gModeSelection == TIME_TRIALS) { func_80005AE8(player); @@ -523,7 +524,7 @@ void func_8028EF28(void) { if (*(gNmiUnknown1 + i) > 99) { *(gNmiUnknown1 + i) = 99; } - D_800DC510 = 5; + gRaceState = RACE_FINISHED; i = gPlayerPositionLUT[1]; gPlayers[i].soundEffects |= 0x200000; gPlayers[i].type |= PLAYER_KART_AI; @@ -537,7 +538,7 @@ void func_8028EF28(void) { *(gNmiUnknown2 + i * 3 + currentPosition) = 99; } if (currentPosition == 1) { - D_800DC510 = 5; + gRaceState = RACE_FINISHED; i = gPlayerPositionLUT[2]; *(gNmiUnknown2 + i * 3 + 2) += 1; if (*(gNmiUnknown2 + i * 3 + 2) > 99) { @@ -556,7 +557,7 @@ void func_8028EF28(void) { *(gNmiUnknown3 + i * 3 + currentPosition) = 99; } if (currentPosition == 2) { - D_800DC510 = 5; + gRaceState = RACE_FINISHED; i = gPlayerPositionLUT[3]; gPlayers[i].soundEffects |= 0x200000; gPlayers[i].type |= PLAYER_KART_AI; @@ -610,16 +611,16 @@ void update_race_position_data(void) { void func_8028F474(void) { s32 i; - switch (D_800DC510) { - case 3: - case 4: - case 5: - case 7: + switch (gRaceState) { + case RACE_IN_PROGRESS: + case RACE_CALCULATE_RANKS: + case RACE_FINISHED: + case RACE_EXIT: for (i = 0; i < NUM_PLAYERS; i++) { func_80009B60(i); } - case 1: - case 2: + case RACE_SETUP: + case RACE_STAGING: update_vehicles(); break; } @@ -633,7 +634,7 @@ void func_8028F4E8(void) { func_800CA330(0x19); func_800CA388(0x19); gGotoMode = START_MENU_FROM_QUIT; - D_800DC510 = 6; + gRaceState = RACE_UNK; D_800DC5B4 = 1; D_800DC5B0 = 1; D_800DC5B8 = 0; @@ -816,7 +817,7 @@ void func_8028F970(void) { void func_8028FBD4(void) { gGotoMode = START_MENU_FROM_QUIT; - D_800DC510 = 6; + gRaceState = RACE_UNK; func_800CA330(25); func_800CA388(25); D_800DC5B4 = 1; @@ -856,8 +857,8 @@ void func_8028FCBC(void) { if (gDemoUseController) { func_8028FC34(); } - switch (D_800DC510) { - case 0: + switch (gRaceState) { + case RACE_INIT: if (!gDemoMode) { if (gModeSelection == GRAND_PRIX) { func_800C8EF8(11); @@ -868,7 +869,7 @@ void func_8028FCBC(void) { } } func_80002DAC(); - D_800DC510 = 1; + gRaceState = RACE_SETUP; D_80150118 = 3.0f; creditsRenderMode = 0; D_802BA032 = 0; @@ -890,8 +891,9 @@ void func_8028FCBC(void) { ply++; } D_800DC5B8 = 1; + break; - case 1: + case RACE_SETUP: func_8028F914(); if (D_802BA034 == 1.0f) { if (gActiveScreenMode != SCREEN_MODE_1P) { @@ -901,7 +903,7 @@ void func_8028FCBC(void) { func_802A7728(); } } - D_800DC510 = 2; + gRaceState = RACE_STAGING; D_800DC5B0 = 0; D_800DC5B8 = 1; CM_SpawnStarterLakitu(); // func_80078F64(); @@ -921,7 +923,7 @@ void func_8028FCBC(void) { } func_8028F4E8(); break; - case 2: + case RACE_STAGING: if (gDemoMode) { start_race(); } @@ -930,7 +932,7 @@ void func_8028FCBC(void) { } func_8028F4E8(); break; - case 3: + case RACE_IN_PROGRESS: if (gModeSelection == BATTLE) { update_player_battle_status(); } else { @@ -940,8 +942,7 @@ void func_8028FCBC(void) { func_8028F4E8(); func_8028F970(); break; - case 4: - + case RACE_CALCULATE_RANKS: switch (gModeSelection) { case GRAND_PRIX: func_8028F4E8(); @@ -952,7 +953,7 @@ void func_8028FCBC(void) { switch (gScreenModeSelection) { case SCREEN_MODE_1P: D_802BA038 = 690; - D_800DC510 = 5; + gRaceState = RACE_FINISHED; func_8028E298(); break; case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: @@ -968,7 +969,7 @@ void func_8028FCBC(void) { func_8028E298(); D_802BA038 = 600; - D_800DC510 = 5; + gRaceState = RACE_FINISHED; } break; } @@ -982,14 +983,14 @@ void func_8028FCBC(void) { case TIME_TRIALS: D_802BA038 = 360; if (D_8015F890 != 0) { - D_800DC510 = 7; + gRaceState = RACE_EXIT; } else { - D_800DC510 = 5; + gRaceState = RACE_FINISHED; } break; } break; - case 5: + case RACE_FINISHED: if (D_802BA038 != 0) { D_802BA038--; } else { @@ -999,7 +1000,7 @@ void func_8028FCBC(void) { func_8028E678(); } else if (gScreenModeSelection == SCREEN_MODE_1P) { func_80092564(); - D_800DC510 = 7; + gRaceState = RACE_EXIT; } else { func_8028E438(); } @@ -1015,14 +1016,14 @@ void func_8028FCBC(void) { } func_8028F4E8(); break; - case 6: + case RACE_UNK: func_8028F8BC(); if (D_802BA034 <= 0) { gIsInQuitToMenuTransition = 1; gQuitToMenuTransitionCounter = 5; } break; - case 7: + case RACE_EXIT: break; } } diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c index 0671a0cd7..b2d654fb4 100644 --- a/src/racing/render_courses.c +++ b/src/racing/render_courses.c @@ -21,6 +21,7 @@ #include "courses/all_course_packed.h" #include "courses/all_course_offsets.h" #include "port/Game.h" +#include "engine/courses/Course.h" #include "enhancements/collision_viewer.h" @@ -241,7 +242,7 @@ void func_8029122C(struct UnkStruct_800DC5EC* arg0, s32 playerId) { } mtxf_identity(matrix); render_set_position(matrix, 0); - CourseManager_DrawWater(arg0, pathCounter, cameraRot, playerDirection); + CM_DrawWater(arg0, pathCounter, cameraRot, playerDirection); // switch (gCurrentCourseId) { // case COURSE_BOWSER_CASTLE: // if (gActiveScreenMode != SCREEN_MODE_1P) { @@ -624,9 +625,7 @@ void render_mario_raceway(struct UnkStruct_800DC5EC* arg0) { gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x07003240))); // d_course_mario_raceway_packed_dl_14A0 gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x070014A0))); - // printf("LOADING SURFACE MAP\n"); render_course_segments(mario_raceway_dls, arg0); - // printf("SURFACE MAP LOADED\n"); gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA); gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK); @@ -639,7 +638,6 @@ void render_mario_raceway(struct UnkStruct_800DC5EC* arg0) { gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x070000E0))); // d_course_mario_raceway_packed_dl_160 gSPDisplayList(gDisplayListHead++, ((uintptr_t) segmented_gfx_to_virtual(0x07000160))); - // printf("RENDERED COURSE\n"); } void render_choco_mountain(struct UnkStruct_800DC5EC* arg0) { @@ -1324,7 +1322,7 @@ void render_big_donut(struct UnkStruct_800DC5EC* arg0) { void func_8029569C(void) { - CourseManager_RenderCredits(); + CM_RenderCredits(); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -1404,7 +1402,7 @@ void render_course(struct UnkStruct_800DC5EC* arg0) { return; } - CourseManager_RenderCourse(arg0); + CM_RenderCourse(arg0); // switch (gCurrentCourseId) { // case COURSE_MARIO_RACEWAY: @@ -1716,7 +1714,7 @@ void course_init(void) { void func_802966A0(void) { - CourseManager_ScrollingTextures(); + CM_ScrollingTextures(); // switch (gCurrentCourseId) { // case COURSE_KOOPA_BEACH: diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c index 6c51fb266..916a97e23 100644 --- a/src/racing/skybox_and_splitscreen.c +++ b/src/racing/skybox_and_splitscreen.c @@ -19,7 +19,6 @@ #include "menus.h" #include "port/Engine.h" #include "engine/courses/Course.h" -#include "engine/Engine.h" #include "port/Game.h" Vp D_802B8880[] = { @@ -362,7 +361,7 @@ void func_802A450C(Vtx* skybox) { return; } - SkyboxColours* prop = (SkyboxColours*) &CourseManager_GetProps()->Skybox; + SkyboxColours* prop = (SkyboxColours*) &CM_GetProps()->Skybox; skybox[0].v.cn[0] = prop->TopRight.r; skybox[0].v.cn[1] = prop->TopRight.g; @@ -445,8 +444,8 @@ void func_802A4A0C(Vtx* vtx, struct UnkStruct_800DC5EC* arg1, UNUSED s32 arg2, U sp5C[0] = 0.0f; sp5C[1] = 0.0f; sp5C[2] = 30000.0f; - func_802B5564(matrix1, &sp128, camera->unk_B4, gScreenAspect, CourseManager_GetProps()->NearPersp, - CourseManager_GetProps()->FarPersp, 1.0f); + func_802B5564(matrix1, &sp128, camera->unk_B4, gScreenAspect, CM_GetProps()->NearPersp, + CM_GetProps()->FarPersp, 1.0f); func_802B5794(matrix2, camera->pos, camera->lookAt); mtxf_multiplication(matrix3, matrix1, matrix2); @@ -829,7 +828,7 @@ void render_screens(s32 mode, s32 cameraId, s32 playerId) { gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); guPerspective(&gGfxPool->mtxPersp[cameraId], &perspNorm, gCameraZoom[cameraId], gScreenAspect, - CourseManager_GetProps()->NearPersp, CourseManager_GetProps()->FarPersp, 1.0f); + CM_GetProps()->NearPersp, CM_GetProps()->FarPersp, 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[cameraId]), diff --git a/src/render_objects.c b/src/render_objects.c index f6baef9b5..83c16b56b 100644 --- a/src/render_objects.c +++ b/src/render_objects.c @@ -43,7 +43,6 @@ #include "port/Game.h" #include "port/Engine.h" -#include "engine/Engine.h" #include "engine/courses/Course.h" #include "engine/Matrix.h" @@ -2621,9 +2620,9 @@ void func_8004EF9C(s32 arg0) { s16 temp_t0; s16 temp_v0; - temp_v0 = CourseManager_GetProps()->MinimapDimensions.X; - temp_t0 = CourseManager_GetProps()->MinimapDimensions.Z; - func_8004D37C(0x00000104, 0x0000003C, CourseManager_GetProps()->MinimapTexture, 0x000000FF, 0x000000FF, 0x000000FF, + temp_v0 = CM_GetProps()->MinimapDimensions.X; + temp_t0 = CM_GetProps()->MinimapDimensions.Z; + func_8004D37C(0x00000104, 0x0000003C, CM_GetProps()->MinimapTexture, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, temp_v0, temp_t0, temp_v0, temp_t0); } @@ -2653,7 +2652,7 @@ void set_minimap_finishline_position(s32 arg0) { } //! @todo Get course minimap props from course. - CourseManager_MinimapFinishlinePosition(); + CM_MinimapFinishlinePosition(); draw_hud_2d_texture_8x8(var_f2, var_f0, (u8*) common_texture_minimap_finish_line); } @@ -4032,23 +4031,17 @@ void func_800568A0(s32 objectIndex, s32 playerId) { } void func_800569F4(s32 playerIndex) { - s32 objectIndex; - - objectIndex = gIndexObjectBombKart[playerIndex]; - init_object(objectIndex, 0); - gObjectList[objectIndex].primAlpha = 0; + CM_DisplayBattleBombKart(playerIndex, 0); } -void func_80056A40(s32 playerIndex, s32 arg1) { - s32 objectIndex; - objectIndex = gIndexObjectBombKart[playerIndex]; - init_object(objectIndex, 0); - gObjectList[objectIndex].primAlpha = (s16) arg1; +void func_80056A40(s32 playerIndex, s32 arg1) { + CM_DisplayBattleBombKart(playerIndex, arg1); } void func_80056A94(s32 playerIndex) { - func_80072428(gIndexObjectBombKart[playerIndex]); + //func_80072428(gIndexObjectBombKart[playerIndex]); + CM_DisplayBattleBombKart(playerIndex, 0); } void render_battle_bomb_karts(s32 cameraId) { diff --git a/src/staff_ghosts.c b/src/staff_ghosts.c index f8e7a69bb..f2fca0490 100644 --- a/src/staff_ghosts.c +++ b/src/staff_ghosts.c @@ -111,7 +111,7 @@ void func_80004FF8(void) { #endif void set_staff_ghost(void) { - CourseManager_SetStaffGhost(); + CM_SetStaffGhost(); } s32 func_800051C4(void) { diff --git a/src/update_objects.c b/src/update_objects.c index 94fb89ce4..3f25e136f 100644 --- a/src/update_objects.c +++ b/src/update_objects.c @@ -2675,7 +2675,7 @@ void func_80078C70(s32 arg0) { D_8018D1E8 = 1.7578125 / D_8018D200; D_8018D218 = 0xA0; - CourseManager_UpdateClouds(sp1C, camera); + CM_UpdateClouds(sp1C, camera); // switch (gCurrentCourseId) { /* switch 2 */ // case COURSE_MARIO_RACEWAY: /* switch 2 */