Merge branch 'options-menu' into music-attenuation

This commit is contained in:
Hyper 2024-11-20 19:28:55 +00:00
commit 8f1d31b619
7 changed files with 208 additions and 301 deletions

View file

@ -39,15 +39,13 @@ public:
CONFIG_DEFINE_CALLBACK("Video", float, ResolutionScale, 1.0f, CONFIG_DEFINE_CALLBACK("Video", float, ResolutionScale, 1.0f,
{ {
def->NameLocale = &g_ResolutionScale_locale; def->Locale = &g_ResolutionScale_locale;
def->DescLocale = &g_ResolutionScale_desc_locale;
def->Value = std::clamp(def->Value, 0.25f, 2.0f); def->Value = std::clamp(def->Value, 0.25f, 2.0f);
}); });
CONFIG_DEFINE_CALLBACK("Video", bool, Fullscreen, false, CONFIG_DEFINE_CALLBACK("Video", bool, Fullscreen, false,
{ {
def->NameLocale = &g_Fullscreen_locale; def->Locale = &g_Fullscreen_locale;
def->DescLocale = &g_Fullscreen_desc_locale;
Window_SetFullscreen(def->Value); Window_SetFullscreen(def->Value);
}); });

View file

@ -10,8 +10,8 @@ ConfigDef<T>::ConfigDef(std::string section, std::string name, T defaultValue) :
// CONFIG_DEFINE_LOCALISED // CONFIG_DEFINE_LOCALISED
template<typename T> template<typename T>
ConfigDef<T>::ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, CONFIG_LOCALE* descLocale, T defaultValue) ConfigDef<T>::ConfigDef(std::string section, std::string name, CONFIG_LOCALE* locale, T defaultValue)
: Section(section), Name(name), NameLocale(nameLocale), DescLocale(descLocale), DefaultValue(defaultValue) : Section(section), Name(name), Locale(locale), DefaultValue(defaultValue)
{ {
Config::Definitions.emplace_back(this); Config::Definitions.emplace_back(this);
} }
@ -29,8 +29,8 @@ ConfigDef<T>::ConfigDef(std::string section, std::string name, T defaultValue, s
// CONFIG_DEFINE_ENUM_LOCALISED // CONFIG_DEFINE_ENUM_LOCALISED
template<typename T> template<typename T>
ConfigDef<T>::ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, CONFIG_LOCALE* descLocale, T defaultValue, std::unordered_map<std::string, T>* enumTemplate, CONFIG_ENUM_LOCALE(T)* enumLocale) ConfigDef<T>::ConfigDef(std::string section, std::string name, CONFIG_LOCALE* locale, T defaultValue, std::unordered_map<std::string, T>* enumTemplate, CONFIG_ENUM_LOCALE(T)* enumLocale)
: Section(section), Name(name), NameLocale(nameLocale), DescLocale(descLocale), DefaultValue(defaultValue), EnumTemplate(enumTemplate), EnumLocale(enumLocale) : Section(section), Name(name), Locale(locale), DefaultValue(defaultValue), EnumTemplate(enumTemplate), EnumLocale(enumLocale)
{ {
for (const auto& pair : *EnumTemplate) for (const auto& pair : *EnumTemplate)
EnumTemplateReverse[pair.second] = pair.first; EnumTemplateReverse[pair.second] = pair.first;
@ -47,45 +47,45 @@ ConfigDef<T>::ConfigDef(std::string section, std::string name, T defaultValue, s
} }
template<typename T> template<typename T>
std::string ConfigDef<T>::GetDescription() const std::string ConfigDef<T>::GetNameLocalised() const
{ {
if (!DescLocale) if (!Locale)
return ""; return Name;
if (!DescLocale->count(Config::Language)) if (!Locale->count(Config::Language))
{ {
if (DescLocale->count(ELanguage::English)) if (Locale->count(ELanguage::English))
{ {
return DescLocale->at(ELanguage::English); return std::get<0>(Locale->at(ELanguage::English));
} }
else else
{ {
return ""; return Name;
} }
} }
return DescLocale->at(Config::Language); return std::get<0>(Locale->at(Config::Language));
} }
template<typename T> template<typename T>
std::string ConfigDef<T>::GetNameLocalised() const std::string ConfigDef<T>::GetDescription() const
{ {
if (!NameLocale) if (!Locale)
return Name; return "";
if (!NameLocale->count(Config::Language)) if (!Locale->count(Config::Language))
{ {
if (NameLocale->count(ELanguage::English)) if (Locale->count(ELanguage::English))
{ {
return NameLocale->at(ELanguage::English); return std::get<1>(Locale->at(ELanguage::English));
} }
else else
{ {
return Name; return "";
} }
} }
return NameLocale->at(Config::Language); return std::get<1>(Locale->at(Config::Language));
} }
template<typename T> template<typename T>
@ -123,5 +123,43 @@ std::string ConfigDef<T>::GetValueLocalised() const
if (!strings.count(Value)) if (!strings.count(Value))
return ToString(false); return ToString(false);
return strings.at(Value); return std::get<0>(strings.at(Value));
}
template<typename T>
std::string ConfigDef<T>::GetValueDescription() const
{
auto language = Config::Language;
CONFIG_ENUM_LOCALE(T)* locale = nullptr;
if constexpr (std::is_enum_v<T>)
{
locale = EnumLocale;
}
else if constexpr (std::is_same_v<T, bool>)
{
locale = &g_bool_locale;
}
if (!locale)
return "";
if (!locale->count(language))
{
if (locale->count(ELanguage::English))
{
language = ELanguage::English;
}
else
{
return "";
}
}
auto strings = locale->at(language);
if (!strings.count(Value))
return "";
return std::get<1>(strings.at(Value));
} }

View file

@ -8,13 +8,13 @@
inline static ConfigDef<type> name{section, #name, defaultValue}; inline static ConfigDef<type> name{section, #name, defaultValue};
#define CONFIG_DEFINE_LOCALISED(section, type, name, defaultValue) \ #define CONFIG_DEFINE_LOCALISED(section, type, name, defaultValue) \
inline static ConfigDef<type> name{section, #name, &g_##name##_locale, &g_##name##_desc_locale, defaultValue}; inline static ConfigDef<type> name{section, #name, &g_##name##_locale, defaultValue};
#define CONFIG_DEFINE_ENUM(section, type, name, defaultValue) \ #define CONFIG_DEFINE_ENUM(section, type, name, defaultValue) \
inline static ConfigDef<type> name{section, #name, defaultValue, &g_##type##_template}; inline static ConfigDef<type> name{section, #name, defaultValue, &g_##type##_template};
#define CONFIG_DEFINE_ENUM_LOCALISED(section, type, name, defaultValue) \ #define CONFIG_DEFINE_ENUM_LOCALISED(section, type, name, defaultValue) \
inline static ConfigDef<type> name{section, #name, &g_##name##_locale, &g_##name##_desc_locale, defaultValue, &g_##type##_template, &g_##type##_locale}; inline static ConfigDef<type> name{section, #name, &g_##name##_locale, defaultValue, &g_##type##_template, &g_##type##_locale};
#define CONFIG_DEFINE_CALLBACK(section, type, name, defaultValue, readCallback) \ #define CONFIG_DEFINE_CALLBACK(section, type, name, defaultValue, readCallback) \
inline static ConfigDef<type> name{section, #name, defaultValue, [](ConfigDef<type>* def) readCallback}; inline static ConfigDef<type> name{section, #name, defaultValue, [](ConfigDef<type>* def) readCallback};
@ -22,8 +22,8 @@
#define CONFIG_DEFINE_ENUM_TEMPLATE(type) \ #define CONFIG_DEFINE_ENUM_TEMPLATE(type) \
inline static std::unordered_map<std::string, type> g_##type##_template = inline static std::unordered_map<std::string, type> g_##type##_template =
#define CONFIG_LOCALE std::unordered_map<ELanguage, std::string> #define CONFIG_LOCALE std::unordered_map<ELanguage, std::tuple<std::string, std::string>>
#define CONFIG_ENUM_LOCALE(type) std::unordered_map<ELanguage, std::unordered_map<type, std::string>> #define CONFIG_ENUM_LOCALE(type) std::unordered_map<ELanguage, std::unordered_map<type, std::tuple<std::string, std::string>>>
#define WINDOWPOS_CENTRED 0x2FFF0000 #define WINDOWPOS_CENTRED 0x2FFF0000
@ -181,10 +181,11 @@ public:
virtual void MakeDefault() = 0; virtual void MakeDefault() = 0;
virtual std::string_view GetSection() const = 0; virtual std::string_view GetSection() const = 0;
virtual std::string_view GetName() const = 0; virtual std::string_view GetName() const = 0;
virtual std::string GetDescription() const = 0;
virtual std::string GetNameLocalised() const = 0; virtual std::string GetNameLocalised() const = 0;
virtual std::string GetDescription() const = 0;
virtual const void* GetValue() const = 0; virtual const void* GetValue() const = 0;
virtual std::string GetValueLocalised() const = 0; virtual std::string GetValueLocalised() const = 0;
virtual std::string GetValueDescription() const = 0;
virtual std::string GetDefinition(bool withSection = false) const = 0; virtual std::string GetDefinition(bool withSection = false) const = 0;
virtual std::string ToString(bool strWithQuotes = true) const = 0; virtual std::string ToString(bool strWithQuotes = true) const = 0;
}; };
@ -195,8 +196,7 @@ class ConfigDef : public IConfigDef
public: public:
std::string Section{}; std::string Section{};
std::string Name{}; std::string Name{};
CONFIG_LOCALE* NameLocale; CONFIG_LOCALE* Locale;
CONFIG_LOCALE* DescLocale;
T DefaultValue{}; T DefaultValue{};
T Value{ DefaultValue }; T Value{ DefaultValue };
std::unordered_map<std::string, T>* EnumTemplate; std::unordered_map<std::string, T>* EnumTemplate;
@ -208,13 +208,13 @@ public:
ConfigDef(std::string section, std::string name, T defaultValue); ConfigDef(std::string section, std::string name, T defaultValue);
// CONFIG_DEFINE_LOCALISED // CONFIG_DEFINE_LOCALISED
ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, CONFIG_LOCALE* descLocale, T defaultValue); ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, T defaultValue);
// CONFIG_DEFINE_ENUM // CONFIG_DEFINE_ENUM
ConfigDef(std::string section, std::string name, T defaultValue, std::unordered_map<std::string, T>* enumTemplate); ConfigDef(std::string section, std::string name, T defaultValue, std::unordered_map<std::string, T>* enumTemplate);
// CONFIG_DEFINE_ENUM_LOCALISED // CONFIG_DEFINE_ENUM_LOCALISED
ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, CONFIG_LOCALE* descLocale, T defaultValue, std::unordered_map<std::string, T>* enumTemplate, CONFIG_ENUM_LOCALE(T)* enumLocale); ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, T defaultValue, std::unordered_map<std::string, T>* enumTemplate, CONFIG_ENUM_LOCALE(T)* enumLocale);
// CONFIG_DEFINE_CALLBACK // CONFIG_DEFINE_CALLBACK
ConfigDef(std::string section, std::string name, T defaultValue, std::function<void(ConfigDef<T>*)> callback); ConfigDef(std::string section, std::string name, T defaultValue, std::function<void(ConfigDef<T>*)> callback);
@ -260,10 +260,10 @@ public:
return Name; return Name;
} }
std::string GetDescription() const override;
std::string GetNameLocalised() const override; std::string GetNameLocalised() const override;
std::string GetDescription() const override;
const void* GetValue() const override const void* GetValue() const override
{ {
return &Value; return &Value;
@ -271,6 +271,8 @@ public:
std::string GetValueLocalised() const override; std::string GetValueLocalised() const override;
std::string GetValueDescription() const override;
std::string GetDefinition(bool withSection = false) const override std::string GetDefinition(bool withSection = false) const override
{ {
std::string result; std::string result;

View file

@ -3,52 +3,65 @@
#include "config_detail.h" #include "config_detail.h"
#define CONFIG_DEFINE_LOCALE(name) \ #define CONFIG_DEFINE_LOCALE(name) \
inline static std::unordered_map<ELanguage, std::string> g_##name##_locale = inline static std::unordered_map<ELanguage, std::tuple<std::string, std::string>> g_##name##_locale =
#define CONFIG_DEFINE_DESCRIPTION_LOCALE(name) \
inline static std::unordered_map<ELanguage, std::string> g_##name##_desc_locale =
#define CONFIG_DEFINE_ENUM_LOCALE(type) \ #define CONFIG_DEFINE_ENUM_LOCALE(type) \
inline static std::unordered_map<ELanguage, std::unordered_map<type, std::string>> g_##type##_locale = inline static std::unordered_map<ELanguage, std::unordered_map<type, std::tuple<std::string, std::string>>> g_##type##_locale =
#define CONFIG_DEFINE_ENUM_DESCRIPTION_LOCALE(type) \
inline static std::unordered_map<ELanguage, std::unordered_map<type, std::string>> g_##type##_desc_locale =
CONFIG_DEFINE_ENUM_LOCALE(bool) CONFIG_DEFINE_ENUM_LOCALE(bool)
{ {
{ {
ELanguage::English, { { true, "ON" }, { false, "OFF" } } ELanguage::English,
{
{ true, { "ON", "" } },
{ false, { "OFF", "" } }
}
}, },
{ {
ELanguage::Japanese, { { true, "オン" }, { false, "オフ" } } ELanguage::Japanese,
{
{ true, { "オン", "" } },
{ false, { "オフ", "" } }
}
}, },
{ {
ELanguage::German, { { true, "EIN" }, { false, "AUS" } } ELanguage::German,
{
{ true, { "EIN", "" } },
{ false, { "AUS", "" } }
}
}, },
{ {
ELanguage::French, { { true, "OUI" }, { false, "NON" } } ELanguage::French,
{
{ true, { "OUI", "" } },
{ false, { "NON", "" } }
}
}, },
{ {
ELanguage::Spanish, { { true, "" }, { false, "NO" } } ELanguage::Spanish,
{
{ true, { "", "" } },
{ false, { "NO", "" } }
}
}, },
{ {
ELanguage::Italian, { { true, "" }, { false, "NO" } } ELanguage::Italian,
{
{ true, { "", "" } },
{ false, { "NO", "" } }
}
} }
}; };
CONFIG_DEFINE_LOCALE(Language) CONFIG_DEFINE_LOCALE(Language)
{ {
{ ELanguage::English, "Language" }, { ELanguage::English, { "Language", "Change the language used for text and logos." } },
{ ELanguage::Japanese, "言語" }, { ELanguage::Japanese, { "言語", "[PLACEHOLDER]" } },
{ ELanguage::German, "Sprache" }, { ELanguage::German, { "Sprache", "[PLACEHOLDER]" } },
{ ELanguage::French, "Langue" }, { ELanguage::French, { "Langue", "[PLACEHOLDER]" } },
{ ELanguage::Spanish, "Idioma" }, { ELanguage::Spanish, { "Idioma", "[PLACEHOLDER]" } },
{ ELanguage::Italian, "Lingua" } { ELanguage::Italian, { "Lingua", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Language)
{
{ ELanguage::English, "Change the language used for text and logos." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(ELanguage) CONFIG_DEFINE_ENUM_LOCALE(ELanguage)
@ -56,54 +69,34 @@ CONFIG_DEFINE_ENUM_LOCALE(ELanguage)
{ {
ELanguage::English, ELanguage::English,
{ {
{ ELanguage::English, "ENGLISH" }, { ELanguage::English, { "ENGLISH", "" } },
{ ELanguage::Japanese, "日本語" }, { ELanguage::Japanese, { "日本語", "" } },
{ ELanguage::German, "DEUTSCH" }, { ELanguage::German, { "DEUTSCH", "" } },
{ ELanguage::French, "FRANÇAIS" }, { ELanguage::French, { "FRANÇAIS", "" } },
{ ELanguage::Spanish, "ESPAÑOL" }, { ELanguage::Spanish, { "ESPAÑOL", "" } },
{ ELanguage::Italian, "ITALIANO" } { ELanguage::Italian, { "ITALIANO", "" } }
} }
} }
}; };
CONFIG_DEFINE_LOCALE(Hints) CONFIG_DEFINE_LOCALE(Hints)
{ {
{ ELanguage::English, "Hints" } { ELanguage::English, { "Hints", "Show hint rings in stages." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Hints)
{
{ ELanguage::English, "Show hint rings in stages." }
}; };
CONFIG_DEFINE_LOCALE(ControlTutorial) CONFIG_DEFINE_LOCALE(ControlTutorial)
{ {
{ ELanguage::English, "Control Tutorial" } { ELanguage::English, { "Control Tutorial", "Show controller hints in stages." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(ControlTutorial)
{
{ ELanguage::English, "Show controller hints in stages." }
}; };
CONFIG_DEFINE_LOCALE(SaveScoreAtCheckpoints) CONFIG_DEFINE_LOCALE(SaveScoreAtCheckpoints)
{ {
{ ELanguage::English, "Save Score at Checkpoints" } { ELanguage::English, { "Save Score at Checkpoints", "Keep your score from the last checkpoint upon respawning." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(SaveScoreAtCheckpoints)
{
{ ELanguage::English, "Keep your score from the last checkpoint upon respawning." }
}; };
CONFIG_DEFINE_LOCALE(UnleashGaugeBehaviour) CONFIG_DEFINE_LOCALE(UnleashGaugeBehaviour)
{ {
{ ELanguage::English, "Unleash Gauge Behavior" } { ELanguage::English, { "Unleash Gauge Behavior", "Change how the Unleash gauge behaves." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(UnleashGaugeBehaviour)
{
{ ELanguage::English, "Change how the Unleash gauge behaves." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EUnleashGaugeBehaviour) CONFIG_DEFINE_ENUM_LOCALE(EUnleashGaugeBehaviour)
@ -111,120 +104,65 @@ CONFIG_DEFINE_ENUM_LOCALE(EUnleashGaugeBehaviour)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EUnleashGaugeBehaviour::Original, "ORIGINAL" }, { EUnleashGaugeBehaviour::Original, { "ORIGINAL", "Original: the gauge will drain at all times regardless." } },
{ EUnleashGaugeBehaviour::Revised, "REVISED" } { EUnleashGaugeBehaviour::Revised, { "REVISED", "Revised: the gauge will only drain when the player can move." } }
} }
} }
}; };
CONFIG_DEFINE_LOCALE(WerehogHubTransformVideo) CONFIG_DEFINE_LOCALE(WerehogHubTransformVideo)
{ {
{ ELanguage::English, "Transformation Cutscene" } { ELanguage::English, { "Transformation Cutscene", "Play the Werehog transformation cutscene when changing the time of day in the hub areas." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(WerehogHubTransformVideo)
{
{ ELanguage::English, "Play the Werehog transformation cutscene when changing the time of day in the hub areas." }
}; };
CONFIG_DEFINE_LOCALE(LogoSkip) CONFIG_DEFINE_LOCALE(LogoSkip)
{ {
{ ELanguage::English, "Skip Intro Logos" } { ELanguage::English, { "Skip Intro Logos", "Skip the logos during the game's boot sequence." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(LogoSkip)
{
{ ELanguage::English, "Show the logos during the game's boot sequence." }
}; };
CONFIG_DEFINE_LOCALE(CameraXInvert) CONFIG_DEFINE_LOCALE(CameraXInvert)
{ {
{ ELanguage::English, "Invert Camera X" } { ELanguage::English, { "Invert Camera X", "Toggle between inverted left and right camera movement." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(CameraXInvert)
{
{ ELanguage::English, "Toggle between inverted left and right camera movement." }
}; };
CONFIG_DEFINE_LOCALE(CameraYInvert) CONFIG_DEFINE_LOCALE(CameraYInvert)
{ {
{ ELanguage::English, "Invert Camera Y" } { ELanguage::English, { "Invert Camera Y", "Toggle between inverted up and down camera movement." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(CameraYInvert)
{
{ ELanguage::English, "Toggle between inverted up and down camera movement." }
}; };
CONFIG_DEFINE_LOCALE(XButtonHoming) CONFIG_DEFINE_LOCALE(XButtonHoming)
{ {
{ ELanguage::English, "Homing Attack on Boost" } { ELanguage::English, { "Homing Attack on Boost", "Toggle between using the boost button or the jump button for homing attack." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(XButtonHoming)
{
{ ELanguage::English, "Toggle between using the boost button or the jump button for homing attack." }
}; };
CONFIG_DEFINE_LOCALE(UnleashCancel) CONFIG_DEFINE_LOCALE(UnleashCancel)
{ {
{ ELanguage::English, "Allow Cancelling Unleash" } { ELanguage::English, { "Allow Cancelling Unleash", "Allow Unleash to be cancelled at the cost of some energy by pressing the input again." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(UnleashCancel)
{
{ ELanguage::English, "Allow Unleash to be cancelled at the cost of some energy by pressing the input again." }
}; };
CONFIG_DEFINE_LOCALE(BackgroundInput) CONFIG_DEFINE_LOCALE(BackgroundInput)
{ {
{ ELanguage::English, "Allow Background Input" } { ELanguage::English, { "Allow Background Input", "Accept controller input whilst the game window is unfocused." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(BackgroundInput)
{
{ ELanguage::English, "Accept controller input whilst the game window is unfocused." }
}; };
CONFIG_DEFINE_LOCALE(MusicVolume) CONFIG_DEFINE_LOCALE(MusicVolume)
{ {
{ ELanguage::English, "Music Volume" } { ELanguage::English, { "Music Volume", "Adjust the volume for the music." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(MusicVolume)
{
{ ELanguage::English, "Adjust the volume for the music." }
}; };
CONFIG_DEFINE_LOCALE(SEVolume) CONFIG_DEFINE_LOCALE(SEVolume)
{ {
{ ELanguage::English, "SE Volume" } { ELanguage::English, { "Effects Volume", "Adjust the volume for sound effects." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(SEVolume)
{
{ ELanguage::English, "Adjust the volume for sound effects." }
}; };
CONFIG_DEFINE_LOCALE(MusicAttenuation) CONFIG_DEFINE_LOCALE(MusicAttenuation)
{ {
{ ELanguage::English, "Music Attenuation" } { ELanguage::English, { "Music Attenuation", "Fade out the game's music when external media is playing.\n\nRequires Windows 10 or later." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(MusicAttenuation)
{
{ ELanguage::English, "Fade out the game's music when external media is playing.\n\nRequires Windows 10 or later." }
}; };
CONFIG_DEFINE_LOCALE(VoiceLanguage) CONFIG_DEFINE_LOCALE(VoiceLanguage)
{ {
{ ELanguage::English, "Voice Language" } { ELanguage::English, { "Voice Language", "Change the language used for character voices." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(VoiceLanguage)
{
{ ELanguage::English, "Change the language used for character voices." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EVoiceLanguage) CONFIG_DEFINE_ENUM_LOCALE(EVoiceLanguage)
@ -232,110 +170,60 @@ CONFIG_DEFINE_ENUM_LOCALE(EVoiceLanguage)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EVoiceLanguage::English, "ENGLISH" }, { EVoiceLanguage::English, { "ENGLISH", "" } },
{ EVoiceLanguage::Japanese, "日本語" } { EVoiceLanguage::Japanese, { "日本語", "" } }
} }
} }
}; };
CONFIG_DEFINE_LOCALE(Subtitles) CONFIG_DEFINE_LOCALE(Subtitles)
{ {
{ ELanguage::English, "Subtitles" } { ELanguage::English, { "Subtitles", "Show subtitles during dialogue." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Subtitles)
{
{ ELanguage::English, "Show subtitles during dialogue." }
}; };
CONFIG_DEFINE_LOCALE(WerehogBattleMusic) CONFIG_DEFINE_LOCALE(WerehogBattleMusic)
{ {
{ ELanguage::English, "Battle Theme" } { ELanguage::English, { "Battle Theme", "Play the Werehog battle theme during combat.\n\nThis option will apply the next time you're in combat." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(WerehogBattleMusic)
{
{ ELanguage::English, "Play the Werehog battle theme during combat.\n\nThis option will apply the next time you're in combat." }
}; };
CONFIG_DEFINE_LOCALE(WindowSize) CONFIG_DEFINE_LOCALE(WindowSize)
{ {
{ ELanguage::English, "Window Size" } { ELanguage::English, { "Window Size", "Adjust the size of the game window in windowed mode." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(WindowSize)
{
{ ELanguage::English, "Adjust the size of the game window in windowed mode." }
}; };
CONFIG_DEFINE_LOCALE(ResolutionScale) CONFIG_DEFINE_LOCALE(ResolutionScale)
{ {
{ ELanguage::English, "Resolution Scale" } { ELanguage::English, { "Resolution Scale", "Adjust the internal resolution of the game.\n\n%dx%d" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(ResolutionScale)
{
{ ELanguage::English, "Adjust the internal resolution of the game.\n\n%dx%d" }
}; };
CONFIG_DEFINE_LOCALE(Fullscreen) CONFIG_DEFINE_LOCALE(Fullscreen)
{ {
{ ELanguage::English, "Fullscreen" } { ELanguage::English, { "Fullscreen", "Toggle between borderless fullscreen or windowed mode." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Fullscreen)
{
{ ELanguage::English, "Toggle between borderless fullscreen or windowed mode." }
}; };
CONFIG_DEFINE_LOCALE(VSync) CONFIG_DEFINE_LOCALE(VSync)
{ {
{ ELanguage::English, "V-Sync" } { ELanguage::English, { "V-Sync", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(VSync)
{
{ ELanguage::English, "[PLACEHOLDER]" }
}; };
CONFIG_DEFINE_LOCALE(TripleBuffering) CONFIG_DEFINE_LOCALE(TripleBuffering)
{ {
{ ELanguage::English, "Triple Buffering" } { ELanguage::English, { "Triple Buffering", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(TripleBuffering)
{
{ ELanguage::English, "[PLACEHOLDER]" }
}; };
CONFIG_DEFINE_LOCALE(FPS) CONFIG_DEFINE_LOCALE(FPS)
{ {
{ ELanguage::English, "FPS" } { ELanguage::English, { "FPS", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(FPS)
{
{ ELanguage::English, "[PLACEHOLDER]" }
}; };
CONFIG_DEFINE_LOCALE(Brightness) CONFIG_DEFINE_LOCALE(Brightness)
{ {
{ ELanguage::English, "Brightness" } { ELanguage::English, { "Brightness", "Adjust the brightness level of the game." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Brightness)
{
{ ELanguage::English, "Adjust the brightness level of the game." }
}; };
CONFIG_DEFINE_LOCALE(AntiAliasing) CONFIG_DEFINE_LOCALE(AntiAliasing)
{ {
{ ELanguage::English, "Anti-Aliasing" } { ELanguage::English, { "Anti-Aliasing", "Adjust the amount of smoothing applied to jagged edges." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(AntiAliasing)
{
{ ELanguage::English, "Adjust the amount of smoothing applied to jagged edges." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing) CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing)
@ -343,29 +231,19 @@ CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EAntiAliasing::None, "NONE" }, { EAntiAliasing::None, { "NONE", "" } },
} }
} }
}; };
CONFIG_DEFINE_LOCALE(AlphaToCoverage) CONFIG_DEFINE_LOCALE(AlphaToCoverage)
{ {
{ ELanguage::English, "Transparency Anti-Aliasing" } { ELanguage::English, { "Transparency Anti-Aliasing", "Apply anti-aliasing to alpha transparent textures." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(AlphaToCoverage)
{
{ ELanguage::English, "Apply anti-aliasing to alpha transparent textures." }
}; };
CONFIG_DEFINE_LOCALE(ShadowResolution) CONFIG_DEFINE_LOCALE(ShadowResolution)
{ {
{ ELanguage::English, "Shadow Resolution" } { ELanguage::English, { "Shadow Resolution", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(ShadowResolution)
{
{ ELanguage::English, "[PLACEHOLDER]" }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution) CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution)
@ -373,19 +251,14 @@ CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EShadowResolution::Original, "ORIGINAL" }, { EShadowResolution::Original, { "ORIGINAL", "Original: the game will automatically determine the resolution of the shadows." } },
} }
} }
}; };
CONFIG_DEFINE_LOCALE(GITextureFiltering) CONFIG_DEFINE_LOCALE(GITextureFiltering)
{ {
{ ELanguage::English, "GI Texture Filtering" } { ELanguage::English, { "GI Texture Filtering", "[PLACEHOLDER]" } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(GITextureFiltering)
{
{ ELanguage::English, "[PLACEHOLDER]" }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering) CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering)
@ -393,40 +266,25 @@ CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EGITextureFiltering::Bilinear, "BILINEAR" }, { EGITextureFiltering::Bilinear, { "BILINEAR", "" } },
{ EGITextureFiltering::Bicubic, "BICUBIC" }, { EGITextureFiltering::Bicubic, { "BICUBIC", "" } },
} }
} }
}; };
CONFIG_DEFINE_LOCALE(MotionBlur) CONFIG_DEFINE_LOCALE(MotionBlur)
{ {
{ ELanguage::English, "Motion Blur" } { ELanguage::English, { "Motion Blur", "Use per-object motion blur and radial blur." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(MotionBlur)
{
{ ELanguage::English, "Use per-object motion blur and radial blur." }
}; };
CONFIG_DEFINE_LOCALE(Xbox360ColourCorrection) CONFIG_DEFINE_LOCALE(Xbox360ColourCorrection)
{ {
{ ELanguage::English, "Xbox 360 Color Correction" } { ELanguage::English, { "Xbox 360 Color Correction", "Use the warm tint from the Xbox 360 version of the game." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(Xbox360ColourCorrection)
{
{ ELanguage::English, "Use the warm tint from the Xbox 360 version of the game." }
}; };
CONFIG_DEFINE_LOCALE(MovieScaleMode) CONFIG_DEFINE_LOCALE(MovieScaleMode)
{ {
{ ELanguage::English, "Movie Scale Mode" } { ELanguage::English, { "Movie Scale Mode", "Change how the movie player scales to the display." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(MovieScaleMode)
{
{ ELanguage::English, "Change how the movie player scales to the display." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EMovieScaleMode) CONFIG_DEFINE_ENUM_LOCALE(EMovieScaleMode)
@ -434,21 +292,16 @@ CONFIG_DEFINE_ENUM_LOCALE(EMovieScaleMode)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EMovieScaleMode::Stretch, "STRETCH" }, { EMovieScaleMode::Stretch, { "STRETCH", "Stretch: the movie will stretch to the display." } },
{ EMovieScaleMode::Fit, "FIT" }, { EMovieScaleMode::Fit, { "FIT", "Fit: the movie will maintain its aspect ratio and fit to the display." } },
{ EMovieScaleMode::Fill, "FILL" }, { EMovieScaleMode::Fill, { "FILL", "Fill: the movie will scale past the bounds of the display if it doesn't match the aspect ratio." } },
} }
} }
}; };
CONFIG_DEFINE_LOCALE(UIScaleMode) CONFIG_DEFINE_LOCALE(UIScaleMode)
{ {
{ ELanguage::English, "UI Scale Mode" } { ELanguage::English, { "UI Scale Mode", "Change how the UI scales to the display." } }
};
CONFIG_DEFINE_DESCRIPTION_LOCALE(UIScaleMode)
{
{ ELanguage::English, "Change how the UI scales to the display." }
}; };
CONFIG_DEFINE_ENUM_LOCALE(EUIScaleMode) CONFIG_DEFINE_ENUM_LOCALE(EUIScaleMode)
@ -456,9 +309,9 @@ CONFIG_DEFINE_ENUM_LOCALE(EUIScaleMode)
{ {
ELanguage::English, ELanguage::English,
{ {
{ EUIScaleMode::Stretch, "STRETCH" }, { EUIScaleMode::Stretch, { "STRETCH", "Stretch: the UI will stretch to the display." } },
{ EUIScaleMode::Edge, "EDGE" }, { EUIScaleMode::Edge, { "EDGE", "Edge: the UI will anchor to the edges of the display." } },
{ EUIScaleMode::Centre, "CENTRE" }, { EUIScaleMode::Centre, { "CENTER", "Center: the UI will anchor to the center of the display." } },
} }
} }
}; };

View file

@ -2,6 +2,7 @@
#include <api/SWA.h> #include <api/SWA.h>
#include <ui/window.h> #include <ui/window.h>
#include <cfg/config.h> #include <cfg/config.h>
#include <app.h>
float m_lastLoadingFrameDelta = 0.0f; float m_lastLoadingFrameDelta = 0.0f;
std::chrono::steady_clock::time_point m_lastLoadingFrameTime; std::chrono::steady_clock::time_point m_lastLoadingFrameTime;
@ -36,14 +37,16 @@ static double ComputeLerpFactor(double t, double deltaTime)
return 1.0 - pow(1.0 - t, (30.0 + bias) / (fps + bias)); return 1.0 - pow(1.0 - t, (30.0 + bias) / (fps + bias));
} }
void CameraLerpFixMidAsmHook(PPCRegister& t, PPCRegister& deltaTime) // It's important to use global delta time here instead of function provided
// delta time, as it might be time scaled and not match with 30 FPS behavior.
void CameraLerpFixMidAsmHook(PPCRegister& t)
{ {
t.f64 = ComputeLerpFactor(t.f64, deltaTime.f64); t.f64 = ComputeLerpFactor(t.f64, g_deltaTime);
} }
void CameraTargetSideOffsetLerpFixMidAsmHook(PPCVRegister& v13, PPCVRegister& v62, PPCRegister& deltaTime) void CameraTargetSideOffsetLerpFixMidAsmHook(PPCVRegister& v13, PPCVRegister& v62)
{ {
float factor = float(ComputeLerpFactor(double(v13.f32[0] * v62.f32[0]), deltaTime.f64)); float factor = float(ComputeLerpFactor(double(v13.f32[0] * v62.f32[0]), g_deltaTime));
for (size_t i = 0; i < 4; i++) for (size_t i = 0; i < 4; i++)
{ {

View file

@ -316,6 +316,7 @@ static bool g_downWasHeld;
static bool g_lockedOnOption; static bool g_lockedOnOption;
static double g_lastTappedTime; static double g_lastTappedTime;
static double g_lastIncrementTime; static double g_lastIncrementTime;
static double g_lastIncrementSoundTime;
static void ResetSelection() static void ResetSelection()
{ {
@ -682,8 +683,13 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef<T>* conf
bool fastIncrement = (time - g_lastTappedTime) > 0.5; bool fastIncrement = (time - g_lastTappedTime) > 0.5;
constexpr double INCREMENT_TIME = 1.0 / 120.0; constexpr double INCREMENT_TIME = 1.0 / 120.0;
constexpr double INCREMENT_SOUND_TIME = 1.0 / 7.5;
bool isPlayIncrementSound = true;
if (fastIncrement) if (fastIncrement)
{ {
isPlayIncrementSound = (time - g_lastIncrementSoundTime) > INCREMENT_SOUND_TIME;
if ((time - g_lastIncrementTime) < INCREMENT_TIME) if ((time - g_lastIncrementTime) < INCREMENT_TIME)
fastIncrement = false; fastIncrement = false;
else else
@ -747,8 +753,13 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef<T>* conf
deltaTime -= INCREMENT_TIME; deltaTime -= INCREMENT_TIME;
} while (fastIncrement && deltaTime > 0.0f); } while (fastIncrement && deltaTime > 0.0f);
if ((increment || decrement) && (config->Value >= valueMin && config->Value <= valueMax)) bool isConfigValueInBounds = config->Value >= valueMin && config->Value <= valueMax;
if ((increment || decrement) && isConfigValueInBounds && isPlayIncrementSound)
{
g_lastIncrementSoundTime = time;
Game_PlaySound("sys_actstg_twn_speechbutton"); Game_PlaySound("sys_actstg_twn_speechbutton");
}
config->Value = std::clamp(config->Value, valueMin, valueMax); config->Value = std::clamp(config->Value, valueMin, valueMax);
} }
@ -976,6 +987,8 @@ static void DrawInfoPanel()
desc = buf; desc = buf;
} }
desc += "\n\n" + g_selectedItem->GetValueDescription();
auto size = Scale(26.0f); auto size = Scale(26.0f);
auto textSize = g_seuratFont->CalcTextSizeA(size, FLT_MAX, 0.0f, desc.c_str()); auto textSize = g_seuratFont->CalcTextSizeA(size, FLT_MAX, 0.0f, desc.c_str());

View file

@ -213,52 +213,52 @@ jump_address = 0x8247DD3C
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247DD48 # Slope address = 0x8247DD48 # Slope
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247DDFC # Dash path binormal address = 0x8247DDFC # Dash path binormal
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E280 # Target front offset address = 0x8247E280 # Target front offset
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E300 # Target address = 0x8247E300 # Target
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E3C8 # Target address = 0x8247E3C8 # Target
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E4A0 # Target up positive address = 0x8247E4A0 # Target up positive
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E4E8 # Target up negative address = 0x8247E4E8 # Target up negative
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247E9FC # Position address = 0x8247E9FC # Position
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247EA84 # Position up negative address = 0x8247EA84 # Position up negative
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247EA50 # Position up positive address = 0x8247EA50 # Position up positive
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraDeltaTimeFixMidAsmHook" name = "CameraDeltaTimeFixMidAsmHook"
@ -269,7 +269,7 @@ jump_address = 0x8247ED34
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247ED40 # Distance offset 1 address = 0x8247ED40 # Distance offset 1
registers = ["f0", "f21"] registers = ["f0"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraDeltaTimeFixMidAsmHook" name = "CameraDeltaTimeFixMidAsmHook"
@ -280,12 +280,12 @@ jump_address = 0x8247ED58
[[midasm_hook]] [[midasm_hook]]
name = "CameraLerpFixMidAsmHook" name = "CameraLerpFixMidAsmHook"
address = 0x8247ED64 # Distance offset 2 address = 0x8247ED64 # Distance offset 2
registers = ["f13", "f21"] registers = ["f13"]
[[midasm_hook]] [[midasm_hook]]
name = "CameraTargetSideOffsetLerpFixMidAsmHook" name = "CameraTargetSideOffsetLerpFixMidAsmHook"
address = 0x8247F12C # Target side offset address = 0x8247F12C # Target side offset
registers = ["v13", "v62", "f21"] registers = ["v13", "v62"]
# 2D camera HFR fixes # 2D camera HFR fixes
[[midasm_hook]] [[midasm_hook]]