mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-09-02 18:32:49 -04:00
Refactor Track Class To Instantiate On Track Load (#587)
* Initial Commit * First compilation of Registry template * Further changes * wip changes * Impl TrackBrowser and Registry Info * Remove const from TInfo * Prep GetWorld * Name refactor * Refactor gWorldInstance to GetWorld() * wip * Should work now * Data menu work again * Fix editor staying open after program close * Rename LoadLevel to LoadTrackDataFromJson * More changes * Add statue * Add search to content browser using tags * Fix statue pos and register tags * Fix actor loading * Fix delete all bug which deleted cameras * reduce some boiler plate in actor and object * Remove unused rulesets * Search bar for all tabs * fix data screen * fix actor spawning * temp editor fix * Clean up * improve extra mode transformation * fix podium crash * Fix editor clicking * Fix editor clicking 2 * fix extra in custom track * Fix FI for three actors * Fix divide by zero error * Ids managed by Registry * Add scary comment --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com> Co-authored-by: coco875 <pereira.jannin@gmail.com>
This commit is contained in:
+237
-285
@@ -4,29 +4,9 @@
|
||||
#include "port/Engine.h"
|
||||
|
||||
#include <fast/Fast3dWindow.h>
|
||||
#include <memory>
|
||||
#include "engine/World.h"
|
||||
#include "engine/tracks/Track.h"
|
||||
#include "engine/tracks/MarioRaceway.h"
|
||||
#include "engine/tracks/ChocoMountain.h"
|
||||
#include "engine/tracks/BowsersCastle.h"
|
||||
#include "engine/tracks/BansheeBoardwalk.h"
|
||||
#include "engine/tracks/YoshiValley.h"
|
||||
#include "engine/tracks/FrappeSnowland.h"
|
||||
#include "engine/tracks/KoopaTroopaBeach.h"
|
||||
#include "engine/tracks/RoyalRaceway.h"
|
||||
#include "engine/tracks/LuigiRaceway.h"
|
||||
#include "engine/tracks/MooMooFarm.h"
|
||||
#include "engine/tracks/ToadsTurnpike.h"
|
||||
#include "engine/tracks/KalimariDesert.h"
|
||||
#include "engine/tracks/SherbetLand.h"
|
||||
#include "engine/tracks/RainbowRoad.h"
|
||||
#include "engine/tracks/WarioStadium.h"
|
||||
#include "engine/tracks/BlockFort.h"
|
||||
#include "engine/tracks/Skyscraper.h"
|
||||
#include "engine/tracks/DoubleDeck.h"
|
||||
#include "engine/tracks/DKJungle.h"
|
||||
#include "engine/tracks/BigDonut.h"
|
||||
#include "engine/tracks/TestTrack.h"
|
||||
#include "engine/AllTracks.h"
|
||||
|
||||
#include "engine/tracks/PodiumCeremony.h"
|
||||
|
||||
@@ -42,13 +22,15 @@
|
||||
|
||||
#include "engine/editor/Editor.h"
|
||||
#include "engine/editor/SceneManager.h"
|
||||
#include "RegisteredActors.h"
|
||||
#include "RegisterContent.h"
|
||||
|
||||
#include "engine/cameras/GameCamera.h"
|
||||
#include "engine/cameras/FreeCamera.h"
|
||||
#include "engine/cameras/TourCamera.h"
|
||||
#include "engine/cameras/LookBehindCamera.h"
|
||||
|
||||
#include "engine/TrackBrowser.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <locale.h>
|
||||
#endif
|
||||
@@ -71,12 +53,12 @@ extern "C" void Graphics_PushFrame(Gfx* data) {
|
||||
}
|
||||
|
||||
// Create the world instance
|
||||
World gWorldInstance;
|
||||
static World sWorldInstance;
|
||||
|
||||
// Deferred cleaning when clearing all actors in the editor
|
||||
bool bCleanWorld = false;
|
||||
|
||||
std::shared_ptr<PodiumCeremony> gPodiumCeremony;
|
||||
std::unique_ptr<PodiumCeremony> gPodiumCeremony;
|
||||
|
||||
Cup* gMushroomCup;
|
||||
Cup* gFlowerCup;
|
||||
@@ -90,68 +72,78 @@ Editor::Editor gEditor;
|
||||
|
||||
s32 gTrophyIndex = NULL;
|
||||
|
||||
Registry<TrackInfo> gTrackRegistry;
|
||||
Registry<ActorInfo, const SpawnParams&> gActorRegistry;
|
||||
|
||||
std::unique_ptr<TrackBrowser> gTrackBrowser;
|
||||
|
||||
World* GetWorld() {
|
||||
return World::Instance;
|
||||
}
|
||||
|
||||
void CustomEngineInit() {
|
||||
/* Add all tracks to the global track list */
|
||||
std::shared_ptr<Track> mario = gWorldInstance.AddTrack(std::make_shared<MarioRaceway>());
|
||||
std::shared_ptr<Track> choco = gWorldInstance.AddTrack(std::make_shared<ChocoMountain>());
|
||||
std::shared_ptr<Track> bowser = gWorldInstance.AddTrack(std::make_shared<BowsersCastle>());
|
||||
std::shared_ptr<Track> banshee = gWorldInstance.AddTrack(std::make_shared<BansheeBoardwalk>());
|
||||
std::shared_ptr<Track> yoshi = gWorldInstance.AddTrack(std::make_shared<YoshiValley>());
|
||||
std::shared_ptr<Track> frappe = gWorldInstance.AddTrack(std::make_shared<FrappeSnowland>());
|
||||
std::shared_ptr<Track> koopa = gWorldInstance.AddTrack(std::make_shared<KoopaTroopaBeach>());
|
||||
std::shared_ptr<Track> royal = gWorldInstance.AddTrack(std::make_shared<RoyalRaceway>());
|
||||
std::shared_ptr<Track> luigi = gWorldInstance.AddTrack(std::make_shared<LuigiRaceway>());
|
||||
std::shared_ptr<Track> mooMoo = gWorldInstance.AddTrack(std::make_shared<MooMooFarm>());
|
||||
std::shared_ptr<Track> toads = gWorldInstance.AddTrack(std::make_shared<ToadsTurnpike>());
|
||||
std::shared_ptr<Track> kalimari = gWorldInstance.AddTrack(std::make_shared<KalimariDesert>());
|
||||
std::shared_ptr<Track> sherbet = gWorldInstance.AddTrack(std::make_shared<SherbetLand>());
|
||||
std::shared_ptr<Track> rainbow = gWorldInstance.AddTrack(std::make_shared<RainbowRoad>());
|
||||
std::shared_ptr<Track> wario = gWorldInstance.AddTrack(std::make_shared<WarioStadium>());
|
||||
std::shared_ptr<Track> block = gWorldInstance.AddTrack(std::make_shared<BlockFort>());
|
||||
std::shared_ptr<Track> skyscraper = gWorldInstance.AddTrack(std::make_shared<Skyscraper>());
|
||||
std::shared_ptr<Track> doubleDeck = gWorldInstance.AddTrack(std::make_shared<DoubleDeck>());
|
||||
std::shared_ptr<Track> dkJungle = gWorldInstance.AddTrack(std::make_shared<DKJungle>());
|
||||
std::shared_ptr<Track> bigDonut = gWorldInstance.AddTrack(std::make_shared<BigDonut>());
|
||||
// std::shared_ptr<Track> harbour = gWorldInstance.AddTrack(std::make_shared<Harbour>());
|
||||
std::shared_ptr<Track> testTrack = gWorldInstance.AddTrack(std::make_shared<TestTrack>());
|
||||
// Close the editor because lus remembers if it was open
|
||||
// This also turns off freecam
|
||||
gEditor.Disable();
|
||||
|
||||
RegisterTracks(gTrackRegistry);
|
||||
gTrackBrowser = std::make_unique<TrackBrowser>(gTrackRegistry);
|
||||
TrackBrowser::Instance->FindCustomTracks();
|
||||
TrackBrowser::Instance->Refresh(gTrackRegistry);
|
||||
|
||||
gPodiumCeremony = std::make_unique<PodiumCeremony>();
|
||||
|
||||
// Construct cups with vectors of Track* (non-owning references)
|
||||
gMushroomCup = new Cup("mk:mushroom_cup", "Mushroom Cup", {
|
||||
luigi, mooMoo, koopa, kalimari
|
||||
"mk:luigi_raceway",
|
||||
"mk:moo_moo_farm",
|
||||
"mk:koopa_troopa_beach",
|
||||
"mk:kalimari_desert"
|
||||
});
|
||||
|
||||
gFlowerCup = new Cup("mk:flower_cup", "Flower Cup", {
|
||||
toads, frappe, choco, mario
|
||||
"mk:toads_turnpike",
|
||||
"mk:frappe_snowland",
|
||||
"mk:choco_mountain",
|
||||
"mk:mario_raceway"
|
||||
});
|
||||
|
||||
gStarCup = new Cup("mk:star_cup", "Star Cup", {
|
||||
wario, sherbet, royal, bowser
|
||||
"mk:wario_stadium",
|
||||
"mk:sherbet_land",
|
||||
"mk:royal_raceway",
|
||||
"mk:bowsers_castle"
|
||||
});
|
||||
|
||||
gSpecialCup = new Cup("mk:special_cup", "Special Cup", {
|
||||
dkJungle, yoshi, banshee, rainbow
|
||||
"mk:dk_jungle",
|
||||
"mk:yoshi_valley",
|
||||
"mk:banshee_boardwalk",
|
||||
"mk:rainbow_road"
|
||||
});
|
||||
|
||||
gBattleCup = new Cup("mk:battle_cup", "Battle Cup", {
|
||||
bigDonut, block, doubleDeck, skyscraper
|
||||
"mk:big_donut",
|
||||
"mk:block_fort",
|
||||
"mk:double_deck",
|
||||
"mk:skyscraper"
|
||||
});
|
||||
|
||||
/* Instantiate Cups */
|
||||
gWorldInstance.AddCup(gMushroomCup);
|
||||
gWorldInstance.AddCup(gFlowerCup);
|
||||
gWorldInstance.AddCup(gStarCup);
|
||||
gWorldInstance.AddCup(gSpecialCup);
|
||||
gWorldInstance.AddCup(gBattleCup);
|
||||
GetWorld()->AddCup(gMushroomCup);
|
||||
GetWorld()->AddCup(gFlowerCup);
|
||||
GetWorld()->AddCup(gStarCup);
|
||||
GetWorld()->AddCup(gSpecialCup);
|
||||
GetWorld()->AddCup(gBattleCup);
|
||||
|
||||
//SelectMarioRaceway(); // This results in a nullptr
|
||||
SetMarioRaceway();
|
||||
|
||||
RegisterGameActors();
|
||||
RegisterActors(gActorRegistry);
|
||||
}
|
||||
|
||||
void CustomEngineDestroy() {
|
||||
gTrackRegistry.Clear();
|
||||
gActorRegistry.Clear();
|
||||
gPodiumCeremony = nullptr;
|
||||
delete gMushroomCup;
|
||||
delete gFlowerCup;
|
||||
delete gStarCup;
|
||||
@@ -175,75 +167,46 @@ void HM_DrawIntro() {
|
||||
|
||||
// Set default track; mario raceway
|
||||
void SetMarioRaceway(void) {
|
||||
SetTrackById(0);
|
||||
gWorldInstance.SetCurrentCup(gMushroomCup);
|
||||
gWorldInstance.GetCurrentCup()->CursorPosition = 3;
|
||||
gWorldInstance.CupIndex = 0;
|
||||
SelectMarioRaceway();
|
||||
GetWorld()->SetCurrentCup(gMushroomCup);
|
||||
GetWorld()->GetCurrentCup()->CursorPosition = 3;
|
||||
GetWorld()->CupIndex = 0;
|
||||
}
|
||||
|
||||
u32 WorldNextCup(void) {
|
||||
return gWorldInstance.NextCup();
|
||||
return GetWorld()->NextCup();
|
||||
}
|
||||
|
||||
u32 WorldPreviousCup(void) {
|
||||
return gWorldInstance.PreviousCup();
|
||||
return GetWorld()->PreviousCup();
|
||||
}
|
||||
|
||||
void CM_SetCup(void* cup) {
|
||||
gWorldInstance.SetCurrentCup((Cup*) cup);
|
||||
GetWorld()->SetCurrentCup((Cup*) cup);
|
||||
}
|
||||
|
||||
void* GetCup() {
|
||||
return gWorldInstance.GetCurrentCup();
|
||||
return GetWorld()->GetCurrentCup();
|
||||
}
|
||||
|
||||
u32 GetCupIndex(void) {
|
||||
return gWorldInstance.GetCupIndex();
|
||||
return GetWorld()->GetCupIndex();
|
||||
}
|
||||
|
||||
void CM_SetCupIndex(size_t index) {
|
||||
gWorldInstance.SetCupIndex(index);
|
||||
GetWorld()->SetCupIndex(index);
|
||||
}
|
||||
|
||||
const char* GetCupName(void) {
|
||||
return gWorldInstance.GetCurrentCup()->Name;
|
||||
return GetWorld()->GetCurrentCup()->Name;
|
||||
}
|
||||
|
||||
void LoadTrack() {
|
||||
gWorldInstance.GetRaceManager().Load();
|
||||
}
|
||||
|
||||
// Unload can be call to frequently so even when if the track wasn't loaded before
|
||||
void UnLoadTrack() {
|
||||
gWorldInstance.GetRaceManager().UnLoad();
|
||||
}
|
||||
|
||||
size_t GetTrackIndex() {
|
||||
return gWorldInstance.TrackIndex;
|
||||
}
|
||||
|
||||
void SetTrack(const char* name) {
|
||||
gWorldInstance.SetTrack(name);
|
||||
}
|
||||
|
||||
void NextTrack() {
|
||||
gWorldInstance.NextTrack();
|
||||
}
|
||||
|
||||
void PreviousTrack() {
|
||||
gWorldInstance.PreviousTrack();
|
||||
}
|
||||
|
||||
void SetTrackById(s32 track) {
|
||||
if (track < 0 || track >= gWorldInstance.Tracks.size()) {
|
||||
return;
|
||||
}
|
||||
gWorldInstance.TrackIndex = track;
|
||||
gWorldInstance.SetCurrentTrack(gWorldInstance.Tracks[gWorldInstance.TrackIndex]);
|
||||
GetWorld()->GetRaceManager().Load();
|
||||
}
|
||||
|
||||
void CM_VehicleCollision(s32 playerId, Player* player) {
|
||||
for (auto& actor : gWorldInstance.Actors) {
|
||||
for (auto& actor : GetWorld()->Actors) {
|
||||
if (actor) {
|
||||
actor->VehicleCollision(playerId, player);
|
||||
}
|
||||
@@ -251,9 +214,9 @@ void CM_VehicleCollision(s32 playerId, Player* player) {
|
||||
}
|
||||
|
||||
void CM_BombKartsWaypoint(s32 cameraId) {
|
||||
for (auto& object : gWorldInstance.Objects) {
|
||||
if (auto kart = dynamic_cast<OBombKart*>(object)) {
|
||||
if (kart) {
|
||||
for (auto& object : GetWorld()->Objects) {
|
||||
if (auto* kart = dynamic_cast<OBombKart*>(object.get())) {
|
||||
if (kart != nullptr) {
|
||||
kart->Waypoint(cameraId);
|
||||
}
|
||||
}
|
||||
@@ -267,26 +230,26 @@ void CM_DisplayBattleBombKart(s32 playerId, s32 primAlpha) {
|
||||
}
|
||||
|
||||
if (primAlpha == 0) {
|
||||
gWorldInstance.playerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::DISABLED;
|
||||
gWorldInstance.playerBombKart[playerId]._primAlpha = primAlpha;
|
||||
GetWorld()->mPlayerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::DISABLED;
|
||||
GetWorld()->mPlayerBombKart[playerId]._primAlpha = primAlpha;
|
||||
} else {
|
||||
gWorldInstance.playerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::ACTIVE;
|
||||
gWorldInstance.playerBombKart[playerId]._primAlpha = primAlpha;
|
||||
GetWorld()->mPlayerBombKart[playerId].state = PlayerBombKart::PlayerBombKartState::ACTIVE;
|
||||
GetWorld()->mPlayerBombKart[playerId]._primAlpha = primAlpha;
|
||||
}
|
||||
}
|
||||
|
||||
void CM_DrawBattleBombKarts(s32 cameraId) {
|
||||
for (size_t i = 0; i < gPlayerCount; i++) {
|
||||
gWorldInstance.playerBombKart[i].Draw(i, cameraId);
|
||||
GetWorld()->mPlayerBombKart[i].Draw(i, cameraId);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_ClearVehicles(void) {
|
||||
gWorldInstance.Crossings.clear();
|
||||
GetWorld()->Crossings.clear();
|
||||
}
|
||||
|
||||
void CM_CrossingTrigger() {
|
||||
for (auto& crossing : gWorldInstance.Crossings) {
|
||||
for (auto& crossing : GetWorld()->Crossings) {
|
||||
if (crossing) {
|
||||
crossing->CrossingTrigger();
|
||||
}
|
||||
@@ -294,7 +257,7 @@ void CM_CrossingTrigger() {
|
||||
}
|
||||
|
||||
void CM_AICrossingBehaviour(s32 playerId) {
|
||||
for (auto& crossing : gWorldInstance.Crossings) {
|
||||
for (auto& crossing : GetWorld()->Crossings) {
|
||||
if (crossing) {
|
||||
crossing->AICrossingBehaviour(playerId);
|
||||
}
|
||||
@@ -317,15 +280,15 @@ s32 CM_GetCrossingOnTriggered(uintptr_t* crossing) {
|
||||
* They do not use DrawCredits() and they do not use track sections.
|
||||
*/
|
||||
void CM_DrawTrack(ScreenContext* screen) {
|
||||
if (nullptr == gWorldInstance.GetTrack()) {
|
||||
if (nullptr == GetWorld()->GetTrack()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Custom tracks should never use DrawCredits();
|
||||
if (gWorldInstance.GetTrack()->IsMod()) {
|
||||
if (GetWorld()->GetTrack()->IsMod()) {
|
||||
switch(screen->camera->renderMode) {
|
||||
default:
|
||||
gWorldInstance.GetTrack()->Draw(screen);
|
||||
GetWorld()->GetTrack()->Draw(screen);
|
||||
break;
|
||||
case RENDER_COLLISION_MESH:
|
||||
render_collision();
|
||||
@@ -334,10 +297,10 @@ void CM_DrawTrack(ScreenContext* screen) {
|
||||
} else {
|
||||
switch(screen->camera->renderMode) {
|
||||
case RENDER_FULL_SCENE:
|
||||
gWorldInstance.GetTrack()->DrawCredits();
|
||||
GetWorld()->GetTrack()->DrawCredits();
|
||||
break;
|
||||
case RENDER_TRACK_SECTIONS:
|
||||
gWorldInstance.GetTrack()->Draw(screen);
|
||||
GetWorld()->GetTrack()->Draw(screen);
|
||||
break;
|
||||
case RENDER_COLLISION_MESH:
|
||||
render_collision();
|
||||
@@ -347,20 +310,20 @@ void CM_DrawTrack(ScreenContext* screen) {
|
||||
}
|
||||
|
||||
void CM_TickActors() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.TickActors();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->TickActors();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_DrawActors(Camera* camera) {
|
||||
//AActor* a = gWorldInstance.ConvertActorToAActor(actor);
|
||||
for (const auto& actor : gWorldInstance.Actors) {
|
||||
//AActor* a = GetWorld()->ConvertActorToAActor(actor);
|
||||
for (const auto& actor : GetWorld()->Actors) {
|
||||
if (actor->IsMod()) {
|
||||
actor->Draw(camera);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto* camera : gWorldInstance.Cameras) {
|
||||
for (auto* camera : GetWorld()->Cameras) {
|
||||
if (auto* tourCam = dynamic_cast<TourCamera*>(camera)) {
|
||||
if (tourCam->IsActive()) {
|
||||
tourCam->Draw();
|
||||
@@ -370,40 +333,33 @@ void CM_DrawActors(Camera* camera) {
|
||||
}
|
||||
|
||||
void CM_DrawStaticMeshActors() {
|
||||
gWorldInstance.DrawStaticMeshActors();
|
||||
GetWorld()->DrawStaticMeshActors();
|
||||
}
|
||||
|
||||
void CM_BeginPlay() {
|
||||
static bool tour = false;
|
||||
auto track = gWorldInstance.GetTrack();
|
||||
auto track = GetWorld()->GetTrack();
|
||||
|
||||
if (nullptr == track) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tour) {
|
||||
// gWorldInstance.Cameras[2]->SetActive(true);
|
||||
// gScreenOneCtx->camera = gWorldInstance.Cameras[2]->Get();
|
||||
if (reinterpret_cast<TourCamera*>(gWorldInstance.Cameras[2])->IsTourComplete()) {
|
||||
// GetWorld()->Cameras[2]->SetActive(true);
|
||||
// gScreenOneCtx->camera = GetWorld()->Cameras[2]->Get();
|
||||
if (reinterpret_cast<TourCamera*>(GetWorld()->Cameras[2])->IsTourComplete()) {
|
||||
tour = false;
|
||||
gScreenOneCtx->pendingCamera = &cameras[0];
|
||||
}
|
||||
}
|
||||
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
// This line should likely be moved.
|
||||
// It's here so PreInit is after the scene file has been loaded
|
||||
// It used to be at the start of BeginPlay
|
||||
Editor::LoadLevel(gWorldInstance.GetTrack().get(), gWorldInstance.GetTrack()->SceneFilePtr);
|
||||
}
|
||||
|
||||
gWorldInstance.GetRaceManager().PreInit();
|
||||
gWorldInstance.GetRaceManager().BeginPlay();
|
||||
gWorldInstance.GetRaceManager().PostInit();
|
||||
GetWorld()->GetRaceManager().PreInit();
|
||||
GetWorld()->GetRaceManager().BeginPlay();
|
||||
GetWorld()->GetRaceManager().PostInit();
|
||||
}
|
||||
|
||||
Camera* CM_GetPlayerCamera(s32 playerIndex) {
|
||||
for (GameCamera* cam : gWorldInstance.Cameras) {
|
||||
for (GameCamera* cam : GetWorld()->Cameras) {
|
||||
// Make sure this is a player camera and not a different type of camera
|
||||
if (typeid(*cam) == typeid(GameCamera)) {
|
||||
Camera* camera = cam->Get();
|
||||
@@ -416,7 +372,7 @@ Camera* CM_GetPlayerCamera(s32 playerIndex) {
|
||||
}
|
||||
|
||||
void CM_SetViewProjection(Camera* camera) {
|
||||
for (GameCamera* gameCamera : gWorldInstance.Cameras) {
|
||||
for (GameCamera* gameCamera : GetWorld()->Cameras) {
|
||||
if (camera == gameCamera->Get()) {
|
||||
gameCamera->SetViewProjection();
|
||||
}
|
||||
@@ -424,62 +380,62 @@ void CM_SetViewProjection(Camera* camera) {
|
||||
}
|
||||
|
||||
void CM_TickCameras() {
|
||||
gWorldInstance.TickCameras();
|
||||
GetWorld()->TickCameras();
|
||||
}
|
||||
|
||||
Camera* CM_AddCamera(Vec3f spawn, s16 rot, u32 mode) {
|
||||
if (gWorldInstance.Cameras.size() >= NUM_CAMERAS) {
|
||||
if (GetWorld()->Cameras.size() >= NUM_CAMERAS) {
|
||||
printf("Reached the max number of cameras, %d\n", NUM_CAMERAS);
|
||||
return nullptr;
|
||||
}
|
||||
gWorldInstance.Cameras.push_back(new GameCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return gWorldInstance.Cameras.back()->Get();
|
||||
GetWorld()->Cameras.push_back(new GameCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return GetWorld()->Cameras.back()->Get();
|
||||
}
|
||||
|
||||
Camera* CM_AddFreeCamera(Vec3f spawn, s16 rot, u32 mode) {
|
||||
if (gWorldInstance.Cameras.size() >= NUM_CAMERAS) {
|
||||
if (GetWorld()->Cameras.size() >= NUM_CAMERAS) {
|
||||
printf("Reached the max number of cameras, %d\n", NUM_CAMERAS);
|
||||
return nullptr;
|
||||
}
|
||||
gWorldInstance.Cameras.push_back(new FreeCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return gWorldInstance.Cameras.back()->Get();
|
||||
GetWorld()->Cameras.push_back(new FreeCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return GetWorld()->Cameras.back()->Get();
|
||||
}
|
||||
|
||||
Camera* CM_AddTourCamera(Vec3f spawn, s16 rot, u32 mode) {
|
||||
if (gWorldInstance.Cameras.size() >= NUM_CAMERAS) {
|
||||
if (GetWorld()->Cameras.size() >= NUM_CAMERAS) {
|
||||
// This is to prevent soft locking the game
|
||||
printf("Reached the max number of cameras, %d\n", NUM_CAMERAS);
|
||||
if (gWorldInstance.GetTrack()->bTourEnabled) {
|
||||
if (GetWorld()->GetTrack()->bTourEnabled) {
|
||||
spawn_and_set_player_spawns();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (nullptr == gWorldInstance.GetTrack()) {
|
||||
if (nullptr == GetWorld()->GetTrack()) {
|
||||
// This is to prevent soft locking the game
|
||||
if (gWorldInstance.GetTrack()->bTourEnabled) {
|
||||
if (GetWorld()->GetTrack()->bTourEnabled) {
|
||||
spawn_and_set_player_spawns();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (gWorldInstance.GetTrack()->TourShots.size() == 0) {
|
||||
if (GetWorld()->GetTrack()->TourShots.size() == 0) {
|
||||
// This is to prevent soft locking the game
|
||||
if (gWorldInstance.GetTrack()->bTourEnabled) {
|
||||
if (GetWorld()->GetTrack()->bTourEnabled) {
|
||||
spawn_and_set_player_spawns();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
gWorldInstance.Cameras.push_back(new TourCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
TourCamera* tour = static_cast<TourCamera*>(gWorldInstance.Cameras.back());
|
||||
GetWorld()->Cameras.push_back(new TourCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
TourCamera* tour = static_cast<TourCamera*>(GetWorld()->Cameras.back());
|
||||
tour->SetActive(true);
|
||||
return tour->Get();
|
||||
}
|
||||
|
||||
bool CM_IsTourEnabled() {
|
||||
if (nullptr != gWorldInstance.GetTrack()) {
|
||||
if ((gWorldInstance.GetTrack()->bTourEnabled) && (gTourComplete == false)) {
|
||||
if (nullptr != GetWorld()->GetTrack()) {
|
||||
if ((GetWorld()->GetTrack()->bTourEnabled) && (gTourComplete == false)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -490,12 +446,12 @@ bool CM_IsTourEnabled() {
|
||||
}
|
||||
|
||||
Camera* CM_AddLookBehindCamera(Vec3f spawn, s16 rot, u32 mode) {
|
||||
if (gWorldInstance.Cameras.size() >= NUM_CAMERAS) {
|
||||
if (GetWorld()->Cameras.size() >= NUM_CAMERAS) {
|
||||
printf("Reached the max number of cameras, %d\n", NUM_CAMERAS);
|
||||
return nullptr;
|
||||
}
|
||||
gWorldInstance.Cameras.push_back(new LookBehindCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return gWorldInstance.Cameras.back()->Get();
|
||||
GetWorld()->Cameras.push_back(new LookBehindCamera(FVector(spawn[0], spawn[1], spawn[2]), rot, mode));
|
||||
return GetWorld()->Cameras.back()->Get();
|
||||
}
|
||||
|
||||
void CM_AttachCamera(Camera* camera, s32 playerIdx) {
|
||||
@@ -503,13 +459,13 @@ void CM_AttachCamera(Camera* camera, s32 playerIdx) {
|
||||
}
|
||||
|
||||
void CM_CameraSetActive(size_t idx, bool state) {
|
||||
if (idx < gWorldInstance.Cameras.size()) {
|
||||
gWorldInstance.Cameras[idx]->SetActive(state);
|
||||
if (idx < GetWorld()->Cameras.size()) {
|
||||
GetWorld()->Cameras[idx]->SetActive(state);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_SetFreeCamera(bool state) {
|
||||
for (auto* cam : gWorldInstance.Cameras) {
|
||||
for (auto* cam : GetWorld()->Cameras) {
|
||||
if (cam->Get() == gScreenOneCtx->freeCamera) {
|
||||
if (state) {
|
||||
gScreenOneCtx->pendingCamera = gScreenOneCtx->freeCamera;
|
||||
@@ -529,7 +485,7 @@ void CM_SetFreeCamera(bool state) {
|
||||
}
|
||||
|
||||
void CM_ActivateTourCamera(Camera* camera) {
|
||||
for (auto* cam : gWorldInstance.Cameras) {
|
||||
for (auto* cam : GetWorld()->Cameras) {
|
||||
if (cam->Get() == camera) {
|
||||
cam->SetActive(true);
|
||||
}
|
||||
@@ -537,22 +493,22 @@ void CM_ActivateTourCamera(Camera* camera) {
|
||||
}
|
||||
|
||||
void CM_TickObjects() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.TickObjects();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->TickObjects();
|
||||
}
|
||||
}
|
||||
|
||||
// A couple objects such as lakitu are ticked inside of process_game_tick which support 60fps.
|
||||
// This is a fallback to support that.
|
||||
void CM_TickObjects60fps() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.TickObjects60fps();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->TickObjects60fps();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_DrawObjects(s32 cameraId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.DrawObjects(cameraId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->DrawObjects(cameraId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -564,119 +520,116 @@ void CM_DrawEditor() {
|
||||
gEditor.Draw();
|
||||
}
|
||||
|
||||
void CM_Editor_SetLevelDimensions(s16 minX, s16 maxX, s16 minZ, s16 maxZ, s16 minY, s16 maxY) {
|
||||
gEditor.SetLevelDimensions(minX, maxX, minZ, maxZ, minY, maxY);
|
||||
}
|
||||
|
||||
void CM_TickParticles() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.TickParticles();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->TickParticles();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_DrawParticles(s32 cameraId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.DrawParticles(cameraId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->DrawParticles(cameraId);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_InitClouds() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->InitClouds();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->InitClouds();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_TickClouds(s32 arg0, Camera* camera) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->TickClouds(arg0, camera);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->TickClouds(arg0, camera);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_Waypoints(Player* player, int8_t playerId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->Waypoints(player, playerId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->Waypoints(player, playerId);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_SomeCollisionThing(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4, f32* arg5, f32* arg6,
|
||||
f32* arg7) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->SomeCollisionThing(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->SomeCollisionThing(player, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_InitTrackObjects() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->InitTrackObjects();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->InitTrackObjects();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_TickTrackObjects() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->TickTrackObjects();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->TickTrackObjects();
|
||||
}
|
||||
TrainSmokeTick();
|
||||
}
|
||||
|
||||
void CM_DrawTrackObjects(s32 cameraId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->DrawTrackObjects(cameraId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->DrawTrackObjects(cameraId);
|
||||
}
|
||||
|
||||
TrainSmokeDraw(cameraId);
|
||||
}
|
||||
|
||||
void CM_SomeSounds() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->SomeSounds();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->SomeSounds();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_CreditsSpawnActors() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->CreditsSpawnActors();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->CreditsSpawnActors();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_WhatDoesThisDo(Player* player, int8_t playerId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->WhatDoesThisDo(player, playerId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->WhatDoesThisDo(player, playerId);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_WhatDoesThisDoAI(Player* player, int8_t playerId) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->WhatDoesThisDoAI(player, playerId);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->WhatDoesThisDoAI(player, playerId);
|
||||
}
|
||||
}
|
||||
|
||||
void CM_SetStaffGhost() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->SetStaffGhost();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->SetStaffGhost();
|
||||
}
|
||||
}
|
||||
|
||||
// This should only be used for checking if the track has changed
|
||||
uintptr_t CM_GetTrack() {
|
||||
return (uintptr_t) (void*) GetWorld()->GetTrack();
|
||||
}
|
||||
|
||||
Properties* CM_GetProps() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
return &gWorldInstance.GetTrack()->Props;
|
||||
if (GetWorld()->GetTrack()) {
|
||||
return &GetWorld()->GetTrack()->Props;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Properties* CM_GetPropsTrackId(s32 trackId) {
|
||||
return &gWorldInstance.Tracks[trackId]->Props;
|
||||
}
|
||||
|
||||
void CM_ScrollingTextures() {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->ScrollingTextures();
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->ScrollingTextures();
|
||||
}
|
||||
}
|
||||
|
||||
void CM_DrawWater(ScreenContext* screen, uint16_t pathCounter, uint16_t cameraRot,
|
||||
uint16_t playerDirection) {
|
||||
if (gWorldInstance.GetTrack()) {
|
||||
gWorldInstance.GetTrack()->DrawWater(screen, pathCounter, cameraRot, playerDirection);
|
||||
if (GetWorld()->GetTrack()) {
|
||||
GetWorld()->GetTrack()->DrawWater(screen, pathCounter, cameraRot, playerDirection);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -689,9 +642,9 @@ void CM_SpawnStarterLakitu() {
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < gPlayerCountSelection1; i++) {
|
||||
OLakitu* lakitu = new OLakitu(i, OLakitu::LakituType::STARTER);
|
||||
gWorldInstance.Lakitus[i] = lakitu;
|
||||
gWorldInstance.AddObject(lakitu);
|
||||
auto lakitu = std::make_unique<OLakitu>(i, OLakitu::LakituType::STARTER);
|
||||
GetWorld()->Lakitus[i] = lakitu.get();
|
||||
GetWorld()->AddObject(std::move(lakitu));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -700,54 +653,50 @@ void CM_ActivateFinishLakitu(s32 playerId) {
|
||||
if ((gDemoMode) || (gGamestate == CREDITS_SEQUENCE)) {
|
||||
return;
|
||||
}
|
||||
gWorldInstance.Lakitus[playerId]->Activate(OLakitu::LakituType::FINISH);
|
||||
GetWorld()->Lakitus[playerId]->Activate(OLakitu::LakituType::FINISH);
|
||||
}
|
||||
|
||||
void CM_ActivateSecondLapLakitu(s32 playerId) {
|
||||
if ((gDemoMode) || (gGamestate == CREDITS_SEQUENCE)) {
|
||||
return;
|
||||
}
|
||||
gWorldInstance.Lakitus[playerId]->Activate(OLakitu::LakituType::SECOND_LAP);
|
||||
GetWorld()->Lakitus[playerId]->Activate(OLakitu::LakituType::SECOND_LAP);
|
||||
}
|
||||
|
||||
void CM_ActivateFinalLapLakitu(s32 playerId) {
|
||||
if ((gDemoMode) || (gGamestate == CREDITS_SEQUENCE)) {
|
||||
return;
|
||||
}
|
||||
gWorldInstance.Lakitus[playerId]->Activate(OLakitu::LakituType::FINAL_LAP);
|
||||
GetWorld()->Lakitus[playerId]->Activate(OLakitu::LakituType::FINAL_LAP);
|
||||
}
|
||||
|
||||
void CM_ActivateReverseLakitu(s32 playerId) {
|
||||
if ((gDemoMode) || (gGamestate == CREDITS_SEQUENCE)) {
|
||||
return;
|
||||
}
|
||||
gWorldInstance.Lakitus[playerId]->Activate(OLakitu::LakituType::REVERSE);
|
||||
GetWorld()->Lakitus[playerId]->Activate(OLakitu::LakituType::REVERSE);
|
||||
}
|
||||
|
||||
size_t GetCupCursorPosition() {
|
||||
return gWorldInstance.GetCurrentCup()->CursorPosition;
|
||||
return GetWorld()->GetCurrentCup()->CursorPosition;
|
||||
}
|
||||
|
||||
void SetCupCursorPosition(size_t position) {
|
||||
gWorldInstance.GetCurrentCup()->SetTrack(position);
|
||||
// gWorldInstance.CurrentCup->CursorPosition = position;
|
||||
GetWorld()->GetCurrentCup()->SetTrack(position);
|
||||
// GetWorld()->CurrentCup->CursorPosition = position;
|
||||
}
|
||||
|
||||
size_t GetCupSize() {
|
||||
return gWorldInstance.GetCurrentCup()->GetSize();
|
||||
}
|
||||
|
||||
void SetTrackFromCup() {
|
||||
gWorldInstance.SetCurrentTrack(gWorldInstance.GetCurrentCup()->GetTrack());
|
||||
return GetWorld()->GetCurrentCup()->GetSize();
|
||||
}
|
||||
|
||||
void* GetTrack(void) {
|
||||
return gWorldInstance.GetTrack().get();
|
||||
return GetWorld()->GetTrack();
|
||||
}
|
||||
|
||||
struct Actor* CM_GetActor(size_t index) {
|
||||
if (index < gWorldInstance.Actors.size()) {
|
||||
AActor* actor = gWorldInstance.Actors[index];
|
||||
if (index < GetWorld()->Actors.size()) {
|
||||
AActor* actor = GetWorld()->Actors[index].get();
|
||||
return reinterpret_cast<struct Actor*>(reinterpret_cast<char*>(actor) + sizeof(void*));
|
||||
} else {
|
||||
// throw std::runtime_error("GetActor() index out of bounds");
|
||||
@@ -759,9 +708,12 @@ size_t CM_FindActorIndex(Actor* actor) {
|
||||
// Move the ptr back to look at the vtable.
|
||||
// This gets us the proper C++ class instead of just the variables used in C.
|
||||
AActor* a = reinterpret_cast<AActor*>(reinterpret_cast<char*>(actor) - sizeof(void*));
|
||||
auto actors = gWorldInstance.Actors;
|
||||
auto& actors = GetWorld()->Actors;
|
||||
|
||||
auto it = std::find_if(actors.begin(), actors.end(), [a](const std::unique_ptr<AActor>& ptr) {
|
||||
return ptr.get() == a;
|
||||
});
|
||||
|
||||
auto it = std::find(actors.begin(), actors.end(), static_cast<AActor*>(a));
|
||||
if (it != actors.end()) {
|
||||
return std::distance(actors.begin(), it);
|
||||
}
|
||||
@@ -770,7 +722,7 @@ size_t CM_FindActorIndex(Actor* actor) {
|
||||
}
|
||||
|
||||
void CM_DeleteActor(size_t index) {
|
||||
std::vector<AActor*> actors = gWorldInstance.Actors;
|
||||
auto& actors = GetWorld()->Actors;
|
||||
if (index < actors.size()) {
|
||||
actors.erase(actors.begin() + index);
|
||||
}
|
||||
@@ -780,27 +732,27 @@ void CM_DeleteActor(size_t index) {
|
||||
* Clean up actors and other game objects.
|
||||
*/
|
||||
void CM_CleanWorld(void) {
|
||||
gWorldInstance.CleanWorld();
|
||||
GetWorld()->CleanWorld();
|
||||
}
|
||||
|
||||
void CM_CleanCameras(void) {
|
||||
for (auto& camera : gWorldInstance.Cameras) {
|
||||
for (auto& camera : GetWorld()->Cameras) {
|
||||
delete camera;
|
||||
}
|
||||
|
||||
gWorldInstance.Cameras.clear();
|
||||
GetWorld()->Cameras.clear();
|
||||
}
|
||||
|
||||
struct Actor* CM_AddBaseActor() {
|
||||
return (struct Actor*) gWorldInstance.AddBaseActor();
|
||||
return (struct Actor*) GetWorld()->AddBaseActor();
|
||||
}
|
||||
|
||||
void CM_ActorBeginPlay(struct Actor* actor) {
|
||||
gWorldInstance.ActorBeginPlay(actor);
|
||||
GetWorld()->ActorBeginPlay(actor);
|
||||
}
|
||||
|
||||
void CM_ActorGenerateCollision(struct Actor* actor) {
|
||||
AActor* act = gWorldInstance.ConvertActorToAActor(actor);
|
||||
AActor* act = GetWorld()->ConvertActorToAActor(actor);
|
||||
|
||||
if ((nullptr != act->Model) && (act->Model[0] != '\0')) {
|
||||
if (act->Triangles.size() == 0) {
|
||||
@@ -827,11 +779,11 @@ void Editor_CleanWorld() {
|
||||
}
|
||||
|
||||
size_t CM_GetActorSize() {
|
||||
return gWorldInstance.Actors.size();
|
||||
return GetWorld()->Actors.size();
|
||||
}
|
||||
|
||||
void CM_ActorCollision(Player* player, Actor* actor) {
|
||||
AActor* a = gWorldInstance.ConvertActorToAActor(actor);
|
||||
AActor* a = GetWorld()->ConvertActorToAActor(actor);
|
||||
|
||||
if (a->IsMod()) {
|
||||
a->Collision(player, a);
|
||||
@@ -840,53 +792,53 @@ void CM_ActorCollision(Player* player, Actor* actor) {
|
||||
|
||||
f32 CM_GetWaterLevel(Vec3f pos, Collision* collision) {
|
||||
FVector fPos = {pos[0], pos[1], pos[2]};
|
||||
return gWorldInstance.GetTrack()->GetWaterLevel(fPos, collision);
|
||||
return GetWorld()->GetTrack()->GetWaterLevel(fPos, collision);
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
bool IsMarioRaceway() { return dynamic_cast<MarioRaceway*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsLuigiRaceway() { return dynamic_cast<LuigiRaceway*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsChocoMountain() { return dynamic_cast<ChocoMountain*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsBowsersCastle() { return dynamic_cast<BowsersCastle*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsBansheeBoardwalk() { return dynamic_cast<BansheeBoardwalk*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsYoshiValley() { return dynamic_cast<YoshiValley*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsFrappeSnowland() { return dynamic_cast<FrappeSnowland*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsKoopaTroopaBeach() { return dynamic_cast<KoopaTroopaBeach*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsRoyalRaceway() { return dynamic_cast<RoyalRaceway*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsMooMooFarm() { return dynamic_cast<MooMooFarm*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsToadsTurnpike() { return dynamic_cast<ToadsTurnpike*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsKalimariDesert() { return dynamic_cast<KalimariDesert*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsSherbetLand() { return dynamic_cast<SherbetLand*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsRainbowRoad() { return dynamic_cast<RainbowRoad*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsWarioStadium() { return dynamic_cast<WarioStadium*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsBlockFort() { return dynamic_cast<BlockFort*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsSkyscraper() { return dynamic_cast<Skyscraper*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsDoubleDeck() { return dynamic_cast<DoubleDeck*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsDkJungle() { return dynamic_cast<DKJungle*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsBigDonut() { return dynamic_cast<BigDonut*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsPodiumCeremony() { return dynamic_cast<PodiumCeremony*>(gWorldInstance.GetTrack().get()) != nullptr; }
|
||||
bool IsMarioRaceway() { return dynamic_cast<MarioRaceway*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsLuigiRaceway() { return dynamic_cast<LuigiRaceway*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsChocoMountain() { return dynamic_cast<ChocoMountain*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsBowsersCastle() { return dynamic_cast<BowsersCastle*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsBansheeBoardwalk() { return dynamic_cast<BansheeBoardwalk*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsYoshiValley() { return dynamic_cast<YoshiValley*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsFrappeSnowland() { return dynamic_cast<FrappeSnowland*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsKoopaTroopaBeach() { return dynamic_cast<KoopaTroopaBeach*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsRoyalRaceway() { return dynamic_cast<RoyalRaceway*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsMooMooFarm() { return dynamic_cast<MooMooFarm*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsToadsTurnpike() { return dynamic_cast<ToadsTurnpike*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsKalimariDesert() { return dynamic_cast<KalimariDesert*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsSherbetLand() { return dynamic_cast<SherbetLand*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsRainbowRoad() { return dynamic_cast<RainbowRoad*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsWarioStadium() { return dynamic_cast<WarioStadium*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsBlockFort() { return dynamic_cast<BlockFort*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsSkyscraper() { return dynamic_cast<Skyscraper*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsDoubleDeck() { return dynamic_cast<DoubleDeck*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsDkJungle() { return dynamic_cast<DKJungle*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsBigDonut() { return dynamic_cast<BigDonut*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
bool IsPodiumCeremony() { return dynamic_cast<PodiumCeremony*>(GetWorld()->GetTrack()) != nullptr; }
|
||||
|
||||
void SelectMarioRaceway() { gWorldInstance.SetTrackByType<MarioRaceway>(); }
|
||||
void SelectLuigiRaceway() { gWorldInstance.SetTrackByType<LuigiRaceway>(); }
|
||||
void SelectChocoMountain() { gWorldInstance.SetTrackByType<ChocoMountain>(); }
|
||||
void SelectBowsersCastle() { gWorldInstance.SetTrackByType<BowsersCastle>(); }
|
||||
void SelectBansheeBoardwalk() { gWorldInstance.SetTrackByType<BansheeBoardwalk>(); }
|
||||
void SelectYoshiValley() { gWorldInstance.SetTrackByType<YoshiValley>(); }
|
||||
void SelectFrappeSnowland() { gWorldInstance.SetTrackByType<FrappeSnowland>(); }
|
||||
void SelectKoopaTroopaBeach() { gWorldInstance.SetTrackByType<KoopaTroopaBeach>(); }
|
||||
void SelectRoyalRaceway() { gWorldInstance.SetTrackByType<RoyalRaceway>(); }
|
||||
void SelectMooMooFarm() { gWorldInstance.SetTrackByType<MooMooFarm>(); }
|
||||
void SelectToadsTurnpike() { gWorldInstance.SetTrackByType<ToadsTurnpike>(); }
|
||||
void SelectKalimariDesert() { gWorldInstance.SetTrackByType<KalimariDesert>(); }
|
||||
void SelectSherbetLand() { gWorldInstance.SetTrackByType<SherbetLand>(); }
|
||||
void SelectRainbowRoad() { gWorldInstance.SetTrackByType<RainbowRoad>(); }
|
||||
void SelectWarioStadium() { gWorldInstance.SetTrackByType<WarioStadium>(); }
|
||||
void SelectBlockFort() { gWorldInstance.SetTrackByType<BlockFort>(); }
|
||||
void SelectSkyscraper() { gWorldInstance.SetTrackByType<Skyscraper>(); }
|
||||
void SelectDoubleDeck() { gWorldInstance.SetTrackByType<DoubleDeck>(); }
|
||||
void SelectDkJungle() { gWorldInstance.SetTrackByType<DKJungle>(); }
|
||||
void SelectBigDonut() { gWorldInstance.SetTrackByType<BigDonut>(); }
|
||||
void SelectPodiumCeremony() { gWorldInstance.SetCurrentTrack(gPodiumCeremony); }
|
||||
void SelectMarioRaceway() { GetWorld()->SetCurrentTrack(std::make_unique<MarioRaceway>()); }
|
||||
void SelectLuigiRaceway() { GetWorld()->SetCurrentTrack(std::make_unique<LuigiRaceway>()); }
|
||||
void SelectChocoMountain() { GetWorld()->SetCurrentTrack(std::make_unique<ChocoMountain>()); }
|
||||
void SelectBowsersCastle() { GetWorld()->SetCurrentTrack(std::make_unique<BowsersCastle>()); }
|
||||
void SelectBansheeBoardwalk() { GetWorld()->SetCurrentTrack(std::make_unique<BansheeBoardwalk>()); }
|
||||
void SelectYoshiValley() { GetWorld()->SetCurrentTrack(std::make_unique<YoshiValley>()); }
|
||||
void SelectFrappeSnowland() { GetWorld()->SetCurrentTrack(std::make_unique<FrappeSnowland>()); }
|
||||
void SelectKoopaTroopaBeach() { GetWorld()->SetCurrentTrack(std::make_unique<KoopaTroopaBeach>()); }
|
||||
void SelectRoyalRaceway() { GetWorld()->SetCurrentTrack(std::make_unique<RoyalRaceway>()); }
|
||||
void SelectMooMooFarm() { GetWorld()->SetCurrentTrack(std::make_unique<MooMooFarm>()); }
|
||||
void SelectToadsTurnpike() { GetWorld()->SetCurrentTrack(std::make_unique<ToadsTurnpike>()); }
|
||||
void SelectKalimariDesert() { GetWorld()->SetCurrentTrack(std::make_unique<KalimariDesert>()); }
|
||||
void SelectSherbetLand() { GetWorld()->SetCurrentTrack(std::make_unique<SherbetLand>()); }
|
||||
void SelectRainbowRoad() { GetWorld()->SetCurrentTrack(std::make_unique<RainbowRoad>()); }
|
||||
void SelectWarioStadium() { GetWorld()->SetCurrentTrack(std::make_unique<WarioStadium>()); }
|
||||
void SelectBlockFort() { GetWorld()->SetCurrentTrack(std::make_unique<BlockFort>()); }
|
||||
void SelectSkyscraper() { GetWorld()->SetCurrentTrack(std::make_unique<Skyscraper>()); }
|
||||
void SelectDoubleDeck() { GetWorld()->SetCurrentTrack(std::make_unique<DoubleDeck>()); }
|
||||
void SelectDkJungle() { GetWorld()->SetCurrentTrack(std::make_unique<DKJungle>()); }
|
||||
void SelectBigDonut() { GetWorld()->SetCurrentTrack(std::make_unique<BigDonut>()); }
|
||||
void SelectPodiumCeremony() { GetWorld()->SetCurrentTrack(std::move(gPodiumCeremony)); }
|
||||
// clang-format on
|
||||
|
||||
void* GetMushroomCup(void) {
|
||||
|
||||
Reference in New Issue
Block a user