public void ApplyPreset(SettingsPreset preset)
        {
            if (preset == SettingsPreset.NoneApplied)
            {
                throw new InvalidOperationException("SettingsPreset.NoneApplied should never be assigned!");
            }

            ActivePreset = preset;
            if (preset == SettingsPreset.Custom) //setting the preset TO custom does nothing
            {
                return;
            }

            ApplyBaseSettings();

            switch (preset)
            {
            case SettingsPreset.NoneApplied:
                break;

            case SettingsPreset.Disabled:
                ToolAutoSwitch         = false;
                OptimalMelee           = false;
                CQCAutoSwitch          = false;
                RangedCombatAutoSwitch = false;

                SidearmSpawnChance = 0.0f;

                LimitModeAmount       = LimitModeAmountOfSidearms.Slots;
                LimitModeAmount_Slots = 1;

                FumbleMode         = FumbleModeOptionsEnum.Never;
                ReEquipOutOfCombat = false;
                ReEquipBest        = false;
                ReEquipInCombat    = false;

                PreserveInventoryInCaravans  = false;
                HideSidearmsInCaravanDialogs = false;
                break;

            case SettingsPreset.LoadoutOnly:
                ToolAutoSwitch               = false;
                OptimalMelee                 = false;
                CQCAutoSwitch                = false;
                RangedCombatAutoSwitch       = false;
                LimitModeSingle              = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingle_AbsoluteMass = 4.75f;
                LimitModeAmount              = LimitModeAmountOfSidearms.Slots;
                LimitModeAmount_Slots        = 3;

                SidearmSpawnChance = 0.0f;

                FumbleMode         = FumbleModeOptionsEnum.Never;
                ReEquipOutOfCombat = false;
                ReEquipBest        = false;
                ReEquipInCombat    = false;
                break;

            case SettingsPreset.Lite:
                SeparateModes        = true;
                LimitModeSingleMelee = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleMelee_AbsoluteMass  = 0.6f;
                LimitModeSingleRanged              = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleRanged_AbsoluteMass = 1.6f;
                LimitModeAmountMelee        = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountMelee_Slots  = 2;
                LimitModeAmountRanged       = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountRanged_Slots = 2;
                LimitModeAmountTotal        = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountTotal_Slots  = 2;

                SidearmSpawnChanceDropoff = 1.0f;
                break;

            case SettingsPreset.Basic:
                SeparateModes        = true;
                LimitModeSingleMelee = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleMelee_AbsoluteMass  = 1.9f;
                LimitModeSingleRanged              = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleRanged_AbsoluteMass = 2.7f;
                LimitModeAmountMelee        = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountMelee_Slots  = 2;
                LimitModeAmountRanged       = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountRanged_Slots = 2;
                LimitModeAmountTotal        = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountTotal_Slots  = 3;
                break;

            case SettingsPreset.Advanced:
                SeparateModes        = true;
                LimitModeSingleMelee = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleMelee_AbsoluteMass  = 2.25f;
                LimitModeSingleRanged              = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleRanged_AbsoluteMass = 5.0f;
                LimitModeAmountTotal = LimitModeAmountOfSidearms.AbsoluteWeight;
                LimitModeAmountTotal_AbsoluteMass = 10;
                break;

            case SettingsPreset.Excessive:
                SidearmSpawnChance        = 0.75f;
                SidearmSpawnChanceDropoff = 0.5f;
                SidearmBudgetMultiplier   = 0.75f;
                SidearmBudgetDropoff      = 0.5f;
                break;

            case SettingsPreset.Brawler:
                SeparateModes        = true;
                LimitModeSingleMelee = LimitModeSingleSidearm.AbsoluteWeight;
                LimitModeSingleMelee_AbsoluteMass = 4f;
                LimitModeAmountMelee = LimitModeAmountOfSidearms.AbsoluteWeight;
                LimitModeAmountMelee_AbsoluteMass = 10f;
                LimitModeAmountRanged             = LimitModeAmountOfSidearms.Slots;
                LimitModeAmountRanged_Slots       = 0;
                break;

            default:
                return;
            }

            RebuildCache(ref LimitModeSingle_Match_Cache, WeaponListKind.Both);
            RebuildCache(ref LimitModeSingleMelee_Match_Cache, WeaponListKind.Melee);
            RebuildCache(ref LimitModeSingleRanged_Match_Cache, WeaponListKind.Ranged);
        }
        public void ApplyBaseSettings()
        {
            ToolAutoSwitch         = true;
            OptimalMelee           = true;
            CQCAutoSwitch          = true;
            CQCTargetOnly          = false;
            RangedCombatAutoSwitch = true;

            RangedCombatAutoSwitchMaxWarmup = 0.75f;

            SpeedSelectionBiasMelee  = 1f;
            SpeedSelectionBiasRanged = 1.1f;

            SeparateModes   = false;
            LimitModeSingle = LimitModeSingleSidearm.None;
            LimitModeAmount = LimitModeAmountOfSidearms.None;

            LimitModeSingleMelee  = LimitModeSingleSidearm.None;
            LimitModeAmountMelee  = LimitModeAmountOfSidearms.None;
            LimitModeSingleRanged = LimitModeSingleSidearm.None;
            LimitModeAmountRanged = LimitModeAmountOfSidearms.None;
            LimitModeAmountTotal  = LimitModeAmountOfSidearms.None;

            #region LimitModeSingle
            LimitModeSingle_AbsoluteMass = 1.9f;
            LimitModeSingle_RelativeMass = 0.25f;
            LimitModeSingle_Selection    = GettersFilters.getValidWeaponsThingDefsOnly().Where(w => w.GetStatValueAbstract(StatDefOf.Mass) <= LimitModeSingle_AbsoluteMass).ToHashSet();
            #endregion
            #region LimitModeAmount
            LimitModeAmount_AbsoluteMass = 10f;
            LimitModeAmount_RelativeMass = 0.5f;
            LimitModeAmount_Slots        = 2;
            #endregion

            #region LimitModeSingleMelee
            LimitModeSingleMelee_AbsoluteMass = 1.9f;
            LimitModeSingleMelee_RelativeMass = 0.25f;
            LimitModeSingleMelee_Selection    = GettersFilters.filterForWeaponKind(GettersFilters.getValidWeaponsThingDefsOnly(), WeaponSearchType.Melee).Where(w => w.GetStatValueAbstract(StatDefOf.Mass) <= LimitModeSingleMelee_AbsoluteMass).ToHashSet();
            #endregion
            #region LimitModeAmountMelee
            LimitModeAmountMelee_AbsoluteMass = 10f;
            LimitModeAmountMelee_RelativeMass = 0.5f;
            LimitModeAmountMelee_Slots        = 2;
            #endregion

            #region LimitModeSingleRanged
            LimitModeSingleRanged_AbsoluteMass = 2.55f;
            LimitModeSingleRanged_RelativeMass = 0.25f;
            LimitModeSingleRanged_Selection    = GettersFilters.filterForWeaponKind(GettersFilters.getValidWeaponsThingDefsOnly(), WeaponSearchType.Ranged).Where(w => w.GetStatValueAbstract(StatDefOf.Mass) <= LimitModeSingleRanged_AbsoluteMass).ToHashSet();
            #endregion
            #region LimitModeAmountRanged
            LimitModeAmountRanged_AbsoluteMass = 10f;
            LimitModeAmountRanged_RelativeMass = 0.5f;
            LimitModeAmountRanged_Slots        = 2;
            #endregion

            #region LimitModeAmountTotal
            LimitModeAmountTotal_AbsoluteMass = 10f;
            LimitModeAmountTotal_RelativeMass = 0.5f;
            LimitModeAmountTotal_Slots        = 4;
            #endregion

            SidearmSpawnChance        = 0.5f;
            SidearmSpawnChanceDropoff = 0.25f;
            SidearmBudgetMultiplier   = 0.5f;
            SidearmBudgetDropoff      = 0.25f;

            ColonistDefaultWeaponMode = PrimaryWeaponMode.BySkill;
            NPCDefaultWeaponMode      = PrimaryWeaponMode.ByGenerated;

            FumbleMode           = FumbleModeOptionsEnum.InDistress;
            FumbleRecoveryChance = new SimpleCurve(defaultFumbleRecoveryChancePoints);
            ReEquipOutOfCombat   = true;
            ReEquipBest          = true;
            ReEquipInCombat      = true;

            PreserveInventoryInCaravans  = true;
            HideSidearmsInCaravanDialogs = true;
        }