mirror of
https://github.com/hedge-dev/UnleashedRecomp
synced 2026-06-10 12:55:51 -04:00
Linux support. (#54)
* Initial Linux attempt. * Add clang toolchain & make tools compile. * vcpkg as submodule. * First implementation of IO rewrite. (#31) * Fix directory iteration resolving symlinks. * Refactor kernel objects to be lock-free. * Implement guest critical sections using std::atomic. * Make D3D12 support optional. (#33) * Make D3D12 support optional. * Update ShaderRecomp, fix macros. * Replace QueryPerformanceCounter. (#35) * Add Linux home path for GetUserPath(). (#36) * Cross-platform Sleep. (#37) * Add mmap implementations for virtual allocation. (#38) * Cross-platform TLS. (#34) * Cross-platform TLS. * Fix front() to back(), use Mutex. * Fix global variable namings. --------- Co-authored-by: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> * Unicode support. (#39) * Replace CreateDirectoryA with Unicode version. * Cross platform thread implementation. (#41) * Cross-platform thread implementation. * Put set thread name calls behind a Win32 macro. * Cross-platform semaphore implementation. (#43) * xam: use SDL for keyboard input * Cross-platform atomic operations. (#44) * Cross-platform spin lock implementation. * Cross-platform reference counting. * Cross-platform event implementation. (#47) * Compiling and running on Linux. (#49) * Current work trying to get it to compile. * Update vcpkg.json baseline. * vcpkg, memory mapped file. * Bitscan forward. * Fix localtime_s. * FPS patches high res clock. * Rename Window to GameWindow. Fix guest pointers. * GetCurrentThreadID gone. * Code cache pointers, RenderWindow type. * Add Linux stubs. * Refactor Config. * Fix paths. * Add linux-release config. * FS fixes. * Fix Windows compilation errors & unicode converter crash. * Rename physical memory allocation functions to not clash with X11. * Fix NULL character being added on RtlMultiByteToUnicodeN. * Use std::exit. * Add protection to memory on Linux. * Convert majority of dependencies to submodules. (#48) * Convert majority of dependencies to submodules. * Don't compile header-only libraries. * Fix a few incorrect data types. * Fix config directory. * Unicode fixes & sizeof asserts. * Change the exit function to not call static destructors. * Fix files picker. * Add RelWithDebInfo preset for Linux. * Implement OS Restart on Linux. (#50) --------- Co-authored-by: Dario <dariosamo@gmail.com> * Update PowerRecomp. * Add Env Var detection for VCPKG_ROOT, add DLC detection. * Use error code version on DLC directory iterator. * Set D3D12MA::ALLOCATOR_FLAG_DONT_PREFER_SMALL_BUFFERS_COMMITTED flag. * Linux flatpak. (#51) * Add flatpak support. * Add game install directory override for flatpak. * Flatpak'ing. * Flatpak it some more. * We flat it, we pak it. * Flatpak'd. * The Marvelous Misadventures of Flatpak. * Attempt to change logic of NFD and show error. * Flattenpakken. * Use game install directory instead of current path. * Attempt to fix line endings. * Update io.github.hedge_dev.unleashedrecomp.json * Fix system time query implementation. * Add Present Wait to Vulkan to improve frame pacing and reduce latency. (#53) * Add present wait support to Vulkan. * Default to triple buffering if presentWait is supported. * Bracey fellas. * Update paths.h * SDL2 audio (again). (#52) * Implement SDL2 audio (again). * Call timeBeginPeriod/timeEndPeriod. * Replace miniaudio with SDL mixer. * Queue audio samples in a separate thread. * Enable CMake option override policy & fix compilation error. * Fix compilation error on Linux. * Fix but also trim shared strings. * Wayland support. (#55) * Make channel index a global variable in embedded player. * Fix SDL Audio selection for OGG on Flatpak. * Minor installer wizard fixes. * Fix compilation error. * Yield in model consumer and pipeline compiler threads. * Special case Sleep(0) to yield on Linux. * Add App Id hint. * Correct implementation for auto reset events. (#57) --------- Co-authored-by: Dario <dariosamo@gmail.com> Co-authored-by: Hyper <34012267+hyperbx@users.noreply.github.com>
This commit is contained in:
@@ -1,14 +1,592 @@
|
||||
#pragma once
|
||||
|
||||
#include <user/config_detail.h>
|
||||
#include <locale/locale.h>
|
||||
#include <user/paths.h>
|
||||
#include <exports.h>
|
||||
|
||||
class IConfigDef
|
||||
{
|
||||
public:
|
||||
virtual ~IConfigDef() = default;
|
||||
virtual void ReadValue(toml::v3::ex::parse_result& toml) = 0;
|
||||
virtual void MakeDefault() = 0;
|
||||
virtual std::string_view GetSection() const = 0;
|
||||
virtual std::string_view GetName() const = 0;
|
||||
virtual std::string GetNameLocalised(ELanguage language) const = 0;
|
||||
virtual std::string GetDescription(ELanguage language) const = 0;
|
||||
virtual bool IsDefaultValue() const = 0;
|
||||
virtual const void* GetValue() const = 0;
|
||||
virtual std::string GetValueLocalised(ELanguage language) const = 0;
|
||||
virtual std::string GetValueDescription(ELanguage language) const = 0;
|
||||
virtual std::string GetDefinition(bool withSection = false) const = 0;
|
||||
virtual std::string ToString(bool strWithQuotes = true) const = 0;
|
||||
virtual void GetLocaleStrings(std::vector<std::string_view>& localeStrings) const = 0;
|
||||
};
|
||||
|
||||
#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::tuple<std::string, std::string>>>
|
||||
|
||||
#define CONFIG_DEFINE(section, type, name, defaultValue) \
|
||||
static inline ConfigDef<type> name{section, #name, defaultValue};
|
||||
|
||||
#define CONFIG_DEFINE_LOCALISED(section, type, name, defaultValue) \
|
||||
static CONFIG_LOCALE g_##name##_locale; \
|
||||
static inline ConfigDef<type> name{section, #name, &g_##name##_locale, defaultValue};
|
||||
|
||||
#define CONFIG_DEFINE_ENUM(section, type, name, defaultValue) \
|
||||
static inline ConfigDef<type> name{section, #name, defaultValue, &g_##type##_template};
|
||||
|
||||
#define CONFIG_DEFINE_ENUM_LOCALISED(section, type, name, defaultValue) \
|
||||
static CONFIG_LOCALE g_##name##_locale; \
|
||||
static CONFIG_ENUM_LOCALE(type) g_##type##_locale; \
|
||||
static inline ConfigDef<type> name{section, #name, &g_##name##_locale, defaultValue, &g_##type##_template, &g_##type##_locale};
|
||||
|
||||
#define CONFIG_DEFINE_CALLBACK(section, type, name, defaultValue, readCallback) \
|
||||
static CONFIG_LOCALE g_##name##_locale; \
|
||||
static inline ConfigDef<type> name{section, #name, defaultValue, [](ConfigDef<type>* def) readCallback};
|
||||
|
||||
#define CONFIG_DEFINE_ENUM_TEMPLATE(type) \
|
||||
inline std::unordered_map<std::string, type> g_##type##_template =
|
||||
|
||||
#define WINDOWPOS_CENTRED 0x2FFF0000
|
||||
|
||||
inline std::vector<IConfigDef*> g_configDefinitions;
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(ELanguage)
|
||||
{
|
||||
{ "English", ELanguage::English },
|
||||
{ "Japanese", ELanguage::Japanese },
|
||||
{ "German", ELanguage::German },
|
||||
{ "French", ELanguage::French },
|
||||
{ "Spanish", ELanguage::Spanish },
|
||||
{ "Italian", ELanguage::Italian }
|
||||
};
|
||||
|
||||
enum class EUnleashGaugeBehaviour : uint32_t
|
||||
{
|
||||
Original,
|
||||
Revised
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EUnleashGaugeBehaviour)
|
||||
{
|
||||
{ "Original", EUnleashGaugeBehaviour::Original },
|
||||
{ "Revised", EUnleashGaugeBehaviour::Revised }
|
||||
};
|
||||
|
||||
enum class ETimeOfDayTransition : uint32_t
|
||||
{
|
||||
Xbox,
|
||||
PlayStation
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(ETimeOfDayTransition)
|
||||
{
|
||||
{ "Xbox", ETimeOfDayTransition::Xbox },
|
||||
{ "PlayStation", ETimeOfDayTransition::PlayStation }
|
||||
};
|
||||
|
||||
enum class EControllerIcons : uint32_t
|
||||
{
|
||||
Auto,
|
||||
Xbox,
|
||||
PlayStation
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EControllerIcons)
|
||||
{
|
||||
{ "Auto", EControllerIcons::Auto },
|
||||
{ "Xbox", EControllerIcons::Xbox },
|
||||
{ "PlayStation", EControllerIcons::PlayStation }
|
||||
};
|
||||
|
||||
enum class EVoiceLanguage : uint32_t
|
||||
{
|
||||
English,
|
||||
Japanese
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EVoiceLanguage)
|
||||
{
|
||||
{ "English", EVoiceLanguage::English },
|
||||
{ "Japanese", EVoiceLanguage::Japanese }
|
||||
};
|
||||
|
||||
enum class EGraphicsAPI : uint32_t
|
||||
{
|
||||
#ifdef SWA_D3D12
|
||||
D3D12,
|
||||
#endif
|
||||
Vulkan
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EGraphicsAPI)
|
||||
{
|
||||
#ifdef SWA_D3D12
|
||||
{ "D3D12", EGraphicsAPI::D3D12 },
|
||||
#endif
|
||||
{ "Vulkan", EGraphicsAPI::Vulkan }
|
||||
};
|
||||
|
||||
enum class EWindowState : uint32_t
|
||||
{
|
||||
Normal,
|
||||
Maximised
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EWindowState)
|
||||
{
|
||||
{ "Normal", EWindowState::Normal },
|
||||
{ "Maximised", EWindowState::Maximised },
|
||||
{ "Maximized", EWindowState::Maximised }
|
||||
};
|
||||
|
||||
enum class EAspectRatio : uint32_t
|
||||
{
|
||||
Auto,
|
||||
Square,
|
||||
Widescreen
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EAspectRatio)
|
||||
{
|
||||
{ "Auto", EAspectRatio::Auto },
|
||||
{ "4:3", EAspectRatio::Square },
|
||||
{ "16:9", EAspectRatio::Widescreen }
|
||||
};
|
||||
|
||||
enum class ETripleBuffering : uint32_t
|
||||
{
|
||||
Auto,
|
||||
On,
|
||||
Off
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(ETripleBuffering)
|
||||
{
|
||||
{ "Auto", ETripleBuffering::Auto },
|
||||
{ "On", ETripleBuffering::On },
|
||||
{ "Off", ETripleBuffering::Off }
|
||||
};
|
||||
|
||||
enum class EAntiAliasing : uint32_t
|
||||
{
|
||||
None = 0,
|
||||
MSAA2x = 2,
|
||||
MSAA4x = 4,
|
||||
MSAA8x = 8
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EAntiAliasing)
|
||||
{
|
||||
{ "None", EAntiAliasing::None },
|
||||
{ "2x MSAA", EAntiAliasing::MSAA2x },
|
||||
{ "4x MSAA", EAntiAliasing::MSAA4x },
|
||||
{ "8x MSAA", EAntiAliasing::MSAA8x }
|
||||
};
|
||||
|
||||
enum class EShadowResolution : int32_t
|
||||
{
|
||||
Original = -1,
|
||||
x512 = 512,
|
||||
x1024 = 1024,
|
||||
x2048 = 2048,
|
||||
x4096 = 4096,
|
||||
x8192 = 8192
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EShadowResolution)
|
||||
{
|
||||
{ "Original", EShadowResolution::Original },
|
||||
{ "512", EShadowResolution::x512 },
|
||||
{ "1024", EShadowResolution::x1024 },
|
||||
{ "2048", EShadowResolution::x2048 },
|
||||
{ "4096", EShadowResolution::x4096 },
|
||||
{ "8192", EShadowResolution::x8192 },
|
||||
};
|
||||
|
||||
enum class EGITextureFiltering : uint32_t
|
||||
{
|
||||
Bilinear,
|
||||
Bicubic
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EGITextureFiltering)
|
||||
{
|
||||
{ "Bilinear", EGITextureFiltering::Bilinear },
|
||||
{ "Bicubic", EGITextureFiltering::Bicubic }
|
||||
};
|
||||
|
||||
enum class EDepthOfFieldQuality : uint32_t
|
||||
{
|
||||
Auto,
|
||||
Low,
|
||||
Medium,
|
||||
High,
|
||||
Ultra
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EDepthOfFieldQuality)
|
||||
{
|
||||
{ "Auto", EDepthOfFieldQuality::Auto },
|
||||
{ "Low", EDepthOfFieldQuality::Low },
|
||||
{ "Medium", EDepthOfFieldQuality::Medium },
|
||||
{ "High", EDepthOfFieldQuality::High },
|
||||
{ "Ultra", EDepthOfFieldQuality::Ultra }
|
||||
};
|
||||
|
||||
enum class EMotionBlur : uint32_t
|
||||
{
|
||||
Off,
|
||||
Original,
|
||||
Enhanced
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EMotionBlur)
|
||||
{
|
||||
{ "Off", EMotionBlur::Off },
|
||||
{ "Original", EMotionBlur::Original },
|
||||
{ "Enhanced", EMotionBlur::Enhanced }
|
||||
};
|
||||
|
||||
enum class EMovieScaleMode : uint32_t
|
||||
{
|
||||
Stretch,
|
||||
Fit,
|
||||
Fill
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EMovieScaleMode)
|
||||
{
|
||||
{ "Stretch", EMovieScaleMode::Stretch },
|
||||
{ "Fit", EMovieScaleMode::Fit },
|
||||
{ "Fill", EMovieScaleMode::Fill }
|
||||
};
|
||||
|
||||
enum class EUIScaleMode : uint32_t
|
||||
{
|
||||
Stretch,
|
||||
Edge,
|
||||
Centre
|
||||
};
|
||||
|
||||
CONFIG_DEFINE_ENUM_TEMPLATE(EUIScaleMode)
|
||||
{
|
||||
{ "Stretch", EUIScaleMode::Stretch },
|
||||
{ "Edge", EUIScaleMode::Edge },
|
||||
{ "Centre", EUIScaleMode::Centre },
|
||||
{ "Center", EUIScaleMode::Centre }
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class ConfigDef final : public IConfigDef
|
||||
{
|
||||
public:
|
||||
std::string Section{};
|
||||
std::string Name{};
|
||||
CONFIG_LOCALE* Locale{};
|
||||
T DefaultValue{};
|
||||
T Value{ DefaultValue };
|
||||
std::unordered_map<std::string, T>* EnumTemplate;
|
||||
std::map<T, std::string> EnumTemplateReverse{};
|
||||
CONFIG_ENUM_LOCALE(T)* EnumLocale{};
|
||||
std::function<void(ConfigDef<T>*)> Callback;
|
||||
|
||||
// CONFIG_DEFINE
|
||||
ConfigDef(std::string section, std::string name, T defaultValue) : Section(section), Name(name), DefaultValue(defaultValue)
|
||||
{
|
||||
g_configDefinitions.emplace_back(this);
|
||||
}
|
||||
|
||||
// CONFIG_DEFINE_LOCALISED
|
||||
ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, T defaultValue) : Section(section), Name(name), Locale(nameLocale), DefaultValue(defaultValue)
|
||||
{
|
||||
g_configDefinitions.emplace_back(this);
|
||||
}
|
||||
|
||||
// CONFIG_DEFINE_ENUM
|
||||
ConfigDef(std::string section, std::string name, T defaultValue, std::unordered_map<std::string, T>* enumTemplate) : Section(section), Name(name), DefaultValue(defaultValue), EnumTemplate(enumTemplate)
|
||||
{
|
||||
for (const auto& pair : *EnumTemplate)
|
||||
EnumTemplateReverse[pair.second] = pair.first;
|
||||
|
||||
g_configDefinitions.emplace_back(this);
|
||||
}
|
||||
|
||||
// CONFIG_DEFINE_ENUM_LOCALISED
|
||||
ConfigDef(std::string section, std::string name, CONFIG_LOCALE* nameLocale, T defaultValue, std::unordered_map<std::string, T>* enumTemplate, CONFIG_ENUM_LOCALE(T)* enumLocale) : Section(section), Name(name), Locale(nameLocale), DefaultValue(defaultValue), EnumTemplate(enumTemplate), EnumLocale(enumLocale)
|
||||
{
|
||||
for (const auto& pair : *EnumTemplate)
|
||||
EnumTemplateReverse[pair.second] = pair.first;
|
||||
|
||||
g_configDefinitions.emplace_back(this);
|
||||
}
|
||||
|
||||
// CONFIG_DEFINE_CALLBACK
|
||||
ConfigDef(std::string section, std::string name, T defaultValue, std::function<void(ConfigDef<T>*)> callback) : Section(section), Name(name), DefaultValue(defaultValue), Callback(callback)
|
||||
{
|
||||
g_configDefinitions.emplace_back(this);
|
||||
}
|
||||
|
||||
void ReadValue(toml::v3::ex::parse_result& toml) override
|
||||
{
|
||||
if (auto pSection = toml[Section].as_table())
|
||||
{
|
||||
const auto& section = *pSection;
|
||||
|
||||
if constexpr (std::is_same<T, std::string>::value)
|
||||
{
|
||||
Value = section[Name].value_or<std::string>(DefaultValue);
|
||||
}
|
||||
else if constexpr (std::is_enum_v<T>)
|
||||
{
|
||||
std::string value = section[Name].value_or(std::string());
|
||||
auto it = EnumTemplate->find(value);
|
||||
if (it != EnumTemplate->end())
|
||||
{
|
||||
Value = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
Value = DefaultValue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Value = section[Name].value_or(DefaultValue);
|
||||
}
|
||||
|
||||
if (Callback)
|
||||
Callback(this);
|
||||
}
|
||||
}
|
||||
|
||||
void MakeDefault() override
|
||||
{
|
||||
Value = DefaultValue;
|
||||
}
|
||||
|
||||
std::string_view GetSection() const override
|
||||
{
|
||||
return Section;
|
||||
}
|
||||
|
||||
std::string_view GetName() const override
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
std::string GetNameLocalised(ELanguage language) const override
|
||||
{
|
||||
if (!Locale)
|
||||
return Name;
|
||||
|
||||
if (!Locale->count(language))
|
||||
{
|
||||
if (Locale->count(ELanguage::English))
|
||||
{
|
||||
return std::get<0>(Locale->at(ELanguage::English));
|
||||
}
|
||||
else
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
return std::get<0>(Locale->at(language));
|
||||
}
|
||||
|
||||
std::string GetDescription(ELanguage language) const override
|
||||
{
|
||||
if (!Locale)
|
||||
return "";
|
||||
|
||||
if (!Locale->count(language))
|
||||
{
|
||||
if (Locale->count(ELanguage::English))
|
||||
{
|
||||
return std::get<1>(Locale->at(ELanguage::English));
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
return std::get<1>(Locale->at(language));
|
||||
}
|
||||
|
||||
bool IsDefaultValue() const override
|
||||
{
|
||||
return Value == DefaultValue;
|
||||
}
|
||||
|
||||
const void* GetValue() const override
|
||||
{
|
||||
return &Value;
|
||||
}
|
||||
|
||||
std::string GetValueLocalised(ELanguage language) const override
|
||||
{
|
||||
CONFIG_ENUM_LOCALE(T)* locale = nullptr;
|
||||
|
||||
if constexpr (std::is_enum_v<T>)
|
||||
{
|
||||
locale = EnumLocale;
|
||||
}
|
||||
else if constexpr (std::is_same_v<T, bool>)
|
||||
{
|
||||
return Value
|
||||
? Localise("Common_On")
|
||||
: Localise("Common_Off");
|
||||
}
|
||||
|
||||
if (!locale)
|
||||
return ToString(false);
|
||||
|
||||
if (!locale->count(language))
|
||||
{
|
||||
if (locale->count(ELanguage::English))
|
||||
{
|
||||
language = ELanguage::English;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ToString(false);
|
||||
}
|
||||
}
|
||||
|
||||
auto strings = locale->at(language);
|
||||
|
||||
if (!strings.count(Value))
|
||||
return ToString(false);
|
||||
|
||||
return std::get<0>(strings.at(Value));
|
||||
}
|
||||
|
||||
std::string GetValueDescription(ELanguage language) const override
|
||||
{
|
||||
CONFIG_ENUM_LOCALE(T)* locale = nullptr;
|
||||
|
||||
if constexpr (std::is_enum_v<T>)
|
||||
{
|
||||
locale = EnumLocale;
|
||||
}
|
||||
else if constexpr (std::is_same_v<T, bool>)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
std::string GetDefinition(bool withSection = false) const override
|
||||
{
|
||||
std::string result;
|
||||
|
||||
if (withSection)
|
||||
result += "[" + Section + "]\n";
|
||||
|
||||
result += Name + " = " + ToString();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string ToString(bool strWithQuotes = true) const override
|
||||
{
|
||||
std::string result = "N/A";
|
||||
|
||||
if constexpr (std::is_same_v<T, std::string>)
|
||||
{
|
||||
result = fmt::format("{}", Value);
|
||||
|
||||
if (strWithQuotes)
|
||||
result = fmt::format("\"{}\"", result);
|
||||
}
|
||||
else if constexpr (std::is_enum_v<T>)
|
||||
{
|
||||
auto it = EnumTemplateReverse.find(Value);
|
||||
|
||||
if (it != EnumTemplateReverse.end())
|
||||
result = fmt::format("{}", it->second);
|
||||
|
||||
if (strWithQuotes)
|
||||
result = fmt::format("\"{}\"", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = fmt::format("{}", Value);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void GetLocaleStrings(std::vector<std::string_view>& localeStrings) const override
|
||||
{
|
||||
if (Locale != nullptr)
|
||||
{
|
||||
for (auto& [language, nameAndDesc] : *Locale)
|
||||
{
|
||||
localeStrings.push_back(std::get<0>(nameAndDesc));
|
||||
localeStrings.push_back(std::get<1>(nameAndDesc));
|
||||
}
|
||||
}
|
||||
|
||||
if (EnumLocale != nullptr)
|
||||
{
|
||||
for (auto& [language, locale] : *EnumLocale)
|
||||
{
|
||||
for (auto& [value, nameAndDesc] : locale)
|
||||
{
|
||||
localeStrings.push_back(std::get<0>(nameAndDesc));
|
||||
localeStrings.push_back(std::get<1>(nameAndDesc));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ConfigDef& operator=(const ConfigDef& other)
|
||||
{
|
||||
if (this != &other)
|
||||
Value = other.Value;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
operator T() const
|
||||
{
|
||||
return Value;
|
||||
}
|
||||
|
||||
void operator=(const T& other)
|
||||
{
|
||||
Value = other;
|
||||
}
|
||||
};
|
||||
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
static inline std::vector<IConfigDef*> Definitions{};
|
||||
|
||||
CONFIG_DEFINE_ENUM_LOCALISED("System", ELanguage, Language, ELanguage::English);
|
||||
CONFIG_DEFINE_LOCALISED("System", bool, Hints, true);
|
||||
CONFIG_DEFINE_LOCALISED("System", bool, ControlTutorial, true);
|
||||
@@ -28,7 +606,12 @@ public:
|
||||
CONFIG_DEFINE_LOCALISED("Audio", bool, MusicAttenuation, false);
|
||||
CONFIG_DEFINE_LOCALISED("Audio", bool, BattleTheme, true);
|
||||
|
||||
#ifdef SWA_D3D12
|
||||
CONFIG_DEFINE_ENUM("Video", EGraphicsAPI, GraphicsAPI, EGraphicsAPI::D3D12);
|
||||
#else
|
||||
CONFIG_DEFINE_ENUM("Video", EGraphicsAPI, GraphicsAPI, EGraphicsAPI::Vulkan);
|
||||
#endif
|
||||
|
||||
CONFIG_DEFINE("Video", int32_t, WindowX, WINDOWPOS_CENTRED);
|
||||
CONFIG_DEFINE("Video", int32_t, WindowY, WINDOWPOS_CENTRED);
|
||||
CONFIG_DEFINE("Video", int32_t, WindowWidth, 1280);
|
||||
|
||||
Reference in New Issue
Block a user