From 739225d222d2dc3f70b3ad420f702814bd0e834d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= <159546+serprex@users.noreply.github.com> Date: Fri, 12 Jun 2026 05:09:24 +0000 Subject: [PATCH] Add 6th notch to text speed which makes text speed instant (#6694) Helps frustration trying to read hints faster without skipping --- soh/soh/SohGui/SohMenuEnhancements.cpp | 10 ++++++++-- soh/src/code/z_message_PAL.c | 11 +++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index d854c621a6..150bf2efce 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -435,9 +435,15 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Skip Text", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("SkipText")) .Options(CheckboxOptions().Tooltip("Holding down B skips text.")); - AddWidget(path, "Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) + AddWidget(path, "Text Speed", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("TextSpeed")) - .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx")); + // Top notch (max) fills the whole text box in one frame + .Callback([](WidgetInfo& info) { + auto options = std::static_pointer_cast(info.options); + options->format = CVarGetInteger(info.cVar, 1) >= options->max ? "Instant" : "%dx"; + }) + .Options(IntSliderOptions().Min(1).Max(6).DefaultValue(1).Format( + CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1) >= 6 ? "Instant" : "%dx")); AddWidget(path, "Slow Text Speed: %dx", WIDGET_CVAR_SLIDER_INT) .CVar(CVAR_ENHANCEMENT("SlowTextSpeed")) .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c index ce09fe2716..57e442676a 100644 --- a/soh/src/code/z_message_PAL.c +++ b/soh/src/code/z_message_PAL.c @@ -15,6 +15,9 @@ #include "soh/SaveManager.h" #include "soh/ResourceManagerHelpers.h" +// SOH [Enhancement] Text Speed which fills whole box in one frame +#define TEXT_SPEED_INSTANT 6 + // #region SOH [NTSC] - Allows custom messages to work on japanese static bool sDisplayNextMessageAsEnglish = false; static u8 sLastLanguage = LANGUAGE_ENG; @@ -1276,7 +1279,9 @@ void Message_DrawTextJPN(PlayState* play, Gfx** gfxP) { } } - if (msgCtx->textDelay == 0) { + if (gTextSpeed >= TEXT_SPEED_INSTANT) { + msgCtx->textDrawPos = msgCtx->decodedTextLen + 1; + } else if (msgCtx->textDelay == 0) { msgCtx->textDrawPos = i + gTextSpeed; if (msgCtx->textDrawPos > msgCtx->decodedTextLen) { msgCtx->textDrawPos = msgCtx->decodedTextLen + 1; @@ -1626,7 +1631,9 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) { break; } } - if (msgCtx->textDelay == 0) { + if (gTextSpeed >= TEXT_SPEED_INSTANT) { + msgCtx->textDrawPos = msgCtx->decodedTextLen + 1; + } else if (msgCtx->textDelay == 0) { msgCtx->textDrawPos = i + gTextSpeed; } else if (msgCtx->textDelayTimer == 0) { msgCtx->textDrawPos = i + 1;