public static void ValidateSetting(SettingValidation validation, IEnumerable <LobbySetting> lobbySettings, JToken jobjectSettingContainer, params string[] additional)
        {
            // Iterate through all input lobby settings.
            foreach (JProperty lobbySetting in jobjectSettingContainer.Children <JProperty>())
            {
                if (additional != null && additional.Contains(lobbySetting.Name))
                {
                    continue;
                }

                // Get the related setting.
                LobbySetting relatedSetting = lobbySettings.FirstOrDefault(ls => ls.Name == lobbySetting.Name);

                // relatedSetting will be null if there are no settings with the name.
                if (relatedSetting == null)
                {
                    validation.InvalidSetting(lobbySetting.Name);
                }
                // Validate the input value.
                else
                {
                    relatedSetting.CheckValue(validation, lobbySetting.Value);
                }
            }
        }
        public static void Init()
        {
            var all = new ModeSettingCollection("All");

            AllModeSettings = new ModeSettingCollection[] {
                all,
                new ModeSettingCollection("Assault", true).Competitive().AddCaptureSpeed(),
                new ModeSettingCollection("Control", true).Competitive().AddCaptureSpeed().Add(LimitValidControlPoints).AddIntRange("Score To Win", false, 1, 3, 2, "Score To Win 1-3").AddRange("Scoring Speed Modifier", 10, 500),
                new ModeSettingCollection("Escort", true).Competitive().AddPayloadSpeed(),
                new ModeSettingCollection("Hybrid", true).Competitive().AddCaptureSpeed().AddPayloadSpeed(),
                new ModeSettingCollection("Capture The Flag", false).AddSwitch("Blitz Flag Locations", false).AddSwitch("Damage Interrupts Flag Interaction", false)
                .AddSelect("Flag Carrier Abilities", "Restricted", "All", "None").AddRange("Flag Dropped Lock Time", 0, 10, 5).AddRange("Flag Pickup Time", 0, 5, 0).AddRange("Flag Return Time", 0, 5, 4)
                .AddRange("Flag Score Respawn Time", 0, 20, 15).AddIntRange("Game Length (Minutes)", false, 5, 15, 8).AddRange("Respawn Speed Buff Duration", 0, 60, 0).Add(ScoreToWin_1to9)
                .AddSwitch("Team Needs Flag At Base To Score", false),
                new ModeSettingCollection("Deathmatch", false).Add(GameLengthInMinutes).Add(SelfInitiatedRespawn).AddIntRange("Score To Win", false, 1, 50, 20, "Score To Win 1-50"),
                new ModeSettingCollection("Elimination", false).Elimination(),
                new ModeSettingCollection("Team Deathmatch", false).Add(GameLengthInMinutes).AddSwitch("Mercy Resurrect Counteracts Kills", true).AddIntRange("Score To Win", false, 1, 200, 30, "Score To Win 1-200").Add(SelfInitiatedRespawn).AddSwitch("Imbalanced Team Score To Win", false)
                .AddIntRange("Team 1 Score To Win", false, 1, 200, 30).AddIntRange("Team 2 Score To Win", false, 1, 200, 30),
                new ModeSettingCollection("Skirmish", false).Add(LimitValidControlPoints),
                new ModeSettingCollection("Practice Range", false).AddSwitch("Spawn Training Bots", true).AddRange("Training Bot Respawn Time Scalar", 10, 500),
                new ModeSettingCollection("Freezethaw Elimination", false).Elimination(),
                new ModeSettingCollection("Bounty Hunter").Add(Enabled_DefaultOff).AddIntRange("Base Score For Killing A Bounty Target", false, 0, 100, 300).AddIntRange("Bounty Increase Per Kill As Bounty Target", false, 0, 1000, 0).AddIntRange("Bounty Target Count", false, 1, 1, 1).AddIntRange("Score Per Kill", false, 0, 1000, 100).AddIntRange("Score Per Kill As Bounty Target", false, 0, 1000, 300)
                .Add(GameLengthInMinutes).AddIntRange("Score To Win", false, 1, 5000, 20, "Score To Win 1-5000").Add(SelfInitiatedRespawn)
            };

            // Get re-occurring settings.
            var encountered = new HashSet <string>();       // Setting keys that were encountered.
            var reoccurring = new HashSet <LobbySetting>(); // Setting keys that were repeatedly encountered.
            var ignore      = new LobbySetting[] { Enabled_DefaultOn, Enabled_DefaultOff };

            foreach (var modeCollection in AllModeSettings)
            {
                foreach (var setting in modeCollection)
                {
                    // Make sure that the setting is not inside the 'ignored' array.
                    // 'encountered' will return false if the key was already added to the HashSet. In this case, we can just
                    if (!ignore.Contains(setting) && !encountered.Add(setting.ReferenceName))
                    {
                        reoccurring.Add(setting);
                    }
                }
            }

            // Add reocurring settings to All.
            foreach (var shared in reoccurring)
            {
                if (!all.Contains(shared))
                {
                    all.Add(shared);
                }
            }
        }
        public static void ToWorkshop(Dictionary <String, object> dict, WorkshopBuilder builder, List <LobbySetting> allSettings)
        {
            foreach (var setting in dict)
            {
                // Get the related setting.
                LobbySetting relatedSetting = allSettings.FirstOrDefault(ls => ls.Name == setting.Key);

                string name  = relatedSetting.ResolveName(builder);
                string value = relatedSetting.GetValue(builder, setting.Value);

                builder.AppendLine($"{name}: {value}");
            }
        }
 public new T Add(LobbySetting lobbySetting)
 {
     base.Add(lobbySetting);
     return((T)(object)this);
 }