options_menu: allow providing reasons for greyed out options

This commit is contained in:
Hyper 2024-11-21 02:41:00 +00:00
parent 1f7f093e22
commit 837914dfdc
4 changed files with 26 additions and 22 deletions

View file

@ -3,7 +3,7 @@
#include <kernel/memory.h>
#include <ui/window.h>
extern "C" void Game_PlaySound(const char* pName)
SWA_API void Game_PlaySound(const char* pName)
{
void* soundPlayerSharedPtr = g_userHeap.Alloc(8);
GuestToHostFunction<void>(0x82B4DF50, soundPlayerSharedPtr, ((be<uint32_t>*)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);
}

View file

@ -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);

View file

@ -24,7 +24,7 @@ bool InjectOptionsBehaviour(uint32_t pThis, uint32_t count)
auto pHudPause = (SWA::CHudPause*)g_memory.Translate(pThis);
auto cursorIndex = *(be<uint32_t>*)g_memory.Translate(4 * (*(be<uint32_t>*)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;

View file

@ -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<typename T>
static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef<T>* 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<T>* 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<T>* 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);