From f74ba3c1da51079c893fc8046c841084fb256861 Mon Sep 17 00:00:00 2001 From: Christopher Leggett Date: Tue, 26 Dec 2023 09:57:59 -0500 Subject: [PATCH] develop-rando: File Select Fixes (#3734) * Fixes pressing B on name entry after randomizer quest. * Reverts to auto parsing previous spoiler file. Also includes an option to press L to automatically gen a fresh seed. It still does regenerate the old spoiler to regen the hints in the user's current language, but it will now automatically do this instead of requiring dragging and dropping the spoiler every time. * Fixes bug causing rando settings to come from CVars instead of a spoiler file when a spoiler is dropped/imported on boot. * Pressing Generate Randomizer in ImGui doesn't use loaded spoilerfile. * Adds tooltip to Generate Randomizer ImGui Button. --- .../randomizer/3drando/rando_main.cpp | 1 - .../randomizer/3drando/spoiler_log.cpp | 2 + soh/soh/Enhancements/randomizer/context.cpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 7 ++- .../ovl_file_choose/z_file_choose.c | 50 +++++++++++-------- .../ovl_file_choose/z_file_nameset_PAL.c | 4 +- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp index 0de9cd8e9..349995177 100644 --- a/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/rando_main.cpp @@ -21,6 +21,5 @@ void RandoMain::GenerateRando(std::set excludedLocations, std:: CVarSave(); CVarLoad(); - Rando::Context::GetInstance()->SetSpoilerLoaded(false); Rando::Context::GetInstance()->SetPlandoLoaded(false); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index 6c9f83ab1..1ef83c7ef 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -864,6 +864,8 @@ const char* SpoilerLog_Write() { jsonFile << std::setw(4) << jsonString << std::endl; jsonFile.close(); + CVarSetString("gSpoilerLog", (std::string("./Randomizer/") + fileName + std::string(".json")).c_str()); + // Note: probably shouldn't return this without making sure this string is stored somewhere, but // this return value is currently only used in playthrough.cpp as a true/false. Even if the pointer // is no longer valid it would still not be nullptr if the spoilerfile was written, so it works but diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index b76dafb95..8f4a4b25e 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -370,7 +370,7 @@ void Context::ParseSpoiler(const char* spoilerFileName, const bool plandoMode) { mSpoilerLoaded = true; mSeedGenerated = false; } catch (...) { - throw; + LUSLOG_ERROR("Failed to load Spoiler File: %s", spoilerFileName); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 3de001e15..882bd4c23 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1659,7 +1659,10 @@ void GenerateRandomizerImgui(std::string seed = "") { CVarSetInteger("gRandoGenerating", 1); CVarSave(); auto ctx = Rando::Context::GetInstance(); - ctx->GetSettings()->SetAllFromCVar(); + if (!ctx->IsSpoilerLoaded()) { + // We use the settings from the spoiler rather than CVars. + ctx->GetSettings()->SetAllFromCVar(); + } // todo: this efficently when we build out cvar array support std::set excludedLocations; std::stringstream excludedLocationStringStream(CVarGetString("gRandomizeExcludedLocations", "")); @@ -1755,8 +1758,10 @@ void RandomizerSettingsWindow::DrawElement() { UIWidgets::Spacer(0); ImGui::BeginDisabled(CVarGetInteger("gRandomizerDontGenerateSpoiler", 0) && gSaveContext.gameMode != GAMEMODE_FILE_SELECT); if (ImGui::Button("Generate Randomizer")) { + ctx->SetSpoilerLoaded(false); GenerateRandomizer(CVarGetInteger("gRandoManualSeedEntry", 0) ? seedString : ""); } + UIWidgets::Tooltip("You can also press L on the Quest Select screen to generate a new seed"); ImGui::EndDisabled(); UIWidgets::Spacer(0); diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 3a8da0b39..feb2e5553 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -974,9 +974,9 @@ void DrawSeedHashSprites(FileChooseContext* this) { // Draw Seed Icons for spoiler log: // 1. On Name Entry if a rando seed has been generated // 2. On Quest Menu if a spoiler has been dropped and the Randomizer quest option is currently hovered. - if ((Randomizer_IsSeedGenerated() || - (strnlen(CVarGetString("gSpoilerLog", ""), 1) != 0 && Randomizer_IsSpoilerLoaded())) && + if ((Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) && ((this->configMode == CM_NAME_ENTRY && gSaveContext.questId == QUEST_RANDOMIZER) || + (this->configMode == CM_GENERATE_SEED && Randomizer_IsSpoilerLoaded()) || (this->configMode == CM_QUEST_MENU && this->questType[this->buttonIndex] == QUEST_RANDOMIZER))) { // Fade top seed icons based on main menu fade and if save supports rando u8 alpha = @@ -999,6 +999,7 @@ void DrawSeedHashSprites(FileChooseContext* this) { } u8 generating; +bool fileSelectSpoilerFileLoaded = false; void FileChoose_UpdateRandomizer() { if (CVarGetInteger("gRandoGenerating", 0) != 0 && generating == 0) { @@ -1006,7 +1007,7 @@ void FileChoose_UpdateRandomizer() { func_800F5E18(SEQ_PLAYER_BGM_MAIN, NA_BGM_HORSE, 0, 7, 1); return; } else if (CVarGetInteger("gRandoGenerating", 0) == 0 && generating) { - if (SpoilerFileExists(CVarGetString("gSpoilerLog", "")) || Randomizer_IsSeedGenerated()) { + if (Randomizer_IsSeedGenerated()) { Audio_PlayFanfare(NA_BGM_HORSE_GOAL); } else { func_80078884(NA_SE_SY_OCARINA_ERROR); @@ -1022,13 +1023,16 @@ void FileChoose_UpdateRandomizer() { CVarSetString("gSpoilerLog", ""); } - if ((CVarGetInteger("gNewFileDropped", 0) != 0)) { - CVarSetString("gSpoilerLog", CVarGetString("gDroppedFile", "")); - CVarSetInteger("gNewSeedGenerated", 0); + if (CVarGetInteger("gNewFileDropped", 0) != 0 || !(Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) && + SpoilerFileExists(CVarGetString("gSpoilerLog", "")) && !fileSelectSpoilerFileLoaded) { + const char* fileLoc = CVarGetString("gSpoilerLog", ""); + if (CVarGetInteger("gNewFileDropped", 0) != 0) { + CVarSetString("gSpoilerLog", CVarGetString("gDroppedFile", "")); + } CVarSetInteger("gNewFileDropped", 0); CVarSetString("gDroppedFile", ""); - const char* fileLoc = CVarGetString("gSpoilerLog", ""); Randomizer_ParseSpoiler(fileLoc); + fileSelectSpoilerFileLoaded = true; if (SpoilerFileExists(CVarGetString("gSpoilerLog", "")) && CVarGetInteger("gRandomizerDontGenerateSpoiler", 0)) { remove(fileLoc); @@ -1274,6 +1278,14 @@ void FileChoose_UpdateQuestMenu(GameState* thisx) { GameInteractor_ExecuteOnUpdateFileQuestSelection(this->questType[this->buttonIndex]); } + if (CHECK_BTN_ALL(input->press.button, BTN_L)) { + if (this->questType[this->buttonIndex] == QUEST_RANDOMIZER) { + Randomizer_SetSpoilerLoaded(false); + this->prevConfigMode = this->configMode; + this->configMode = CM_GENERATE_SEED; + } + } + if (CHECK_BTN_ALL(input->press.button, BTN_A)) { gSaveContext.questId = this->questType[this->buttonIndex]; @@ -1318,6 +1330,10 @@ void FileChoose_GenerateRandoSeed(GameState* thisx) { FileChooseContext* this = (FileChooseContext*)thisx; FileChoose_UpdateRandomizer(); if (Randomizer_IsSeedGenerated() || Randomizer_IsPlandoLoaded()) { + Audio_PlayFanfare(NA_BGM_HORSE_GOAL); + func_800F5E18(SEQ_PLAYER_BGM_MAIN, NA_BGM_FILE_SELECT, 0, 7, 1); + generating = 0; + Randomizer_SetSpoilerLoaded(true); static u8 emptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }; static u8 linkName[] = { 0x15, 0x2C, 0x31, 0x2E, 0x3E, 0x3E, 0x3E, 0x3E }; this->prevConfigMode = this->configMode; @@ -3190,25 +3206,25 @@ void FileChoose_DrawRandoSaveVersionWarning(GameState* thisx) { static const char* noRandoGeneratedText[] = { // English - "Open Randomizer Settings to change your settings,\nthen press A to generate a new seed" + "No Randomizer seed currently available.\nGenerate one in the Randomizer Settings" #if defined(__WIIU__) || defined(__SWITCH__) ".", #else ",\nor drop a spoiler log on the game window.", #endif // German - "Open Randomizer Settings to change your settings,\nthen press A to generate a new seed" + "No Randomizer seed currently available.\nGenerate one in the Randomizer Settings" #if defined(__WIIU__) || defined(__SWITCH__) ".", #else ",\nor drop a spoiler log on the game window.", #endif // French - "Ouvrez le menu \"Randomizer Settings\" pour modifier\nvos paramètres, appuyez sur A pour générer\nune nouvelle seed" + "Aucune Seed de Randomizer actuellement disponible.\nGénérez-en une dans les \"Randomizer Settings\"" #if (defined(__WIIU__) || defined(__SWITCH__)) "." #else - " ou glissez un spoilerlog sur la\nfenêtre du jeu." + "\nou glissez un spoilerlog sur la fenêtre du jeu." #endif }; @@ -3231,18 +3247,12 @@ void FileChoose_DrawNoRandoGeneratedWarning(GameState* thisx) { uint16_t textboxWidth = 256 * textboxScale; uint16_t textboxHeight = 64 * textboxScale; uint8_t leftOffset = 72; - uint8_t bottomOffset = 132; + uint8_t bottomOffset = 84; uint8_t textVerticalOffset; #if defined(__WIIU__) || defined(__SWITCH__) - textVerticalOffset = 80; // 2 lines - if (gSaveContext.language == LANGUAGE_FRA) { - textVerticalOffset = 75; // 3 lines - } + textVerticalOffset = 127; // 2 lines #else - textVerticalOffset = 75; // 3 lines - if (gSaveContext.language == LANGUAGE_FRA) { - textVerticalOffset = 70; // 4 lines - } + textVerticalOffset = 122; // 3 lines #endif Gfx_SetupDL_39Opa(this->state.gfxCtx); diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c index 67c8c4de9..0a346c266 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c @@ -373,7 +373,7 @@ void FileChoose_DrawNameEntry(GameState* thisx) { if (this->newFileNameCharCount < 0) { this->newFileNameCharCount = 0; - if (this->prevConfigMode == CM_QUEST_MENU) { + if (this->prevConfigMode == CM_QUEST_MENU || this->prevConfigMode == CM_GENERATE_SEED) { this->configMode = CM_NAME_ENTRY_TO_QUEST_MENU; Randomizer_SetSeedGenerated(false); } else { @@ -459,8 +459,6 @@ void FileChoose_DrawNameEntry(GameState* thisx) { CVarSetInteger("gOnFileSelectNameEntry", 0); CVarSetInteger("gNewFileDropped", 0); Randomizer_SetSeedGenerated(false); - Randomizer_SetSpoilerLoaded(false); - Randomizer_SetPlandoLoaded(false); this->nameBoxAlpha[this->buttonIndex] = this->nameAlpha[this->buttonIndex] = 200; this->connectorAlpha[this->buttonIndex] = 255; func_800AA000(300.0f, 0xB4, 0x14, 0x64);