From 422ee1fbdc39a134e491c9f690246fe8246abbad Mon Sep 17 00:00:00 2001 From: Bo Anderson Date: Tue, 6 Dec 2022 21:21:10 +0000 Subject: [PATCH] kernal/xam/xam_info: base game region on user_country It is debatable whether this is correct in the general case. There's nothing really wrong with 0xFFFF logically. Burnout Paradise however bases its in-game language on this and does not recognise 0xFFFF. The game uses Japanese in the default case. I've avoided the "rest of Asia" code since Burnout Paradise seems to use a different value (0x01F8) for that than what I expected (0x01FC). --- src/xenia/kernel/xam/xam_info.cc | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index 9c6dd0611..ec4acc082 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -26,6 +26,7 @@ #include "third_party/fmt/include/fmt/format.h" DEFINE_int32(avpack, 8, "Video modes", "Video"); +DECLARE_int32(user_country); DECLARE_int32(user_language); namespace xe { @@ -206,7 +207,25 @@ dword_result_t XGetAVPack_entry() { } DECLARE_XAM_EXPORT1(XGetAVPack, kNone, kStub); -uint32_t xeXGetGameRegion() { return 0xFFFFu; } +uint32_t xeXGetGameRegion() { + static uint32_t const 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(cvars::user_country); + return country < xe::countof(table) ? table[country] : 0xFFFFu; +} dword_result_t XGetGameRegion_entry() { return xeXGetGameRegion(); } DECLARE_XAM_EXPORT1(XGetGameRegion, kNone, kStub);