private void GetRenderers()
        {
            renderers = new List <DirectDrawWrapper>();

            var renderersIni = new IniFile(ProgramConstants.GetBaseResourcePath() + RENDERERS_INI);

            var keys = renderersIni.GetSectionKeys("Renderers");

            if (keys == null)
            {
                throw new Exception("[Renderers] not found from Renderers.ini!");
            }

            foreach (string key in keys)
            {
                string internalName = renderersIni.GetStringValue("Renderers", key, string.Empty);

                var ddWrapper = new DirectDrawWrapper(internalName, renderersIni);
                renderers.Add(ddWrapper);
            }

            OSVersion osVersion = ClientConfiguration.Instance.GetOperatingSystemVersion();

            defaultRenderer = renderersIni.GetStringValue("DefaultRenderer", osVersion.ToString(), string.Empty);

            if (defaultRenderer == null)
            {
                throw new Exception("Invalid or missing default renderer for operating system: " + osVersion);
            }
        }
        private void GetRenderers()
        {
            renderers = new List <DirectDrawWrapper>();

            var renderersIni = new IniFile(ProgramConstants.GetBaseResourcePath() + RENDERERS_INI);

            var keys = renderersIni.GetSectionKeys("Renderers");

            if (keys == null)
            {
                throw new Exception("[Renderers] not found from Renderers.ini!");
            }

            foreach (string key in keys)
            {
                string internalName = renderersIni.GetStringValue("Renderers", key, string.Empty);

                var ddWrapper = new DirectDrawWrapper(internalName, renderersIni);
                renderers.Add(ddWrapper);
            }

            OSVersion osVersion = ClientConfiguration.Instance.GetOperatingSystemVersion();

            defaultRenderer = renderersIni.GetStringValue("DefaultRenderer", osVersion.ToString(), string.Empty);

            if (defaultRenderer == null)
            {
                throw new Exception("Invalid or missing default renderer for operating system: " + osVersion);
            }


            string renderer = UserINISettings.Instance.Renderer;

            selectedRenderer = renderers.Find(r => r.InternalName == renderer);

            if (selectedRenderer == null)
            {
                selectedRenderer = renderers.Find(r => r.InternalName == defaultRenderer);
            }

            if (selectedRenderer == null)
            {
                throw new Exception("Missing renderer: " + renderer);
            }

            GameProcessLogic.UseQres            = selectedRenderer.UseQres;
            GameProcessLogic.SingleCoreAffinity = selectedRenderer.SingleCoreAffinity;
        }
        public override bool Save()
        {
            base.Save();

            bool restartRequired = false;

            IniSettings.DetailLevel.Value = ddDetailLevel.SelectedIndex;

            string[] resolution = ddIngameResolution.SelectedItem.Text.Split('x');

            int[] ingameRes = new int[2] {
                int.Parse(resolution[0]), int.Parse(resolution[1])
            };

            IniSettings.IngameScreenWidth.Value  = ingameRes[0];
            IniSettings.IngameScreenHeight.Value = ingameRes[1];

            // Calculate drag selection distance, scale it with resolution width
            int dragDistance = ingameRes[0] / ORIGINAL_RESOLUTION_WIDTH * DRAG_DISTANCE_DEFAULT;

            IniSettings.DragDistance.Value = dragDistance;

            DirectDrawWrapper originalRenderer = selectedRenderer;

            selectedRenderer = (DirectDrawWrapper)ddRenderer.SelectedItem.Tag;

            IniSettings.WindowedMode.Value = chkWindowedMode.Checked &&
                                             !selectedRenderer.UsesCustomWindowedOption();

            IniSettings.BorderlessWindowedMode.Value = chkBorderlessWindowedMode.Checked &&
                                                       string.IsNullOrEmpty(selectedRenderer.BorderlessWindowedModeKey);

            string[] clientResolution = ((string)ddClientResolution.SelectedItem.Tag).Split('x');

            int[] clientRes = new int[2] {
                int.Parse(clientResolution[0]), int.Parse(clientResolution[1])
            };

            IniSettings.ClientResolutionX.Value = clientRes[0];
            IniSettings.ClientResolutionY.Value = clientRes[1];

            if (clientRes[0] != WindowManager.WindowWidth ||
                clientRes[1] != WindowManager.WindowHeight)
            {
                restartRequired = true;
            }

            if (IniSettings.BorderlessWindowedClient.Value != chkBorderlessClient.Checked)
            {
                restartRequired = true;
            }

            IniSettings.BorderlessWindowedClient.Value = chkBorderlessClient.Checked;

            if (IniSettings.ClientTheme != ddClientTheme.SelectedItem.Text)
            {
                restartRequired = true;
            }

            IniSettings.ClientTheme.Value = ddClientTheme.SelectedItem.Text;

#if YR
            IniSettings.BackBufferInVRAM.Value = chkBackBufferInVRAM.Checked;
#else
            IniSettings.BackBufferInVRAM.Value = !chkBackBufferInVRAM.Checked;
#endif

            if (selectedRenderer != originalRenderer ||
                !File.Exists(ProgramConstants.GamePath + selectedRenderer.ConfigFileName))
            {
                foreach (var renderer in renderers)
                {
                    if (renderer != selectedRenderer)
                    {
                        renderer.Clean();
                    }
                }
            }

            selectedRenderer.Apply();

            GameProcessLogic.UseQres            = selectedRenderer.UseQres;
            GameProcessLogic.SingleCoreAffinity = selectedRenderer.SingleCoreAffinity;

            if (selectedRenderer.UsesCustomWindowedOption())
            {
                IniFile rendererSettingsIni = new IniFile(
                    ProgramConstants.GamePath + selectedRenderer.ConfigFileName);

                rendererSettingsIni.SetBooleanValue(selectedRenderer.WindowedModeSection,
                                                    selectedRenderer.WindowedModeKey, chkWindowedMode.Checked);

                if (!string.IsNullOrEmpty(selectedRenderer.BorderlessWindowedModeKey))
                {
                    bool borderlessModeIniValue = chkBorderlessWindowedMode.Checked;
                    if (selectedRenderer.IsBorderlessWindowedModeKeyReversed)
                    {
                        borderlessModeIniValue = !borderlessModeIniValue;
                    }

                    rendererSettingsIni.SetBooleanValue(selectedRenderer.WindowedModeSection,
                                                        selectedRenderer.BorderlessWindowedModeKey, borderlessModeIniValue);
                }

                rendererSettingsIni.WriteIniFile();
            }

            IniSettings.Renderer.Value = selectedRenderer.InternalName;

#if !YR
            File.Delete(ProgramConstants.GamePath + "Language.dll");

            if (ingameRes[0] >= 1024 && ingameRes[1] >= 720)
            {
                File.Copy(ProgramConstants.GamePath + "Resources\\language_1024x720.dll", ProgramConstants.GamePath + "Language.dll");
            }
            else if (ingameRes[0] >= 800 && ingameRes[1] >= 600)
            {
                File.Copy(ProgramConstants.GamePath + "Resources\\language_800x600.dll", ProgramConstants.GamePath + "Language.dll");
            }
            else
            {
                File.Copy(ProgramConstants.GamePath + "Resources\\language_640x480.dll", ProgramConstants.GamePath + "Language.dll");
            }
#endif

            return(restartRequired);
        }