From eb44ba0f044586e010daeaa573c65dadd0784e0a Mon Sep 17 00:00:00 2001 From: Kiloku Date: Fri, 3 Jan 2025 16:47:07 -0300 Subject: [PATCH] Prevent loading checkpoints in the wrong level --- src/engine/fox_play.c | 2 +- src/port/ui/ImguiUI.cpp | 13 ++++++++++++- src/port/ui/ImguiUI.h | 9 +++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/engine/fox_play.c b/src/engine/fox_play.c index 844ddad1..74ffdb13 100644 --- a/src/engine/fox_play.c +++ b/src/engine/fox_play.c @@ -4678,7 +4678,7 @@ void Player_Setup(Player* playerx) { gDisplayedHitCount = gHitCount; D_hud_80161730 = 0; - if (CVarGetInteger("gCheckpoint.Set", 0)) { + if (CVarGetInteger("gCheckpoint.Set", 0) && CVarGetInteger("gCheckpoint.gSavedLevel", -1) == gCurrentLevel) { gSavedGroundSurface = CVarGetInteger("gCheckpoint.gSavedGroundSurface", gSavedGroundSurface); gSavedPathProgress = CVarGetFloat("gCheckpoint.gSavedPathProgress", gSavedPathProgress); gSavedObjectLoadIndex = CVarGetInteger("gCheckpoint.gSavedObjectLoadIndex", gSavedObjectLoadIndex); diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index 69c1a43c..0e5024f8 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -599,7 +599,17 @@ void DrawDebugMenu() { .tooltip = "Jump to credits at the main menu" }); - if (CVarGetInteger("gCheckpoint.Set", 0)) { + if (CVarGetInteger("gCheckpoint.Set", 0)) { + LevelId savedLevel = CVarGetInteger("gCheckpoint.gSavedLevel", -1); + std::string CheckpointLabel = "Checkpoint is at "; + if (savedLevel == 77){ + CheckpointLabel += "Warp Zone"; + } else if (savedLevel < 0 || savedLevel >= sizeof(GameUI::LevelNameLookup)/sizeof(GameUI::LevelNameLookup[0])) { + CheckpointLabel += "Unknown (out of bounds)"; + } else { + CheckpointLabel += GameUI::LevelNameLookup[CVarGetInteger("gCheckpoint.gSavedLevel", -1)]; + } + ImGui::Text(CheckpointLabel.c_str()); if (UIWidgets::Button("Clear Checkpoint")) { CVarClear("gCheckpoint.Set"); Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); @@ -607,6 +617,7 @@ void DrawDebugMenu() { } else if (gPlayer != NULL) { if (UIWidgets::Button("Set Checkpoint")) { CVarSetInteger("gCheckpoint.Set", 1); + CVarSetInteger("gCheckpoint.gSavedLevel", gCurrentLevel); CVarSetInteger("gCheckpoint.gSavedPathProgress", gGroundSurface); CVarSetFloat("gCheckpoint.gSavedPathProgress", (-gPlayer->pos.z) - 250.0f); CVarSetInteger("gCheckpoint.gSavedObjectLoadIndex", gObjectLoadIndex); diff --git a/src/port/ui/ImguiUI.h b/src/port/ui/ImguiUI.h index e3fa9a66..675cfd80 100644 --- a/src/port/ui/ImguiUI.h +++ b/src/port/ui/ImguiUI.h @@ -2,6 +2,15 @@ #include namespace GameUI { + const std::string LevelNameLookup[] = + { + "Corneria", "Meteo", "Sector X", "Area 6", + "Unknown", "Sector Y", "Venom 1", "Solar", + "Zoness", "Andross", "Training", "Macbeth", + "Titania", "Aquas", "Fortuna", "Unknown", + "Katina", "Bolse", "Sector Z", "Venom 2", + "Versus" + }; void SetupGuiElements(); void Destroy(); }