/// <summary> /// Initialize weather specific settings /// </summary> /// <param name="settings">The settings instance to use</param> /// <param name="biome">The biome we're working with</param> /// <param name="key">The key to use</param> /// <param name="weathers">The weathers to iterate through</param> /// <param name="visibilityFunc">Our base visibility function</param> private void InitWeatherSettings(ModSettingsPack settings, BiomeDef biome, string key, List <WeatherDef> weathers, SettingHandle.ShouldDisplay visibilityFunc) { // Per-biome rain and snowfall multipliers foreach (var weather in weathers) { weatherCommonalities[weather] = new WeatherData(settings, biome, weather, visibilityFunc); } SpacerDrawer.GenerateSpacer("ColdDesertNights_WeatherMiscSettings".Translate(), settings, visibilityFunc); // If we're allowed to bypass the rain limits settingIgnoreRainLimit = settings.GetHandle( $"ignore_rain_limit_{key}", " " + "ColdDesertNights_IgnoreRainLimit".Translate(), "ColdDesertNights_IgnoreRainLimit_Desc".Translate(), false); // Force weather into the given range minWeatherTemperature = settings.GetHandle( $"weather_temp_min_{key}", " " + "ColdDesertNights_WeatherTempMin".Translate(), "ColdDesertNights_WeatherTempMin_Desc".Translate(), -999f); maxWeatherTemperature = settings.GetHandle( $"weather_temp_max_{key}", " " + "ColdDesertNights_WeatherTempMax".Translate(), "ColdDesertNights_WeatherTempMax_Desc".Translate(), 999f); // Set our visibility predicates: settingIgnoreRainLimit.VisibilityPredicate = minWeatherTemperature.VisibilityPredicate = maxWeatherTemperature.VisibilityPredicate = visibilityFunc; }
/// <summary> /// Initializes the weather data from the given <see cref="ModSettingsPack" /> settings /// and <see cref="WeatherDef" />, creating our settings in the process. /// </summary> /// <param name="settings">The setting pack to use</param> /// <param name="biome">The biome to use</param> /// <param name="weather">The weather to base this off of</param> /// <param name="visibilityFunc">Function which returns if we should display this now</param> public WeatherData(ModSettingsPack settings, BiomeDef biome, WeatherDef weather, SettingHandle.ShouldDisplay visibilityFunc) { this.weather = weather; var curCommonality = biome.baseWeatherCommonalities.FirstOrDefault(wc => wc.weather == weather)?.commonality ?? 0f; // Init our settings... SpacerDrawer.GenerateSpacer(GenText.ToTitleCaseSmart(weather.label), settings, visibilityFunc); commonality = settings.GetHandle($"weather_{biome.defName}_{weather.defName}", " " + "ColdDesertNights_BiomeWeather".Translate(), "ColdDesertNights_BiomeWeather_Desc".Translate(curCommonality), curCommonality, Validators.FloatRangeValidator(0f, float.MaxValue)); allowRepeating = settings.GetHandle($"weather_{biome.defName}_{weather.defName}_repeating", " " + "ColdDesertNights_BiomeWeatherRepeating".Translate(), "ColdDesertNights_BiomeWeatherRepeating_Desc".Translate( (weather.repeatable ? "ColdDesertNights_Checked" : "ColdDesertNights_Unchecked").Translate()), weather.repeatable); allowEarly = settings.GetHandle($"weather_{biome.defName}_{weather.defName}_early", " " + "ColdDesertNights_BiomeWeatherEarly".Translate(), "ColdDesertNights_BiomeWeatherEarly_Desc".Translate( (Favorability.Neutral <= weather.favorability ? "ColdDesertNights_Checked" : "ColdDesertNights_Unchecked").Translate()), Favorability.Neutral <= weather.favorability); // And set our visibility predicates... commonality.VisibilityPredicate = allowRepeating.VisibilityPredicate = allowEarly.VisibilityPredicate = visibilityFunc; }
/// <summary> /// Generates a randomly named settings spacer /// </summary> /// <param name="label">The label to use</param> /// <param name="settings">The settings handle to use</param> /// <param name="visibilityFunc">The visibility predicate</param> public static void GenerateSpacer(string label, ModSettingsPack settings, SettingHandle.ShouldDisplay visibilityFunc) { var spacer = settings.GetHandle <bool>("s" + spacers++, label, string.Empty); spacer.CustomDrawer = r => Draw(label, r); spacer.Unsaved = true; spacer.VisibilityPredicate = visibilityFunc; }
internal void PrepareSettingsHandles(ModSettingsPack pack) { GlobalHotkeysSetting = pack.GetHandle("globalHotkeys", "setting_globalHotkeys_label".Translate(), "setting_globalHotkeys_desc".Translate(), true); ContextOverlaySetting = pack.GetHandle("contextOverlay", "setting_contextOverlay_label".Translate(), "setting_contextOverlay_desc".Translate(), true); ContextWatermarkSetting = pack.GetHandle("contextWatermark", "setting_contextWatermark_label".Translate(), "setting_contextWatermark_desc".Translate(), true); ReplaceIconsSetting = pack.GetHandle("replaceIcons", "setting_replaceIcons_label".Translate(), "setting_replaceIcons_desc".Translate(), false); HaulWorktypeSetting = pack.GetHandle("haulUrgentlyWorktype", "setting_haulUrgentlyWorktype_label".Translate(), "setting_haulUrgentlyWorktype_desc".Translate(), true); FinishOffWorktypeSetting = pack.GetHandle("finishOffWorktype", "setting_finishOffWorktype_label".Translate(), "setting_finishOffWorktype_desc".Translate(), false); ExtendedContextActionSetting = pack.GetHandle("extendedContextActionKey", "setting_extendedContextHotkey_label".Translate(), "setting_extendedContextHotkey_desc".Translate(), true); ReverseDesignatorPickSetting = pack.GetHandle("reverseDesignatorPick", "setting_reverseDesignatorPick_label".Translate(), "setting_reverseDesignatorPick_desc".Translate(), true); FinishOffUnforbidsSetting = pack.GetHandle("finishOffUnforbids", "setting_finishOffUnforbids_label".Translate(), "setting_finishOffUnforbids_desc".Translate(), true); PartyHuntSetting = pack.GetHandle("partyHunt", "setting_partyHunt_label".Translate(), "setting_partyHunt_desc".Translate(), true); StorageSpaceAlertSetting = pack.GetHandle("storageSpaceAlert", "setting_storageSpaceAlert_label".Translate(), "setting_storageSpaceAlert_desc".Translate(), true); SelectionLimitSetting = pack.GetHandle("selectionLimit", "setting_selectionLimit_label".Translate(), "setting_selectionLimit_desc".Translate(), 200, Validators.IntRangeValidator(50, 100000)); SelectionLimitSetting.SpinnerIncrement = 50; // designators MakeSettingsCategoryToggle(pack, "setting_showToolToggles_label", () => expandToolSettings = !expandToolSettings); foreach (var designatorDef in DefDatabase <ThingDesignatorDef> .AllDefs) { var handleName = DesignatorHandleNamePrefix + designatorDef.defName; var handle = pack.GetHandle(handleName, "setting_showTool_label".Translate(designatorDef.label), null, true); handle.VisibilityPredicate = () => expandToolSettings; designatorToggleHandles[handleName] = handle; } // context menus MakeSettingsCategoryToggle(pack, "setting_showProviderToggles_label", () => expandProviderSettings = !expandProviderSettings); SettingHandle.ShouldDisplay menuEntryHandleVisibility = () => expandProviderSettings; foreach (var handle in DesignatorContextMenuController.RegisterMenuEntryHandles(pack)) { handle.VisibilityPredicate = menuEntryHandleVisibility; } // reverse designators MakeSettingsCategoryToggle(pack, "setting_showReverseToggles_label", () => expandReverseToolSettings = !expandReverseToolSettings); foreach (var reverseDef in DefDatabase <ReverseDesignatorDef> .AllDefs) { var handleName = ReverseDesignatorHandleNamePrefix + reverseDef.defName; var handle = pack.GetHandle(handleName, "setting_showTool_label".Translate(reverseDef.designatorDef.label), "setting_reverseDesignator_desc".Translate(), true); handle.VisibilityPredicate = () => expandReverseToolSettings; reverseDesignatorToggleHandles[handleName] = handle; } FinishOffSkillRequirement = pack.GetHandle("finishOffSkill", "setting_finishOffSkill_label".Translate(), "setting_finishOffSkill_desc".Translate(), true); FinishOffSkillRequirement.VisibilityPredicate = () => Prefs.DevMode; StripMineSettings = pack.GetHandle <StripMineGlobalSettings>("stripMineSettings", null, null); if (StripMineSettings.Value == null) { StripMineSettings.Value = new StripMineGlobalSettings(); } // invisible but resettable StripMineSettings.VisibilityPredicate = () => false; RegisterPackHandlesChangedCallback(pack); }
/// <summary> /// Initializes the biome data from the given <see cref="ModSettingsPack" /> settings /// and <see cref="BiomeDef" />, creating our settings in the process. /// </summary> /// <param name="settings">The setting pack to use</param> /// <param name="biome">The biome to base this off of</param> /// <param name="visibilityFunc">Function which returns if we should display this now</param> /// <param name="currentPane">The current settings pane we're on</param> /// <param name="weathers">A list of weathers to iterate through</param> /// <param name="conditions">A list of game conditions to iterate through</param> public BiomeData(ModSettingsPack settings, BiomeDef biome, SettingHandle.ShouldDisplay visibilityFunc, SettingHandle <SettingsPane> currentPane, List <WeatherDef> weathers, List <GameConditionDef> conditions) { // Build out the key: var key = Regex.Replace(biome.defName, "[^A-Za-z]", ""); // Init all of our various settings InitGeneralSettings(settings, biome, key, () => currentPane.Value == SettingsPane.General && visibilityFunc()); InitWeatherSettings(settings, biome, key, weathers, () => currentPane.Value == SettingsPane.Weather && visibilityFunc()); InitConditionSettings(settings, key, conditions, () => currentPane.Value == SettingsPane.Conditions && visibilityFunc()); // Port things from the v1 labeling: var v1Key = Regex.Replace(biome.label, "[^A-Za-z]", ""); // <-- This was a bad plan. if (string.IsNullOrEmpty(v1Key)) { return; } var oldFunc = settings.PeekValue($"temp_func_{v1Key}"); if (oldFunc != null && settingFunc.HasDefaultValue()) { settingFunc.StringValue = oldFunc; settings.TryRemoveUnclaimedValue($"temp_func_{v1Key}"); } var oldMult = settings.PeekValue($"temp_multiplier_{v1Key}"); if (oldMult != null && settingMultiplier.HasDefaultValue()) { settingMultiplier.StringValue = oldMult; settings.TryRemoveUnclaimedValue($"temp_multiplier_{v1Key}"); } var oldOffset = settings.PeekValue($"temp_offset_{v1Key}"); if (oldOffset == null || !settingOffset.HasDefaultValue()) { return; } settingOffset.StringValue = settings.PeekValue($"temp_offset_{v1Key}"); settings.TryRemoveUnclaimedValue($"temp_offset_{v1Key}"); }
/// <summary> /// Initialize condition specific settings /// </summary> /// <param name="settings">The settings instance to use</param> /// <param name="key">The key to use</param> /// <param name="conditions">The conditions to iterate through</param> /// <param name="visibilityFunc">Our base visibility function</param> private void InitConditionSettings(ModSettingsPack settings, string key, List <GameConditionDef> conditions, SettingHandle.ShouldDisplay visibilityFunc) { // Iterate through each of our conditions... foreach (var condition in conditions) { var setting = settings.GetHandle($"condition_{key}_{condition.defName}_offset", "ColdDesertNights_ConditionTemp".Translate(GenText.ToTitleCaseSmart(condition.label)), "ColdDesertNights_ConditionTemp_Desc".Translate(), DefaultConditionTemps.ContainsKey(condition) ? DefaultConditionTemps[condition] : 0f, Validators.FloatRangeValidator(-400, 400)); setting.VisibilityPredicate = visibilityFunc; conditionOffsets[condition] = setting; } }
/// <summary> /// Initalizes all of our 'general' tab settings. /// </summary> /// <param name="settings">The settings instance to use</param> /// <param name="biome">The biome we're working with</param> /// <param name="key">The key to use</param> /// <param name="visibilityFunc">Our base visibility function</param> private void InitGeneralSettings(ModSettingsPack settings, BiomeDef biome, string key, SettingHandle.ShouldDisplay visibilityFunc) { settingFunc = settings.GetHandle($"temp_func_{key}", "ColdDesertNights_Function".Translate(GenText.ToTitleCaseSmart(biome.label)), "ColdDesertNights_Function_Desc".Translate(), TemperatureFunctions.Vanilla, null, "ColdDesertNights_Function_Enum_"); settingMultiplier = settings.GetHandle( $"temp_multiplier_{key}", "ColdDesertNights_Multiplier".Translate(GenText.ToTitleCaseSmart(biome.label)), "ColdDesertNights_Multiplier_Desc".Translate(), 14.0f, Validators.FloatRangeValidator(-200, 200)); settingOffset = settings.GetHandle($"temp_offset_{key}", "ColdDesertNights_Offset".Translate(GenText.ToTitleCaseSmart(biome.label)), "ColdDesertNights_Offset_Desc".Translate(), 0.0f, Validators.FloatRangeValidator(-200, 200)); settingSeasonal = settings.GetHandle($"temp_seasonal_{key}", "ColdDesertNights_Seasonal".Translate(GenText.ToTitleCaseSmart(biome.label)), "ColdDesertNights_Seasonal_Desc".Translate(), 56.0f, Validators.FloatRangeValidator(-400, 400)); settingFunc.VisibilityPredicate = settingMultiplier.VisibilityPredicate = settingOffset.VisibilityPredicate = settingSeasonal.VisibilityPredicate = visibilityFunc; // And use them to init our values... UpdateFunction(settingFunc.Value); RecalculateMultiplierAndOffset(); RecalculateSeasonalCurve(settingSeasonal.Value); // Sync them up when they get changed settingFunc.OnValueChanged += UpdateFunction; settingMultiplier.OnValueChanged += _ => RecalculateMultiplierAndOffset(); settingOffset.OnValueChanged += _ => RecalculateMultiplierAndOffset(); settingSeasonal.OnValueChanged += RecalculateSeasonalCurve; }
public override void DefsLoaded() { // ------------------ Basic options ----------------- //Config.ColonistsPrefPasteOverTasty = Settings.GetHandle<bool>("colonistsPrefPasteOverTasty", "PrefNutrientPasteOverTasty".Translate(), "PrefNutrientPasteOverTasty_desc".Translate(), true); //Config.privilegedPrisoners = Settings.GetHandle<bool>("privilegedPrisoners", "PrivilegedPrisoners".Translate(), "PrivilegedPrisoners_desc".Translate(), false); //Config.IncapColonistsFeedMode = Settings.GetHandle("incapColonistsFeedMode", "IncapFeedMode".Translate(), "", IncapFeedMode.AnimalsLikeExcludeCorpses, null, "enumSetting_"); //Config.petsPreferHunt = Settings.GetHandle<bool>("petsPreferHunt", "PetsPreferHunt".Translate(), "PetsPreferHunt_desc".Translate(), true); Config.SeparatedNutrientPaste = Settings.GetHandle <bool>("separatedNutrientPaste", "SeparatedNutrientPaste".Translate(), "SeparatedNutrientPaste_desc".Translate(), true); Config.PrintPreferencesCommand = Settings.GetHandle <bool>("commandPrintReport", "PrintReportCommand".Translate(), "PrintReportCommand_desc".Translate()); Config.PrintPreferencesCommand.CustomDrawer = delegate(Rect rect) { if (Widgets.ButtonText(rect, "commandPrintReportButton".Translate())) { var floatOptions = new List <FloatMenuOption>(); foreach (var printMode in Enum.GetValues(typeof(ReportMode))) { floatOptions.Add(new FloatMenuOption(("commandPrintReportOption_" + printMode.ToString()).Translate(), () => { Report.PrintCompatibilityReport((ReportMode)printMode); })); } Find.WindowStack.Add(new FloatMenu(floatOptions)); } return(true); }; Config.NeedsTabUIHeight = Settings.GetHandle <float>("NeedsTabUIHeight", "NeedsTabUIHeight".Translate(), "NeedsTabUIHeight_desc".Translate(), 140); Config.NeedsTabUIHeight.Validator = delegate(string text) { float value; if (!float.TryParse(text, out value)) { return(false); } if (value < 100) { return(false); } return(true); }; Config.NeedsTabUIHeight.OnValueChanged = delegate(float value) { UI.PawnPolicyCard.middleRectHeigth = value; }; Config.controlPets = Settings.GetHandle <bool>("controlPets", "ControlPets".Translate(), "ControlPets_desc".Translate(), true); Config.controlPrisoners = Settings.GetHandle <bool>("controlPrisoners", "ControlPrisoners".Translate(), "ControlPrisoners_desc".Translate(), true); Config.controlColonists = Settings.GetHandle <bool>("controlColonists", "ControlColonists".Translate(), "ControlColonists_desc".Translate(), true); Config.controlVisitors = Settings.GetHandle <bool>("controlVisitors", "ControlVisitors".Translate(), "ControlColonists_desc".Translate(), true); Config.ShowAdvancedOptions = Settings.GetHandle <bool>("showAdvancedOptions", "ShowAdvancedOptions".Translate(), "ShowAdvancedOptions_desc".Translate(), false); // ------------------ Advanced options ----------------- { SettingHandle.ShouldDisplay VisibilityPredicate = (() => Config.ShowAdvancedOptions); Config.petsSafeHuntMaxStrengthRatio = Settings.GetHandle <float>("petsSafeHuntMaxStrenghRatio", "PetsSafeHuntMaxStrenghtRatio".Translate(), "PetsSafeHuntMaxStrenghtRatio_desc".Translate(), 0.25f); Config.petsSafeHuntMaxStrengthRatio.VisibilityPredicate = VisibilityPredicate; Config.petsSafeHuntMaxStrengthRatio.Validator = delegate(string value) { float ratio; if (float.TryParse(value, out ratio) && 0f < ratio && ratio <= 0.5f) { return(true); } Logger.Warning("Wrong option value: " + value + " \nreseting..."); return(false); }; Config.useCorpsesForTaming = Settings.GetHandle <bool>("useCorpsesForTaming", "UseCorpsesForTaming".Translate(), "UseCorpsesForTaming_desc".Translate(), false); Config.useCorpsesForTaming.VisibilityPredicate = VisibilityPredicate; Config.useHumanlikeCorpsesForTaming = Settings.GetHandle <bool>("useHumanlikeCorpsesForTaming", "UseHumanlikeCorpsesForTaming".Translate(), "UseHumanlikeCorpsesForTaming_desc".Translate(), false); Config.useHumanlikeCorpsesForTaming.VisibilityPredicate = VisibilityPredicate; //Config.extendedFoodOptimality = Settings.GetHandle<bool>("extendedFoodOptimality", "ExtendedFoodOptimality".Translate(), "ExtendedFoodOptimality_desc".Translate(), true); //Config.extendedFoodOptimality.VisibilityPredicate = VisibilityPredicate; Config.CostFactor = Settings.GetHandle <float>("CostFactor", "CostFactor".Translate(), "CostFactor_desc".Translate(), Config.CONFIG_DEFAULT_COST_FACTOR); Config.CostFactor.VisibilityPredicate = VisibilityPredicate; Config.FoodSearchMaxItemsCount = Settings.GetHandle <int>("FoodSearchMaxItemsCount", "FoodSearchMaxItemsCount".Translate(), "FoodSearchMaxItemsCount_desc".Translate(), 2000); Config.FoodSearchMaxItemsCount.VisibilityPredicate = VisibilityPredicate; Config.useMealsForTaming = Settings.GetHandle <bool>("useMealsForTaming", "UseMealsForTaming".Translate(), "UseMealsForTaming_desc".Translate(), false); Config.useMealsForTaming.VisibilityPredicate = VisibilityPredicate; #if DEBUG Config.debugNoPawnsRestricted = Settings.GetHandle <bool>("debugNoPawnsRestricted", "debugNoPawnsRestricted", "", false); Config.debugFoodPrefConstant = Settings.GetHandle <bool>("debugFoodPrefConstant", "debugFoodPrefConstant", "", false); Config.debugNoWasteFactor = Settings.GetHandle <bool>("debugNoWasteFactor", "debugNoWasteFactor", "", false); #endif } FoodCategoryUtils.ClearAllRecords(); processDefs(); // ducktape processCannibalMealDef("MealNutrientPaste"); //processCannibalMealDef("MealSimple"); //processCannibalMealDef("MealFine"); //processCannibalMealDef("MealLavish"); //#if DEBUG Report.PrintCompatibilityReport(ReportMode.DefName, true); //#endif }