[XConfig] Implementation of XConfig

This commit is contained in:
Gliniak
2026-05-17 21:30:10 +02:00
committed by Radosław Gliński
parent f88bfbe41e
commit 99ea6da18a
31 changed files with 2020 additions and 846 deletions

View File

@@ -21,8 +21,6 @@
#include "third_party/fmt/include/fmt/format.h"
#include "third_party/fmt/include/fmt/xchar.h"
DECLARE_int32(user_country);
DECLARE_int32(user_language);
// TODO(gibbed): put these forward decls in a header somewhere.
namespace xe {
@@ -205,17 +203,14 @@ uint8_t xeXamGetLocaleFromCountry(uint8_t id) {
// Helpers.
uint8_t xeXamGetLocaleEx(uint8_t max_country_id, uint8_t max_locale_id) {
// TODO(gibbed): rework when XConfig is cleanly implemented.
uint8_t country_id = static_cast<uint8_t>(cvars::user_country);
/*if (XSUCCEEDED(xboxkrnl::xeExGetXConfigSetting(
3, 14, &country_id, sizeof(country_id), nullptr))) {*/
uint8_t country_id = kernel_state()->xconfig()->ReadSetting<uint8_t>(
XCONFIG_USER_CATEGORY, XCONFIG_USER_COUNTRY);
if (country_id <= max_country_id) {
uint8_t locale_id = xeXamGetLocaleFromCountry(country_id);
if (locale_id <= max_locale_id) {
return locale_id;
}
}
/*}*/
// couldn't find locale, fallback from game region.
auto game_region = xeXGetGameRegion();
@@ -529,7 +524,9 @@ uint32_t xeXGetGameRegion() {
0x02FEu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu, 0x02FEu, 0xFFFFu, 0x03FFu,
0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x03FFu, 0x02FEu, 0x00FFu,
0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu};
auto country = static_cast<uint8_t>(cvars::user_country);
auto country = kernel_state()->xconfig()->ReadSetting<uint8_t>(
XCONFIG_USER_CATEGORY,
XCONFIG_USER_CATEGORY_ENTRIES::XCONFIG_USER_COUNTRY);
return country < xe::countof(table) ? table[country] : 0xFFFFu;
}
@@ -537,7 +534,11 @@ dword_result_t XGetGameRegion_entry() { return xeXGetGameRegion(); }
DECLARE_XAM_EXPORT1(XGetGameRegion, kNone, kStub);
XLanguage xeGetLanguage(bool extended_languages_support) {
auto desired_language = static_cast<XLanguage>(cvars::user_language);
auto desired_language =
static_cast<XLanguage>(kernel_state()->xconfig()->ReadSetting<uint32_t>(
XCONFIG_USER_CATEGORY,
XCONFIG_USER_CATEGORY_ENTRIES::XCONFIG_USER_LANGUAGE));
uint32_t region = xeXGetGameRegion();
auto max_languages = extended_languages_support ? XLanguage::kMaxLanguages
: XLanguage::kSChinese;
@@ -599,6 +600,24 @@ pointer_result_t XamGetLanguageTypefacePatch_entry(dword_t language) {
}
DECLARE_XAM_EXPORT1(XamGetLanguageTypefacePatch, kNone, kStub);
dword_result_t XamGetCountry_entry() {
return kernel_state()->xconfig()->ReadSetting<uint32_t>(
XCONFIG_USER_CATEGORY,
XCONFIG_USER_CATEGORY_ENTRIES::XCONFIG_USER_COUNTRY);
}
DECLARE_XAM_EXPORT1(XamGetCountry, kNone, kSketchy);
dword_result_t XamSetCountry_entry(dword_t country) {
const uint8_t country_real = country;
kernel_state()->xconfig()->WriteSetting(
XCONFIG_USER_CATEGORY,
XCONFIG_USER_CATEGORY_ENTRIES::XCONFIG_USER_COUNTRY, &country_real);
return 0;
}
DECLARE_XAM_EXPORT1(XamSetCountry, kNone, kSketchy);
} // namespace xam
} // namespace kernel
} // namespace xe