Пример #1
0
// Boot the ISO or file
bool BootCore(const std::string& _rFilename)
{
  SConfig& StartUp = SConfig::GetInstance();

  // Use custom settings for debugging mode
  Host_SetStartupDebuggingParameters();

  StartUp.m_BootType = SConfig::BOOT_ISO;
  StartUp.m_strFilename = _rFilename;
  SConfig::GetInstance().m_LastFilename = _rFilename;
  SConfig::GetInstance().SaveSettings();
  StartUp.bRunCompareClient = false;
  StartUp.bRunCompareServer = false;

  config_cache.SaveConfig(StartUp);

  // If for example the ISO file is bad we return here
  if (!StartUp.AutoSetup(SConfig::BOOT_DEFAULT))
    return false;

  // Load game specific settings
  {
    IniFile game_ini = StartUp.LoadGameIni();

    // General settings
    IniFile::Section* core_section = game_ini.GetOrCreateSection("Core");
    IniFile::Section* dsp_section = game_ini.GetOrCreateSection("DSP");
    IniFile::Section* controls_section = game_ini.GetOrCreateSection("Controls");

    core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread);
    core_section->Get("EnableCheats", &StartUp.bEnableCheats, StartUp.bEnableCheats);
    core_section->Get("SyncOnSkipIdle", &StartUp.bSyncGPUOnSkipIdleHack,
                      StartUp.bSyncGPUOnSkipIdleHack);
    core_section->Get("FPRF", &StartUp.bFPRF, StartUp.bFPRF);
    core_section->Get("AccurateNaNs", &StartUp.bAccurateNaNs, StartUp.bAccurateNaNs);
    core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU);
    core_section->Get("DCBZ", &StartUp.bDCBZOFF, StartUp.bDCBZOFF);
    core_section->Get("SyncGPU", &StartUp.bSyncGPU, StartUp.bSyncGPU);
    core_section->Get("FastDiscSpeed", &StartUp.bFastDiscSpeed, StartUp.bFastDiscSpeed);
    core_section->Get("DSPHLE", &StartUp.bDSPHLE, StartUp.bDSPHLE);
    core_section->Get("GFXBackend", &StartUp.m_strVideoBackend, StartUp.m_strVideoBackend);
    core_section->Get("CPUCore", &StartUp.iCPUCore, StartUp.iCPUCore);
    core_section->Get("HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2);
    core_section->Get("ProgressiveScan", &StartUp.bProgressive, StartUp.bProgressive);
    core_section->Get("PAL60", &StartUp.bPAL60, StartUp.bPAL60);
    core_section->Get("GameCubeLanguage", &StartUp.SelectedLanguage, StartUp.SelectedLanguage);
    if (core_section->Get("EmulationSpeed", &SConfig::GetInstance().m_EmulationSpeed,
                          SConfig::GetInstance().m_EmulationSpeed))
      config_cache.bSetEmulationSpeed = true;

    if (dsp_section->Get("Volume", &SConfig::GetInstance().m_Volume,
                         SConfig::GetInstance().m_Volume))
      config_cache.bSetVolume = true;
    dsp_section->Get("EnableJIT", &SConfig::GetInstance().m_DSPEnableJIT,
                     SConfig::GetInstance().m_DSPEnableJIT);
    dsp_section->Get("Backend", &SConfig::GetInstance().sBackend, SConfig::GetInstance().sBackend);
    VideoBackendBase::ActivateBackend(StartUp.m_strVideoBackend);
    core_section->Get("GPUDeterminismMode", &StartUp.m_strGPUDeterminismMode,
                      StartUp.m_strGPUDeterminismMode);

    for (unsigned int i = 0; i < MAX_SI_CHANNELS; ++i)
    {
      int source;
      controls_section->Get(StringFromFormat("PadType%u", i), &source, -1);
      if (source >= SIDEVICE_NONE && source < SIDEVICE_COUNT)
      {
        SConfig::GetInstance().m_SIDevice[i] = (SIDevices)source;
        config_cache.bSetPads[i] = true;
      }
    }

    // Wii settings
    if (StartUp.bWii)
    {
      int source;
      for (unsigned int i = 0; i < MAX_WIIMOTES; ++i)
      {
        controls_section->Get(StringFromFormat("WiimoteSource%u", i), &source, -1);
        if (source != -1 && g_wiimote_sources[i] != (unsigned)source &&
            source >= WIIMOTE_SRC_NONE && source <= WIIMOTE_SRC_HYBRID)
        {
          config_cache.bSetWiimoteSource[i] = true;
          g_wiimote_sources[i] = source;
          WiimoteReal::ChangeWiimoteSource(i, source);
        }
      }
      controls_section->Get("WiimoteSourceBB", &source, -1);
      if (source != -1 && g_wiimote_sources[WIIMOTE_BALANCE_BOARD] != (unsigned)source &&
          (source == WIIMOTE_SRC_NONE || source == WIIMOTE_SRC_REAL))
      {
        config_cache.bSetWiimoteSource[WIIMOTE_BALANCE_BOARD] = true;
        g_wiimote_sources[WIIMOTE_BALANCE_BOARD] = source;
        WiimoteReal::ChangeWiimoteSource(WIIMOTE_BALANCE_BOARD, source);
      }

      IniFile::Section* wii_section = game_ini.GetOrCreateSection("Wii");
      wii_section->Get("Language", &StartUp.m_wii_language, StartUp.m_wii_language);
    }
  }

  StartUp.m_GPUDeterminismMode = ParseGPUDeterminismMode(StartUp.m_strGPUDeterminismMode);

  // Movie settings
  if (Movie::IsPlayingInput() && Movie::IsConfigSaved())
  {
    StartUp.bCPUThread = Movie::IsDualCore();
    StartUp.bDSPHLE = Movie::IsDSPHLE();
    StartUp.bProgressive = Movie::IsProgressive();
    StartUp.bPAL60 = Movie::IsPAL60();
    StartUp.bFastDiscSpeed = Movie::IsFastDiscSpeed();
    StartUp.iCPUCore = Movie::GetCPUMode();
    StartUp.bSyncGPU = Movie::IsSyncGPU();
    if (!StartUp.bWii)
      StartUp.SelectedLanguage = Movie::GetLanguage();
    for (int i = 0; i < 2; ++i)
    {
      if (Movie::IsUsingMemcard(i) && Movie::IsStartingFromClearSave() && !StartUp.bWii)
      {
        if (File::Exists(File::GetUserPath(D_GCUSER_IDX) +
                         StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B")))
          File::Delete(File::GetUserPath(D_GCUSER_IDX) +
                       StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B"));
      }
    }
  }

  if (NetPlay::IsNetPlayRunning())
  {
    StartUp.bCPUThread = g_NetPlaySettings.m_CPUthread;
    StartUp.bEnableCheats = g_NetPlaySettings.m_EnableCheats;
    StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE;
    StartUp.bEnableMemcardSdWriting = g_NetPlaySettings.m_WriteToMemcard;
    StartUp.iCPUCore = g_NetPlaySettings.m_CPUcore;
    StartUp.SelectedLanguage = g_NetPlaySettings.m_SelectedLanguage;
    StartUp.bOverrideGCLanguage = g_NetPlaySettings.m_OverrideGCLanguage;
    StartUp.bProgressive = g_NetPlaySettings.m_ProgressiveScan;
    StartUp.bPAL60 = g_NetPlaySettings.m_PAL60;
    SConfig::GetInstance().m_DSPEnableJIT = g_NetPlaySettings.m_DSPEnableJIT;
    SConfig::GetInstance().m_OCEnable = g_NetPlaySettings.m_OCEnable;
    SConfig::GetInstance().m_OCFactor = g_NetPlaySettings.m_OCFactor;
    SConfig::GetInstance().m_EXIDevice[0] = g_NetPlaySettings.m_EXIDevice[0];
    SConfig::GetInstance().m_EXIDevice[1] = g_NetPlaySettings.m_EXIDevice[1];
    config_cache.bSetEXIDevice[0] = true;
    config_cache.bSetEXIDevice[1] = true;
  }
  else
  {
    g_SRAM_netplay_initialized = false;
  }

  const bool ntsc = DiscIO::IsNTSC(StartUp.m_region);

  // Apply overrides
  // Some NTSC GameCube games such as Baten Kaitos react strangely to
  // language settings that would be invalid on an NTSC system
  if (!StartUp.bOverrideGCLanguage && ntsc)
  {
    StartUp.SelectedLanguage = 0;
  }

  // Some NTSC Wii games such as Doc Louis's Punch-Out!! and
  // 1942 (Virtual Console) crash if the PAL60 option is enabled
  if (StartUp.bWii && ntsc)
  {
    StartUp.bPAL60 = false;
  }

  if (StartUp.bWii)
    SConfig::GetInstance().SaveSettingsToSysconf();

  // Run the game
  // Init the core
  if (!Core::Init())
  {
    PanicAlertT("Couldn't init the core.\nCheck your configuration.");
    return false;
  }

  return true;
}
Пример #2
0
// Boot the ISO or file
bool BootCore(std::unique_ptr<BootParameters> boot)
{
  if (!boot)
    return false;

  SConfig& StartUp = SConfig::GetInstance();

  StartUp.bRunCompareClient = false;
  StartUp.bRunCompareServer = false;

  config_cache.SaveConfig(StartUp);

  if (!StartUp.SetPathsAndGameMetadata(*boot))
    return false;

  // Load game specific settings
  if (!std::holds_alternative<BootParameters::IPL>(boot->parameters))
  {
    IniFile game_ini = StartUp.LoadGameIni();

    // General settings
    IniFile::Section* core_section = game_ini.GetOrCreateSection("Core");
    IniFile::Section* dsp_section = game_ini.GetOrCreateSection("DSP");
    IniFile::Section* controls_section = game_ini.GetOrCreateSection("Controls");

    core_section->Get("CPUThread", &StartUp.bCPUThread, StartUp.bCPUThread);
    core_section->Get("JITFollowBranch", &StartUp.bJITFollowBranch, StartUp.bJITFollowBranch);
    core_section->Get("EnableCheats", &StartUp.bEnableCheats, StartUp.bEnableCheats);
    core_section->Get("SyncOnSkipIdle", &StartUp.bSyncGPUOnSkipIdleHack,
                      StartUp.bSyncGPUOnSkipIdleHack);
    core_section->Get("FPRF", &StartUp.bFPRF, StartUp.bFPRF);
    core_section->Get("AccurateNaNs", &StartUp.bAccurateNaNs, StartUp.bAccurateNaNs);
    core_section->Get("MMU", &StartUp.bMMU, StartUp.bMMU);
    core_section->Get("LowDCBZHack", &StartUp.bLowDCBZHack, StartUp.bLowDCBZHack);
    core_section->Get("SyncGPU", &StartUp.bSyncGPU, StartUp.bSyncGPU);
    core_section->Get("FastDiscSpeed", &StartUp.bFastDiscSpeed, StartUp.bFastDiscSpeed);
    core_section->Get("DSPHLE", &StartUp.bDSPHLE, StartUp.bDSPHLE);
    core_section->Get("GFXBackend", &StartUp.m_strVideoBackend, StartUp.m_strVideoBackend);
    core_section->Get("CPUCore", &StartUp.cpu_core, StartUp.cpu_core);
    core_section->Get("HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2);
    core_section->Get("GameCubeLanguage", &StartUp.SelectedLanguage, StartUp.SelectedLanguage);
    if (core_section->Get("EmulationSpeed", &StartUp.m_EmulationSpeed, StartUp.m_EmulationSpeed))
      config_cache.bSetEmulationSpeed = true;

    if (dsp_section->Get("Volume", &StartUp.m_Volume, StartUp.m_Volume))
      config_cache.bSetVolume = true;
    dsp_section->Get("EnableJIT", &StartUp.m_DSPEnableJIT, StartUp.m_DSPEnableJIT);
    dsp_section->Get("Backend", &StartUp.sBackend, StartUp.sBackend);
    VideoBackendBase::ActivateBackend(StartUp.m_strVideoBackend);
    core_section->Get("GPUDeterminismMode", &StartUp.m_strGPUDeterminismMode,
                      StartUp.m_strGPUDeterminismMode);
    core_section->Get("Overclock", &StartUp.m_OCFactor, StartUp.m_OCFactor);
    core_section->Get("OverclockEnable", &StartUp.m_OCEnable, StartUp.m_OCEnable);

    for (unsigned int i = 0; i < SerialInterface::MAX_SI_CHANNELS; ++i)
    {
      int source;
      controls_section->Get(StringFromFormat("PadType%u", i), &source, -1);
      if (source >= SerialInterface::SIDEVICE_NONE && source < SerialInterface::SIDEVICE_COUNT)
      {
        StartUp.m_SIDevice[i] = static_cast<SerialInterface::SIDevices>(source);
        config_cache.bSetPads[i] = true;
      }
    }

    // Wii settings
    if (StartUp.bWii)
    {
      int source;
      for (unsigned int i = 0; i < MAX_WIIMOTES; ++i)
      {
        controls_section->Get(StringFromFormat("WiimoteSource%u", i), &source, -1);
        if (source != -1 && g_wiimote_sources[i] != (unsigned)source &&
            source >= WIIMOTE_SRC_NONE && source <= WIIMOTE_SRC_REAL)
        {
          config_cache.bSetWiimoteSource[i] = true;
          g_wiimote_sources[i] = source;
          WiimoteReal::ChangeWiimoteSource(i, source);
        }
      }
      controls_section->Get("WiimoteSourceBB", &source, -1);
      if (source != -1 && g_wiimote_sources[WIIMOTE_BALANCE_BOARD] != (unsigned)source &&
          (source == WIIMOTE_SRC_NONE || source == WIIMOTE_SRC_REAL))
      {
        config_cache.bSetWiimoteSource[WIIMOTE_BALANCE_BOARD] = true;
        g_wiimote_sources[WIIMOTE_BALANCE_BOARD] = source;
        WiimoteReal::ChangeWiimoteSource(WIIMOTE_BALANCE_BOARD, source);
      }
    }
  }

  StartUp.m_GPUDeterminismMode = ParseGPUDeterminismMode(StartUp.m_strGPUDeterminismMode);

  // Movie settings
  if (Movie::IsPlayingInput() && Movie::IsConfigSaved())
  {
    // TODO: remove this once ConfigManager starts using OnionConfig.
    StartUp.bCPUThread = Config::Get(Config::MAIN_CPU_THREAD);
    StartUp.bJITFollowBranch = Config::Get(Config::MAIN_JIT_FOLLOW_BRANCH);
    StartUp.bDSPHLE = Config::Get(Config::MAIN_DSP_HLE);
    StartUp.bFastDiscSpeed = Config::Get(Config::MAIN_FAST_DISC_SPEED);
    StartUp.cpu_core = Config::Get(Config::MAIN_CPU_CORE);
    StartUp.bSyncGPU = Config::Get(Config::MAIN_SYNC_GPU);
    if (!StartUp.bWii)
      StartUp.SelectedLanguage = Config::Get(Config::MAIN_GC_LANGUAGE);
    for (int i = 0; i < 2; ++i)
    {
      if (Movie::IsUsingMemcard(i) && Movie::IsStartingFromClearSave() && !StartUp.bWii)
      {
        if (File::Exists(File::GetUserPath(D_GCUSER_IDX) +
                         StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B")))
          File::Delete(File::GetUserPath(D_GCUSER_IDX) +
                       StringFromFormat("Movie%s.raw", (i == 0) ? "A" : "B"));
        if (File::Exists(File::GetUserPath(D_GCUSER_IDX) + "Movie"))
          File::DeleteDirRecursively(File::GetUserPath(D_GCUSER_IDX) + "Movie");
      }
    }
  }

  if (NetPlay::IsNetPlayRunning())
  {
    const NetPlay::NetSettings& netplay_settings = NetPlay::GetNetSettings();
    Config::AddLayer(ConfigLoaders::GenerateNetPlayConfigLoader(netplay_settings));
    StartUp.bCPUThread = netplay_settings.m_CPUthread;
    StartUp.bEnableCheats = netplay_settings.m_EnableCheats;
    StartUp.bDSPHLE = netplay_settings.m_DSPHLE;
    StartUp.bEnableMemcardSdWriting = netplay_settings.m_WriteToMemcard;
    StartUp.bCopyWiiSaveNetplay = netplay_settings.m_CopyWiiSave;
    StartUp.cpu_core = netplay_settings.m_CPUcore;
    StartUp.SelectedLanguage = netplay_settings.m_SelectedLanguage;
    StartUp.bOverrideGCLanguage = netplay_settings.m_OverrideGCLanguage;
    StartUp.m_DSPEnableJIT = netplay_settings.m_DSPEnableJIT;
    StartUp.m_OCEnable = netplay_settings.m_OCEnable;
    StartUp.m_OCFactor = netplay_settings.m_OCFactor;
    StartUp.m_EXIDevice[0] = netplay_settings.m_EXIDevice[0];
    StartUp.m_EXIDevice[1] = netplay_settings.m_EXIDevice[1];
    config_cache.bSetEXIDevice[0] = true;
    config_cache.bSetEXIDevice[1] = true;
    StartUp.bFPRF = netplay_settings.m_FPRF;
    StartUp.bAccurateNaNs = netplay_settings.m_AccurateNaNs;
    StartUp.bSyncGPUOnSkipIdleHack = netplay_settings.m_SyncOnSkipIdle;
    StartUp.bSyncGPU = netplay_settings.m_SyncGPU;
    StartUp.iSyncGpuMaxDistance = netplay_settings.m_SyncGpuMaxDistance;
    StartUp.iSyncGpuMinDistance = netplay_settings.m_SyncGpuMinDistance;
    StartUp.fSyncGpuOverclock = netplay_settings.m_SyncGpuOverclock;
    StartUp.bJITFollowBranch = netplay_settings.m_JITFollowBranch;
    StartUp.bFastDiscSpeed = netplay_settings.m_FastDiscSpeed;
    StartUp.bMMU = netplay_settings.m_MMU;
    StartUp.bFastmem = netplay_settings.m_Fastmem;
    StartUp.bHLE_BS2 = netplay_settings.m_SkipIPL;
    if (netplay_settings.m_HostInputAuthority && !netplay_settings.m_IsHosting)
      config_cache.bSetEmulationSpeed = true;
  }
  else
  {
    g_SRAM_netplay_initialized = false;
  }

  const bool ntsc = DiscIO::IsNTSC(StartUp.m_region);

  // Apply overrides
  // Some NTSC GameCube games such as Baten Kaitos react strangely to
  // language settings that would be invalid on an NTSC system
  if (!StartUp.bOverrideGCLanguage && ntsc)
  {
    StartUp.SelectedLanguage = 0;
  }

  // Some NTSC Wii games such as Doc Louis's Punch-Out!! and
  // 1942 (Virtual Console) crash if the PAL60 option is enabled
  if (StartUp.bWii && ntsc)
    Config::SetCurrent(Config::SYSCONF_PAL60, false);

  // Ensure any new settings are written to the SYSCONF
  if (StartUp.bWii)
    ConfigLoaders::SaveToSYSCONF(Config::LayerType::Meta);

  const bool load_ipl = !StartUp.bWii && !StartUp.bHLE_BS2 &&
                        std::holds_alternative<BootParameters::Disc>(boot->parameters);
  if (load_ipl)
  {
    return Core::Init(std::make_unique<BootParameters>(
        BootParameters::IPL{StartUp.m_region,
                            std::move(std::get<BootParameters::Disc>(boot->parameters))},
        boot->savestate_path));
  }
  return Core::Init(std::move(boot));
}