diff --git a/src/citra_qt/game_list_p.h b/src/citra_qt/game_list_p.h index 0309ed083..96aaffa33 100644 --- a/src/citra_qt/game_list_p.h +++ b/src/citra_qt/game_list_p.h @@ -75,30 +75,31 @@ static QString GetQStringShortTitleFromSMDH(const Loader::SMDH& smdh, * @return QString region */ static QString GetRegionFromSMDH(const Loader::SMDH& smdh) { - const Loader::SMDH::GameRegion region = smdh.GetRegion(); + using GameRegion = Loader::SMDH::GameRegion; + static const std::map regions_map = { + {GameRegion::Japan, QT_TR_NOOP("Japan")}, + {GameRegion::NorthAmerica, QT_TR_NOOP("North America")}, + {GameRegion::Europe, QT_TR_NOOP("Europe")}, + {GameRegion::Australia, QT_TR_NOOP("Australia")}, + {GameRegion::China, QT_TR_NOOP("China")}, + {GameRegion::Korea, QT_TR_NOOP("Korea")}, + {GameRegion::Taiwan, QT_TR_NOOP("Taiwan")}}; - switch (region) { - case Loader::SMDH::GameRegion::Invalid: + std::vector regions = smdh.GetRegions(); + + if (regions.empty()) { return QObject::tr("Invalid region"); - case Loader::SMDH::GameRegion::Japan: - return QObject::tr("Japan"); - case Loader::SMDH::GameRegion::NorthAmerica: - return QObject::tr("North America"); - case Loader::SMDH::GameRegion::Europe: - return QObject::tr("Europe"); - case Loader::SMDH::GameRegion::Australia: - return QObject::tr("Australia"); - case Loader::SMDH::GameRegion::China: - return QObject::tr("China"); - case Loader::SMDH::GameRegion::Korea: - return QObject::tr("Korea"); - case Loader::SMDH::GameRegion::Taiwan: - return QObject::tr("Taiwan"); - case Loader::SMDH::GameRegion::RegionFree: - return QObject::tr("Region free"); - default: - return QObject::tr("Invalid Region"); } + + if (std::find(regions.begin(), regions.end(), GameRegion::RegionFree) != regions.end()) { + return QObject::tr("Region free"); + } + + QString result = QObject::tr(regions_map.at(regions.front())); + for (auto region = ++regions.begin(); region != regions.end(); ++region) { + result += QStringLiteral("\n") + QObject::tr(regions_map.at(*region)); + } + return result; } class GameListItem : public QStandardItem { diff --git a/src/core/loader/smdh.cpp b/src/core/loader/smdh.cpp index 3392739c5..417f8d074 100644 --- a/src/core/loader/smdh.cpp +++ b/src/core/loader/smdh.cpp @@ -48,20 +48,20 @@ std::array SMDH::GetShortTitle(Loader::SMDH::TitleLanguage language) return titles[static_cast(language)].short_title; } -SMDH::GameRegion SMDH::GetRegion() const { +std::vector SMDH::GetRegions() const { if (region_lockout == 0x7fffffff) { - return GameRegion::RegionFree; + return std::vector{GameRegion::RegionFree}; } constexpr u32 REGION_COUNT = 7; - u32 region = 0; - for (; region < REGION_COUNT; ++region) { + std::vector result; + for (u32 region = 0; region < REGION_COUNT; ++region) { if (region_lockout & (1 << region)) { - return static_cast(region); + result.push_back(static_cast(region)); } } - return GameRegion::Invalid; + return result; } } // namespace Loader diff --git a/src/core/loader/smdh.h b/src/core/loader/smdh.h index 0da1cf855..adeea05a9 100644 --- a/src/core/loader/smdh.h +++ b/src/core/loader/smdh.h @@ -63,7 +63,6 @@ struct SMDH { }; enum class GameRegion { - Invalid = -1, Japan = 0, NorthAmerica = 1, Europe = 2, @@ -88,7 +87,7 @@ struct SMDH { */ std::array GetShortTitle(Loader::SMDH::TitleLanguage language) const; - GameRegion GetRegion() const; + std::vector GetRegions() const; }; static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong");