@@ -18,7 +18,6 @@ class IniFile;

namespace DiscIO
{
enum class Country;
enum class Language;
enum class Platform;
enum class Region;
@@ -141,7 +140,7 @@ struct SConfig
float fSyncGpuOverclock;

int SelectedLanguage = 0;
bool bOverrideGCLanguage = false;
bool bOverrideRegionSettings = false;

bool bWii = false;
bool m_is_mios = false;
@@ -212,6 +211,7 @@ struct SConfig
bool SetPathsAndGameMetadata(const BootParameters& boot);
static DiscIO::Region GetFallbackRegion();
DiscIO::Language GetCurrentLanguage(bool wii) const;
DiscIO::Language GetLanguageAdjustedForRegion(bool wii, DiscIO::Region region) const;

IniFile LoadDefaultGameIni() const;
IniFile LoadLocalGameIni() const;
@@ -365,7 +365,7 @@ struct SConfig
void LoadJitDebugSettings(IniFile& ini);

void SetRunningGameMetadata(const std::string& game_id, const std::string& gametdb_id,
u64 title_id, u16 revision, DiscIO::Country country);
u64 title_id, u16 revision, DiscIO::Region region);

static SConfig* m_Instance;

@@ -631,7 +631,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)

packet >> m_net_settings.m_EnableCheats;
packet >> m_net_settings.m_SelectedLanguage;
packet >> m_net_settings.m_OverrideGCLanguage;
packet >> m_net_settings.m_OverrideRegionSettings;
packet >> m_net_settings.m_ProgressiveScan;
packet >> m_net_settings.m_PAL60;
packet >> m_net_settings.m_DSPEnableJIT;
@@ -26,7 +26,7 @@ struct NetSettings
PowerPC::CPUCore m_CPUcore;
bool m_EnableCheats;
int m_SelectedLanguage;
bool m_OverrideGCLanguage;
bool m_OverrideRegionSettings;
bool m_ProgressiveScan;
bool m_PAL60;
bool m_DSPHLE;
@@ -1279,7 +1279,7 @@ bool NetPlayServer::StartGame()
spac << static_cast<std::underlying_type_t<PowerPC::CPUCore>>(m_settings.m_CPUcore);
spac << m_settings.m_EnableCheats;
spac << m_settings.m_SelectedLanguage;
spac << m_settings.m_OverrideGCLanguage;
spac << m_settings.m_OverrideRegionSettings;
spac << m_settings.m_ProgressiveScan;
spac << m_settings.m_PAL60;
spac << m_settings.m_DSPEnableJIT;
@@ -145,6 +145,29 @@ Country TypicalCountryForRegion(Region region)
}
}

Region SysConfCountryToRegion(u8 country_code)
{
if (country_code == 0)
return Region::Unknown;

if (country_code < 0x08) // Japan
return Region::NTSC_J;

if (country_code < 0x40) // Americas
return Region::NTSC_U;

if (country_code < 0x80) // Europe, Oceania, parts of Africa
return Region::PAL;

if (country_code < 0xa8) // Southeast Asia
return country_code == 0x88 ? Region::NTSC_K : Region::NTSC_J;

if (country_code < 0xc0) // Middle East
return Region::NTSC_U;

return Region::Unknown;
}

Region CountryCodeToRegion(u8 country_code, Platform platform, Region expected_region,
std::optional<u16> revision)
{
@@ -77,6 +77,7 @@ bool IsWii(Platform volume_type);
bool IsNTSC(Region region);

Country TypicalCountryForRegion(Region region);
Region SysConfCountryToRegion(u8 country_code);
// Avoid using this function if you can. Country codes aren't always reliable region indicators.
Region CountryCodeToRegion(u8 country_code, Platform platform,
Region expected_region = Region::Unknown,
@@ -443,7 +443,7 @@ void NetPlayDialog::OnStart()
settings.m_CPUcore = Config::Get(Config::MAIN_CPU_CORE);
settings.m_EnableCheats = Config::Get(Config::MAIN_ENABLE_CHEATS);
settings.m_SelectedLanguage = Config::Get(Config::MAIN_GC_LANGUAGE);
settings.m_OverrideGCLanguage = Config::Get(Config::MAIN_OVERRIDE_GC_LANGUAGE);
settings.m_OverrideRegionSettings = Config::Get(Config::MAIN_OVERRIDE_REGION_SETTINGS);
settings.m_ProgressiveScan = Config::Get(Config::SYSCONF_PROGRESSIVE_SCAN);
settings.m_PAL60 = Config::Get(Config::SYSCONF_PAL60);
settings.m_DSPHLE = Config::Get(Config::MAIN_DSP_HLE);
@@ -56,7 +56,6 @@ void GameCubePane::CreateWidgets()
ipl_box->setLayout(ipl_layout);

m_skip_main_menu = new QCheckBox(tr("Skip Main Menu"), ipl_box);
m_override_language_ntsc = new QCheckBox(tr("Override Language on NTSC Games"), ipl_box);
m_language_combo = new QComboBox(ipl_box);
m_language_combo->setCurrentIndex(-1);

@@ -71,7 +70,6 @@ void GameCubePane::CreateWidgets()
ipl_layout->addWidget(m_skip_main_menu, 0, 0);
ipl_layout->addWidget(new QLabel(tr("System Language:")), 1, 0);
ipl_layout->addWidget(m_language_combo, 1, 1);
ipl_layout->addWidget(m_override_language_ntsc, 2, 0);

// Device Settings
QGroupBox* device_box = new QGroupBox(tr("Device Settings"), this);
@@ -134,7 +132,6 @@ void GameCubePane::ConnectWidgets()
connect(m_skip_main_menu, &QCheckBox::stateChanged, this, &GameCubePane::SaveSettings);
connect(m_language_combo, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
&GameCubePane::SaveSettings);
connect(m_override_language_ntsc, &QCheckBox::stateChanged, this, &GameCubePane::SaveSettings);

// Device Settings
for (int i = 0; i < SLOT_COUNT; i++)
@@ -302,7 +299,6 @@ void GameCubePane::LoadSettings()
// IPL Settings
m_skip_main_menu->setChecked(params.bHLE_BS2);
m_language_combo->setCurrentIndex(m_language_combo->findData(params.SelectedLanguage));
m_override_language_ntsc->setChecked(params.bOverrideGCLanguage);

bool have_menu = false;

@@ -343,9 +339,6 @@ void GameCubePane::SaveSettings()
Config::SetBaseOrCurrent(Config::MAIN_SKIP_IPL, m_skip_main_menu->isChecked());
params.SelectedLanguage = m_language_combo->currentData().toInt();
Config::SetBaseOrCurrent(Config::MAIN_GC_LANGUAGE, m_language_combo->currentData().toInt());
params.bOverrideGCLanguage = m_override_language_ntsc->isChecked();
Config::SetBaseOrCurrent(Config::MAIN_OVERRIDE_GC_LANGUAGE,
m_override_language_ntsc->isChecked());

for (int i = 0; i < SLOT_COUNT; i++)
{
@@ -27,7 +27,6 @@ class GameCubePane : public QWidget
void OnConfigPressed(int slot);

QCheckBox* m_skip_main_menu;
QCheckBox* m_override_language_ntsc;
QComboBox* m_language_combo;

QPushButton* m_slot_buttons[3];
@@ -84,6 +84,7 @@ void GeneralPane::OnEmulationStateChanged(Core::State state)

m_checkbox_dualcore->setEnabled(!running);
m_checkbox_cheats->setEnabled(!running);
m_checkbox_override_region_settings->setEnabled(!running);
#ifdef USE_DISCORD_PRESENCE
m_checkbox_discord_presence->setEnabled(!running);
#endif
@@ -96,6 +97,8 @@ void GeneralPane::ConnectLayout()
{
connect(m_checkbox_dualcore, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig);
connect(m_checkbox_cheats, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig);
connect(m_checkbox_override_region_settings, &QCheckBox::stateChanged, this,
&GeneralPane::OnSaveConfig);
connect(m_checkbox_auto_disc_change, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig);
#ifdef USE_DISCORD_PRESENCE
connect(m_checkbox_discord_presence, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig);
@@ -138,6 +141,9 @@ void GeneralPane::CreateBasic()
m_checkbox_cheats = new QCheckBox(tr("Enable Cheats"));
basic_group_layout->addWidget(m_checkbox_cheats);

m_checkbox_override_region_settings = new QCheckBox(tr("Allow Mismatched Region Settings"));
basic_group_layout->addWidget(m_checkbox_override_region_settings);

m_checkbox_auto_disc_change = new QCheckBox(tr("Change Discs Automatically"));
basic_group_layout->addWidget(m_checkbox_auto_disc_change);

@@ -243,6 +249,7 @@ void GeneralPane::LoadConfig()
#endif
m_checkbox_dualcore->setChecked(SConfig::GetInstance().bCPUThread);
m_checkbox_cheats->setChecked(Settings::Instance().GetCheatsEnabled());
m_checkbox_override_region_settings->setChecked(SConfig::GetInstance().bOverrideRegionSettings);
m_checkbox_auto_disc_change->setChecked(Config::Get(Config::MAIN_AUTO_DISC_CHANGE));
#ifdef USE_DISCORD_PRESENCE
m_checkbox_discord_presence->setChecked(Config::Get(Config::MAIN_USE_DISCORD_PRESENCE));
@@ -305,6 +312,9 @@ void GeneralPane::OnSaveConfig()
settings.bCPUThread = m_checkbox_dualcore->isChecked();
Config::SetBaseOrCurrent(Config::MAIN_CPU_THREAD, m_checkbox_dualcore->isChecked());
Settings::Instance().SetCheatsEnabled(m_checkbox_cheats->isChecked());
settings.bOverrideRegionSettings = m_checkbox_override_region_settings->isChecked();
Config::SetBaseOrCurrent(Config::MAIN_OVERRIDE_REGION_SETTINGS,
m_checkbox_override_region_settings->isChecked());
Config::SetBase(Config::MAIN_AUTO_DISC_CHANGE, m_checkbox_auto_disc_change->isChecked());
Config::SetBaseOrCurrent(Config::MAIN_ENABLE_CHEATS, m_checkbox_cheats->isChecked());
settings.m_EmulationSpeed = m_combobox_speedlimit->currentIndex() * 0.1f;
@@ -44,6 +44,7 @@ class GeneralPane final : public QWidget
QComboBox* m_combobox_update_track;
QCheckBox* m_checkbox_dualcore;
QCheckBox* m_checkbox_cheats;
QCheckBox* m_checkbox_override_region_settings;
QCheckBox* m_checkbox_auto_disc_change;
#ifdef USE_DISCORD_PRESENCE
QCheckBox* m_checkbox_discord_presence;
@@ -61,15 +61,12 @@ bool UseGameCovers()

DiscIO::Language GameFile::GetConfigLanguage() const
{
if (m_platform == DiscIO::Platform::GameCubeDisc && m_country == DiscIO::Country::Japan)
return DiscIO::Language::Japanese;

#ifdef ANDROID
// TODO: Make the Android app load the config at app start instead of emulation start
// so that we can access the user's preference here
return DiscIO::Language::English;
#else
return SConfig::GetInstance().GetCurrentLanguage(DiscIO::IsWii(m_platform));
return SConfig::GetInstance().GetLanguageAdjustedForRegion(DiscIO::IsWii(m_platform), m_region);
#endif
}