summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2025-12-07 21:00:06 -0700
committerGitHub <noreply@github.com>2025-12-07 21:00:06 -0700
commitdbae0c3aca33a022e8c1d511fe521407375057b2 (patch)
tree889ebe9e5c03261d92304545c5beae13892831f2 /src/engine
parent04ca19a9757752676450364e998d6af0d90e73ef (diff)
Name ScreenContext, Refactor Course class to Track (#583)
* Rename Screen Contexts * typedef ScreenContext struct * Fix Compile * Rename Course.cpp to Track.cpp * Refactor Course to Track * A few renames * General Cleanup * More Rename * More names * Move TrackSections struct to Track.h --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/CoreMath.h2
-rw-r--r--src/engine/Cup.cpp10
-rw-r--r--src/engine/Cup.h14
-rw-r--r--src/engine/GameAPI.h4
-rw-r--r--src/engine/RaceManager.cpp20
-rw-r--r--src/engine/World.cpp56
-rw-r--r--src/engine/World.h42
-rw-r--r--src/engine/actors/FallingRock.cpp4
-rw-r--r--src/engine/actors/MarioSign.cpp2
-rw-r--r--src/engine/actors/WarioSign.cpp2
-rw-r--r--src/engine/cameras/TourCamera.cpp18
-rw-r--r--src/engine/editor/SceneManager.cpp70
-rw-r--r--src/engine/editor/SceneManager.h16
-rw-r--r--src/engine/objects/ChainChomp.cpp1
-rw-r--r--src/engine/objects/Crab.h2
-rw-r--r--src/engine/objects/Flagpole.cpp1
-rw-r--r--src/engine/objects/Lakitu.h1
-rw-r--r--src/engine/objects/Seagull.cpp1
-rw-r--r--src/engine/objects/Thwomp.cpp2
-rw-r--r--src/engine/tracks/BansheeBoardwalk.cpp (renamed from src/engine/courses/BansheeBoardwalk.cpp)21
-rw-r--r--src/engine/tracks/BansheeBoardwalk.h (renamed from src/engine/courses/BansheeBoardwalk.h)17
-rw-r--r--src/engine/tracks/BigDonut.cpp (renamed from src/engine/courses/BigDonut.cpp)8
-rw-r--r--src/engine/tracks/BigDonut.h (renamed from src/engine/courses/BigDonut.h)9
-rw-r--r--src/engine/tracks/BlockFort.cpp (renamed from src/engine/courses/BlockFort.cpp)8
-rw-r--r--src/engine/tracks/BlockFort.h (renamed from src/engine/courses/BlockFort.h)7
-rw-r--r--src/engine/tracks/BowsersCastle.cpp (renamed from src/engine/courses/BowsersCastle.cpp)23
-rw-r--r--src/engine/tracks/BowsersCastle.h (renamed from src/engine/courses/BowsersCastle.h)17
-rw-r--r--src/engine/tracks/ChocoMountain.cpp (renamed from src/engine/courses/ChocoMountain.cpp)15
-rw-r--r--src/engine/tracks/ChocoMountain.h (renamed from src/engine/courses/ChocoMountain.h)11
-rw-r--r--src/engine/tracks/DKJungle.cpp (renamed from src/engine/courses/DKJungle.cpp)21
-rw-r--r--src/engine/tracks/DKJungle.h (renamed from src/engine/courses/DKJungle.h)17
-rw-r--r--src/engine/tracks/DoubleDeck.cpp (renamed from src/engine/courses/DoubleDeck.cpp)12
-rw-r--r--src/engine/tracks/DoubleDeck.h (renamed from src/engine/courses/DoubleDeck.h)11
-rw-r--r--src/engine/tracks/FrappeSnowland.cpp (renamed from src/engine/courses/FrappeSnowland.cpp)19
-rw-r--r--src/engine/tracks/FrappeSnowland.h (renamed from src/engine/courses/FrappeSnowland.h)15
-rw-r--r--src/engine/tracks/Harbour.cpp (renamed from src/engine/courses/Harbour.cpp)11
-rw-r--r--src/engine/tracks/Harbour.h (renamed from src/engine/courses/Harbour.h)7
-rw-r--r--src/engine/tracks/KalimariDesert.cpp (renamed from src/engine/courses/KalimariDesert.cpp)29
-rw-r--r--src/engine/tracks/KalimariDesert.h (renamed from src/engine/courses/KalimariDesert.h)11
-rw-r--r--src/engine/tracks/KoopaTroopaBeach.cpp (renamed from src/engine/courses/KoopaTroopaBeach.cpp)25
-rw-r--r--src/engine/tracks/KoopaTroopaBeach.h (renamed from src/engine/courses/KoopaTroopaBeach.h)17
-rw-r--r--src/engine/tracks/LuigiRaceway.cpp (renamed from src/engine/courses/LuigiRaceway.cpp)17
-rw-r--r--src/engine/tracks/LuigiRaceway.h (renamed from src/engine/courses/LuigiRaceway.h)10
-rw-r--r--src/engine/tracks/MarioRaceway.cpp (renamed from src/engine/courses/MarioRaceway.cpp)17
-rw-r--r--src/engine/tracks/MarioRaceway.h (renamed from src/engine/courses/MarioRaceway.h)11
-rw-r--r--src/engine/tracks/MooMooFarm.cpp (renamed from src/engine/courses/MooMooFarm.cpp)15
-rw-r--r--src/engine/tracks/MooMooFarm.h (renamed from src/engine/courses/MooMooFarm.h)9
-rw-r--r--src/engine/tracks/PodiumCeremony.cpp (renamed from src/engine/courses/PodiumCeremony.cpp)15
-rw-r--r--src/engine/tracks/PodiumCeremony.h (renamed from src/engine/courses/PodiumCeremony.h)11
-rw-r--r--src/engine/tracks/RainbowRoad.cpp (renamed from src/engine/courses/RainbowRoad.cpp)23
-rw-r--r--src/engine/tracks/RainbowRoad.h (renamed from src/engine/courses/RainbowRoad.h)19
-rw-r--r--src/engine/tracks/RoyalRaceway.cpp (renamed from src/engine/courses/RoyalRaceway.cpp)15
-rw-r--r--src/engine/tracks/RoyalRaceway.h (renamed from src/engine/courses/RoyalRaceway.h)11
-rw-r--r--src/engine/tracks/SherbetLand.cpp (renamed from src/engine/courses/SherbetLand.cpp)23
-rw-r--r--src/engine/tracks/SherbetLand.h (renamed from src/engine/courses/SherbetLand.h)15
-rw-r--r--src/engine/tracks/Skyscraper.cpp (renamed from src/engine/courses/Skyscraper.cpp)10
-rw-r--r--src/engine/tracks/Skyscraper.h (renamed from src/engine/courses/Skyscraper.h)11
-rw-r--r--src/engine/tracks/TestTrack.cpp (renamed from src/engine/courses/TestCourse.cpp)42
-rw-r--r--src/engine/tracks/TestTrack.h (renamed from src/engine/courses/TestCourse.h)12
-rw-r--r--src/engine/tracks/ToadsTurnpike.cpp (renamed from src/engine/courses/ToadsTurnpike.cpp)17
-rw-r--r--src/engine/tracks/ToadsTurnpike.h (renamed from src/engine/courses/ToadsTurnpike.h)11
-rw-r--r--src/engine/tracks/Track.cpp (renamed from src/engine/courses/Course.cpp)103
-rw-r--r--src/engine/tracks/Track.h (renamed from src/engine/courses/Course.h)66
-rw-r--r--src/engine/tracks/WarioStadium.cpp (renamed from src/engine/courses/WarioStadium.cpp)21
-rw-r--r--src/engine/tracks/WarioStadium.h (renamed from src/engine/courses/WarioStadium.h)15
-rw-r--r--src/engine/tracks/YoshiValley.cpp (renamed from src/engine/courses/YoshiValley.cpp)25
-rw-r--r--src/engine/tracks/YoshiValley.h (renamed from src/engine/courses/YoshiValley.h)15
-rw-r--r--src/engine/vehicles/Train.cpp2
68 files changed, 585 insertions, 575 deletions
diff --git a/src/engine/CoreMath.h b/src/engine/CoreMath.h
index 626b498ae..60cf67e5a 100644
--- a/src/engine/CoreMath.h
+++ b/src/engine/CoreMath.h
@@ -208,7 +208,7 @@ struct FRotator {
};
/**
- * For selecting a section of a course path
+ * For selecting a section of a track path
* Usage: IPathSpan(point1, point2) --> IPathSpan(40, 65)
*/
struct IPathSpan {
diff --git a/src/engine/Cup.cpp b/src/engine/Cup.cpp
index 36e192723..0bbaff851 100644
--- a/src/engine/Cup.cpp
+++ b/src/engine/Cup.cpp
@@ -1,7 +1,7 @@
#include "Cup.h"
-#include "courses/Course.h"
+#include "tracks/Track.h"
-Cup::Cup(std::string id, const char* name, std::vector<std::shared_ptr<Course>> courses) {
+Cup::Cup(std::string id, const char* name, std::vector<std::shared_ptr<Track>> courses) {
Id = id;
Name = name;
Courses = courses;
@@ -23,14 +23,14 @@ void Cup::Previous() {
}
}
-void Cup::SetCourse(size_t position) {
+void Cup::SetTrack(size_t position) {
if ((position < 0) || (position >= Courses.size())) {
- throw std::invalid_argument("Invalid course index.");
+ throw std::invalid_argument("Invalid track index.");
}
CursorPosition = position;
}
-std::shared_ptr<Course> Cup::GetCourse() {
+std::shared_ptr<Track> Cup::GetTrack() {
return Courses[CursorPosition];
}
diff --git a/src/engine/Cup.h b/src/engine/Cup.h
index a38563bb0..54f83bd70 100644
--- a/src/engine/Cup.h
+++ b/src/engine/Cup.h
@@ -3,25 +3,25 @@
// Base Cup class
#include <vector>
#include <memory>
-#include "courses/Course.h"
+#include "tracks/Track.h"
-class Course; // <-- Forward declare
+class Track; // <-- Forward declare
class Cup {
public:
std::string Id;
const char* Name;
u8 *Thumbnail;
- size_t CursorPosition = 0; // Course index in cup
- std::vector<std::shared_ptr<Course>> Courses;
+ size_t CursorPosition = 0; // Track index in cup
+ std::vector<std::shared_ptr<Track>> Courses;
- explicit Cup(std::string id, const char* name, std::vector<std::shared_ptr<Course>> courses);
+ explicit Cup(std::string id, const char* name, std::vector<std::shared_ptr<Track>> courses);
virtual void ShuffleCourses();
virtual void Next();
virtual void Previous();
- virtual void SetCourse(size_t position);
- virtual std::shared_ptr<Course> GetCourse();
+ virtual void SetTrack(size_t position);
+ virtual std::shared_ptr<Track> GetTrack();
virtual size_t GetSize();
}; \ No newline at end of file
diff --git a/src/engine/GameAPI.h b/src/engine/GameAPI.h
index 6e2e84323..1110aafed 100644
--- a/src/engine/GameAPI.h
+++ b/src/engine/GameAPI.h
@@ -1,6 +1,6 @@
#ifndef GAME_API_H
#define GAME_API_H
-void* GetCourse(void);
+void* GetTrack(void);
-#endif // GAME_API_H \ No newline at end of file
+#endif // GAME_API_H
diff --git a/src/engine/RaceManager.cpp b/src/engine/RaceManager.cpp
index 851c25375..d59f875a8 100644
--- a/src/engine/RaceManager.cpp
+++ b/src/engine/RaceManager.cpp
@@ -52,15 +52,15 @@ extern "C" void add_triangle_to_collision_mesh(Vtx* vtx1, Vtx* vtx2, Vtx* vtx3,
}
void RaceManager::Load() {
- if (WorldContext.GetCurrentCourse()) {
+ if (WorldContext.GetTrack()) {
mirroredVtxCache.clear();
- WorldContext.GetCurrentCourse()->Load();
+ WorldContext.GetTrack()->Load();
}
}
void RaceManager::UnLoad() {
- if (WorldContext.GetCurrentCourse()) {
- WorldContext.GetCurrentCourse()->UnLoad();
+ if (WorldContext.GetTrack()) {
+ WorldContext.GetTrack()->UnLoad();
}
}
@@ -74,14 +74,14 @@ void RaceManager::PreInit() {
}
void RaceManager::BeginPlay() {
- auto course = WorldContext.GetCurrentCourse();
+ auto track = WorldContext.GetTrack();
- if (course) {
+ if (track) {
// Do not spawn finishline in credits or battle mode. And if bSpawnFinishline.
if ((gGamestate != CREDITS_SEQUENCE) && (gModeSelection != BATTLE)) {
- if (course->bSpawnFinishline) {
- if (course->FinishlineSpawnPoint.has_value()) {
- AFinishline::Spawn(course->FinishlineSpawnPoint.value(), IRotator(0, 0, 0));
+ if (track->bSpawnFinishline) {
+ if (track->FinishlineSpawnPoint.has_value()) {
+ AFinishline::Spawn(track->FinishlineSpawnPoint.value(), IRotator(0, 0, 0));
} else {
AFinishline::Spawn();
}
@@ -90,7 +90,7 @@ void RaceManager::BeginPlay() {
}
gEditor.AddLight("Sun", nullptr, D_800DC610[1].l->l.dir);
- course->BeginPlay();
+ track->BeginPlay();
}
}
diff --git a/src/engine/World.cpp b/src/engine/World.cpp
index ac7cfb372..f204ee0f8 100644
--- a/src/engine/World.cpp
+++ b/src/engine/World.cpp
@@ -1,7 +1,7 @@
#include <libultraship.h>
#include "World.h"
#include "Cup.h"
-#include "courses/Course.h"
+#include "tracks/Track.h"
#include "objects/BombKart.h"
#include "TrainCrossing.h"
#include <memory>
@@ -27,7 +27,7 @@ extern "C" {
#include "engine/cameras/TourCamera.h"
#include "engine/cameras/LookBehindCamera.h"
-std::shared_ptr<Course> CurrentCourse;
+std::shared_ptr<Track> mTrack;
Cup* CurrentCup;
World::World() {
@@ -38,27 +38,27 @@ World::~World() {
CleanWorld();
}
-std::shared_ptr<Course> World::AddCourse(std::shared_ptr<Course> course) {
- gWorldInstance.Courses.push_back(course);
- return course;
+std::shared_ptr<Track> World::AddTrack(std::shared_ptr<Track> track) {
+ gWorldInstance.Tracks.push_back(track);
+ return track;
}
void World::AddCup(Cup* cup) {
Cups.push_back(cup);
}
-void World::SetCurrentCourse(std::shared_ptr<Course> course) {
- if (CurrentCourse) {
- UnLoadCourse();
+void World::SetCurrentTrack(std::shared_ptr<Track> track) {
+ if (mTrack) {
+ UnLoadTrack();
}
- if (CurrentCourse == course) {
+ if (mTrack == track) {
return;
}
- CurrentCourse = std::move(course);
+ mTrack = std::move(track);
}
-void World::SetCourseFromCup() {
- SetCurrentCourse(CurrentCup->GetCourse());
+void World::SetTrackFromCup() {
+ SetCurrentTrack(CurrentCup->GetTrack());
}
TrainCrossing* World::AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius,
@@ -114,39 +114,39 @@ void World::SetCurrentCup(Cup* cup) {
}
}
-void World::SetCourse(const char* name) {
+void World::SetTrack(const char* name) {
//! @todo Use content dictionary instead
- for (size_t i = 0; i < Courses.size(); i++) {
- if (strcmp(Courses[i]->Props.Name, name) == 0) {
- SetCurrentCourse(Courses[i]);
+ for (size_t i = 0; i < Tracks.size(); i++) {
+ if (strcmp(Tracks[i]->Props.Name, name) == 0) {
+ SetCurrentTrack(Tracks[i]);
break;
}
}
- std::runtime_error("SetCourse() Course name not found in Courses list");
+ std::runtime_error("[World] [SetTrack()] Track name not found in Track list");
}
-void World::NextCourse() {
- if (CourseIndex < Courses.size() - 1) {
- CourseIndex++;
+void World::NextTrack() {
+ if (TrackIndex < Tracks.size() - 1) {
+ TrackIndex++;
} else {
- CourseIndex = 0;
+ TrackIndex = 0;
}
- gWorldInstance.SetCurrentCourse(Courses[CourseIndex]);
+ gWorldInstance.SetCurrentTrack(Tracks[TrackIndex]);
}
-void World::PreviousCourse() {
- if (CourseIndex > 0) {
- CourseIndex--;
+void World::PreviousTrack() {
+ if (TrackIndex > 0) {
+ TrackIndex--;
} else {
- CourseIndex = Courses.size() - 1;
+ TrackIndex = Tracks.size() - 1;
}
- gWorldInstance.SetCurrentCourse(Courses[CourseIndex]);
+ gWorldInstance.SetCurrentTrack(Tracks[TrackIndex]);
}
void World::TickCameras() {
for (size_t i = 0; i < 4; i++) {
- struct UnkStruct_800DC5EC* screen = &D_8015F480[i];
+ ScreenContext* screen = &gScreenContexts[i];
if (NULL == screen->pendingCamera) { continue; }
if (screen->pendingCamera != screen->camera) {
screen->camera = screen->pendingCamera;
diff --git a/src/engine/World.h b/src/engine/World.h
index afa826458..872ea17c0 100644
--- a/src/engine/World.h
+++ b/src/engine/World.h
@@ -3,7 +3,7 @@
#include <libultraship.h>
#include "CoreMath.h"
-#include "engine/courses/Course.h"
+#include "engine/tracks/Track.h"
#include "engine/cameras/GameCamera.h"
#include "objects/Object.h"
#include "Cup.h"
@@ -29,7 +29,7 @@ extern "C" {
class Cup; // <-- Forward declaration
class OObject;
class GameCamera;
-class Course;
+class Track;
class StaticMeshActor;
class OBombKart;
class TrainCrossing;
@@ -52,7 +52,7 @@ typedef struct Matrix {
{}
};
private:
- std::shared_ptr<Course> CurrentCourse;
+ std::shared_ptr<Track> mTrack;
Cup* CurrentCup;
public:
@@ -62,7 +62,7 @@ public:
RaceManager& GetRaceManager() { return *RaceManagerInstance; }
void SetRaceManager(std::unique_ptr<RaceManager> manager) { RaceManagerInstance = std::move(manager); }
- std::shared_ptr<Course> AddCourse(std::shared_ptr<Course> course);
+ std::shared_ptr<Track> AddTrack(std::shared_ptr<Track> track);
void TickCameras();
@@ -100,32 +100,32 @@ public:
u32 GetCupIndex();
u32 NextCup();
u32 PreviousCup();
- void SetCourseFromCup();
+ void SetTrackFromCup();
World* GetWorld(void);
void CleanWorld(void);
- // getter/setter for current course
- std::shared_ptr<Course> GetCurrentCourse() {
- return CurrentCourse;
+ // getter/setter for current track
+ std::shared_ptr<Track> GetTrack() {
+ return mTrack;
}
- void SetCurrentCourse(std::shared_ptr<Course> course);
+ void SetCurrentTrack(std::shared_ptr<Track> track);
- // These are only for browsing through the course list
- void SetCourse(const char*);
+ // These are only for browsing through the track list
+ void SetTrack(const char*);
template<typename T>
- void SetCourseByType() {
- for (const auto& course : Courses) {
- if (dynamic_cast<T*>(course.get())) {
- SetCurrentCourse(course);
+ void SetTrackByType() {
+ for (const auto& track : Tracks) {
+ if (dynamic_cast<T*>(track.get())) {
+ SetCurrentTrack(track);
return;
}
}
- printf("World::SetCourseByType() No course by the type found");
+ printf("World::SetTrackByType() No track by the type found");
}
- void NextCourse(void);
- void PreviousCourse(void);
+ void NextTrack(void);
+ void PreviousTrack(void);
Matrix Mtx;
@@ -147,9 +147,9 @@ public:
TrainCrossing* AddCrossing(Vec3f position, u32 waypointMin, u32 waypointMax, f32 approachRadius, f32 exitRadius);
std::vector<std::shared_ptr<TrainCrossing>> Crossings;
- // Holds all available courses
- std::vector<std::shared_ptr<Course>> Courses;
- size_t CourseIndex = 0; // For browsing courses.
+ // Holds all available tracks
+ std::vector<std::shared_ptr<Track>> Tracks;
+ size_t TrackIndex = 0; // For browsing tracks.
private:
std::unique_ptr<RaceManager> RaceManagerInstance;
};
diff --git a/src/engine/actors/FallingRock.cpp b/src/engine/actors/FallingRock.cpp
index 4b6dc1ad5..fb0c47280 100644
--- a/src/engine/actors/FallingRock.cpp
+++ b/src/engine/actors/FallingRock.cpp
@@ -27,7 +27,7 @@ AFallingRock::AFallingRock(SpawnParams params) : AActor(params) {
FVector pos = params.Location.value_or(FVector(0, 0, 0));
TimerLength = params.Behaviour.value_or(80);
- Pos[0] = pos.x * gCourseDirection;
+ Pos[0] = pos.x * gTrackDirection;
Pos[1] = pos.y + 10.0f;
Pos[2] = pos.z;
State = _count;
@@ -49,7 +49,7 @@ void AFallingRock::SetSpawnParams(SpawnParams& params) {
void AFallingRock::Reset() {
RespawnTimer = TimerLength;
FVector pos = SpawnPos;
- Pos[0] = (f32) pos.x * gCourseDirection;
+ Pos[0] = (f32) pos.x * gTrackDirection;
Pos[1] = (f32) pos.y + 10.0f;
Pos[2] = (f32) pos.z;
vec3f_set(Velocity, 0, 0, 0);
diff --git a/src/engine/actors/MarioSign.cpp b/src/engine/actors/MarioSign.cpp
index 097d00f2e..bede4cd8b 100644
--- a/src/engine/actors/MarioSign.cpp
+++ b/src/engine/actors/MarioSign.cpp
@@ -21,7 +21,7 @@ AMarioSign::AMarioSign(const SpawnParams& params) : AActor(params) {
Speed = params.Speed.value_or(182);
FVector pos = params.Location.value_or(FVector(0, 0, 0));
- Pos[0] = pos.x * gCourseDirection;
+ Pos[0] = pos.x * gTrackDirection;
Pos[1] = pos.y;
Pos[2] = pos.z;
diff --git a/src/engine/actors/WarioSign.cpp b/src/engine/actors/WarioSign.cpp
index 7976f7c10..5cda60140 100644
--- a/src/engine/actors/WarioSign.cpp
+++ b/src/engine/actors/WarioSign.cpp
@@ -21,7 +21,7 @@ AWarioSign::AWarioSign(const SpawnParams& params) : AActor(params) {
Speed = params.Speed.value_or(182);
FVector pos = params.Location.value_or(FVector(0, 0, 0));
- Pos[0] = pos.x * gCourseDirection;
+ Pos[0] = pos.x * gTrackDirection;
Pos[1] = pos.y;
Pos[2] = pos.z;
diff --git a/src/engine/cameras/TourCamera.cpp b/src/engine/cameras/TourCamera.cpp
index 4feb48c65..c7a453b0e 100644
--- a/src/engine/cameras/TourCamera.cpp
+++ b/src/engine/cameras/TourCamera.cpp
@@ -45,12 +45,12 @@ void TourCamera::Reset() {
void TourCamera::NextShot() {
TourCamera::Reset();
bShotComplete = false;
- _camera->pos[0] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].Pos.x;
- _camera->pos[1] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].Pos.y;
- _camera->pos[2] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].Pos.z;
- _camera->lookAt[0] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].LookAt.x;
- _camera->lookAt[1] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].LookAt.y;
- _camera->lookAt[2] = gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].LookAt.z;
+ _camera->pos[0] = gWorldInstance.GetTrack()->TourShots[ShotIndex].Pos.x;
+ _camera->pos[1] = gWorldInstance.GetTrack()->TourShots[ShotIndex].Pos.y;
+ _camera->pos[2] = gWorldInstance.GetTrack()->TourShots[ShotIndex].Pos.z;
+ _camera->lookAt[0] = gWorldInstance.GetTrack()->TourShots[ShotIndex].LookAt.x;
+ _camera->lookAt[1] = gWorldInstance.GetTrack()->TourShots[ShotIndex].LookAt.y;
+ _camera->lookAt[2] = gWorldInstance.GetTrack()->TourShots[ShotIndex].LookAt.z;
}
void TourCamera::Stop() {
@@ -58,7 +58,7 @@ void TourCamera::Stop() {
gTourComplete = true;
CM_ResetAudio();
- D_8015F480[0].pendingCamera = &cameras[0];
+ gScreenContexts[0].pendingCamera = &cameras[0];
bActive = false;
bTourComplete = true;
@@ -76,7 +76,7 @@ void TourCamera::Tick() {
if (
(nullptr == _camera) ||
(bTourComplete) ||
- (ShotIndex >= gWorldInstance.GetCurrentCourse()->TourShots.size())
+ (ShotIndex >= gWorldInstance.GetTrack()->TourShots.size())
) {
Alpha += 5;
if (Alpha == 255) {
@@ -108,7 +108,7 @@ void TourCamera::Tick() {
}
}
- bool done = TourCamera::MoveCameraAlongSpline(&extraArg, gWorldInstance.GetCurrentCourse()->TourShots[ShotIndex].Frames);
+ bool done = TourCamera::MoveCameraAlongSpline(&extraArg, gWorldInstance.GetTrack()->TourShots[ShotIndex].Frames);
// Advance to the next camera shot
if (done) {
diff --git a/src/engine/editor/SceneManager.cpp b/src/engine/editor/SceneManager.cpp
index 90a33f48f..1c4edb407 100644
--- a/src/engine/editor/SceneManager.cpp
+++ b/src/engine/editor/SceneManager.cpp
@@ -42,7 +42,7 @@ namespace Editor {
/**
* Save track properties, static mesh actors, actors, and tour camera
*/
- data["Props"] = gWorldInstance.GetCurrentCourse()->Props.to_json();
+ data["Props"] = gWorldInstance.GetTrack()->Props.to_json();
nlohmann::json staticMesh;
SaveStaticMeshActors(staticMesh);
@@ -54,7 +54,7 @@ namespace Editor {
data["Actors"] = actors;
- if (gWorldInstance.GetCurrentCourse()->TourShots.size() != 0) {
+ if (gWorldInstance.GetTrack()->TourShots.size() != 0) {
nlohmann::json tour;
SaveTour(tour);
data["Tour"] = tour;
@@ -85,10 +85,10 @@ namespace Editor {
}
/** Do not use gWorldInstance.CurrentCourse during loading! The current track is not guaranteed! **/
- void LoadLevel(Course* course, std::string sceneFile) {
+ void LoadLevel(Track* track, std::string sceneFile) {
SceneFile = sceneFile;
- if ((nullptr == course) || (nullptr == course->RootArchive)) {
- SPDLOG_INFO("[SceneManager] [LoadLevel] Failed to load scenefile, course or rootarchive were null");
+ if ((nullptr == track) || (nullptr == track->RootArchive)) {
+ SPDLOG_INFO("[SceneManager] [LoadLevel] Failed to load scenefile, track or rootarchive were null");
return;
}
@@ -97,7 +97,7 @@ namespace Editor {
* the init data needs to be manually populated
*/
auto initData = std::make_shared<Ship::ResourceInitData>();
- initData->Parent = course->RootArchive;
+ initData->Parent = track->RootArchive;
initData->Format = RESOURCE_FORMAT_BINARY;
initData->ByteOrder = Ship::Endianness::Little;
initData->Type = static_cast<uint32_t>(Ship::ResourceType::Json);
@@ -116,10 +116,10 @@ namespace Editor {
SPDLOG_INFO("[SceneManager] [LoadLevel] Loading track scenefile...");
// Load the Props, and populate actors
- LoadProps(course, data);
- LoadActors(course, data);
- LoadStaticMeshActors(course, data);
- LoadTour(course, data);
+ LoadProps(track, data);
+ LoadActors(track, data);
+ LoadStaticMeshActors(track, data);
+ LoadTour(track, data);
SPDLOG_INFO("[SceneManager] [LoadLevel] Scene File Loaded!");
}
@@ -138,11 +138,11 @@ namespace Editor {
}
// Called from ContentBrowser.cpp
- void LoadMinimap(Course* course, std::string filePath) {
+ void LoadMinimap(Track* track, std::string filePath) {
SPDLOG_INFO(" Loading {} minimap...", filePath);
- if (nullptr == course->RootArchive) {
+ if (nullptr == track->RootArchive) {
SPDLOG_INFO("[SceneManager] [LoadMinimap] Root archive is nullptr");
- SetDefaultMinimap(course);
+ SetDefaultMinimap(track);
return;
}
@@ -151,7 +151,7 @@ namespace Editor {
* the init data needs to be manually populated
*/
auto initData = std::make_shared<Ship::ResourceInitData>();
- initData->Parent = course->RootArchive;
+ initData->Parent = track->RootArchive;
initData->Format = RESOURCE_FORMAT_BINARY;
initData->ByteOrder = Ship::Endianness::Little;
initData->Type = static_cast<uint32_t>(MK64::ResourceType::Minimap);
@@ -163,19 +163,19 @@ namespace Editor {
if (ptr) {
SPDLOG_INFO(" Minimap Loaded!");
MK64::MinimapTexture texture = ptr->Texture;
- course->Props.Minimap.Texture = (const char*)texture.Data;
- course->Props.Minimap.Width = texture.Width;
- course->Props.Minimap.Height = texture.Height;
+ track->Props.Minimap.Texture = (const char*)texture.Data;
+ track->Props.Minimap.Width = texture.Width;
+ track->Props.Minimap.Height = texture.Height;
} else { // Fallback
- SetDefaultMinimap(course);
+ SetDefaultMinimap(track);
}
}
// Sets the default minimap if none has been set
- void SetDefaultMinimap(Course* course) {
- course->Props.Minimap.Texture = minimap_mario_raceway;
- course->Props.Minimap.Width = ResourceGetTexWidthByName(course->Props.Minimap.Texture);
- course->Props.Minimap.Height = ResourceGetTexHeightByName(course->Props.Minimap.Texture);
+ void SetDefaultMinimap(Track* track) {
+ track->Props.Minimap.Texture = minimap_mario_raceway;
+ track->Props.Minimap.Width = ResourceGetTexWidthByName(track->Props.Minimap.Texture);
+ track->Props.Minimap.Height = ResourceGetTexHeightByName(track->Props.Minimap.Texture);
SPDLOG_INFO(" No minimap found! Falling back to default minimap");
}
@@ -253,47 +253,47 @@ namespace Editor {
}
void SaveTour(nlohmann::json& tour) {
- tour["Enabled"] = gWorldInstance.GetCurrentCourse()->bTourEnabled;
+ tour["Enabled"] = gWorldInstance.GetTrack()->bTourEnabled;
// Camera shots
tour["Shots"] = nlohmann::json::array();
- for (const auto& shot : gWorldInstance.GetCurrentCourse()->TourShots) {
+ for (const auto& shot : gWorldInstance.GetTrack()->TourShots) {
tour["Shots"].push_back(ToJson(shot));
}
}
- void LoadProps(Course* course, nlohmann::json& data) {
+ void LoadProps(Track* track, nlohmann::json& data) {
if (!data.contains("Props") || !data["Props"].is_object()) {
SPDLOG_INFO("Track is missing props data. Is the scene.json file corrupt?");
return;
}
try {
- course->Props.from_json(data["Props"]);
+ track->Props.from_json(data["Props"]);
} catch(const std::exception& e) {
std::cerr << " Error parsing track properties: " << e.what() << std::endl;
std::cerr << " Is your scene.json file out of date?" << std::endl;
}
}
- void LoadActors(Course* course, nlohmann::json& data) {
+ void LoadActors(Track* track, nlohmann::json& data) {
if (!data.contains("Actors") || !data["Actors"].is_object()) {
SPDLOG_INFO(" This track contains no actors");
return;
}
- course->SpawnList.clear(); // Clear existing actors, if any
+ track->SpawnList.clear(); // Clear existing actors, if any
for (const auto& actor : data["Actors"]) {
SpawnParams params;
params.from_json(actor); //<SpawnParams>();
if (!params.Name.empty()) {
- course->SpawnList.push_back(params);
+ track->SpawnList.push_back(params);
}
}
}
- void LoadStaticMeshActors(Course* course, nlohmann::json& data) {
+ void LoadStaticMeshActors(Track* track, nlohmann::json& data) {
if (!data.contains("StaticMeshActors") || !data["StaticMeshActors"].is_object()) {
SPDLOG_INFO(" This track contains no StaticMeshActors!");
return;
@@ -306,7 +306,7 @@ namespace Editor {
}
}
- void LoadTour(Course* course, nlohmann::json& data) {
+ void LoadTour(Track* track, nlohmann::json& data) {
if (!data.contains("Tour") || !data["Tour"].is_object()) {
SPDLOG_INFO(" This track does not contain a camera tour");
return;
@@ -316,17 +316,17 @@ namespace Editor {
// Enable flag
if (tours.contains("Enabled")) {
- course->bTourEnabled = tours["Enabled"].get<bool>();
+ track->bTourEnabled = tours["Enabled"].get<bool>();
} else {
- course->bTourEnabled = false;
+ track->bTourEnabled = false;
}
// Camera shots
if (tours.contains("Shots") && tours["Shots"].is_array()) {
- course->TourShots.clear();
+ track->TourShots.clear();
for (const auto& shotJson : tours["Shots"]) {
- course->TourShots.push_back(FromJsonCameraShot(shotJson));
+ track->TourShots.push_back(FromJsonCameraShot(shotJson));
}
}
}
diff --git a/src/engine/editor/SceneManager.h b/src/engine/editor/SceneManager.h
index 8fa101aac..f7b3a50bb 100644
--- a/src/engine/editor/SceneManager.h
+++ b/src/engine/editor/SceneManager.h
@@ -2,26 +2,26 @@
#include <libultraship/libultraship.h>
#include "CoreMath.h"
-#include "engine/courses/Course.h"
+#include "engine/tracks/Track.h"
#include <optional>
#include <nlohmann/json.hpp>
namespace Editor {
void SaveLevel();
- void LoadLevel(Course* course, std::string sceneFile);
+ void LoadLevel(Track* track, std::string sceneFile);
void Load_AddStaticMeshActor(const nlohmann::json& actorJson);
void SetSceneFile(std::shared_ptr<Ship::Archive> archive, std::string sceneFile);
- void LoadMinimap(Course* course, std::string filePath);
- void SetDefaultMinimap(Course* course);
+ void LoadMinimap(Track* track, std::string filePath);
+ void SetDefaultMinimap(Track* track);
void SaveActors(nlohmann::json& actorList);
void SaveStaticMeshActors(nlohmann::json& actorList);
void SaveTour(nlohmann::json& tour);
- void LoadProps(Course* course, nlohmann::json& data);
- void LoadActors(Course* course, nlohmann::json& data);
- void LoadStaticMeshActors(Course* course, nlohmann::json& data);
- void LoadTour(Course* course, nlohmann::json& data);
+ void LoadProps(Track* track, nlohmann::json& data);
+ void LoadActors(Track* track, nlohmann::json& data);
+ void LoadStaticMeshActors(Track* track, nlohmann::json& data);
+ void LoadTour(Track* track, nlohmann::json& data);
void SpawnActors(std::vector<std::pair<std::string, SpawnParams>> spawnList);
diff --git a/src/engine/objects/ChainChomp.cpp b/src/engine/objects/ChainChomp.cpp
index b9c59606d..fafed0846 100644
--- a/src/engine/objects/ChainChomp.cpp
+++ b/src/engine/objects/ChainChomp.cpp
@@ -14,6 +14,7 @@ extern "C" {
#include "code_80057C60.h"
#include "code_80005FD0.h"
#include "external.h"
+#include "course_offsets.h"
}
size_t OChainChomp::_count = 0;
diff --git a/src/engine/objects/Crab.h b/src/engine/objects/Crab.h
index 3a1acdfb0..c89bb1df2 100644
--- a/src/engine/objects/Crab.h
+++ b/src/engine/objects/Crab.h
@@ -22,7 +22,7 @@ extern "C" {
* @arg end x and z patrol location
*
* Crab patrols between start and end.
- * The game automatically places the actor on the course surface.
+ * The game automatically places the actor on the surface of the tracks geometry.
* Therefore, providing a Y height is unnecessary.
*
* Crab appears to have a maximum patrolling distance and will patrol between
diff --git a/src/engine/objects/Flagpole.cpp b/src/engine/objects/Flagpole.cpp
index ec7588720..9f51bab92 100644
--- a/src/engine/objects/Flagpole.cpp
+++ b/src/engine/objects/Flagpole.cpp
@@ -11,6 +11,7 @@ extern "C" {
#include "math_util_2.h"
#include "code_80086E70.h"
#include "code_80057C60.h"
+#include "course_offsets.h"
}
size_t OFlagpole::_count = 0;
diff --git a/src/engine/objects/Lakitu.h b/src/engine/objects/Lakitu.h
index 1944733ee..470c18e91 100644
--- a/src/engine/objects/Lakitu.h
+++ b/src/engine/objects/Lakitu.h
@@ -12,7 +12,6 @@ extern "C" {
#include "waypoints.h"
#include "common_structs.h"
#include "objects.h"
-#include "course_offsets.h"
}
/**
diff --git a/src/engine/objects/Seagull.cpp b/src/engine/objects/Seagull.cpp
index 8eff07740..fb926892c 100644
--- a/src/engine/objects/Seagull.cpp
+++ b/src/engine/objects/Seagull.cpp
@@ -22,6 +22,7 @@ extern "C" {
#include "some_data.h"
#include "ceremony_and_credits.h"
#include "assets/models/common_data.h"
+#include "course_offsets.h"
extern SplineData D_800E6034;
extern SplineData D_800E60F0;
extern SplineData D_800E61B4;
diff --git a/src/engine/objects/Thwomp.cpp b/src/engine/objects/Thwomp.cpp
index 324f32cfb..b658b50ff 100644
--- a/src/engine/objects/Thwomp.cpp
+++ b/src/engine/objects/Thwomp.cpp
@@ -2,7 +2,7 @@
#include <libultra/gbi.h>
#include "Thwomp.h"
#include <vector>
-#include "engine/courses/Course.h"
+#include "engine/tracks/Track.h"
#include "engine/World.h"
#include "port/Game.h"
diff --git a/src/engine/courses/BansheeBoardwalk.cpp b/src/engine/tracks/BansheeBoardwalk.cpp
index c3ea03e60..424b584b4 100644
--- a/src/engine/courses/BansheeBoardwalk.cpp
+++ b/src/engine/tracks/BansheeBoardwalk.cpp
@@ -38,7 +38,6 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
-#include "course.h"
extern const char *banshee_boardwalk_dls[100];
}
@@ -59,7 +58,7 @@ BansheeBoardwalk::BansheeBoardwalk() {
Props.SetText(Props.Name, "banshee boardwalk", sizeof(Props.Name));
Props.SetText(Props.DebugName, "ghost", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "747m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "747m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009058;
Props.AIMaximumSeparation = 40.0f;
@@ -118,7 +117,7 @@ BansheeBoardwalk::BansheeBoardwalk() {
}
void BansheeBoardwalk::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(banshee_boardwalk_dls); i++) {
@@ -146,7 +145,7 @@ void BansheeBoardwalk::Load() {
D_801625EC = 0;
D_801625F4 = 0;
D_801625F0 = 0;
- parse_course_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_banshee_boardwalk_track_sections));
+ parse_track_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_banshee_boardwalk_track_sections));
func_80295C6C();
find_vtx_and_set_colours((Gfx*) d_course_banshee_boardwalk_packed_dl_878, 128, 0, 0, 0);
}
@@ -191,14 +190,14 @@ void BansheeBoardwalk::BeginPlay() {
}
}
-void BansheeBoardwalk::InitCourseObjects() {
+void BansheeBoardwalk::InitTrackObjects() {
size_t objectId = 0;
if (gGamestate != CREDITS_SEQUENCE) {
init_object(indexObjectList1[2], 0);
}
}
-void BansheeBoardwalk::UpdateCourseObjects() {
+void BansheeBoardwalk::TickTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
func_8007E4C4();
if (gModeSelection != TIME_TRIALS) {
@@ -208,7 +207,7 @@ void BansheeBoardwalk::UpdateCourseObjects() {
}
}
-void BansheeBoardwalk::RenderCourseObjects(s32 cameraId) {
+void BansheeBoardwalk::DrawTrackObjects(s32 cameraId) {
if (gGamestate != CREDITS_SEQUENCE) {
// render_object_bat(cameraId);
// render_object_boos(cameraId);
@@ -248,7 +247,7 @@ void BansheeBoardwalk::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void BansheeBoardwalk::Render(struct UnkStruct_800DC5EC* arg0) {
+void BansheeBoardwalk::Draw(ScreenContext* arg0) {
Camera* camera = arg0->camera;
Mat4 spCC;
UNUSED s32 pad[6];
@@ -279,7 +278,7 @@ void BansheeBoardwalk::Render(struct UnkStruct_800DC5EC* arg0) {
// d_course_banshee_boardwalk_packed_dl_69B0
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_banshee_boardwalk_packed_dl_69B0);
- render_course_segments(banshee_boardwalk_dls, arg0);
+ render_track_sections(banshee_boardwalk_dls, arg0);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
@@ -307,7 +306,7 @@ void BansheeBoardwalk::Render(struct UnkStruct_800DC5EC* arg0) {
gDPPipeSync(gDisplayListHead++);
}
-void BansheeBoardwalk::RenderCredits() {
+void BansheeBoardwalk::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*) (d_course_banshee_boardwalk_dl_B308));
}
@@ -332,7 +331,7 @@ void BansheeBoardwalk::Waypoints(Player* player, int8_t playerId) {
}
}
-void BansheeBoardwalk::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+void BansheeBoardwalk::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection) {
gDPPipeSync(gDisplayListHead++);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
diff --git a/src/engine/courses/BansheeBoardwalk.h b/src/engine/tracks/BansheeBoardwalk.h
index a299709db..c8f918ed0 100644
--- a/src/engine/courses/BansheeBoardwalk.h
+++ b/src/engine/tracks/BansheeBoardwalk.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/banshee_boardwalk/banshee_boardwalk_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture banshee_boardwalk_textures[];
}
-class BansheeBoardwalk : public Course {
+class BansheeBoardwalk : public Track {
public:
virtual ~BansheeBoardwalk() = default; // Virtual destructor for proper cleanup in derived classes
@@ -28,17 +29,17 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
//virtual void InitClouds() override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void ScrollingTextures() override;
virtual void Waypoints(Player*, int8_t) override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/BigDonut.cpp b/src/engine/tracks/BigDonut.cpp
index b5c6bbff3..7a944f2ba 100644
--- a/src/engine/courses/BigDonut.cpp
+++ b/src/engine/tracks/BigDonut.cpp
@@ -47,7 +47,7 @@ BigDonut::BigDonut() {
Props.SetText(Props.Name, "big donut", sizeof(Props.Name));
Props.SetText(Props.DebugName, "doughnut", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F18;
Props.AIMaximumSeparation = -1.0f;
@@ -103,7 +103,7 @@ BigDonut::BigDonut() {
}
void BigDonut::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
InvertTriangleWindingByName(d_course_big_donut_packed_dl_DE8);
InvertTriangleWindingByName(d_course_big_donut_packed_dl_450);
@@ -142,7 +142,7 @@ void BigDonut::BeginPlay() {
}
}
-void BigDonut::Render(struct UnkStruct_800DC5EC* arg0) {
+void BigDonut::Draw(ScreenContext* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
@@ -165,7 +165,7 @@ void BigDonut::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_big_donut_packed_dl_230);
}
-void BigDonut::RenderCredits() {
+void BigDonut::DrawCredits() {
}
void BigDonut::Waypoints(Player* player, int8_t playerId) {
diff --git a/src/engine/courses/BigDonut.h b/src/engine/tracks/BigDonut.h
index 751d3cbcb..60a10e43c 100644
--- a/src/engine/courses/BigDonut.h
+++ b/src/engine/tracks/BigDonut.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/big_donut/big_donut_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture big_donut_textures[];
}
-class BigDonut : public Course {
+class BigDonut : public Track {
public:
virtual ~BigDonut() = default;
@@ -24,8 +25,8 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/BlockFort.cpp b/src/engine/tracks/BlockFort.cpp
index a80e4a619..4bbcd1cfc 100644
--- a/src/engine/courses/BlockFort.cpp
+++ b/src/engine/tracks/BlockFort.cpp
@@ -49,7 +49,7 @@ BlockFort::BlockFort() {
Props.SetText(Props.Name, "block fort", sizeof(Props.Name));
Props.SetText(Props.DebugName, "block", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F18;
Props.AIMaximumSeparation = -1.0f;
@@ -106,14 +106,14 @@ BlockFort::BlockFort() {
}
void BlockFort::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
InvertTriangleWindingByName(d_course_block_fort_packed_dl_15C0);
}
generate_collision_mesh_with_default_section_id((Gfx*) d_course_block_fort_packed_dl_15C0, 1);
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void BlockFort::UnLoad() {
@@ -133,7 +133,7 @@ void BlockFort::BeginPlay() {
}
}
-void BlockFort::Render(struct UnkStruct_800DC5EC* arg0) {
+void BlockFort::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
diff --git a/src/engine/courses/BlockFort.h b/src/engine/tracks/BlockFort.h
index 296809b03..67d4ac310 100644
--- a/src/engine/courses/BlockFort.h
+++ b/src/engine/tracks/BlockFort.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/block_fort/block_fort_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture block_fort_textures[];
}
-class BlockFort : public Course {
+class BlockFort : public Track {
public:
virtual ~BlockFort() = default; // Virtual destructor for proper cleanup in derived classes
@@ -27,6 +28,6 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
+ virtual void Draw(ScreenContext*) override;
virtual void Waypoints(Player*, int8_t) override;
};
diff --git a/src/engine/courses/BowsersCastle.cpp b/src/engine/tracks/BowsersCastle.cpp
index 32550a636..b5744969f 100644
--- a/src/engine/courses/BowsersCastle.cpp
+++ b/src/engine/tracks/BowsersCastle.cpp
@@ -6,7 +6,7 @@
#include "BowsersCastle.h"
#include "align_asset_macro.h"
#include "engine/World.h"
-#include "engine/courses/Course.h"
+#include "engine/tracks/Track.h"
#include "engine/actors/Finishline.h"
#include "engine/objects/BombKart.h"
#include "engine/objects/Thwomp.h"
@@ -34,7 +34,6 @@ extern "C" {
#include "collision.h"
#include "code_8003DC40.h"
#include "memory.h"
- #include "course.h"
extern const char *bowsers_castle_dls[108];
}
@@ -55,7 +54,7 @@ BowsersCastle::BowsersCastle() {
Props.SetText(Props.Name, "bowser's castle", sizeof(Props.Name));
Props.SetText(Props.DebugName, "castle", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "777m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "777m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008FB8;
Props.AIMaximumSeparation = 35.0f;
@@ -115,7 +114,7 @@ BowsersCastle::BowsersCastle() {
}
void BowsersCastle::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(bowsers_castle_dls); i++) {
InvertTriangleWindingByName(bowsers_castle_dls[i]);
@@ -127,7 +126,7 @@ void BowsersCastle::Load() {
InvertTriangleWindingByName(d_course_bowsers_castle_dl_9228);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_bowsers_castle_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_bowsers_castle_addr));
func_80295C6C();
find_vtx_and_set_colours((Gfx*) d_course_bowsers_castle_packed_dl_1350, 0x32, 0, 0, 0);
}
@@ -192,7 +191,7 @@ void BowsersCastle::BeginPlay() {
}
}
-void BowsersCastle::InitCourseObjects() {
+void BowsersCastle::InitTrackObjects() {
size_t objectId;
size_t i;
@@ -219,11 +218,11 @@ void BowsersCastle::InitCourseObjects() {
}
}
-void BowsersCastle::UpdateCourseObjects() {
+void BowsersCastle::TickTrackObjects() {
update_flame_particle();
}
-void BowsersCastle::RenderCourseObjects(s32 cameraId) {
+void BowsersCastle::DrawTrackObjects(s32 cameraId) {
// render_object_thwomps(cameraId);
render_object_bowser_flame(cameraId);
}
@@ -261,7 +260,7 @@ void BowsersCastle::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void BowsersCastle::Render(struct UnkStruct_800DC5EC* arg0) {
+void BowsersCastle::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -280,7 +279,7 @@ void BowsersCastle::Render(struct UnkStruct_800DC5EC* arg0) {
if (D_802B87BC > 255) {
D_802B87BC = 0;
}
- render_course_segments(bowsers_castle_dls, arg0);
+ render_track_sections(bowsers_castle_dls, arg0);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
@@ -288,7 +287,7 @@ void BowsersCastle::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_bowsers_castle_packed_dl_248);
}
-void BowsersCastle::RenderCredits() {
+void BowsersCastle::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*) (d_course_bowsers_castle_dl_9148));
}
@@ -310,7 +309,7 @@ void BowsersCastle::Waypoints(Player* player, int8_t playerId) {
}
}
-void BowsersCastle::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+void BowsersCastle::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection) {
if (gActiveScreenMode != SCREEN_MODE_1P) {
return;
diff --git a/src/engine/courses/BowsersCastle.h b/src/engine/tracks/BowsersCastle.h
index 5f62cd320..4e566be16 100644
--- a/src/engine/courses/BowsersCastle.h
+++ b/src/engine/tracks/BowsersCastle.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/bowsers_castle/bowsers_castle_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture bowsers_castle_textures[];
}
-class BowsersCastle : public Course {
+class BowsersCastle : public Track {
public:
virtual ~BowsersCastle() = default; // Virtual destructor for proper cleanup in derived classes
@@ -29,17 +30,17 @@ public:
void SpawnStockThwomp();
virtual void BeginPlay() override;
//virtual void InitClouds() override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() 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*, int8_t) override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection);
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection);
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/ChocoMountain.cpp b/src/engine/tracks/ChocoMountain.cpp
index e04aa825f..2719d5f42 100644
--- a/src/engine/courses/ChocoMountain.cpp
+++ b/src/engine/tracks/ChocoMountain.cpp
@@ -34,7 +34,6 @@ extern "C" {
#include "code_8003DC40.h"
#include "memory.h"
#include "course_offsets.h"
- #include "course.h"
extern const char *choco_mountain_dls[96];
}
@@ -54,7 +53,7 @@ ChocoMountain::ChocoMountain() {
Id = "mk:choco_mountain";
Props.SetText(Props.Name, "choco mountain", sizeof(Props.Name));
Props.SetText(Props.DebugName, "mountain", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "687m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "687m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F80;
Props.AIMaximumSeparation = 35.0f;
@@ -113,7 +112,7 @@ ChocoMountain::ChocoMountain() {
}
void ChocoMountain::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(choco_mountain_dls); i++) {
InvertTriangleWindingByName(choco_mountain_dls[i]);
@@ -153,7 +152,7 @@ void ChocoMountain::Load() {
nullify_displaylist((uintptr_t) LOAD_ASSET_RAW(d_course_choco_mountain_packed_dl_3C8));
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_choco_mountain_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_choco_mountain_addr));
func_802B5CAC(0x238E, 0x31C7, D_8015F590);
func_80295C6C();
}
@@ -179,7 +178,7 @@ void ChocoMountain::BeginPlay() {
}
}
-void ChocoMountain::InitCourseObjects() {
+void ChocoMountain::InitTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == GRAND_PRIX) {
func_80070714();
@@ -226,7 +225,7 @@ void ChocoMountain::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void ChocoMountain::Render(struct UnkStruct_800DC5EC* arg0) {
+void ChocoMountain::Draw(ScreenContext* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -256,7 +255,7 @@ void ChocoMountain::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_choco_mountain_packed_dl_5868);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
- render_course_segments(choco_mountain_dls, arg0);
+ render_track_sections(choco_mountain_dls, arg0);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
@@ -273,7 +272,7 @@ void ChocoMountain::Render(struct UnkStruct_800DC5EC* arg0) {
gDPPipeSync(gDisplayListHead++);
}
-void ChocoMountain::RenderCredits() {
+void ChocoMountain::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_choco_mountain_dl_71B8));
}
diff --git a/src/engine/courses/ChocoMountain.h b/src/engine/tracks/ChocoMountain.h
index 45df1ed5b..13fd7120a 100644
--- a/src/engine/courses/ChocoMountain.h
+++ b/src/engine/tracks/ChocoMountain.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/choco_mountain/choco_mountain_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture choco_mountain_textures[];
}
-class ChocoMountain : public Course {
+class ChocoMountain : public Track {
public:
virtual ~ChocoMountain() = default; // Virtual destructor for proper cleanup in derived classes
@@ -27,12 +28,12 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7) override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/DKJungle.cpp b/src/engine/tracks/DKJungle.cpp
index 77e5bab88..47dabe296 100644
--- a/src/engine/courses/DKJungle.cpp
+++ b/src/engine/tracks/DKJungle.cpp
@@ -36,7 +36,6 @@ extern "C" {
#include "code_8003DC40.h"
#include "memory.h"
#include "sounds.h"
- #include "course.h"
extern const char *d_course_dks_jungle_parkway_unknown_dl_list[105];
extern s16 currentScreenSection;
}
@@ -56,7 +55,7 @@ DKJungle::DKJungle() {
Props.SetText(Props.Name, "d.k.'s jungle parkway", sizeof(Props.Name));
Props.SetText(Props.DebugName, "jungle", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "893m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "893m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D0093C0;
Props.AIMaximumSeparation = 40.0f;
@@ -115,7 +114,7 @@ DKJungle::DKJungle() {
}
void DKJungle::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(d_course_dks_jungle_parkway_unknown_dl_list); i++) {
InvertTriangleWindingByName(d_course_dks_jungle_parkway_unknown_dl_list[i]);
@@ -128,7 +127,7 @@ void DKJungle::Load() {
InvertTriangleWindingByName(d_course_dks_jungle_parkway_packed_dl_36A8);
InvertTriangleWindingByName(d_course_dks_jungle_parkway_packed_dl_3F30);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_dks_jungle_parkway_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_dks_jungle_parkway_addr));
func_80295C6C();
// d_course_dks_jungle_parkway_packed_dl_3FA8
find_vtx_and_set_colours((Gfx*) d_course_dks_jungle_parkway_packed_dl_3FA8, 120, 255, 255, 255);
@@ -194,7 +193,7 @@ void DKJungle::BeginPlay() {
}
}
-void DKJungle::InitCourseObjects() {
+void DKJungle::InitTrackObjects() {
for (size_t i = 0; i < NUM_TORCHES; i++) {
init_smoke_particles(i);
// wtf?
@@ -202,11 +201,11 @@ void DKJungle::InitCourseObjects() {
}
}
-void DKJungle::UpdateCourseObjects() {
+void DKJungle::TickTrackObjects() {
update_ferries_smoke_particle();
}
-void DKJungle::RenderCourseObjects(s32 cameraId) {
+void DKJungle::DrawTrackObjects(s32 cameraId) {
if (gGamestate != CREDITS_SEQUENCE) {
render_object_paddle_boat_smoke_particles(cameraId);
}
@@ -262,7 +261,7 @@ void DKJungle::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void DKJungle::Render(struct UnkStruct_800DC5EC* arg0) {
+void DKJungle::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
set_track_light_direction(&D_800DC610[1], D_802B87D4, D_802B87D0, 1);
@@ -280,12 +279,12 @@ void DKJungle::Render(struct UnkStruct_800DC5EC* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
- render_course_segments(d_course_dks_jungle_parkway_unknown_dl_list, arg0);
+ render_track_sections(d_course_dks_jungle_parkway_unknown_dl_list, arg0);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
-void DKJungle::RenderCredits() {
+void DKJungle::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_dks_jungle_parkway_dl_13C30));
}
@@ -329,7 +328,7 @@ void DKJungle::ScrollingTextures() {
evaluate_collision_players_palm_trees();
}
-void DKJungle::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
+void DKJungle::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
gDPPipeSync(gDisplayListHead++);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
diff --git a/src/engine/courses/DKJungle.h b/src/engine/tracks/DKJungle.h
index 0b7f09524..1c9da598f 100644
--- a/src/engine/courses/DKJungle.h
+++ b/src/engine/tracks/DKJungle.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/dks_jungle_parkway/dks_jungle_parkway_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture dks_jungle_parkway_textures[];
}
-class DKJungle : public Course {
+class DKJungle : public Track {
public:
virtual ~DKJungle() = default; // Virtual destructor for proper cleanup in derived classes
@@ -29,18 +30,18 @@ public:
virtual f32 GetWaterLevel(FVector pos, Collision* collision) override;
virtual void BeginPlay() override;
//virtual void InitClouds() override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() 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;
virtual void ScrollingTextures() override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/DoubleDeck.cpp b/src/engine/tracks/DoubleDeck.cpp
index ad7de5700..581e7aed3 100644
--- a/src/engine/courses/DoubleDeck.cpp
+++ b/src/engine/tracks/DoubleDeck.cpp
@@ -48,7 +48,7 @@ DoubleDeck::DoubleDeck() {
Props.SetText(Props.Name, "double deck", sizeof(Props.Name));
Props.SetText(Props.DebugName, "deck", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F18;
@@ -106,13 +106,13 @@ DoubleDeck::DoubleDeck() {
}
void DoubleDeck::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
InvertTriangleWindingByName(d_course_double_deck_packed_dl_738);
}
generate_collision_mesh_with_default_section_id((Gfx*) d_course_double_deck_packed_dl_738, 1);
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void DoubleDeck::UnLoad() {
@@ -132,7 +132,7 @@ void DoubleDeck::BeginPlay() {
}
}
-void DoubleDeck::InitCourseObjects() {}
+void DoubleDeck::InitTrackObjects() {}
void DoubleDeck::SomeSounds() {}
@@ -140,7 +140,7 @@ void DoubleDeck::WhatDoesThisDo(Player* player, int8_t playerId) {}
void DoubleDeck::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void DoubleDeck::Render(struct UnkStruct_800DC5EC* arg0) {
+void DoubleDeck::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
@@ -151,7 +151,7 @@ void DoubleDeck::Render(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
-void DoubleDeck::RenderCredits() {}
+void DoubleDeck::DrawCredits() {}
void DoubleDeck::Waypoints(Player* player, int8_t playerId) {
player->nearestPathPointId = 0;
diff --git a/src/engine/courses/DoubleDeck.h b/src/engine/tracks/DoubleDeck.h
index 354ab116a..a99034960 100644
--- a/src/engine/courses/DoubleDeck.h
+++ b/src/engine/tracks/DoubleDeck.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/double_deck/double_deck_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture double_deck_textures[];
}
-class DoubleDeck : public Course {
+class DoubleDeck : public Track {
public:
virtual ~DoubleDeck() = default; // Virtual destructor for proper cleanup in derived classes
@@ -27,12 +28,12 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/FrappeSnowland.cpp b/src/engine/tracks/FrappeSnowland.cpp
index dbba9efbf..c492f6cc8 100644
--- a/src/engine/courses/FrappeSnowland.cpp
+++ b/src/engine/tracks/FrappeSnowland.cpp
@@ -35,7 +35,6 @@ extern "C" {
#include "memory.h"
#include "update_objects.h"
#include "course_offsets.h"
- #include "course.h"
extern const char *d_course_frappe_snowland_dl_list[68];
extern s8 gPlayerCount;
}
@@ -56,7 +55,7 @@ FrappeSnowland::FrappeSnowland() {
Props.SetText(Props.Name, "frappe snowland", sizeof(Props.Name));
Props.SetText(Props.DebugName, "snow", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "734m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "734m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D0090F8;
Props.AIMaximumSeparation = 50.0f;
@@ -115,7 +114,7 @@ FrappeSnowland::FrappeSnowland() {
}
void FrappeSnowland::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(d_course_frappe_snowland_dl_list); i++) {
@@ -124,7 +123,7 @@ void FrappeSnowland::Load() {
InvertTriangleWindingByName(d_course_frappe_snowland_packed_dl_65E0);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_frappe_snowland_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_frappe_snowland_addr));
func_80295C6C();
}
@@ -185,11 +184,11 @@ void FrappeSnowland::InitClouds() {
D_8018D230 = 0; // This must be turned off or mayhem ensues
}
-void FrappeSnowland::UpdateClouds(s32 sp1C, Camera* camera) {
+void FrappeSnowland::TickClouds(s32 sp1C, Camera* camera) {
func_80078170(sp1C, camera);
}
-void FrappeSnowland::InitCourseObjects() {
+void FrappeSnowland::InitTrackObjects() {
size_t objectId;
size_t i;
for (i = 0; i < NUM_SNOWFLAKES; i++) {
@@ -197,11 +196,11 @@ void FrappeSnowland::InitCourseObjects() {
}
}
-void FrappeSnowland::UpdateCourseObjects() {
+void FrappeSnowland::TickTrackObjects() {
update_snowflakes();
}
-void FrappeSnowland::Render(struct UnkStruct_800DC5EC* arg0) {
+void FrappeSnowland::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -215,10 +214,10 @@ void FrappeSnowland::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(d_course_frappe_snowland_dl_list, arg0);
+ render_track_sections(d_course_frappe_snowland_dl_list, arg0);
}
-void FrappeSnowland::RenderCredits() {
+void FrappeSnowland::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_frappe_snowland_dl_76A0));
}
diff --git a/src/engine/courses/FrappeSnowland.h b/src/engine/tracks/FrappeSnowland.h
index aa9052f57..65af72a10 100644
--- a/src/engine/courses/FrappeSnowland.h
+++ b/src/engine/tracks/FrappeSnowland.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/frappe_snowland/frappe_snowland_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture frappe_snowland_textures[];
}
-class FrappeSnowland : public Course {
+class FrappeSnowland : public Track {
public:
virtual ~FrappeSnowland() = default;
@@ -25,10 +26,10 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
virtual void InitClouds() override;
- virtual void UpdateClouds(s32 sp1C, Camera* camera) override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void TickClouds(s32 sp1C, Camera* camera) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
};
diff --git a/src/engine/courses/Harbour.cpp b/src/engine/tracks/Harbour.cpp
index 9b76457cf..4423beed0 100644
--- a/src/engine/courses/Harbour.cpp
+++ b/src/engine/tracks/Harbour.cpp
@@ -51,7 +51,6 @@ extern "C" {
#include "collision.h"
#include "memory.h"
#include "courses/harbour/track.h"
- #include "course.h"
}
TrackPathPoint harbour_path[] = {
@@ -530,7 +529,7 @@ Harbour::Harbour() {
Id = "mk:harbour";
Props.SetText(Props.Name, "Harbour", sizeof(Props.Name));
Props.SetText(Props.DebugName, "harbour", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "99m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "99m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F28;
Props.AIMaximumSeparation = 50.0f;
@@ -596,7 +595,7 @@ TrackSections harbour_surfaces[] = {
};
void Harbour::Load() {
- Course::Load(road_map_001_mesh_vtx_0, NULL);
+ Track::Load(road_map_001_mesh_vtx_0, NULL);
if (gIsMirrorMode != 0) {
InvertTriangleWinding(ground_map_mesh);
@@ -622,9 +621,9 @@ void Harbour::Load() {
generate_collision_mesh_with_defaults(bush_map_004_mesh);
generate_collision_mesh_with_defaults(statue_map_005_mesh);
- parse_course_displaylists((TrackSections*)harbour_surfaces);
+ parse_track_displaylists((TrackSections*)harbour_surfaces);
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void Harbour::UnLoad() {
@@ -717,7 +716,7 @@ void Harbour::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void Harbour::Render(struct UnkStruct_800DC5EC* arg0) {
+void Harbour::Draw(ScreenContext* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
diff --git a/src/engine/courses/Harbour.h b/src/engine/tracks/Harbour.h
index 69524cfbf..0a5c9c23d 100644
--- a/src/engine/courses/Harbour.h
+++ b/src/engine/tracks/Harbour.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/mario_raceway/mario_raceway_vertices.h"
@@ -12,10 +12,9 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
- extern const course_texture test_course_textures[];
}
-class Harbour : public Course {
+class Harbour : public Track {
public:
virtual ~Harbour() = default; // Virtual destructor for proper cleanup in derived classes
@@ -29,6 +28,6 @@ public:
virtual void BeginPlay() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
+ virtual void Draw(ScreenContext*) override;
virtual bool IsMod() override;
};
diff --git a/src/engine/courses/KalimariDesert.cpp b/src/engine/tracks/KalimariDesert.cpp
index 1c523e0e4..15c50f752 100644
--- a/src/engine/courses/KalimariDesert.cpp
+++ b/src/engine/tracks/KalimariDesert.cpp
@@ -33,7 +33,6 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
- #include "course.h"
extern const char *kalimari_desert_dls[80];
}
@@ -52,7 +51,7 @@ KalimariDesert::KalimariDesert() {
Props.SetText(Props.Name, "kalimari desert", sizeof(Props.Name));
Props.SetText(Props.DebugName, "desert", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "753m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "753m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009260;
Props.AIMaximumSeparation = 50.0f;
@@ -110,7 +109,7 @@ KalimariDesert::KalimariDesert() {
}
void KalimariDesert::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(kalimari_desert_dls); i++) {
@@ -125,9 +124,9 @@ void KalimariDesert::Load() {
InvertTriangleWindingByName(d_course_kalimari_desert_packed_dl_270);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_kalimari_desert_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_kalimari_desert_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void KalimariDesert::UnLoad() {
@@ -151,25 +150,25 @@ void KalimariDesert::BeginPlay() {
uintptr_t* crossing2 = (uintptr_t*) gWorldInstance.AddCrossing(crossingPos2, 176, 182, 900.0f, 650.0f);
vec3f_set(position, -1680.0f, 2.0f, 35.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity,
ACTOR_RAILROAD_CROSSING));
rrxing->crossingTrigger = crossing2;
vec3f_set(position, -1600.0f, 2.0f, 35.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity,
ACTOR_RAILROAD_CROSSING));
rrxing->crossingTrigger = crossing2;
- // Original game forgot to put gCourseDirection to face the crossing the right direction in extra mode
- vec3s_set(rotation, 0, -0x2000 * gCourseDirection, 0);
+ // Original game forgot to put gTrackDirection to face the crossing the right direction in extra mode
+ vec3s_set(rotation, 0, -0x2000 * gTrackDirection, 0);
vec3f_set(position, -2459.0f, 2.0f, 2263.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity,
ACTOR_RAILROAD_CROSSING));
rrxing->crossingTrigger = crossing1;
vec3f_set(position, -2467.0f, 2.0f, 2375.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity,
ACTOR_RAILROAD_CROSSING));
rrxing->crossingTrigger = crossing1;
@@ -218,7 +217,7 @@ void KalimariDesert::BeginPlay() {
}
}
-void KalimariDesert::InitCourseObjects() {
+void KalimariDesert::InitTrackObjects() {
size_t i;
if (gGamestate != CREDITS_SEQUENCE) {
find_unused_obj_index(&D_8018CF10);
@@ -241,7 +240,7 @@ void KalimariDesert::WhatDoesThisDo(Player* player, int8_t playerId) {}
void KalimariDesert::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void KalimariDesert::Render(struct UnkStruct_800DC5EC* arg0) {
+void KalimariDesert::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
@@ -257,7 +256,7 @@ void KalimariDesert::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(kalimari_desert_dls, arg0);
+ render_track_sections(kalimari_desert_dls, arg0);
// d_course_kalimari_desert_packed_dl_1ED8
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_kalimari_desert_packed_dl_1ED8);
// d_course_kalimari_desert_packed_dl_1B18
@@ -274,7 +273,7 @@ void KalimariDesert::Render(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
-void KalimariDesert::RenderCredits() {
+void KalimariDesert::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_kalimari_desert_dl_22E00));
}
diff --git a/src/engine/courses/KalimariDesert.h b/src/engine/tracks/KalimariDesert.h
index 4b9cc4247..2789f39dd 100644
--- a/src/engine/courses/KalimariDesert.h
+++ b/src/engine/tracks/KalimariDesert.h
@@ -2,7 +2,7 @@
#include <libultraship.h>
#include "CoreMath.h"
-#include "Course.h"
+#include "Track.h"
#include "engine/vehicles/Train.h"
extern "C" {
@@ -14,10 +14,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture kalimari_desert_textures[];
}
-class KalimariDesert : public Course {
+class KalimariDesert : public Track {
public:
virtual ~KalimariDesert() = default; // Virtual destructor for proper cleanup in derived classes
@@ -29,12 +30,12 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Destroy() override;
private:
diff --git a/src/engine/courses/KoopaTroopaBeach.cpp b/src/engine/tracks/KoopaTroopaBeach.cpp
index d22580c2c..851b943e6 100644
--- a/src/engine/courses/KoopaTroopaBeach.cpp
+++ b/src/engine/tracks/KoopaTroopaBeach.cpp
@@ -34,7 +34,6 @@ extern "C" {
#include "collision.h"
#include "code_8003DC40.h"
#include "memory.h"
- #include "course.h"
extern const char *d_course_koopa_troopa_beach_dl_list1[148];
extern const char *koopa_troopa_beach_dls2[148];
extern s8 gPlayerCount;
@@ -56,7 +55,7 @@ KoopaTroopaBeach::KoopaTroopaBeach() {
Id = "mk:koopa_beach";
Props.SetText(Props.Name, "koopa troopa beach", sizeof(Props.Name));
Props.SetText(Props.DebugName, "beach", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "691m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "691m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009158;
Props.AIMaximumSeparation = 50.0f;
@@ -118,7 +117,7 @@ KoopaTroopaBeach::KoopaTroopaBeach() {
}
void KoopaTroopaBeach::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(d_course_koopa_troopa_beach_dl_list1); i++) {
InvertTriangleWindingByName(d_course_koopa_troopa_beach_dl_list1[i]);
@@ -131,7 +130,7 @@ void KoopaTroopaBeach::Load() {
InvertTriangleWindingByName(d_course_koopa_troopa_beach_packed_dl_2C0);
InvertTriangleWindingByName(d_course_koopa_troopa_beach_packed_dl_9E70);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_koopa_troopa_beach_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_koopa_troopa_beach_addr));
func_80295C6C();
find_vtx_and_set_colours((Gfx*) d_course_koopa_troopa_beach_packed_dl_ADE0, 150, 255, 255, 255);
find_vtx_and_set_colours((Gfx*) d_course_koopa_troopa_beach_packed_dl_A540, 150, 255, 255, 255);
@@ -144,7 +143,7 @@ void KoopaTroopaBeach::UnLoad() {
}
void KoopaTroopaBeach::BeginPlay() {
- init_actor_hot_air_balloon_item_box(328.0f * gCourseDirection, 70.0f, 2541.0f);
+ init_actor_hot_air_balloon_item_box(328.0f * gTrackDirection, 70.0f, 2541.0f);
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_koopa_troopa_beach_item_box_spawns));
spawn_palm_trees((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_koopa_troopa_beach_tree_spawn));
@@ -186,10 +185,10 @@ void KoopaTroopaBeach::BeginPlay() {
}
}
-void KoopaTroopaBeach::InitCourseObjects() {
+void KoopaTroopaBeach::InitTrackObjects() {
}
-void KoopaTroopaBeach::UpdateCourseObjects() {
+void KoopaTroopaBeach::TickTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
//update_crabs();
}
@@ -198,7 +197,7 @@ void KoopaTroopaBeach::UpdateCourseObjects() {
}
}
-void KoopaTroopaBeach::RenderCourseObjects(s32 cameraId) {
+void KoopaTroopaBeach::DrawTrackObjects(s32 cameraId) {
if (gGamestate != CREDITS_SEQUENCE) {
//render_object_crabs(cameraId);
}
@@ -221,7 +220,7 @@ void KoopaTroopaBeach::WhatDoesThisDo(Player* player, int8_t playerId) {}
void KoopaTroopaBeach::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void KoopaTroopaBeach::Render(struct UnkStruct_800DC5EC* arg0) {
+void KoopaTroopaBeach::Draw(ScreenContext* arg0) {
gDPPipeSync(gDisplayListHead++);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -237,7 +236,7 @@ void KoopaTroopaBeach::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
// d_course_koopa_troopa_beach_packed_dl_9688
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_koopa_troopa_beach_packed_dl_9688);
- render_course_segments((const char**)d_course_koopa_troopa_beach_dl_list1, arg0);
+ render_track_sections((const char**)d_course_koopa_troopa_beach_dl_list1, arg0);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
@@ -247,7 +246,7 @@ void KoopaTroopaBeach::Render(struct UnkStruct_800DC5EC* arg0) {
gDPPipeSync(gDisplayListHead++);
}
-void KoopaTroopaBeach::RenderCredits() {
+void KoopaTroopaBeach::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_koopa_troopa_beach_dl_18D68));
}
@@ -291,7 +290,7 @@ void KoopaTroopaBeach::ScrollingTextures() {
}
-void KoopaTroopaBeach::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
+void KoopaTroopaBeach::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
Vec3f vector;
gDPPipeSync(gDisplayListHead++);
@@ -322,7 +321,7 @@ void KoopaTroopaBeach::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pat
gDPSetBlendMask(gDisplayListHead++, 0xFF);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
- render_course_segments((const char**)koopa_troopa_beach_dls2, screen);
+ render_track_sections((const char**)koopa_troopa_beach_dls2, screen);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 1, 1, G_OFF);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
diff --git a/src/engine/courses/KoopaTroopaBeach.h b/src/engine/tracks/KoopaTroopaBeach.h
index 2c6d45397..5f3f776a7 100644
--- a/src/engine/courses/KoopaTroopaBeach.h
+++ b/src/engine/tracks/KoopaTroopaBeach.h
@@ -2,7 +2,7 @@
#include <libultraship.h>
#include "../CoreMath.h"
-#include "Course.h"
+#include "Track.h"
#include "World.h"
@@ -15,10 +15,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture koopa_troopa_beach_textures[];
}
-class KoopaTroopaBeach : public Course {
+class KoopaTroopaBeach : public Track {
public:
virtual ~KoopaTroopaBeach() = default; // Virtual destructor for proper cleanup in derived classes
@@ -30,16 +31,16 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7) override;
virtual void ScrollingTextures() override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/LuigiRaceway.cpp b/src/engine/tracks/LuigiRaceway.cpp
index 2ebde3087..5414fa1a5 100644
--- a/src/engine/courses/LuigiRaceway.cpp
+++ b/src/engine/tracks/LuigiRaceway.cpp
@@ -38,7 +38,6 @@ extern "C" {
#include "courses/staff_ghost_data.h"
#include "framebuffer_effects.h"
#include "skybox_and_splitscreen.h"
-#include "course.h"
extern const char* luigi_raceway_dls[120];
extern s16 currentScreenSection;
}
@@ -59,7 +58,7 @@ LuigiRaceway::LuigiRaceway() {
Id = "mk:luigi_raceway";
Props.SetText(Props.Name, "luigi raceway", sizeof(Props.Name));
Props.SetText(Props.DebugName, "l circuit", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "717m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "717m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D0091E8;
Props.AIMaximumSeparation = 50.0f;
@@ -117,7 +116,7 @@ LuigiRaceway::LuigiRaceway() {
}
void LuigiRaceway::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(luigi_raceway_dls); i++) {
InvertTriangleWindingByName(luigi_raceway_dls[i]);
@@ -126,9 +125,9 @@ void LuigiRaceway::Load() {
InvertTriangleWindingByName(d_course_luigi_raceway_packed_dl_E0);
InvertTriangleWindingByName(d_course_luigi_raceway_packed_dl_68);
}
- parse_course_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_luigi_raceway_addr));
+ parse_track_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_luigi_raceway_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void LuigiRaceway::UnLoad() {
@@ -157,7 +156,7 @@ void LuigiRaceway::BeginPlay() {
}
}
-void LuigiRaceway::InitCourseObjects() {
+void LuigiRaceway::InitTrackObjects() {
size_t i;
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == GRAND_PRIX) {
@@ -249,7 +248,7 @@ void LuigiRaceway::CopyJumbotron(s32 ulx, s32 uly, s16 portionToDraw, u16* sourc
}
}
-void LuigiRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
+void LuigiRaceway::Draw(ScreenContext* arg0) {
UNUSED s32 pad;
u16 sp22 = (u16) arg0->pathCounter;
s16 prevFrame;
@@ -278,7 +277,7 @@ void LuigiRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(luigi_raceway_dls, arg0);
+ render_track_sections(luigi_raceway_dls, arg0);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2);
@@ -314,7 +313,7 @@ void LuigiRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
}
}
-void LuigiRaceway::RenderCredits() {
+void LuigiRaceway::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*) (d_course_luigi_raceway_dl_FD40));
}
diff --git a/src/engine/courses/LuigiRaceway.h b/src/engine/tracks/LuigiRaceway.h
index 53d9b8060..5d4b722fc 100644
--- a/src/engine/courses/LuigiRaceway.h
+++ b/src/engine/tracks/LuigiRaceway.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/luigi_raceway/luigi_raceway_vertices.h"
@@ -15,7 +15,7 @@ extern "C" {
extern const course_texture luigi_raceway_textures[];
}
-class LuigiRaceway : public Course {
+class LuigiRaceway : public Track {
void CopyJumbotron(s32 ulx, s32 uly, s16 portionToDraw, u16* source);
public:
@@ -29,13 +29,13 @@ class LuigiRaceway : public Course {
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
virtual void SetStaffGhost() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6,
f32* arg7) override;
};
diff --git a/src/engine/courses/MarioRaceway.cpp b/src/engine/tracks/MarioRaceway.cpp
index cff1e42b2..957ba7468 100644
--- a/src/engine/courses/MarioRaceway.cpp
+++ b/src/engine/tracks/MarioRaceway.cpp
@@ -34,7 +34,6 @@ extern "C" {
#include "collision.h"
#include "memory.h"
#include "courses/staff_ghost_data.h"
- #include "course.h"
extern const char *mario_raceway_dls[68];
}
@@ -54,7 +53,7 @@ MarioRaceway::MarioRaceway() {
Id = "mk:mario_raceway";
Props.SetText(Props.Name, "mario raceway", sizeof(Props.Name));
Props.SetText(Props.DebugName, "m circuit", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "567m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "567m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F28;
Props.AIMaximumSeparation = 50.0f;
@@ -113,7 +112,7 @@ MarioRaceway::MarioRaceway() {
}
void MarioRaceway::Load() {
- Course::Load();
+ Track::Load();
// Invert winding in mirror mode before generating collision meshes
if (gIsMirrorMode != 0) {
@@ -150,9 +149,9 @@ void MarioRaceway::Load() {
}
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_mario_raceway_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_mario_raceway_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void MarioRaceway::UnLoad() {
@@ -187,7 +186,7 @@ void MarioRaceway::BeginPlay() {
}
}
-void MarioRaceway::InitCourseObjects() {
+void MarioRaceway::InitTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == GRAND_PRIX) {
func_80070714();
@@ -257,7 +256,7 @@ void render_mario_raceway_pipe(void) {
}
}
-void MarioRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
+void MarioRaceway::Draw(ScreenContext* arg0) {
u16 sp22 = arg0->pathCounter;
u16 temp_t0 = arg0->playerDirection;
@@ -351,7 +350,7 @@ void MarioRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_mario_raceway_packed_dl_3508);
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_mario_raceway_packed_dl_3240);
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_mario_raceway_packed_dl_14A0);
- render_course_segments(mario_raceway_dls, arg0);
+ render_track_sections(mario_raceway_dls, arg0);
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);
@@ -362,7 +361,7 @@ void MarioRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_mario_raceway_packed_dl_160);
}
-void MarioRaceway::RenderCredits() {
+void MarioRaceway::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_mario_raceway_dl_9348));
}
diff --git a/src/engine/courses/MarioRaceway.h b/src/engine/tracks/MarioRaceway.h
index 1e99add7e..ebecafc91 100644
--- a/src/engine/courses/MarioRaceway.h
+++ b/src/engine/tracks/MarioRaceway.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/mario_raceway/mario_raceway_vertices.h"
@@ -12,9 +12,10 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
}
-class MarioRaceway : public Course {
+class MarioRaceway : public Track {
public:
virtual ~MarioRaceway() = default; // Virtual destructor for proper cleanup in derived classes
@@ -26,13 +27,13 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
virtual void SetStaffGhost() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/MooMooFarm.cpp b/src/engine/tracks/MooMooFarm.cpp
index c509d7822..a7b65be7e 100644
--- a/src/engine/courses/MooMooFarm.cpp
+++ b/src/engine/tracks/MooMooFarm.cpp
@@ -33,7 +33,6 @@ extern "C" {
#include "collision.h"
#include "memory.h"
#include "code_80086E70.h"
- #include "course.h"
extern const char *moo_moo_farm_dls[92];
extern s16 currentScreenSection;
extern s8 gPlayerCount;
@@ -54,7 +53,7 @@ MooMooFarm::MooMooFarm() {
Props.SetText(Props.Name, "moo moo farm", sizeof(Props.Name));
Props.SetText(Props.DebugName, "farm", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "527m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "527m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009210;
Props.AIMaximumSeparation = 50.0f;
@@ -112,7 +111,7 @@ MooMooFarm::MooMooFarm() {
}
void MooMooFarm::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(moo_moo_farm_dls); i++) {
InvertTriangleWindingByName(moo_moo_farm_dls[i]);
@@ -124,9 +123,9 @@ void MooMooFarm::Load() {
InvertTriangleWindingByName(d_course_moo_moo_farm_dl_14060);
InvertTriangleWindingByName(d_course_moo_moo_farm_packed_dl_10C0);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_moo_moo_farm_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_moo_moo_farm_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void MooMooFarm::UnLoad() {
@@ -260,7 +259,7 @@ void MooMooFarm::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void MooMooFarm::Render(struct UnkStruct_800DC5EC* arg0) {
+void MooMooFarm::Draw(ScreenContext* arg0) {
s16 temp_s0 = arg0->pathCounter;
s16 temp_s1 = arg0->playerDirection;
@@ -276,7 +275,7 @@ void MooMooFarm::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_moo_moo_farm_packed_dl_5640);
gSPFogPosition(gDisplayListHead++, D_802B87B0, D_802B87B4);
- render_course_segments(moo_moo_farm_dls, arg0);
+ render_track_sections(moo_moo_farm_dls, arg0);
if ((temp_s0 < 14) && (temp_s0 > 10)) {
if ((temp_s1 == 2) || (temp_s1 == 3) || (temp_s1 == 1)) {
@@ -333,7 +332,7 @@ void MooMooFarm::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_moo_moo_farm_packed_dl_10C0);
}
-void MooMooFarm::RenderCredits() {
+void MooMooFarm::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_moo_moo_farm_dl_14088));
}
diff --git a/src/engine/courses/MooMooFarm.h b/src/engine/tracks/MooMooFarm.h
index 8468ca8aa..aa38070f8 100644
--- a/src/engine/courses/MooMooFarm.h
+++ b/src/engine/tracks/MooMooFarm.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
#include "engine/objects/Mole.h"
extern "C" {
@@ -13,12 +13,13 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture moo_moo_farm_textures[];
}
class OMole;
-class MooMooFarm : public Course {
+class MooMooFarm : public Track {
public:
virtual ~MooMooFarm() = default; // Virtual destructor for proper cleanup in derived classes
@@ -32,8 +33,8 @@ public:
virtual void BeginPlay() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/PodiumCeremony.cpp b/src/engine/tracks/PodiumCeremony.cpp
index 48cd2478b..91f8f84e1 100644
--- a/src/engine/courses/PodiumCeremony.cpp
+++ b/src/engine/tracks/PodiumCeremony.cpp
@@ -38,7 +38,6 @@ extern "C" {
#include "memory.h"
#include "courses/staff_ghost_data.h"
#include "podium_ceremony_actors.h"
- #include "course.h"
extern const char *royal_raceway_dls[];
}
@@ -55,7 +54,7 @@ PodiumCeremony::PodiumCeremony() {
Props.SetText(Props.Name, "royal raceway", sizeof(Props.Name));
Props.SetText(Props.DebugName, "p circuit", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "1025m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "1025m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009188;
Props.AIMaximumSeparation = 50.0f;
@@ -112,9 +111,9 @@ PodiumCeremony::PodiumCeremony() {
}
void PodiumCeremony::Load() {
- Course::Load();
+ Track::Load();
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_royal_raceway_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_royal_raceway_addr));
func_80295C6C();
}
@@ -163,7 +162,7 @@ void PodiumCeremony::BeginPlay() {
}
}
-void PodiumCeremony::InitCourseObjects() {
+void PodiumCeremony::InitTrackObjects() {
size_t i;
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == GRAND_PRIX) {
@@ -205,7 +204,7 @@ void PodiumCeremony::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void PodiumCeremony::Render(struct UnkStruct_800DC5EC* arg0) {
+void PodiumCeremony::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -222,7 +221,7 @@ void PodiumCeremony::Render(struct UnkStruct_800DC5EC* arg0) {
// d_course_royal_raceway_packed_dl_A648
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_royal_raceway_packed_dl_A648);
- render_course_segments(royal_raceway_dls, arg0);
+ render_track_sections(royal_raceway_dls, arg0);
// d_course_royal_raceway_packed_dl_11A8
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_royal_raceway_packed_dl_11A8);
@@ -234,7 +233,7 @@ void PodiumCeremony::Render(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
-void PodiumCeremony::RenderCredits() {
+void PodiumCeremony::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_royal_raceway_dl_D8E8));
}
diff --git a/src/engine/courses/PodiumCeremony.h b/src/engine/tracks/PodiumCeremony.h
index 403f7f310..efb9271c2 100644
--- a/src/engine/courses/PodiumCeremony.h
+++ b/src/engine/tracks/PodiumCeremony.h
@@ -2,7 +2,7 @@
#include <libultraship.h>
#include "CoreMath.h"
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/royal_raceway/royal_raceway_vertices.h"
@@ -13,10 +13,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture royal_raceway_textures[];
}
-class PodiumCeremony : public Course {
+class PodiumCeremony : public Track {
public:
virtual ~PodiumCeremony() = default; // Virtual destructor for proper cleanup in derived classes
@@ -29,11 +30,11 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
//virtual void InitClouds() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/RainbowRoad.cpp b/src/engine/tracks/RainbowRoad.cpp
index dcfd4856d..ad026c4ec 100644
--- a/src/engine/courses/RainbowRoad.cpp
+++ b/src/engine/tracks/RainbowRoad.cpp
@@ -31,7 +31,6 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
- #include "course.h"
extern const char *rainbow_road_dls[48];
}
@@ -50,7 +49,7 @@ RainbowRoad::RainbowRoad() {
Props.SetText(Props.Name, "rainbow road", sizeof(Props.Name));
Props.SetText(Props.DebugName, "rainbow", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "2000m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "2000m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D0092C8;
Props.AIMaximumSeparation = 50.0f;
@@ -109,14 +108,14 @@ RainbowRoad::RainbowRoad() {
}
void RainbowRoad::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(rainbow_road_dls); i++) {
InvertTriangleWindingByName(rainbow_road_dls[i]);
}
}
D_800DC5C8 = 1;
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_rainbow_road_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_rainbow_road_addr));
func_80295C6C();
// d_course_rainbow_road_packed_dl_2068
find_vtx_and_set_colours((Gfx*) d_course_rainbow_road_packed_dl_2068, 150, 255, 255, 255);
@@ -158,11 +157,11 @@ void RainbowRoad::InitClouds() {
init_stars(this->Props.Clouds);
}
-void RainbowRoad::UpdateClouds(s32 sp1C, Camera* camera) {
+void RainbowRoad::TickClouds(s32 sp1C, Camera* camera) {
update_stars(sp1C, camera, this->Props.CloudList);
}
-void RainbowRoad::InitCourseObjects() {
+void RainbowRoad::InitTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
size_t i;
for (i = 0; i < NUM_NEON_SIGNS; i++) {
@@ -171,14 +170,14 @@ void RainbowRoad::InitCourseObjects() {
}
}
-void RainbowRoad::UpdateCourseObjects() {
+void RainbowRoad::TickTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
update_neon();
//update_chain_chomps();
}
}
-void RainbowRoad::RenderCourseObjects(s32 cameraId) {
+void RainbowRoad::DrawTrackObjects(s32 cameraId) {
if (gGamestate != CREDITS_SEQUENCE) {
render_object_neon(cameraId);
//render_object_chain_chomps(cameraId);
@@ -192,7 +191,7 @@ void RainbowRoad::WhatDoesThisDo(Player* player, int8_t playerId) {}
void RainbowRoad::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void RainbowRoad::Render(struct UnkStruct_800DC5EC* arg0) {
+void RainbowRoad::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -200,7 +199,7 @@ void RainbowRoad::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
}
-void RainbowRoad::RenderCredits() {
+void RainbowRoad::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_rainbow_road_dl_16220));
}
@@ -208,11 +207,11 @@ void RainbowRoad::Waypoints(Player* player, int8_t playerId) {
player->nearestPathPointId = gCopyNearestWaypointByPlayerId[playerId];
}
-void RainbowRoad::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
+void RainbowRoad::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
gDPPipeSync(gDisplayListHead++);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
- render_course_segments(rainbow_road_dls, screen);
+ render_track_sections(rainbow_road_dls, screen);
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
gDPPipeSync(gDisplayListHead++);
diff --git a/src/engine/courses/RainbowRoad.h b/src/engine/tracks/RainbowRoad.h
index ffe3286ca..34c998e68 100644
--- a/src/engine/courses/RainbowRoad.h
+++ b/src/engine/tracks/RainbowRoad.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/rainbow_road/rainbow_road_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture rainbow_road_textures[];
}
-class RainbowRoad : public Course {
+class RainbowRoad : public Track {
public:
virtual ~RainbowRoad() = default; // Virtual destructor for proper cleanup in derived classes
@@ -28,17 +29,17 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
virtual void InitClouds() override;
- virtual void UpdateClouds(s32, Camera*) override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void TickClouds(s32, Camera*) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/RoyalRaceway.cpp b/src/engine/tracks/RoyalRaceway.cpp
index 6362a2c15..6e57aff14 100644
--- a/src/engine/courses/RoyalRaceway.cpp
+++ b/src/engine/tracks/RoyalRaceway.cpp
@@ -32,7 +32,6 @@ extern "C" {
#include "collision.h"
#include "memory.h"
#include "courses/staff_ghost_data.h"
- #include "course.h"
extern const char *royal_raceway_dls[132];
}
@@ -51,7 +50,7 @@ RoyalRaceway::RoyalRaceway() {
Props.SetText(Props.Name, "royal raceway", sizeof(Props.Name));
Props.SetText(Props.DebugName, "p circuit", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "1025m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "1025m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009188;
Props.AIMaximumSeparation = 50.0f;
@@ -111,7 +110,7 @@ RoyalRaceway::RoyalRaceway() {
}
void RoyalRaceway::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(royal_raceway_dls); i++) {
InvertTriangleWindingByName(royal_raceway_dls[i]);
@@ -121,7 +120,7 @@ void RoyalRaceway::Load() {
InvertTriangleWindingByName(d_course_royal_raceway_packed_dl_11A8);
InvertTriangleWindingByName(d_course_royal_raceway_packed_dl_8A0);
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_royal_raceway_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_royal_raceway_addr));
func_80295C6C();
}
@@ -148,7 +147,7 @@ void RoyalRaceway::BeginPlay() {
}
}
-void RoyalRaceway::InitCourseObjects() {
+void RoyalRaceway::InitTrackObjects() {
size_t i;
if (gGamestate != CREDITS_SEQUENCE) {
if (gModeSelection == GRAND_PRIX) {
@@ -200,7 +199,7 @@ void RoyalRaceway::SetStaffGhost() {
D_80162DE4 = 6;
}
-void RoyalRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
+void RoyalRaceway::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -217,7 +216,7 @@ void RoyalRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
// d_course_royal_raceway_packed_dl_A648
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_royal_raceway_packed_dl_A648);
- render_course_segments(royal_raceway_dls, arg0);
+ render_track_sections(royal_raceway_dls, arg0);
// d_course_royal_raceway_packed_dl_11A8
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_royal_raceway_packed_dl_11A8);
@@ -229,7 +228,7 @@ void RoyalRaceway::Render(struct UnkStruct_800DC5EC* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK);
}
-void RoyalRaceway::RenderCredits() {
+void RoyalRaceway::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_royal_raceway_dl_D8E8));
}
diff --git a/src/engine/courses/RoyalRaceway.h b/src/engine/tracks/RoyalRaceway.h
index 4b8552b09..4cc19fcb8 100644
--- a/src/engine/courses/RoyalRaceway.h
+++ b/src/engine/tracks/RoyalRaceway.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/royal_raceway/royal_raceway_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture royal_raceway_textures[];
}
-class RoyalRaceway : public Course {
+class RoyalRaceway : public Track {
public:
virtual ~RoyalRaceway() = default; // Virtual destructor for proper cleanup in derived classes
@@ -27,12 +28,12 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
virtual void SetStaffGhost() override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void ScrollingTextures() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
};
diff --git a/src/engine/courses/SherbetLand.cpp b/src/engine/tracks/SherbetLand.cpp
index a27f954d3..3c893069e 100644
--- a/src/engine/courses/SherbetLand.cpp
+++ b/src/engine/tracks/SherbetLand.cpp
@@ -32,7 +32,6 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
- #include "course.h"
extern const char *sherbet_land_dls[72];
extern const char *sherbet_land_dls_2[72];
}
@@ -53,7 +52,7 @@ SherbetLand::SherbetLand() {
Props.SetText(Props.Name, "sherbet land", sizeof(Props.Name));
Props.SetText(Props.DebugName, "sherbet", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "756m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "756m", sizeof(Props.TrackLength));
Props.LakituTowType = (s32)OLakitu::LakituTowType::ICE;
@@ -115,7 +114,7 @@ SherbetLand::SherbetLand() {
}
void SherbetLand::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(sherbet_land_dls); i++) {
InvertTriangleWindingByName(sherbet_land_dls[i]);
@@ -124,7 +123,7 @@ void SherbetLand::Load() {
InvertTriangleWindingByName(sherbet_land_dls_2[i]);
}
}
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_sherbet_land_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_sherbet_land_addr));
func_80295C6C();
// d_course_sherbet_land_packed_dl_1EB8
find_vtx_and_set_colours((Gfx*) d_course_sherbet_land_packed_dl_1EB8, 180, 255, 255, 255);
@@ -138,7 +137,7 @@ void SherbetLand::UnLoad() {
f32 SherbetLand::GetWaterLevel(FVector pos, Collision* collision) {
if ((get_surface_type(collision->meshIndexZX) & 0xFF) == SNOW) {
- return (f32) (gCourseMinY - 0xA);
+ return (f32) (gTrackMinY - 0xA);
}
return Props.WaterLevel;
}
@@ -188,32 +187,32 @@ void SherbetLand::BeginPlay() {
}
}
-void SherbetLand::UpdateCourseObjects() {
+void SherbetLand::TickTrackObjects() {
if (gGamestate != CREDITS_SEQUENCE) {
func_800842C8();
}
}
-void SherbetLand::RenderCourseObjects(s32 cameraId) {
+void SherbetLand::DrawTrackObjects(s32 cameraId) {
if (gGamestate != CREDITS_SEQUENCE) {
func_80052E30(cameraId);
}
}
-void SherbetLand::Render(struct UnkStruct_800DC5EC* arg0) {
+void SherbetLand::Draw(ScreenContext* arg0) {
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(sherbet_land_dls, arg0);
+ render_track_sections(sherbet_land_dls, arg0);
}
-void SherbetLand::RenderCredits() {
+void SherbetLand::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_sherbet_land_dl_9AE8));
}
-void SherbetLand::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
+void SherbetLand::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) {
gDPPipeSync(gDisplayListHead++);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
@@ -221,7 +220,7 @@ void SherbetLand::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCoun
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP);
gDPSetTexturePersp(gDisplayListHead++, G_TP_PERSP);
- render_course_segments(sherbet_land_dls_2, screen);
+ render_track_sections(sherbet_land_dls_2, screen);
gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE);
if ((func_80290C20(screen->camera) == 1) && (get_water_level(screen->player) < screen->player->pos[1])) {
diff --git a/src/engine/courses/SherbetLand.h b/src/engine/tracks/SherbetLand.h
index ecc72aedf..6987759ef 100644
--- a/src/engine/courses/SherbetLand.h
+++ b/src/engine/tracks/SherbetLand.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/sherbet_land/sherbet_land_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture sherbet_land_textures[];
}
-class SherbetLand : public Course {
+class SherbetLand : public Track {
public:
virtual ~SherbetLand() = default; // Virtual destructor for proper cleanup in derived classes
@@ -28,10 +29,10 @@ public:
virtual void UnLoad() override;
virtual f32 GetWaterLevel(FVector pos, Collision* collision) override;
virtual void BeginPlay() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot, uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
};
diff --git a/src/engine/courses/Skyscraper.cpp b/src/engine/tracks/Skyscraper.cpp
index 0abd6caa5..3e7e34d1c 100644
--- a/src/engine/courses/Skyscraper.cpp
+++ b/src/engine/tracks/Skyscraper.cpp
@@ -47,7 +47,7 @@ Skyscraper::Skyscraper() {
Props.SetText(Props.Name, "skyscraper", sizeof(Props.Name));
Props.SetText(Props.DebugName, "skyscraper", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F18;
Props.AIMaximumSeparation = -1.0f;
@@ -106,7 +106,7 @@ Skyscraper::Skyscraper() {
}
void Skyscraper::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
InvertTriangleWindingByName(d_course_skyscraper_packed_dl_FE8);
InvertTriangleWindingByName(d_course_skyscraper_packed_dl_C60);
@@ -140,7 +140,7 @@ void Skyscraper::BeginPlay() {
}
}
-void Skyscraper::InitCourseObjects() {}
+void Skyscraper::InitTrackObjects() {}
void Skyscraper::SomeSounds() {}
@@ -148,7 +148,7 @@ void Skyscraper::WhatDoesThisDo(Player* player, int8_t playerId) {}
void Skyscraper::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void Skyscraper::Render(struct UnkStruct_800DC5EC* arg0) {
+void Skyscraper::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
@@ -171,7 +171,7 @@ void Skyscraper::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_skyscraper_packed_dl_258);
}
-void Skyscraper::RenderCredits() {}
+void Skyscraper::DrawCredits() {}
void Skyscraper::Waypoints(Player* player, int8_t playerId) {
player->nearestPathPointId = 0;
diff --git a/src/engine/courses/Skyscraper.h b/src/engine/tracks/Skyscraper.h
index f7a323037..f00d4833c 100644
--- a/src/engine/courses/Skyscraper.h
+++ b/src/engine/tracks/Skyscraper.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/skyscraper/skyscraper_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture skyscraper_textures[];
}
-class Skyscraper : public Course {
+class Skyscraper : public Track {
public:
virtual ~Skyscraper() = default; // Virtual destructor for proper cleanup in derived classes
@@ -28,12 +29,12 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
//virtual void InitClouds() override;
- virtual void InitCourseObjects() override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
virtual void Destroy() override;
};
diff --git a/src/engine/courses/TestCourse.cpp b/src/engine/tracks/TestTrack.cpp
index c60198329..52ddfc49c 100644
--- a/src/engine/courses/TestCourse.cpp
+++ b/src/engine/tracks/TestTrack.cpp
@@ -4,7 +4,7 @@
#include <vector>
#include <memory>
-#include "TestCourse.h"
+#include "TestTrack.h"
#include "World.h"
#include "engine/actors/Finishline.h"
#include "engine/actors/BowserStatue.h"
@@ -51,15 +51,13 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
- #include "course.h"
- extern Gfx test_course_dls[];
extern Vtx mario_Plane_001_mesh_vtx_1[];
extern Gfx mario_Plane_001_mesh[];
- extern TrackPathPoint test_course_path[];
- extern TrackSections test_course_addr[];
+ extern TrackPathPoint test_track_path[];
+ extern TrackSections test_track_addr[];
}
-TestCourse::TestCourse() {
+TestTrack::TestTrack() {
Props.Minimap.Texture = minimap_mario_raceway;
Props.Minimap.Width = ResourceGetTexWidthByName(Props.Minimap.Texture);
Props.Minimap.Height = ResourceGetTexHeightByName(Props.Minimap.Texture);
@@ -73,11 +71,11 @@ TestCourse::TestCourse() {
Props.Minimap.Colour = {255, 255, 255};
ResizeMinimap(&Props.Minimap);
- Id = "mk:test_course";
+ Id = "mk:test_track";
- Props.SetText(Props.Name, "Test Course", sizeof(Props.Name));
+ Props.SetText(Props.Name, "Test Track", sizeof(Props.Name));
Props.SetText(Props.DebugName, "test track", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "100m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "100m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D008F28;
Props.AIMaximumSeparation = 50.0f;
@@ -109,12 +107,12 @@ TestCourse::TestCourse() {
Props.OffTrackTargetSpeed[2] = 5.75f;
Props.OffTrackTargetSpeed[3] = 6.3333334f;
- Props.PathTable[0] = test_course_path;
+ Props.PathTable[0] = test_track_path;
Props.PathTable[1] = NULL;
Props.PathTable[2] = NULL;
Props.PathTable[3] = NULL;
- Props.PathTable2[0] = test_course_path;
+ Props.PathTable2[0] = test_track_path;
Props.PathTable2[1] = NULL;
Props.PathTable2[2] = NULL;
Props.PathTable2[3] = NULL;
@@ -134,8 +132,8 @@ TestCourse::TestCourse() {
Props.Sequence = MusicSeq::MUSIC_SEQ_WARIO_STADIUM;
}
-void TestCourse::Load() {
- Course::Load(mario_Plane_001_mesh_vtx_1, NULL);
+void TestTrack::Load() {
+ Track::Load(mario_Plane_001_mesh_vtx_1, NULL);
if (gIsMirrorMode != 0) {
InvertTriangleWinding(mario_Plane_001_mesh);
@@ -143,15 +141,15 @@ void TestCourse::Load() {
generate_collision_mesh_with_defaults(mario_Plane_001_mesh);
- parse_course_displaylists((TrackSections*)test_course_addr);
+ parse_track_displaylists((TrackSections*)test_track_addr);
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
-void TestCourse::UnLoad() {
+void TestTrack::UnLoad() {
}
-void TestCourse::BeginPlay() {
+void TestTrack::BeginPlay() {
struct ActorSpawnData itemboxes[] = {
{ 200, 1500, 200 , 0},
{ 350, 2500, 300 , 1},
@@ -192,7 +190,7 @@ void TestCourse::BeginPlay() {
Vec3f crossingPos = {0, 2, 0};
uintptr_t* crossing1 = (uintptr_t*) gWorldInstance.AddCrossing(crossingPos, 0, 2, 900.0f, 650.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
rrxing = (struct RailroadCrossing*) GET_ACTOR(add_actor_to_empty_slot(position, rotation, velocity,
ACTOR_RAILROAD_CROSSING));
rrxing->crossingTrigger = crossing1;
@@ -230,7 +228,7 @@ void TestCourse::BeginPlay() {
// OGrandPrixBalloons::Spawn(FVector(0, 0, 0));
}
-void TestCourse::WhatDoesThisDo(Player* player, int8_t playerId) {
+void TestTrack::WhatDoesThisDo(Player* player, int8_t playerId) {
if (((s16) gNearestPathPointByPlayerId[playerId] >= 0x19B) &&
((s16) gNearestPathPointByPlayerId[playerId] < 0x1B9)) {
if (D_80165300[playerId] != 1) {
@@ -245,7 +243,7 @@ void TestCourse::WhatDoesThisDo(Player* player, int8_t playerId) {
}
}
-void TestCourse::WhatDoesThisDoAI(Player* player, int8_t playerId) {
+void TestTrack::WhatDoesThisDoAI(Player* player, int8_t playerId) {
if (((s16) gNearestPathPointByPlayerId[playerId] >= 0x19B) &&
((s16) gNearestPathPointByPlayerId[playerId] < 0x1B9)) {
if (D_80165300[playerId] != 1) {
@@ -260,7 +258,7 @@ void TestCourse::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void TestCourse::Render(struct UnkStruct_800DC5EC* arg0) {
+void TestTrack::Draw(ScreenContext* arg0) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
@@ -275,6 +273,6 @@ void TestCourse::Render(struct UnkStruct_800DC5EC* arg0) {
gSPDisplayList(gDisplayListHead++, mario_Plane_001_mesh);
}
-bool TestCourse::IsMod() {
+bool TestTrack::IsMod() {
return true;
}
diff --git a/src/engine/courses/TestCourse.h b/src/engine/tracks/TestTrack.h
index 8bbb93634..db0c061a8 100644
--- a/src/engine/courses/TestCourse.h
+++ b/src/engine/tracks/TestTrack.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/mario_raceway/mario_raceway_vertices.h"
@@ -12,15 +12,15 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
- extern const course_texture test_course_textures[];
+ #include "code_800029B0.h"
}
-class TestCourse : public Course {
+class TestTrack : public Track {
public:
- virtual ~TestCourse() = default; // Virtual destructor for proper cleanup in derived classes
+ virtual ~TestTrack() = default; // Virtual destructor for proper cleanup in derived classes
// Constructor
- explicit TestCourse();
+ explicit TestTrack();
// virtual void Load(const char* courseVtx,
// course_texture* textures, const char* displaylists, size_t dlSize);
@@ -29,6 +29,6 @@ public:
virtual void BeginPlay() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
+ virtual void Draw(ScreenContext*) override;
virtual bool IsMod() override;
};
diff --git a/src/engine/courses/ToadsTurnpike.cpp b/src/engine/tracks/ToadsTurnpike.cpp
index af0cb51d4..c3381a821 100644
--- a/src/engine/courses/ToadsTurnpike.cpp
+++ b/src/engine/tracks/ToadsTurnpike.cpp
@@ -37,7 +37,6 @@ extern "C" {
#include "collision.h"
#include "memory.h"
#include "code_80086E70.h"
- #include "course.h"
extern const char *d_course_toads_turnpike_dl_list[81];
extern s16 currentScreenSection;
extern s8 gPlayerCount;
@@ -58,7 +57,7 @@ ToadsTurnpike::ToadsTurnpike() {
Props.SetText(Props.Name, "toad's turnpike", sizeof(Props.Name));
Props.SetText(Props.DebugName, "highway", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "1036m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "1036m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009238;
Props.AIMaximumSeparation = 50.0f;
@@ -122,7 +121,7 @@ ToadsTurnpike::ToadsTurnpike() {
}
void ToadsTurnpike::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(d_course_toads_turnpike_dl_list); i++) {
@@ -138,9 +137,9 @@ void ToadsTurnpike::Load() {
D_801625F0 = 4;
D_802B87B0 = 993;
D_802B87B4 = 1000;
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_toads_turnpike_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_toads_turnpike_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void ToadsTurnpike::UnLoad() {
@@ -206,7 +205,7 @@ void ToadsTurnpike::InitClouds() {
init_stars(this->Props.Clouds);
}
-void ToadsTurnpike::UpdateClouds(s32 sp1C, Camera* camera) {
+void ToadsTurnpike::TickClouds(s32 sp1C, Camera* camera) {
update_stars(sp1C, camera, this->Props.CloudList);
}
@@ -240,7 +239,7 @@ void ToadsTurnpike::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
}
-void ToadsTurnpike::Render(struct UnkStruct_800DC5EC* arg0) {
+void ToadsTurnpike::Draw(ScreenContext* arg0) {
set_track_light_direction(D_800DC610, D_802B87D4, 0, 1);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
@@ -252,7 +251,7 @@ void ToadsTurnpike::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_PASS2);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(d_course_toads_turnpike_dl_list, arg0);
+ render_track_sections(d_course_toads_turnpike_dl_list, arg0);
gDPSetRenderMode(gDisplayListHead++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2);
gDPSetCombineMode(gDisplayListHead++, G_CC_DECALRGBA, G_CC_PASS2);
@@ -266,7 +265,7 @@ void ToadsTurnpike::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE);
}
-void ToadsTurnpike::RenderCredits() {
+void ToadsTurnpike::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_toads_turnpike_dl_23930));
}
diff --git a/src/engine/courses/ToadsTurnpike.h b/src/engine/tracks/ToadsTurnpike.h
index 9c72a466e..45f7bb6f4 100644
--- a/src/engine/courses/ToadsTurnpike.h
+++ b/src/engine/tracks/ToadsTurnpike.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/toads_turnpike/toads_turnpike_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture toads_turnpike_textures[];
}
-class ToadsTurnpike : public Course {
+class ToadsTurnpike : public Track {
public:
virtual ~ToadsTurnpike() = default; // Virtual destructor for proper cleanup in derived classes
@@ -28,12 +29,12 @@ public:
virtual void UnLoad() override;
virtual void BeginPlay() override;
virtual void InitClouds() override;
- virtual void UpdateClouds(s32, Camera*) override;
+ virtual void TickClouds(s32, Camera*) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void Destroy() override;
private:
size_t _numTrucks = 7;
diff --git a/src/engine/courses/Course.cpp b/src/engine/tracks/Track.cpp
index 2cc812d9f..ddcbcd9ff 100644
--- a/src/engine/courses/Course.cpp
+++ b/src/engine/tracks/Track.cpp
@@ -3,12 +3,11 @@
#include <string>
#include <cstring>
-#include "Course.h"
+#include "Track.h"
#include "MarioRaceway.h"
#include "ChocoMountain.h"
#include "port/Game.h"
#include "port/resource/type/TrackPathPointData.h"
-#include "port/resource/type/TrackSections.h"
#include "engine/editor/SceneManager.h"
#include "Registry.h"
#include "resourcebridge.h"
@@ -243,10 +242,10 @@ bool IsTriangleWindingInverted() {
}
-Course::Course() {
+Track::Track() {
Props.SetText(Props.Name, "Blank Track", sizeof(Props.Name));
Props.SetText(Props.DebugName, "blnktrck", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "100m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "100m", sizeof(Props.TrackLength));
// Props.Cup = FLOWER_CUP;
// Props.CupIndex = 3;
Id = "";
@@ -313,14 +312,14 @@ Course::Course() {
}
// Load custom track from code
-void Course::Load(Vtx* vtx, Gfx* gfx) {
- Course::Init();
+void Track::Load(Vtx* vtx, Gfx* gfx) {
+ Track::Init();
}
-void Course::UnLoad() {
+void Track::UnLoad() {
}
-void Course::LoadO2R(std::string trackPath) {
+void Track::LoadO2R(std::string trackPath) {
if (!trackPath.empty()) {
SceneFilePtr = (trackPath + "/scene.json");
TrackSectionsPtr = (trackPath + "/data_track_sections");
@@ -336,7 +335,7 @@ void Course::LoadO2R(std::string trackPath) {
u16* ptr = &Props.PathSizes.unk0;
for (auto& path : paths) {
if (i >= ARRAY_COUNT(Props.PathTable2)) {
- printf("[Course.cpp] The game can only import 5 paths. Found more than 5. Skipping the rest\n");
+ printf("[Track.cpp] The game can only import 5 paths. Found more than 5. Skipping the rest\n");
break; // Only 5 paths allowed. 4 track, 1 vehicle
}
ptr[i] = path.size();
@@ -348,12 +347,12 @@ void Course::LoadO2R(std::string trackPath) {
gVehiclePathSize = Props.PathSizes.unk0; // This is likely incorrect.
} else {
- printf("Course.cpp: LoadO2R: trackPath str is empty\n");
+ printf("Track.cpp: LoadO2R: trackPath str is empty\n");
}
}
// Load stock and o2r tracks
-void Course::Load() {
+void Track::Load() {
// Re-load scenefile in-case changes were made in the editor
if (!SceneFilePtr.empty()) {
Editor::LoadLevel(this, SceneFilePtr);
@@ -368,24 +367,24 @@ void Course::Load() {
size_t size = ResourceGetSizeByName(TrackSectionsPtr.c_str());
if (sections != nullptr) {
- Course::Init();
- ParseCourseSections(sections, size);
+ Track::Init();
+ ParseTrackSections(sections, size);
func_80295C6C();
if (Props.WaterLevel == FLT_MAX) {
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
} else {
- printf("Course.cpp: Custom track sections are invalid\n");
+ printf("Track.cpp: Custom track sections are invalid\n");
}
return;
}
- Course::Init();
+ Track::Init();
}
-// C++ version of parse_course_displaylists()
-void Course::ParseCourseSections(TrackSections* sections, size_t size) {
+// C++ version of parse_track_displaylists()
+void Track::ParseTrackSections(TrackSections* sections, size_t size) {
printf("\n[Track] Generating Collision Meshes...\n");
for (size_t i = 0; i < (size / sizeof(TrackSections)); i++) {
if (sections[i].flags & 0x8000) {
@@ -411,7 +410,7 @@ void Course::ParseCourseSections(TrackSections* sections, size_t size) {
printf("[Track] Collision Mesh Generation Complete!\n\n");
}
-void Course::TestPath() {
+void Track::TestPath() {
// DEBUG ONLY TO VISUALIZE PATH
return;
s16 x;
@@ -435,15 +434,15 @@ void Course::TestPath() {
}
}
-void Course::Init() {
+void Track::Init() {
gNumActors = 0;
- gCourseMinX = 0;
- gCourseMinY = 0;
- gCourseMinZ = 0;
+ gTrackMinX = 0;
+ gTrackMinY = 0;
+ gTrackMinZ = 0;
- gCourseMaxX = 0;
- gCourseMaxY = 0;
- gCourseMaxZ = 0;
+ gTrackMaxX = 0;
+ gTrackMaxY = 0;
+ gTrackMaxZ = 0;
D_8015F59C = 0;
D_8015F5A0 = 0;
@@ -455,14 +454,14 @@ void Course::Init() {
D_800DC5C8 = 0;
}
-void Course::BeginPlay() {
+void Track::BeginPlay() {
printf("[Track] BeginPlay\n");
TestPath();
this->SpawnActors();
}
// Spawns actors from SpawnParams set by the scene file in SceneManager.cpp
-void Course::SpawnActors() {
+void Track::SpawnActors() {
for (const auto& actor : SpawnList) {
auto it = gActorRegistry.find(actor.Name);
if (it != gActorRegistry.end() && it->second.spawnFunc) {
@@ -473,13 +472,13 @@ void Course::SpawnActors() {
}
}
-void Course::InitClouds() {
+void Track::InitClouds() {
if (this->Props.Clouds) {
init_clouds(this->Props.Clouds);
}
}
-void Course::UpdateClouds(s32 arg0, Camera* camera) {
+void Track::TickClouds(s32 arg0, Camera* camera) {
s32 cloudIndex;
s32 objectIndex;
CloudData* cloud;
@@ -494,46 +493,46 @@ void Course::UpdateClouds(s32 arg0, Camera* camera) {
}
// Adjusts player speed on steep hills
-void Course::SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6,
+void Track::SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6,
f32* arg7) {
func_8003E048(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
-void Course::InitCourseObjects() {
+void Track::InitTrackObjects() {
}
-void Course::UpdateCourseObjects() {
+void Track::TickTrackObjects() {
}
-void Course::RenderCourseObjects(s32 cameraId) {
+void Track::DrawTrackObjects(s32 cameraId) {
}
-// Implemented for the first cup of each course plus Koopa Beach
-void Course::SomeSounds() {
+// Implemented for the first cup of each track plus Koopa Beach
+void Track::SomeSounds() {
}
-void Course::CreditsSpawnActors() {
+void Track::CreditsSpawnActors() {
}
-void Course::WhatDoesThisDo(Player* player, int8_t playerId) {
+void Track::WhatDoesThisDo(Player* player, int8_t playerId) {
}
-void Course::WhatDoesThisDoAI(Player* player, int8_t playerId) {
+void Track::WhatDoesThisDoAI(Player* player, int8_t playerId) {
}
-void Course::SetStaffGhost() {
+void Track::SetStaffGhost() {
bCourseGhostDisabled = 1;
D_80162DF4 = 1;
}
-void Course::Waypoints(Player* player, int8_t playerId) {
+void Track::Waypoints(Player* player, int8_t playerId) {
player->nearestPathPointId = gNearestPathPointByPlayerId[playerId];
if (player->nearestPathPointId < 0) {
player->nearestPathPointId = gPathCountByPathIndex[0] + player->nearestPathPointId;
}
}
-void Course::Render(struct UnkStruct_800DC5EC* arg0) {
+void Track::Draw(ScreenContext* arg0) {
if (!TrackSectionsPtr.empty()) {
gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
@@ -555,14 +554,14 @@ void Course::Render(struct UnkStruct_800DC5EC* arg0) {
}
}
-void Course::RenderCredits() {
+void Track::DrawCredits() {
}
-f32 Course::GetWaterLevel(FVector pos, Collision* collision) {
+f32 Track::GetWaterLevel(FVector pos, Collision* collision) {
float highestWater = -FLT_MAX;
bool found = false;
- for (const auto& volume : gWorldInstance.GetCurrentCourse()->WaterVolumes) {
+ for (const auto& volume : gWorldInstance.GetTrack()->WaterVolumes) {
if (pos.x >= volume.MinX && pos.x <= volume.MaxX && pos.z >= volume.MinZ && pos.z <= volume.MaxZ) {
// Choose the highest water volume the player is over
if (!found || volume.Height > highestWater) {
@@ -572,21 +571,19 @@ f32 Course::GetWaterLevel(FVector pos, Collision* collision) {
}
}
- // If player is not over-top of a water volume then return the courses default water level
- return found ? highestWater : gWorldInstance.GetCurrentCourse()->Props.WaterLevel;
+ // If player is not over-top of a water volume then return the tracks default water level
+ return found ? highestWater : gWorldInstance.GetTrack()->Props.WaterLevel;
}
-void Course::ScrollingTextures() {
+void Track::ScrollingTextures() {
}
-void Course::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+void Track::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection) {
}
-void Course::Destroy() {
+void Track::Destroy() {
}
-bool Course::IsMod() {
+bool Track::IsMod() {
return bIsMod;
}
-
-Course* currentCourse = nullptr;
diff --git a/src/engine/courses/Course.h b/src/engine/tracks/Track.h
index cf1161de6..c8fb32dd8 100644
--- a/src/engine/courses/Course.h
+++ b/src/engine/tracks/Track.h
@@ -1,5 +1,5 @@
-#ifndef ENGINE_COURSE_H
-#define ENGINE_COURSE_H
+#ifndef ENGINE_TRACK_H
+#define ENGINE_TRACK_H
#include <libultraship/libultraship.h>
#include "CoreMath.h"
@@ -10,19 +10,18 @@
#include <nlohmann/json.hpp>
#include "engine/objects/Lakitu.h"
#include "engine/cameras/TourCamera.h"
-#include "port/resource/type/TrackSections.h"
extern "C" {
#endif
+#include "defines.h"
#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"
+#include "code_800029B0.h"
#ifdef __cplusplus
}
@@ -73,10 +72,23 @@ void InvertTriangleWindingByName(const char* name);
void RestoreTriangleWinding();
bool IsTriangleWindingInverted();
+/**
+ * A container of models that make up each section of the track
+ * The game displays each model depending on the location of the player
+ * and the direction they are facing
+ * This work is done in render_track_sections()
+ */
+typedef struct {
+ uint64_t crc;
+ u8 surfaceType; // Determines what kind of surface the player drives on (ex. dirt, asphalt, etc.)
+ u8 sectionId;
+ u16 flags;
+} TrackSections;
+
typedef struct Properties {
char Name[128];
char DebugName[128];
- char CourseLength[128];
+ char TrackLength[128];
int32_t LakituTowType;
MinimapProps Minimap;
const char* AIBehaviour;
@@ -86,7 +98,7 @@ typedef struct Properties {
float FarPersp;
int16_t* AIDistance;
uint32_t AISteeringSensitivity;
- _struct_gCoursePathSizes_0x10 PathSizes;
+ TrackPathSizes PathSizes;
Vec4f CurveTargetSpeed;
Vec4f NormalTargetSpeed;
Vec4f D_0D0096B8;
@@ -106,7 +118,7 @@ typedef struct Properties {
// j["Id"] = Id ? Id : "";
j["Name"] = Name ? Name : "";
j["DebugName"] = DebugName ? DebugName : "";
- j["CourseLength"] = CourseLength ? CourseLength : "";
+ j["TrackLength"] = TrackLength ? TrackLength : "";
//j["AIBehaviour"] = AIBehaviour ? AIBehaviour : "";
j["LakituTowType"] = LakituTowType;
j["AIMaximumSeparation"] = AIMaximumSeparation;
@@ -119,7 +131,7 @@ typedef struct Properties {
j["AISteeringSensitivity"] = AISteeringSensitivity;
- // PathSizes - Assuming _struct_gCoursePathSizes_0x10 can be serialized similarly
+ // PathSizes - Assuming TrackPathSizes can be serialized similarly
// j["PathSizes"] = PathSizes; // Implement your serialization logic here
j["CurveTargetSpeed"] = { CurveTargetSpeed[0], CurveTargetSpeed[1], CurveTargetSpeed[2], CurveTargetSpeed[3] };
@@ -175,9 +187,9 @@ typedef struct Properties {
strncpy(DebugName, j.at("DebugName").get<std::string>().c_str(), sizeof(DebugName) - 1);
DebugName[sizeof(DebugName) - 1] = '\0'; // Ensure null termination
- // CourseLength = j.at("CourseLength").get<std::string>().c_str();
- strncpy(CourseLength, j.at("CourseLength").get<std::string>().c_str(), sizeof(CourseLength) - 1);
- CourseLength[sizeof(CourseLength) - 1] = '\0'; // Ensure null termination
+ // TrackLength = j.at("TrackLength").get<std::string>().c_str();
+ strncpy(TrackLength, j.at("TrackLength").get<std::string>().c_str(), sizeof(TrackLength) - 1);
+ TrackLength[sizeof(TrackLength) - 1] = '\0'; // Ensure null termination
//AIBehaviour = j.at("AIBehaviour").get<std::string>().c_str();
LakituTowType = j.at("LakituTowType").get<int>();
@@ -194,7 +206,7 @@ typedef struct Properties {
// Copy the data into the existing AIDistances array
std::copy(temp.begin(), temp.end(), AIDistance);
} else {
- printf("Course::from_json() AIDistance array not size of 32\n");
+ printf("[Track.h] [from_json()] AIDistance array not size of 32\n");
}
AISteeringSensitivity = j.at("AISteeringSensitivity").get<uint32_t>();
@@ -287,7 +299,7 @@ typedef struct Properties {
void New() {
SetText(Name, "", sizeof(Name));
SetText(DebugName, "", sizeof(DebugName));
- SetText(CourseLength, "", sizeof(CourseLength));
+ SetText(TrackLength, "", sizeof(TrackLength));
}
#endif
@@ -298,7 +310,7 @@ typedef struct Properties {
class World; // <-- Forward declare
-class Course {
+class Track {
public:
std::string Id;
@@ -323,15 +335,15 @@ public:
std::vector<TourCamera::CameraShot> TourShots;
- virtual ~Course() = default;
+ virtual ~Track() = default;
- explicit Course();
+ explicit Track();
virtual void LoadO2R(std::string trackPath); // Load custom track from o2r
- virtual void Load(); // Decompress and load stock courses or from o2r but TrackSectionsPtr must be set.
+ virtual void Load(); // Decompress and load stock tracks or from o2r but TrackSectionsPtr must be set.
virtual void Load(Vtx* vtx, Gfx *gfx); // Load custom track from code. Load must be overridden and then call to this base class method impl.
virtual void UnLoad();
- virtual void ParseCourseSections(TrackSections* sections, size_t size);
+ virtual void ParseTrackSections(TrackSections* sections, size_t size);
/**
* @brief BeginPlay This function is called once at the start of gameplay.
@@ -341,23 +353,23 @@ public:
void SpawnActors();
virtual void TestPath();
virtual void InitClouds();
- virtual void UpdateClouds(s32, Camera*);
+ virtual void TickClouds(s32, Camera*);
virtual void SomeCollisionThing(Player *player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6, f32* arg7);
- virtual void InitCourseObjects();
- virtual void UpdateCourseObjects();
- virtual void RenderCourseObjects(s32 cameraId);
+ virtual void InitTrackObjects();
+ virtual void TickTrackObjects();
+ virtual void DrawTrackObjects(s32 cameraId);
virtual void SomeSounds();
virtual void CreditsSpawnActors();
virtual void WhatDoesThisDo(Player*, int8_t);
virtual void WhatDoesThisDoAI(Player*, int8_t);
virtual void SetStaffGhost();
- virtual void Render(struct UnkStruct_800DC5EC*);
- virtual void RenderCredits();
+ virtual void Draw(ScreenContext*);
+ virtual void DrawCredits();
virtual void Waypoints(Player* player, int8_t playerId);
virtual f32 GetWaterLevel(FVector pos, Collision* collision);
virtual void ScrollingTextures();
// Draw transparent models (water, signs, arrows, etc.)
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection);
virtual void Destroy();
virtual bool IsMod();
@@ -368,4 +380,4 @@ public:
#endif
-#endif // ENGINE_COURSE_H
+#endif // ENGINE_TRACK_H
diff --git a/src/engine/courses/WarioStadium.cpp b/src/engine/tracks/WarioStadium.cpp
index 9f900b885..8b728f36b 100644
--- a/src/engine/courses/WarioStadium.cpp
+++ b/src/engine/tracks/WarioStadium.cpp
@@ -33,7 +33,6 @@ extern "C" {
#include "code_8003DC40.h"
#include "memory.h"
#include "skybox_and_splitscreen.h"
-#include "course.h"
extern const char* wario_stadium_dls[108];
extern s16 currentScreenSection;
}
@@ -53,7 +52,7 @@ WarioStadium::WarioStadium() {
Props.SetText(Props.Name, "wario stadium", sizeof(Props.Name));
Props.SetText(Props.DebugName, "stadium", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "1591m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "1591m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D009310;
Props.AIMaximumSeparation = 50.0f;
@@ -117,7 +116,7 @@ WarioStadium::WarioStadium() {
}
void WarioStadium::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(wario_stadium_dls); i++) {
@@ -129,9 +128,9 @@ void WarioStadium::Load() {
InvertTriangleWindingByName(d_course_wario_stadium_packed_dl_EC0);
}
- parse_course_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_wario_stadium_addr));
+ parse_track_displaylists((TrackSections*) LOAD_ASSET_RAW(d_course_wario_stadium_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
// d_course_wario_stadium_packed_dl_C50
find_vtx_and_set_colours((Gfx*) d_course_wario_stadium_packed_dl_C50, 100, 255, 255, 255);
// d_course_wario_stadium_packed_dl_BD8
@@ -176,11 +175,11 @@ void WarioStadium::InitClouds() {
init_stars(this->Props.Clouds);
}
-void WarioStadium::UpdateClouds(s32 sp1C, Camera* camera) {
+void WarioStadium::TickClouds(s32 sp1C, Camera* camera) {
update_stars(sp1C, camera, this->Props.CloudList);
}
-void WarioStadium::InitCourseObjects() {
+void WarioStadium::InitTrackObjects() {
}
void WarioStadium::SomeSounds() {
@@ -237,7 +236,7 @@ void WarioStadium::CopyJumbotron(s32 ulx, s32 uly, s16 portionToDraw, u16* sourc
}
}
-void WarioStadium::Render(struct UnkStruct_800DC5EC* arg0) {
+void WarioStadium::Draw(ScreenContext* arg0) {
s16 prevFrame;
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
@@ -263,7 +262,7 @@ void WarioStadium::Render(struct UnkStruct_800DC5EC* arg0) {
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATERGBA, G_CC_MODULATERGBA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
- render_course_segments(wario_stadium_dls, arg0);
+ render_track_sections(wario_stadium_dls, arg0);
// d_course_wario_stadium_packed_dl_A228
gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_wario_stadium_packed_dl_A228);
@@ -296,7 +295,7 @@ void WarioStadium::Render(struct UnkStruct_800DC5EC* arg0) {
}
}
-void WarioStadium::RenderCredits() {
+void WarioStadium::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*) (d_course_wario_stadium_dl_CA78));
}
@@ -305,7 +304,7 @@ void WarioStadium::SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Ve
func_8003EE2C(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
-void WarioStadium::DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+void WarioStadium::DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection) {
gDPPipeSync(gDisplayListHead++);
diff --git a/src/engine/courses/WarioStadium.h b/src/engine/tracks/WarioStadium.h
index eb8c253f4..938d770c9 100644
--- a/src/engine/courses/WarioStadium.h
+++ b/src/engine/tracks/WarioStadium.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/wario_stadium/wario_stadium_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+#include "code_800029B0.h"
extern const course_texture wario_stadium_textures[];
}
-class WarioStadium : public Course {
+class WarioStadium : public Track {
void CopyJumbotron(s32 ulx, s32 uly, s16 portionToDraw, u16* source);
public:
@@ -30,16 +31,16 @@ class WarioStadium : public Course {
virtual void UnLoad() override;
virtual void BeginPlay() override;
virtual void InitClouds() override;
- virtual void UpdateClouds(s32, Camera*) override;
- virtual void InitCourseObjects() override;
+ virtual void TickClouds(s32, Camera*) override;
+ virtual void InitTrackObjects() override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6,
f32* arg7) override;
- virtual void DrawWater(struct UnkStruct_800DC5EC* screen, uint16_t pathCounter, uint16_t cameraRot,
+ virtual void DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
uint16_t playerDirection) override;
virtual void CreditsSpawnActors() override;
virtual void Destroy() override;
diff --git a/src/engine/courses/YoshiValley.cpp b/src/engine/tracks/YoshiValley.cpp
index c2506e568..35af33e39 100644
--- a/src/engine/courses/YoshiValley.cpp
+++ b/src/engine/tracks/YoshiValley.cpp
@@ -33,7 +33,6 @@ extern "C" {
#include "actors.h"
#include "collision.h"
#include "memory.h"
- #include "course.h"
extern const char *d_course_yoshi_valley_dl_list[124];
}
@@ -50,7 +49,7 @@ YoshiValley::YoshiValley() {
Props.SetText(Props.Name, "yoshi valley", sizeof(Props.Name));
Props.SetText(Props.DebugName, "maze", sizeof(Props.DebugName));
- Props.SetText(Props.CourseLength, "772m", sizeof(Props.CourseLength));
+ Props.SetText(Props.TrackLength, "772m", sizeof(Props.TrackLength));
Props.AIBehaviour = D_0D0090B8;
Props.AIMaximumSeparation = 35.0f;
@@ -108,7 +107,7 @@ YoshiValley::YoshiValley() {
}
void YoshiValley::Load() {
- Course::Load();
+ Track::Load();
if (gIsMirrorMode != 0) {
for (size_t i = 0; i < ARRAY_COUNT(d_course_yoshi_valley_dl_list); i++) {
@@ -118,9 +117,9 @@ void YoshiValley::Load() {
Lights1 lights4 = gdSPDefLights1(100, 100, 100, 255, 254, 254, 0, 0, 120);
set_track_light_direction(&lights4, -0x38F0, 0x1C70, 1);
- parse_course_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_yoshi_valley_addr));
+ parse_track_displaylists((TrackSections*)LOAD_ASSET_RAW(d_course_yoshi_valley_addr));
func_80295C6C();
- Props.WaterLevel = gCourseMinY - 10.0f;
+ Props.WaterLevel = gTrackMinY - 10.0f;
}
void YoshiValley::UnLoad() {
@@ -135,7 +134,7 @@ void YoshiValley::BeginPlay() {
spawn_foliage((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_yoshi_valley_tree_spawn));
spawn_all_item_boxes((struct ActorSpawnData*)LOAD_ASSET_RAW(d_course_yoshi_valley_item_box_spawns));
vec3f_set(position, -2300.0f, 0.0f, 634.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
add_actor_to_empty_slot(position, rotation, velocity, ACTOR_YOSHI_EGG);
if (gGamestate != CREDITS_SEQUENCE) {
@@ -177,13 +176,13 @@ void YoshiValley::BeginPlay() {
}
}
-void YoshiValley::InitCourseObjects() {
+void YoshiValley::InitTrackObjects() {
}
-void YoshiValley::UpdateCourseObjects() {
+void YoshiValley::TickTrackObjects() {
}
-void YoshiValley::RenderCourseObjects(s32 cameraId) {
+void YoshiValley::DrawTrackObjects(s32 cameraId) {
}
void YoshiValley::SomeSounds() {
@@ -193,16 +192,16 @@ void YoshiValley::WhatDoesThisDo(Player* player, int8_t playerId) {}
void YoshiValley::WhatDoesThisDoAI(Player* player, int8_t playerId) {}
-void YoshiValley::Render(struct UnkStruct_800DC5EC* arg0) {
+void YoshiValley::Draw(ScreenContext* arg0) {
gDPPipeSync(gDisplayListHead++);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEI, G_CC_MODULATEI);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING);
- render_course_segments(d_course_yoshi_valley_dl_list, arg0);
+ render_track_sections(d_course_yoshi_valley_dl_list, arg0);
gDPPipeSync(gDisplayListHead++);
}
-void YoshiValley::RenderCredits() {
+void YoshiValley::DrawCredits() {
gSPDisplayList(gDisplayListHead++, (Gfx*)(d_course_yoshi_valley_dl_18020));
}
@@ -218,7 +217,7 @@ void YoshiValley::CreditsSpawnActors() {
Vec3s rotation = { 0, 0, 0 };
vec3f_set(position, -2300.0f, 0.0f, 634.0f);
- position[0] *= gCourseDirection;
+ position[0] *= gTrackDirection;
add_actor_to_empty_slot(position, rotation, velocity, ACTOR_YOSHI_EGG);
}
diff --git a/src/engine/courses/YoshiValley.h b/src/engine/tracks/YoshiValley.h
index 88a306533..644ab3b48 100644
--- a/src/engine/courses/YoshiValley.h
+++ b/src/engine/tracks/YoshiValley.h
@@ -1,7 +1,7 @@
#pragma once
#include <libultraship.h>
-#include "Course.h"
+#include "Track.h"
extern "C" {
#include "assets/models/tracks/yoshi_valley/yoshi_valley_vertices.h"
@@ -12,10 +12,11 @@ extern "C" {
#include "data/some_data.h"
#include "objects.h"
#include "path_spawn_metadata.h"
+ #include "code_800029B0.h"
extern const course_texture yoshi_valley_textures[];
}
-class YoshiValley : public Course {
+class YoshiValley : public Track {
public:
virtual ~YoshiValley() = default; // Virtual destructor for proper cleanup in derived classes
@@ -27,14 +28,14 @@ public:
virtual void Load() override;
virtual void UnLoad() override;
virtual void BeginPlay() override;
- virtual void InitCourseObjects() override;
- virtual void UpdateCourseObjects() override;
- virtual void RenderCourseObjects(s32 cameraId) override;
+ virtual void InitTrackObjects() override;
+ virtual void TickTrackObjects() override;
+ virtual void DrawTrackObjects(s32 cameraId) override;
virtual void SomeSounds() override;
virtual void WhatDoesThisDo(Player* player, int8_t playerId) override;
virtual void WhatDoesThisDoAI(Player* player, int8_t playerId) override;
- virtual void Render(struct UnkStruct_800DC5EC*) override;
- virtual void RenderCredits() override;
+ virtual void Draw(ScreenContext*) override;
+ virtual void DrawCredits() override;
virtual void ScrollingTextures() override;
virtual void Waypoints(Player* player, int8_t playerId) override;
virtual void CreditsSpawnActors() override;
diff --git a/src/engine/vehicles/Train.cpp b/src/engine/vehicles/Train.cpp
index 23724fad6..8b728375e 100644
--- a/src/engine/vehicles/Train.cpp
+++ b/src/engine/vehicles/Train.cpp
@@ -4,7 +4,7 @@
#include "Train.h"
#include <vector>
-#include "engine/courses/Course.h"
+#include "engine/tracks/Track.h"
#include "engine/vehicles/Utils.h"
#include "engine/World.h"
#include "port/Game.h"