[XAM] Implemented XamGetLanguageLocaleFallbackString and XamGetLanguageTypeface

- Added stub XamGetLanguageTypefacePatch
- Moved locale related calls to xam_locale from xam_info
This commit is contained in:
Gliniak
2026-05-16 23:43:59 +02:00
committed by Radosław Gliński
parent dc4db67f9c
commit 4c396fe611
4 changed files with 160 additions and 92 deletions

View File

@@ -44,8 +44,6 @@ DEFINE_int32(avpack, 8,
" 7 = TV PAL-60\n"
" 8 = HDMI (default)",
"Video");
DECLARE_int32(user_country);
DECLARE_int32(user_language);
DECLARE_uint32(audio_flag);
DEFINE_bool(staging_mode, 0,
@@ -90,40 +88,6 @@ dword_result_t XamGetOnlineSchema_entry() {
}
DECLARE_XAM_EXPORT1(XamGetOnlineSchema, kNone, kImplemented);
void XamFormatDateString_entry(dword_t locale_format, qword_t filetime,
lpvoid_t output_buffer, dword_t output_count) {
output_buffer.Zero(output_count * sizeof(char16_t));
auto tp = xe::chrono::WinSystemClock::to_sys(
xe::chrono::WinSystemClock::from_file_time(filetime));
auto dp = date::floor<date::days>(tp);
auto year_month_day = date::year_month_day{dp};
auto str = fmt::format(u"{:02d}/{:02d}/{}",
static_cast<unsigned>(year_month_day.month()),
static_cast<unsigned>(year_month_day.day()),
static_cast<int>(year_month_day.year()));
xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,
output_count);
}
DECLARE_XAM_EXPORT1(XamFormatDateString, kNone, kImplemented);
void XamFormatTimeString_entry(dword_t user_index, qword_t filetime,
lpvoid_t output_buffer, dword_t output_count) {
output_buffer.Zero(output_count * sizeof(char16_t));
auto tp = xe::chrono::WinSystemClock::to_sys(
xe::chrono::WinSystemClock::from_file_time(filetime));
auto dp = date::floor<date::days>(tp);
auto time = date::hh_mm_ss{date::floor<std::chrono::milliseconds>(tp - dp)};
auto str = fmt::format(u"{:02d}:{:02d}", time.hours().count(),
time.minutes().count());
xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,
output_count);
}
DECLARE_XAM_EXPORT1(XamFormatTimeString, kNone, kImplemented);
dword_result_t keXamBuildResourceLocator(uint64_t module,
const std::u16string& container,
const std::u16string& resource,
@@ -253,61 +217,6 @@ dword_result_t XGetAVPack_entry() {
}
DECLARE_XAM_EXPORT1(XGetAVPack, kNone, kStub);
uint32_t xeXGetGameRegion() {
static uint32_t constexpr table[] = {
0xFFFFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x02FEu, 0x0201u, 0x03FFu,
0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu,
0x00FFu, 0xFFFFu, 0x02FEu, 0x03FFu, 0x0102u, 0x03FFu, 0x03FFu, 0x02FEu,
0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu,
0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu,
0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu,
0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x03FFu, 0x0101u, 0x03FFu, 0x03FFu,
0x03FFu, 0x03FFu, 0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x02FEu, 0x02FEu,
0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x03FFu, 0x0102u, 0x03FFu, 0x00FFu,
0x03FFu, 0x03FFu, 0x02FEu, 0x02FEu, 0x0201u, 0x03FFu, 0x03FFu, 0x03FFu,
0x03FFu, 0x03FFu, 0x02FEu, 0x03FFu, 0x02FEu, 0x03FFu, 0x03FFu, 0x02FEu,
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);
return country < xe::countof(table) ? table[country] : 0xFFFFu;
}
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);
uint32_t region = xeXGetGameRegion();
auto max_languages = extended_languages_support ? XLanguage::kMaxLanguages
: XLanguage::kSChinese;
if (desired_language < max_languages) {
return desired_language;
}
if ((region & 0xff00) != 0x100) {
return XLanguage::kEnglish;
}
switch (region) {
case 0x101: // NTSC-J (Japan)
return XLanguage::kJapanese;
case 0x102: // NTSC-J (China)
return extended_languages_support ? XLanguage::kSChinese
: XLanguage::kEnglish;
default:
return XLanguage::kKorean;
}
}
dword_result_t XGetLanguage_entry() {
return static_cast<uint32_t>(xeGetLanguage(false));
}
DECLARE_XAM_EXPORT1(XGetLanguage, kNone, kImplemented);
dword_result_t XamGetLanguage_entry() {
return static_cast<uint32_t>(xeGetLanguage(true));
}
DECLARE_XAM_EXPORT1(XamGetLanguage, kNone, kImplemented);
dword_result_t XamGetCurrentTitleId_entry() {
return kernel_state()->emulator()->title_id();
}