diff --git a/UnleashedRecomp/exports.cpp b/UnleashedRecomp/exports.cpp index 1befe499..c09c29cb 100644 --- a/UnleashedRecomp/exports.cpp +++ b/UnleashedRecomp/exports.cpp @@ -3,7 +3,7 @@ #include #include -extern "C" void Game_PlaySound(const char* pName) +SWA_API void Game_PlaySound(const char* pName) { void* soundPlayerSharedPtr = g_userHeap.Alloc(8); GuestToHostFunction(0x82B4DF50, soundPlayerSharedPtr, ((be*)g_memory.Translate(0x83367900))->get(), 7, 0, 0); @@ -22,7 +22,7 @@ extern "C" void Game_PlaySound(const char* pName) g_userHeap.Free(soundPlayerSharedPtr); } -extern "C" void Window_SetFullscreen(bool isEnabled) +SWA_API void Window_SetFullscreen(bool isEnabled) { Window::SetFullscreen(isEnabled); } diff --git a/UnleashedRecomp/exports.h b/UnleashedRecomp/exports.h index feef2bae..8963c767 100644 --- a/UnleashedRecomp/exports.h +++ b/UnleashedRecomp/exports.h @@ -1,4 +1,4 @@ #pragma once -extern "C" void Game_PlaySound(const char* pName); -extern "C" void Window_SetFullscreen(bool isEnabled); +SWA_API void Game_PlaySound(const char* pName); +SWA_API void Window_SetFullscreen(bool isEnabled); diff --git a/UnleashedRecomp/patches/ui/CHudPause_patches.cpp b/UnleashedRecomp/patches/ui/CHudPause_patches.cpp index a0557e79..92db1a2b 100644 --- a/UnleashedRecomp/patches/ui/CHudPause_patches.cpp +++ b/UnleashedRecomp/patches/ui/CHudPause_patches.cpp @@ -24,7 +24,7 @@ bool InjectOptionsBehaviour(uint32_t pThis, uint32_t count) auto pHudPause = (SWA::CHudPause*)g_memory.Translate(pThis); auto cursorIndex = *(be*)g_memory.Translate(4 * (*(be*)g_memory.Translate(pThis + 0x19C) + 0x68) + pThis); - auto exitType = SWA::eActionType_Undefined; + auto actionType = SWA::eActionType_Undefined; auto transitionType = SWA::eTransitionType_Undefined; switch (pHudPause->m_Menu) @@ -32,13 +32,13 @@ bool InjectOptionsBehaviour(uint32_t pThis, uint32_t count) case SWA::eMenuType_WorldMap: case SWA::eMenuType_Stage: case SWA::eMenuType_Misc: - exitType = SWA::eActionType_Return; + actionType = SWA::eActionType_Return; transitionType = SWA::eTransitionType_Quit; break; case SWA::eMenuType_Village: case SWA::eMenuType_Hub: - exitType = SWA::eActionType_Return; + actionType = SWA::eActionType_Return; transitionType = SWA::eTransitionType_Hide; break; } @@ -56,7 +56,7 @@ bool InjectOptionsBehaviour(uint32_t pThis, uint32_t count) } else if (cursorIndex == count - 1) { - pHudPause->m_Action = exitType; + pHudPause->m_Action = actionType; pHudPause->m_Transition = transitionType; return true; diff --git a/UnleashedRecomp/ui/options_menu.cpp b/UnleashedRecomp/ui/options_menu.cpp index 26a61ea8..86126282 100644 --- a/UnleashedRecomp/ui/options_menu.cpp +++ b/UnleashedRecomp/ui/options_menu.cpp @@ -17,7 +17,8 @@ static ImFont* g_dfsogeistdFont; static ImFont* g_newRodinFont; static const IConfigDef* g_selectedItem; -static bool g_isSelectedItemAccessible; + +static std::string* g_inaccessibleReason; static bool g_isEnterKeyBuffered = false; @@ -496,7 +497,9 @@ static bool DrawCategories() extern void VideoConfigValueChangedCallback(IConfigDef* config); template -static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* config, bool isAccessible, T valueMin = T(0), T valueCenter = T(0.5), T valueMax = T(1)) +static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* config, + bool isAccessible, std::string* inaccessibleReason = nullptr, + T valueMin = T(0), T valueCenter = T(0.5), T valueMax = T(1)) { auto drawList = ImGui::GetForegroundDrawList(); auto clipRectMin = drawList->GetClipRectMin(); @@ -527,7 +530,7 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* conf if (g_selectedRowIndex == rowIndex) { g_selectedItem = config; - g_isSelectedItemAccessible = isAccessible; + g_inaccessibleReason = isAccessible ? nullptr : inaccessibleReason; if (!g_isEnterKeyBuffered) { @@ -834,14 +837,15 @@ static void DrawConfigOptions() int32_t rowCount = 0; bool isStage = OptionsMenu::s_pauseMenuType == SWA::eMenuType_Stage || OptionsMenu::s_pauseMenuType == SWA::eMenuType_Hub; + auto cmnReason = &Localise("Options_Desc_NotAvailable"); // TODO: Don't use raw numbers here! switch (g_categoryIndex) { case 0: // SYSTEM - DrawConfigOption(rowCount++, yOffset, &Config::Language, !OptionsMenu::s_isPause); - DrawConfigOption(rowCount++, yOffset, &Config::Hints, !isStage); - DrawConfigOption(rowCount++, yOffset, &Config::ControlTutorial, !isStage); + DrawConfigOption(rowCount++, yOffset, &Config::Language, !OptionsMenu::s_isPause, cmnReason); + DrawConfigOption(rowCount++, yOffset, &Config::Hints, !isStage, cmnReason); + DrawConfigOption(rowCount++, yOffset, &Config::ControlTutorial, !isStage, cmnReason); DrawConfigOption(rowCount++, yOffset, &Config::SaveScoreAtCheckpoints, true); DrawConfigOption(rowCount++, yOffset, &Config::UnleashGaugeBehaviour, true); DrawConfigOption(rowCount++, yOffset, &Config::WerehogHubTransformVideo, true); @@ -850,7 +854,7 @@ static void DrawConfigOptions() case 1: // INPUT DrawConfigOption(rowCount++, yOffset, &Config::CameraXInvert, true); DrawConfigOption(rowCount++, yOffset, &Config::CameraYInvert, true); - DrawConfigOption(rowCount++, yOffset, &Config::XButtonHoming, !OptionsMenu::s_isPause); // TODO: make this editable in stages. + DrawConfigOption(rowCount++, yOffset, &Config::XButtonHoming, !OptionsMenu::s_isPause, cmnReason); // TODO: make this editable in stages. DrawConfigOption(rowCount++, yOffset, &Config::UnleashCancel, true); DrawConfigOption(rowCount++, yOffset, &Config::BackgroundInput, true); break; @@ -863,11 +867,11 @@ static void DrawConfigOptions() break; case 3: // VIDEO // TODO: expose WindowWidth/WindowHeight as WindowSize. - DrawConfigOption(rowCount++, yOffset, &Config::ResolutionScale, true, 0.25f, 1.0f, 2.0f); + DrawConfigOption(rowCount++, yOffset, &Config::ResolutionScale, true, nullptr, 0.25f, 1.0f, 2.0f); DrawConfigOption(rowCount++, yOffset, &Config::Fullscreen, true); DrawConfigOption(rowCount++, yOffset, &Config::VSync, true); DrawConfigOption(rowCount++, yOffset, &Config::TripleBuffering, true); - DrawConfigOption(rowCount++, yOffset, &Config::FPS, true, 15, 120, 240); + DrawConfigOption(rowCount++, yOffset, &Config::FPS, true, nullptr, 15, 120, 240); DrawConfigOption(rowCount++, yOffset, &Config::Brightness, true); DrawConfigOption(rowCount++, yOffset, &Config::AntiAliasing, true); DrawConfigOption(rowCount++, yOffset, &Config::AlphaToCoverage, true); @@ -993,7 +997,11 @@ static void DrawInfoPanel() { auto desc = g_selectedItem->GetDescription(); - if (g_isSelectedItemAccessible) + if (g_inaccessibleReason) + { + desc = *g_inaccessibleReason; + } + else { // Specialised description for resolution scale if (g_selectedItem->GetName() == "ResolutionScale") @@ -1010,10 +1018,6 @@ static void DrawInfoPanel() desc += "\n\n" + g_selectedItem->GetValueDescription(); } - else - { - desc = Localise("Options_Desc_NotAvailable"); - } auto size = Scale(26.0f);