feat(cheatenabler): add bounded shell-count input

This commit is contained in:
2026-07-11 01:02:12 +08:00
parent 6b03801681
commit 15c5bbdd72
4 changed files with 36 additions and 29 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ DSP_Mods/
| Mod | GUID | Description | | Mod | GUID | Description |
|-----|------|-------------| |-----|------|-------------|
| **UXAssist** | `org.soardev.uxassist` | Core QoL mod and shared library. Window resize, profile-based saves, FPS control, factory/logistics/navigation/Dyson Sphere tweaks, UI improvements, config panel UI, and `Common/` + `UI/` widget library shared by other mods. The Logistics tab can also push auto-config values to all existing facilities of a type on the current planet (per-setting `Apply` and per-category `Apply All` buttons; logic in `LogisticsPatch.Apply*`/`ForEach*`, wired in `UIConfigWindow`). | | **UXAssist** | `org.soardev.uxassist` | Core QoL mod and shared library. Window resize, profile-based saves, FPS control, factory/logistics/navigation/Dyson Sphere tweaks, UI improvements, config panel UI, and `Common/` + `UI/` widget library shared by other mods. The Logistics tab can also push auto-config values to all existing facilities of a type on the current planet (per-setting `Apply` and per-category `Apply All` buttons; logic in `LogisticsPatch.Apply*`/`ForEach*`, wired in `UIConfigWindow`). |
| **CheatEnabler** | `org.soardev.cheatenabler` | Cheat pack (depends on UXAssist). Instant build, architect mode, infinite resources, power boosts, Dyson Sphere cheats, mecha invincibility, and more. | | **CheatEnabler** | `org.soardev.cheatenabler` | Cheat pack (depends on UXAssist). Instant build, architect mode, infinite resources, power boosts, Dyson Sphere cheats with a bounded shell-count input (199,999), mecha invincibility, and more. |
| **LogisticMiner** | — | Makes logistic stations automatically mine ores and water from the current planet. | | **LogisticMiner** | — | Makes logistic stations automatically mine ores and water from the current planet. |
| **HideTips** | — | Suppresses all tutorial popups, random tips, achievement/milestone cards, and skips the prologue cutscene. | | **HideTips** | — | Suppresses all tutorial popups, random tips, achievement/milestone cards, and skips the prologue cutscene. |
| **MechaDronesTweaks** | — | Configurable drone speed multiplier, skip stage-1 animation, reduce energy consumption. Successor to FastDrones. | | **MechaDronesTweaks** | — | Configurable drone speed multiplier, skip stage-1 animation, reduce energy consumption. Successor to FastDrones. |
+4 -1
View File
@@ -1,5 +1,6 @@
using System.Reflection; using System.Reflection;
using BepInEx; using BepInEx;
using BepInEx.Configuration;
using CheatEnabler.Patches; using CheatEnabler.Patches;
using CheatEnabler.Patches.Factory; using CheatEnabler.Patches.Factory;
using UXAssist.Common; using UXAssist.Common;
@@ -92,7 +93,9 @@ public class CheatEnabler : BaseUnityPlugin
Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled = Config.Bind("DysonSphere", "IllegalDysonShellFunctions", false, Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled = Config.Bind("DysonSphere", "IllegalDysonShellFunctions", false,
"Enable illegal dyson shell functions"); "Enable illegal dyson shell functions");
Functions.DysonSphereFunctions.ShellsCountForFunctions = Config.Bind("DysonSphere", "ShellsCountForFunctions", 2048, Functions.DysonSphereFunctions.ShellsCountForFunctions = Config.Bind("DysonSphere", "ShellsCountForFunctions", 2048,
"Shells count for various functions"); new ConfigDescription("Shells count for various functions", new AcceptableValueRange<int>(
Functions.DysonSphereFunctions.MinShellsCountForFunctions,
Functions.DysonSphereFunctions.MaxShellsCountForFunctions)));
CombatPatch.MechaInvincibleEnabled = Config.Bind("Battle", "MechaInvincible", false, CombatPatch.MechaInvincibleEnabled = Config.Bind("Battle", "MechaInvincible", false,
"Mecha and Drones/Fleets invincible"); "Mecha and Drones/Fleets invincible");
CombatPatch.BuildingsInvincibleEnabled = Config.Bind("Battle", "BuildingsInvincible", false, CombatPatch.BuildingsInvincibleEnabled = Config.Bind("Battle", "BuildingsInvincible", false,
@@ -8,6 +8,9 @@ namespace CheatEnabler.Functions;
[ModFeature("CheatDysonSphere", Order = 20)] [ModFeature("CheatDysonSphere", Order = 20)]
public static class DysonSphereFunctions public static class DysonSphereFunctions
{ {
public const int MinShellsCountForFunctions = 1;
public const int MaxShellsCountForFunctions = 99_999;
public static ConfigEntry<bool> IllegalDysonShellFunctionsEnabled; public static ConfigEntry<bool> IllegalDysonShellFunctionsEnabled;
public static ConfigEntry<int> ShellsCountForFunctions; public static ConfigEntry<int> ShellsCountForFunctions;
+28 -27
View File
@@ -2,6 +2,7 @@
using CheatEnabler.Patches; using CheatEnabler.Patches;
using CheatEnabler.Patches.Factory; using CheatEnabler.Patches.Factory;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
using UXAssist.UI; using UXAssist.UI;
using UXAssist.Common; using UXAssist.Common;
using System; using System;
@@ -41,34 +42,34 @@ public static class UIConfigWindow
} }
} }
class ShellsCountMapper : MyWindow.RangeValueMapper<int> private static InputField AddShellsCountInput(MyConfigWindow wnd, float x, float y, RectTransform parent, string objName)
{ {
public ShellsCountMapper() : base(1, 139) var config = DysonSphereFunctions.ShellsCountForFunctions;
{ var count = Mathf.Clamp(config.Value, DysonSphereFunctions.MinShellsCountForFunctions, DysonSphereFunctions.MaxShellsCountForFunctions);
} if (config.Value != count) config.Value = count;
public override int ValueToIndex(int value) InputField input = null;
input = wnd.AddInputField(x, y, parent, count.ToString(), 15, objName, onEditEnd: value =>
{ {
return value switch if (!int.TryParse(value, out var parsed)) parsed = config.Value;
{ parsed = Mathf.Clamp(parsed, DysonSphereFunctions.MinShellsCountForFunctions, DysonSphereFunctions.MaxShellsCountForFunctions);
< 4 => value, config.Value = parsed;
< 64 => value / 4 + 3, input.text = parsed.ToString();
< 256 => value / 16 + 15, });
< 4096 => value / 64 + 27, input.contentType = InputField.ContentType.IntegerNumber;
_ => value / 256 + 75, input.characterLimit = 5;
};
}
public override int IndexToValue(int index) config.SettingChanged += OnShellsCountChanged;
wnd.OnFree += () => config.SettingChanged -= OnShellsCountChanged;
return input;
void OnShellsCountChanged(object o, EventArgs e)
{ {
return index switch var normalized = Mathf.Clamp(config.Value, DysonSphereFunctions.MinShellsCountForFunctions, DysonSphereFunctions.MaxShellsCountForFunctions);
{ if (config.Value != normalized) config.Value = normalized;
< 4 => index,
< 19 => (index - 3) * 4, var value = normalized.ToString();
< 31 => (index - 15) * 16, if (input.text != value) input.text = value;
< 91 => (index - 27) * 64,
_ => (index - 75) * 256,
};
} }
} }
@@ -266,7 +267,7 @@ public static class UIConfigWindow
() => { DysonSphereFunctions.DuplicateShellsWithHighestProduction(); }); () => { DysonSphereFunctions.DuplicateShellsWithHighestProduction(); });
}); });
y += 30f; y += 30f;
var slider1 = wnd.AddSlider(x + 20f, y, tab4, DysonSphereFunctions.ShellsCountForFunctions, new ShellsCountMapper()); var input1 = AddShellsCountInput(wnd, x + 20f, y, tab4, "input-shells-count-illegal");
y = originalY; y = originalY;
var btn4 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell quickly", 16, "button-generate-illegal-dyson-shells-quickly", () => var btn4 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell quickly", 16, "button-generate-illegal-dyson-shells-quickly", () =>
@@ -276,7 +277,7 @@ public static class UIConfigWindow
}); });
y += 30f; y += 30f;
var txt2 = wnd.AddText2(x, y, tab4, "Shells count", 15, "text-shells-count"); var txt2 = wnd.AddText2(x, y, tab4, "Shells count", 15, "text-shells-count");
var slider2 = wnd.AddSlider(x + txt2.preferredWidth + 5f, y + 6f, tab4, DysonSphereFunctions.ShellsCountForFunctions, new ShellsCountMapper()); var input2 = AddShellsCountInput(wnd, x + txt2.preferredWidth + 5f, y, tab4, "input-shells-count-quick");
Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.SettingChanged += onIllegalDysonShellFunctionsChanged; Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.SettingChanged += onIllegalDysonShellFunctionsChanged;
wnd.OnFree += () => { Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.SettingChanged -= onIllegalDysonShellFunctionsChanged; }; wnd.OnFree += () => { Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.SettingChanged -= onIllegalDysonShellFunctionsChanged; };
@@ -288,11 +289,11 @@ public static class UIConfigWindow
btn1.gameObject.SetActive(enabled); btn1.gameObject.SetActive(enabled);
btn2.gameObject.SetActive(enabled); btn2.gameObject.SetActive(enabled);
btn3.gameObject.SetActive(enabled); btn3.gameObject.SetActive(enabled);
slider1.gameObject.SetActive(enabled); input1.gameObject.SetActive(enabled);
btn4.gameObject.SetActive(!enabled); btn4.gameObject.SetActive(!enabled);
txt2.gameObject.SetActive(!enabled); txt2.gameObject.SetActive(!enabled);
slider2.gameObject.SetActive(!enabled); input2.gameObject.SetActive(!enabled);
} }
} }