Skip to content

Commit

Permalink
[Base] Move XdbfLocale to xbox.h as XLanguage, let STFS headers use it
Browse files Browse the repository at this point in the history
Renamed to XLanguage because AFAIK locale on Xbox is a different concept involving countries, this enum only involves languages though.
  • Loading branch information
emoose committed May 5, 2021
1 parent 1f1baea commit f2a65c1
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/xenia/emulator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,7 @@ X_STATUS Emulator::CompleteLaunch(const std::filesystem::path& path,
module->memory()->TranslateVirtual(resource_data), resource_size);
if (db.is_valid()) {
// TODO(gibbed): get title respective to user locale.
title_name_ = db.title(kernel::util::XdbfLocale::kEnglish);
title_name_ = db.title(XLanguage::kEnglish);
if (title_name_.empty()) {
// If English title is unavailable, get the title in default locale.
title_name_ = db.title();
Expand Down
14 changes: 7 additions & 7 deletions src/xenia/kernel/util/xdbf_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ XdbfBlock XdbfWrapper::GetEntry(XdbfSection section, uint64_t id) const {
return {0};
}

std::string XdbfWrapper::GetStringTableEntry(XdbfLocale locale,
std::string XdbfWrapper::GetStringTableEntry(XLanguage language,
uint16_t string_id) const {
auto language_block =
GetEntry(XdbfSection::kStringTable, static_cast<uint64_t>(locale));
GetEntry(XdbfSection::kStringTable, static_cast<uint64_t>(language));
if (!language_block) {
return "";
}
Expand Down Expand Up @@ -88,22 +88,22 @@ XdbfBlock XdbfGameData::icon() const {
return GetEntry(XdbfSection::kImage, kXdbfIdTitle);
}

XdbfLocale XdbfGameData::default_language() const {
XLanguage XdbfGameData::default_language() const {
auto block = GetEntry(XdbfSection::kMetadata, kXdbfIdXstc);
if (!block.buffer) {
return XdbfLocale::kEnglish;
return XLanguage::kEnglish;
}
auto xstc = reinterpret_cast<const XdbfXstc*>(block.buffer);
assert_true(xstc->magic == kXdbfMagicXstc);
return static_cast<XdbfLocale>(static_cast<uint32_t>(xstc->default_language));
return static_cast<XLanguage>(static_cast<uint32_t>(xstc->default_language));
}

std::string XdbfGameData::title() const {
return GetStringTableEntry(default_language(), kXdbfIdTitle);
}

std::string XdbfGameData::title(XdbfLocale locale) const {
return GetStringTableEntry(locale, kXdbfIdTitle);
std::string XdbfGameData::title(XLanguage language) const {
return GetStringTableEntry(language, kXdbfIdTitle);
}

} // namespace util
Expand Down
20 changes: 4 additions & 16 deletions src/xenia/kernel/util/xdbf_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <vector>

#include "xenia/base/memory.h"
#include "xenia/xbox.h"

namespace xe {
namespace kernel {
Expand All @@ -28,19 +29,6 @@ enum class XdbfSection : uint16_t {
kStringTable = 0x0003,
};

// Found by dumping the kSectionStringTable sections of various games:
enum class XdbfLocale : uint32_t {
kUnknown = 0,
kEnglish = 1,
kJapanese = 2,
kGerman = 3,
kFrench = 4,
kSpanish = 5,
kItalian = 6,
kKorean = 7,
kChinese = 8,
};

struct XdbfBlock {
const uint8_t* buffer;
size_t size;
Expand All @@ -63,7 +51,7 @@ class XdbfWrapper {

// Gets a string from the string table in the given language.
// Returns the empty string if the entry is not found.
std::string GetStringTableEntry(XdbfLocale locale, uint16_t string_id) const;
std::string GetStringTableEntry(XLanguage language, uint16_t string_id) const;

protected:
#pragma pack(push, 1)
Expand Down Expand Up @@ -133,12 +121,12 @@ class XdbfGameData : public XdbfWrapper {
XdbfBlock icon() const;

// The game's default language.
XdbfLocale default_language() const;
XLanguage default_language() const;

// The game's title in its default language.
std::string title() const;

std::string title(XdbfLocale locale) const;
std::string title(XLanguage language) const;
};

} // namespace util
Expand Down
11 changes: 4 additions & 7 deletions src/xenia/kernel/xam/xam_info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ namespace xe {
namespace kernel {
namespace xam {

constexpr uint32_t X_LANGUAGE_ENGLISH = 1;
constexpr uint32_t X_LANGUAGE_JAPANESE = 2;

dword_result_t XamFeatureEnabled(dword_t unk) { return 0; }
DECLARE_XAM_EXPORT1(XamFeatureEnabled, kNone, kStub);

Expand Down Expand Up @@ -208,19 +205,19 @@ dword_result_t XGetGameRegion() { return xeXGetGameRegion(); }
DECLARE_XAM_EXPORT1(XGetGameRegion, kNone, kStub);

dword_result_t XGetLanguage() {
uint32_t desired_language = X_LANGUAGE_ENGLISH;
auto desired_language = XLanguage::kEnglish;

// Switch the language based on game region.
// TODO(benvanik): pull from xex header.
uint32_t game_region = XEX_REGION_NTSCU;
if (game_region & XEX_REGION_NTSCU) {
desired_language = X_LANGUAGE_ENGLISH;
desired_language = XLanguage::kEnglish;
} else if (game_region & XEX_REGION_NTSCJ) {
desired_language = X_LANGUAGE_JAPANESE;
desired_language = XLanguage::kJapanese;
}
// Add more overrides?

return desired_language;
return uint32_t(desired_language);
}
DECLARE_XAM_EXPORT1(XGetLanguage, kNone, kImplemented);

Expand Down
40 changes: 28 additions & 12 deletions src/xenia/vfs/devices/stfs_container_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,11 +268,13 @@ XEPACKEDSTRUCT(XContentMetadata, {
char16_t description_ex_chars[kNumLanguagesV2 - kNumLanguagesV1][128];
};

std::u16string display_name(uint32_t lang_id) const {
lang_id--;
std::u16string display_name(XLanguage language) const {
uint32_t lang_id = uint32_t(language) - 1;

if (lang_id >= kNumLanguagesV2) {
assert_always();
lang_id = 0; // no room for this lang, read from english slot..
// no room for this lang, read from english slot..
lang_id = uint32_t(XLanguage::kEnglish) - 1;
}

const be<uint16_t>* str = 0;
Expand All @@ -284,17 +286,21 @@ XEPACKEDSTRUCT(XContentMetadata, {
}

if (!str) {
// Invalid language ID?
assert_always();
return u"";
}

return load_and_swap<std::u16string>(str);
}

std::u16string description(uint32_t lang_id) const {
lang_id--;
std::u16string description(XLanguage language) const {
uint32_t lang_id = uint32_t(language) - 1;

if (lang_id >= kNumLanguagesV2) {
assert_always();
lang_id = 0; // no room for this lang, read from english slot..
// no room for this lang, read from english slot..
lang_id = uint32_t(XLanguage::kEnglish) - 1;
}

const be<uint16_t>* str = 0;
Expand All @@ -306,6 +312,8 @@ XEPACKEDSTRUCT(XContentMetadata, {
}

if (!str) {
// Invalid language ID?
assert_always();
return u"";
}

Expand All @@ -320,11 +328,13 @@ XEPACKEDSTRUCT(XContentMetadata, {
return load_and_swap<std::u16string>(title_name_raw);
}

bool set_display_name(uint32_t lang_id, const std::u16string_view value) {
lang_id--;
bool set_display_name(XLanguage language, const std::u16string_view value) {
uint32_t lang_id = uint32_t(language) - 1;

if (lang_id >= kNumLanguagesV2) {
assert_always();
lang_id = 0; // no room for this lang, store in english slot..
// no room for this lang, store in english slot..
lang_id = uint32_t(XLanguage::kEnglish) - 1;
}

char16_t* str = 0;
Expand All @@ -336,6 +346,8 @@ XEPACKEDSTRUCT(XContentMetadata, {
}

if (!str) {
// Invalid language ID?
assert_always();
return false;
}

Expand All @@ -344,11 +356,13 @@ XEPACKEDSTRUCT(XContentMetadata, {
return true;
}

bool set_description(uint32_t lang_id, const std::u16string_view value) {
lang_id--;
bool set_description(XLanguage language, const std::u16string_view value) {
uint32_t lang_id = uint32_t(language) - 1;

if (lang_id >= kNumLanguagesV2) {
assert_always();
lang_id = 0; // no room for this lang, store in english slot..
// no room for this lang, store in english slot..
lang_id = uint32_t(XLanguage::kEnglish) - 1;
}

char16_t* str = 0;
Expand All @@ -360,6 +374,8 @@ XEPACKEDSTRUCT(XContentMetadata, {
}

if (!str) {
// Invalid language ID?
assert_always();
return false;
}

Expand Down
21 changes: 21 additions & 0 deletions src/xenia/xbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,27 @@ static_assert_size(X_EXCEPTION_RECORD, 0x50);

#pragma pack(pop)

// Found by dumping the kSectionStringTable sections of various games:
// and the language list at
// https://free60project.github.io/wiki/Profile_Account/
enum class XLanguage : uint32_t {
kInvalid = 0,
kEnglish = 1,
kJapanese = 2,
kGerman = 3,
kFrench = 4,
kSpanish = 5,
kItalian = 6,
kKorean = 7,
kTChinese = 8,
kPortuguese = 9,
kSChinese = 10,
kPolish = 11,
kRussian = 12,
// STFS headers can't support any more languages than these
kMaxLanguages = 13
};

} // namespace xe

// clang-format on
Expand Down

0 comments on commit f2a65c1

Please sign in to comment.