summaryrefslogtreecommitdiff
path: root/src/port/Game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/port/Game.cpp')
-rw-r--r--src/port/Game.cpp279
1 files changed, 110 insertions, 169 deletions
diff --git a/src/port/Game.cpp b/src/port/Game.cpp
index 2c0ec3a0a..4cea9c5e2 100644
--- a/src/port/Game.cpp
+++ b/src/port/Game.cpp
@@ -69,29 +69,7 @@ extern "C" void Timer_Update();
// Create the world instance
World gWorldInstance;
-MarioRaceway* gMarioRaceway;
-ChocoMountain* gChocoMountain;
-BowsersCastle* gBowsersCastle;
-BansheeBoardwalk* gBansheeBoardwalk;
-YoshiValley* gYoshiValley;
-FrappeSnowland* gFrappeSnowland;
-KoopaTroopaBeach* gKoopaTroopaBeach;
-RoyalRaceway* gRoyalRaceway;
-LuigiRaceway* gLuigiRaceway;
-MooMooFarm* gMooMooFarm;
-ToadsTurnpike* gToadsTurnpike;
-KalimariDesert* gKalimariDesert;
-SherbetLand* gSherbetLand;
-RainbowRoad* gRainbowRoad;
-WarioStadium* gWarioStadium;
-BlockFort* gBlockFort;
-Skyscraper* gSkyscraper;
-DoubleDeck* gDoubleDeck;
-DKJungle* gDkJungle;
-BigDonut* gBigDonut;
-PodiumCeremony* gPodiumCeremony;
-Harbour* gHarbour;
-TestCourse* gTestCourse;
+std::unique_ptr<PodiumCeremony> gPodiumCeremony;
Cup* gMushroomCup;
Cup* gFlowerCup;
@@ -108,65 +86,52 @@ Editor::Editor gEditor;
s32 gTrophyIndex = NULL;
void CustomEngineInit() {
-
- gMarioRaceway = new MarioRaceway();
- gChocoMountain = new ChocoMountain();
- gBowsersCastle = new BowsersCastle();
- gBansheeBoardwalk = new BansheeBoardwalk();
- gYoshiValley = new YoshiValley();
- gFrappeSnowland = new FrappeSnowland();
- gKoopaTroopaBeach = new KoopaTroopaBeach();
- gRoyalRaceway = new RoyalRaceway();
- gLuigiRaceway = new LuigiRaceway();
- gMooMooFarm = new MooMooFarm();
- gToadsTurnpike = new ToadsTurnpike();
- gKalimariDesert = new KalimariDesert();
- gSherbetLand = new SherbetLand();
- gRainbowRoad = new RainbowRoad();
- gWarioStadium = new WarioStadium();
- gBlockFort = new BlockFort();
- gSkyscraper = new Skyscraper();
- gDoubleDeck = new DoubleDeck();
- gDkJungle = new DKJungle();
- gBigDonut = new BigDonut();
- gPodiumCeremony = new PodiumCeremony();
- gHarbour = new Harbour();
- gTestCourse = new TestCourse();
-
/* Add all courses to the global course list */
- gWorldInstance.AddCourse(gMarioRaceway);
- gWorldInstance.AddCourse(gChocoMountain);
- gWorldInstance.AddCourse(gBowsersCastle);
- gWorldInstance.AddCourse(gBansheeBoardwalk);
- gWorldInstance.AddCourse(gYoshiValley);
- gWorldInstance.AddCourse(gFrappeSnowland);
- gWorldInstance.AddCourse(gKoopaTroopaBeach);
- gWorldInstance.AddCourse(gRoyalRaceway);
- gWorldInstance.AddCourse(gLuigiRaceway);
- gWorldInstance.AddCourse(gMooMooFarm);
- gWorldInstance.AddCourse(gToadsTurnpike);
- gWorldInstance.AddCourse(gKalimariDesert);
- gWorldInstance.AddCourse(gSherbetLand);
- gWorldInstance.AddCourse(gRainbowRoad);
- gWorldInstance.AddCourse(gWarioStadium);
- gWorldInstance.AddCourse(gBlockFort);
- gWorldInstance.AddCourse(gSkyscraper);
- gWorldInstance.AddCourse(gDoubleDeck);
- gWorldInstance.AddCourse(gDkJungle);
- gWorldInstance.AddCourse(gBigDonut);
- gWorldInstance.AddCourse(gHarbour);
- gWorldInstance.AddCourse(gTestCourse);
-
- gMushroomCup = new Cup("mk:mushroom_cup", "mushroom cup",
- std::vector<Course*>{ gLuigiRaceway, gMooMooFarm, gKoopaTroopaBeach, gKalimariDesert });
- gFlowerCup = new Cup("mk:flower_cup", "flower cup",
- std::vector<Course*>{ gToadsTurnpike, gFrappeSnowland, gChocoMountain, gMarioRaceway });
- gStarCup = new Cup("mk:star_cup", "star cup",
- std::vector<Course*>{ gWarioStadium, gSherbetLand, gRoyalRaceway, gBowsersCastle });
- gSpecialCup = new Cup("mk:special_cup", "special cup",
- std::vector<Course*>{ gDkJungle, gYoshiValley, gBansheeBoardwalk, gRainbowRoad });
- gBattleCup =
- new Cup("mk:battle_cup", "battle", std::vector<Course*>{ gBigDonut, gBlockFort, gDoubleDeck, gSkyscraper });
+ Course* mario = gWorldInstance.AddCourse(std::make_unique<MarioRaceway>());
+ Course* choco = gWorldInstance.AddCourse(std::make_unique<ChocoMountain>());
+ Course* bowser = gWorldInstance.AddCourse(std::make_unique<BowsersCastle>());
+ Course* banshee = gWorldInstance.AddCourse(std::make_unique<BansheeBoardwalk>());
+ Course* yoshi = gWorldInstance.AddCourse(std::make_unique<YoshiValley>());
+ Course* frappe = gWorldInstance.AddCourse(std::make_unique<FrappeSnowland>());
+ Course* koopa = gWorldInstance.AddCourse(std::make_unique<KoopaTroopaBeach>());
+ Course* royal = gWorldInstance.AddCourse(std::make_unique<RoyalRaceway>());
+ Course* luigi = gWorldInstance.AddCourse(std::make_unique<LuigiRaceway>());
+ Course* mooMoo = gWorldInstance.AddCourse(std::make_unique<MooMooFarm>());
+ Course* toads = gWorldInstance.AddCourse(std::make_unique<ToadsTurnpike>());
+ Course* kalimari = gWorldInstance.AddCourse(std::make_unique<KalimariDesert>());
+ Course* sherbet = gWorldInstance.AddCourse(std::make_unique<SherbetLand>());
+ Course* rainbow = gWorldInstance.AddCourse(std::make_unique<RainbowRoad>());
+ Course* wario = gWorldInstance.AddCourse(std::make_unique<WarioStadium>());
+ Course* block = gWorldInstance.AddCourse(std::make_unique<BlockFort>());
+ Course* skyscraper = gWorldInstance.AddCourse(std::make_unique<Skyscraper>());
+ Course* doubleDeck = gWorldInstance.AddCourse(std::make_unique<DoubleDeck>());
+ Course* dkJungle = gWorldInstance.AddCourse(std::make_unique<DKJungle>());
+ Course* bigDonut = gWorldInstance.AddCourse(std::make_unique<BigDonut>());
+ Course* harbour = gWorldInstance.AddCourse(std::make_unique<Harbour>());
+ Course* testCourse = gWorldInstance.AddCourse(std::make_unique<TestCourse>());
+
+ gPodiumCeremony = std::make_unique<PodiumCeremony>();
+
+ // Construct cups with vectors of Course* (non-owning references)
+ gMushroomCup = new Cup("mk:mushroom_cup", "Mushroom Cup", {
+ luigi, mooMoo, koopa, kalimari
+ });
+
+ gFlowerCup = new Cup("mk:flower_cup", "Flower Cup", {
+ toads, frappe, choco, mario
+ });
+
+ gStarCup = new Cup("mk:star_cup", "Star Cup", {
+ wario, sherbet, royal, bowser
+ });
+
+ gSpecialCup = new Cup("mk:special_cup", "Special Cup", {
+ dkJungle, yoshi, banshee, rainbow
+ });
+
+ gBattleCup = new Cup("mk:battle_cup", "Battle Cup", {
+ bigDonut, block, doubleDeck, skyscraper
+ });
/* Instantiate Cups */
gWorldInstance.AddCup(gMushroomCup);
@@ -176,7 +141,7 @@ void CustomEngineInit() {
gWorldInstance.AddCup(gBattleCup);
/* Set default course; mario raceway */
- gWorldInstance.CurrentCourse = gMarioRaceway;
+ SelectMarioRaceway();
gWorldInstance.CurrentCup = gMushroomCup;
gWorldInstance.CurrentCup->CursorPosition = 3;
gWorldInstance.CupIndex = 0;
@@ -198,6 +163,14 @@ void CustomEngineInit() {
// gModelLoader.Load();
}
+void CustomEngineDestroy() {
+ delete gMushroomCup;
+ delete gFlowerCup;
+ delete gStarCup;
+ delete gSpecialCup;
+ delete gBattleCup;
+}
+
extern "C" {
void HM_InitIntro() {
@@ -244,6 +217,10 @@ u32 GetCupIndex(void) {
return gWorldInstance.GetCupIndex();
}
+void CM_SetCupIndex(size_t index) {
+ gWorldInstance.SetCupIndex(index);
+}
+
const char* GetCupName(void) {
return gWorldInstance.CurrentCup->Name;
}
@@ -275,7 +252,7 @@ void SetCourseById(s32 course) {
return;
}
gWorldInstance.CourseIndex = course;
- gWorldInstance.CurrentCourse = gWorldInstance.Courses[gWorldInstance.CourseIndex];
+ gWorldInstance.CurrentCourse = gWorldInstance.Courses[gWorldInstance.CourseIndex].get();
}
void CM_VehicleCollision(s32 playerId, Player* player) {
@@ -394,10 +371,11 @@ void CM_BeginPlay() {
if (course) {
// Do not spawn finishline in credits or battle mode. And if bSpawnFinishline.
- if ((gGamestate != CREDITS_SEQUENCE) && (gGamestate != BATTLE) && (course->bSpawnFinishline)) {
- gWorldInstance.AddActor(new AFinishline(course->FinishlineSpawnPoint));
+ if ((gGamestate != CREDITS_SEQUENCE) && (gModeSelection != BATTLE)) {
+ if (course->bSpawnFinishline) {
+ gWorldInstance.AddActor(new AFinishline(course->FinishlineSpawnPoint));
+ }
}
-
gEditor.AddLight("Sun", nullptr, D_800DC610[1].l->l.dir);
course->BeginPlay();
@@ -723,89 +701,51 @@ f32 CM_GetWaterLevel(Vec3f pos, Collision* collision) {
return gWorldInstance.CurrentCourse->GetWaterLevel(fPos, collision);
}
-void* GetMarioRaceway(void) {
- return gMarioRaceway;
-}
-
-void* GetLuigiRaceway(void) {
- return gLuigiRaceway;
-}
-
-void* GetChocoMountain(void) {
- return gChocoMountain;
-}
-
-void* GetBowsersCastle(void) {
- return gBowsersCastle;
-}
-
-void* GetBansheeBoardwalk(void) {
- return gBansheeBoardwalk;
-}
-
-void* GetYoshiValley(void) {
- return gYoshiValley;
-}
-
-void* GetFrappeSnowland(void) {
- return gFrappeSnowland;
-}
-
-void* GetKoopaTroopaBeach(void) {
- return gKoopaTroopaBeach;
-}
-
-void* GetRoyalRaceway(void) {
- return gRoyalRaceway;
-}
-
-void* GetMooMooFarm(void) {
- return gMooMooFarm;
-}
-
-void* GetToadsTurnpike(void) {
- return gToadsTurnpike;
-}
-
-void* GetKalimariDesert(void) {
- return gKalimariDesert;
-}
-
-void* GetSherbetLand(void) {
- return gSherbetLand;
-}
-
-void* GetRainbowRoad(void) {
- return gRainbowRoad;
-}
-
-void* GetWarioStadium(void) {
- return gWarioStadium;
-}
-
-void* GetBlockFort(void) {
- return gBlockFort;
-}
-
-void* GetSkyscraper(void) {
- return gSkyscraper;
-}
-
-void* GetDoubleDeck(void) {
- return gDoubleDeck;
-}
-
-void* GetDkJungle(void) {
- return gDkJungle;
-}
-
-void* GetBigDonut(void) {
- return gBigDonut;
-}
-
-void* GetPodiumCeremony(void) {
- return gPodiumCeremony;
-}
+// clang-format off
+bool IsMarioRaceway() { return dynamic_cast<MarioRaceway*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsLuigiRaceway() { return dynamic_cast<LuigiRaceway*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsChocoMountain() { return dynamic_cast<ChocoMountain*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsBowsersCastle() { return dynamic_cast<BowsersCastle*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsBansheeBoardwalk() { return dynamic_cast<BansheeBoardwalk*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsYoshiValley() { return dynamic_cast<YoshiValley*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsFrappeSnowland() { return dynamic_cast<FrappeSnowland*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsKoopaTroopaBeach() { return dynamic_cast<KoopaTroopaBeach*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsRoyalRaceway() { return dynamic_cast<RoyalRaceway*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsMooMooFarm() { return dynamic_cast<MooMooFarm*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsToadsTurnpike() { return dynamic_cast<ToadsTurnpike*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsKalimariDesert() { return dynamic_cast<KalimariDesert*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsSherbetLand() { return dynamic_cast<SherbetLand*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsRainbowRoad() { return dynamic_cast<RainbowRoad*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsWarioStadium() { return dynamic_cast<WarioStadium*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsBlockFort() { return dynamic_cast<BlockFort*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsSkyscraper() { return dynamic_cast<Skyscraper*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsDoubleDeck() { return dynamic_cast<DoubleDeck*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsDkJungle() { return dynamic_cast<DKJungle*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsBigDonut() { return dynamic_cast<BigDonut*>(gWorldInstance.CurrentCourse) != nullptr; }
+bool IsPodiumCeremony() { return dynamic_cast<PodiumCeremony*>(gWorldInstance.CurrentCourse) != nullptr; }
+
+void SelectMarioRaceway() { gWorldInstance.SetCourseByType<MarioRaceway>(); }
+void SelectLuigiRaceway() { gWorldInstance.SetCourseByType<LuigiRaceway>(); }
+void SelectChocoMountain() { gWorldInstance.SetCourseByType<ChocoMountain>(); }
+void SelectBowsersCastle() { gWorldInstance.SetCourseByType<BowsersCastle>(); }
+void SelectBansheeBoardwalk() { gWorldInstance.SetCourseByType<BansheeBoardwalk>(); }
+void SelectYoshiValley() { gWorldInstance.SetCourseByType<YoshiValley>(); }
+void SelectFrappeSnowland() { gWorldInstance.SetCourseByType<FrappeSnowland>(); }
+void SelectKoopaTroopaBeach() { gWorldInstance.SetCourseByType<KoopaTroopaBeach>(); }
+void SelectRoyalRaceway() { gWorldInstance.SetCourseByType<RoyalRaceway>(); }
+void SelectMooMooFarm() { gWorldInstance.SetCourseByType<MooMooFarm>(); }
+void SelectToadsTurnpike() { gWorldInstance.SetCourseByType<ToadsTurnpike>(); }
+void SelectKalimariDesert() { gWorldInstance.SetCourseByType<KalimariDesert>(); }
+void SelectSherbetLand() { gWorldInstance.SetCourseByType<SherbetLand>(); }
+void SelectRainbowRoad() { gWorldInstance.SetCourseByType<RainbowRoad>(); }
+void SelectWarioStadium() { gWorldInstance.SetCourseByType<WarioStadium>(); }
+void SelectBlockFort() { gWorldInstance.SetCourseByType<BlockFort>(); }
+void SelectSkyscraper() { gWorldInstance.SetCourseByType<Skyscraper>(); }
+void SelectDoubleDeck() { gWorldInstance.SetCourseByType<DoubleDeck>(); }
+void SelectDkJungle() { gWorldInstance.SetCourseByType<DKJungle>(); }
+void SelectBigDonut() { gWorldInstance.SetCourseByType<BigDonut>(); }
+void SelectPodiumCeremony() { gWorldInstance.CurrentCourse = gPodiumCeremony.get(); }
+// clang-format on
void* GetMushroomCup(void) {
return gMushroomCup;
@@ -868,6 +808,7 @@ extern "C"
while (WindowIsRunning()) {
push_frame();
}
+ CustomEngineDestroy();
// GameEngine::Instance->ProcessFrame(push_frame);
GameEngine::Instance->Destroy();
return 0;