Exemple #1
0
        // Validates and alters the settings to fix any invalid values
        private void SanitizeSettings(GameSettings settings)
        {
            GameSettings defaultSettings = GetDefaultSettings();

            // Sanitize audio or use defaults
            if (settings.Audio == null)
            {
                settings.Audio = defaultSettings.Audio.Clone();
            }
            else
            {
                settings.Audio.Volume = settings.Audio.Volume.Clamp(0, 100);
                settings.Audio.SfxSet = settings.Audio.SfxSet.Clamp(1, AudioManager.SfxSetCount);
            }

            // Sanitize video or use defaults
            if (settings.Video == null)
            {
                settings.Video = defaultSettings.Video.Clone();
            }
            else
            {
                GraphicsDeviceManager graphics = _graphics.Value;
                bool isSupportedDisplayMode    = graphics.GraphicsDevice.Adapter.SupportedDisplayModes.Any(
                    sdm => sdm.Width == (int)settings.Video.Resolution.X && sdm.Height == (int)settings.Video.Resolution.Y);
                if (!isSupportedDisplayMode)
                {
                    settings.Video.Resolution = SettingsConstants.DefaultResolution;
                }
            }

            // Sanitize gameplay or use defaults
            if (settings.Gameplay == null)
            {
                settings.Gameplay = defaultSettings.Gameplay.Clone();
            }
            else
            {
                settings.Gameplay.BallCount  = settings.Gameplay.BallCount.Clamp(SettingsConstants.BallMinCount, SettingsConstants.BallMaxCount);
                settings.Gameplay.GameSpeed  = settings.Gameplay.GameSpeed.Clamp(SettingsConstants.GameSpeedMinValue, SettingsConstants.GameSpeedMaxValue);
                settings.Gameplay.ScoreLimit = settings.Gameplay.ScoreLimit.Clamp(0, int.MaxValue);
                settings.Gameplay.TimeLimit  = settings.Gameplay.TimeLimit.Clamp(TimeSpan.Zero, TimeSpan.MaxValue);

                if (!PaddleFactory.IsPaddleSupported(settings.Gameplay.LeftPaddleType))
                {
                    settings.Gameplay.LeftPaddleType = defaultSettings.Gameplay.LeftPaddleType;
                }
                if (!PaddleFactory.IsPaddleSupported(settings.Gameplay.RightPaddleType))
                {
                    settings.Gameplay.RightPaddleType = defaultSettings.Gameplay.RightPaddleType;
                }
            }

            // Sanitize controls or use defaults
            if (settings.Controls == null)
            {
                settings.Controls = defaultSettings.Controls.Clone();
            }
            else
            {
                if (settings.Controls.LeftPaddle == null)
                {
                    settings.Controls.LeftPaddle = defaultSettings.Controls.LeftPaddle.Clone();
                }
                else
                {
                    if (settings.Controls.LeftPaddle.MoveUp == Keys.None)
                    {
                        settings.Controls.LeftPaddle.MoveUp = defaultSettings.Controls.LeftPaddle.MoveUp;
                    }
                    if (settings.Controls.LeftPaddle.MoveDown == Keys.None)
                    {
                        settings.Controls.LeftPaddle.MoveDown = defaultSettings.Controls.LeftPaddle.MoveDown;
                    }
                }

                if (settings.Controls.RightPaddle == null)
                {
                    settings.Controls.RightPaddle = defaultSettings.Controls.RightPaddle.Clone();
                }
                else
                {
                    if (settings.Controls.RightPaddle.MoveUp == Keys.None)
                    {
                        settings.Controls.RightPaddle.MoveUp = defaultSettings.Controls.RightPaddle.MoveUp;
                    }
                    if (settings.Controls.RightPaddle.MoveDown == Keys.None)
                    {
                        settings.Controls.RightPaddle.MoveDown = defaultSettings.Controls.RightPaddle.MoveDown;
                    }
                }
            }
        }