diff --git a/CheatEnabler/CheatEnabler.cs b/CheatEnabler/CheatEnabler.cs index 57c5b78..dbcd21a 100644 --- a/CheatEnabler/CheatEnabler.cs +++ b/CheatEnabler/CheatEnabler.cs @@ -44,6 +44,8 @@ public class CheatEnabler : BaseUnityPlugin "No collision"); FactoryPatch.BeltSignalGeneratorEnabled = Config.Bind("Build", "BeltSignalGenerator", false, "Belt signal generator"); + FactoryPatch.BeltSignalNumberAltFormat = Config.Bind("Build", "BeltSignalNumberFormat", false, + "Belt signal number format alternative format (AAAA=generation speed in minutes, B=proliferate points, C=stack count):\n AAAABC by default\n BCAAAA as alternative"); FactoryPatch.BeltSignalCountRecipeEnabled = Config.Bind("Build", "BeltSignalCountRecipe", false, "Belt signal count all raws and intermediates in statistics"); FactoryPatch.NightLightEnabled = Config.Bind("Build", "NightLight", false, diff --git a/CheatEnabler/CheatEnabler.csproj b/CheatEnabler/CheatEnabler.csproj index d2f14fb..6dd55d3 100644 --- a/CheatEnabler/CheatEnabler.csproj +++ b/CheatEnabler/CheatEnabler.csproj @@ -5,7 +5,7 @@ net472 org.soardev.cheatenabler DSP MOD - CheatEnabler - 2.2.1 + 2.2.2 true latest CheatEnabler diff --git a/CheatEnabler/FactoryPatch.cs b/CheatEnabler/FactoryPatch.cs index 2a23f31..736d3f8 100644 --- a/CheatEnabler/FactoryPatch.cs +++ b/CheatEnabler/FactoryPatch.cs @@ -15,6 +15,7 @@ public static class FactoryPatch public static ConfigEntry NoConditionEnabled; public static ConfigEntry NoCollisionEnabled; public static ConfigEntry BeltSignalGeneratorEnabled; + public static ConfigEntry BeltSignalNumberAltFormat; public static ConfigEntry BeltSignalCountRecipeEnabled; public static ConfigEntry NightLightEnabled; public static ConfigEntry RemovePowerSpaceLimitEnabled; @@ -35,6 +36,7 @@ public static class FactoryPatch NoConditionEnabled.SettingChanged += (_, _) => NoConditionValueChanged(); NoCollisionEnabled.SettingChanged += (_, _) => NoCollisionValueChanged(); BeltSignalGeneratorEnabled.SettingChanged += (_, _) => BeltSignalGeneratorValueChanged(); + BeltSignalNumberAltFormat.SettingChanged += (_, _) => { BeltSignalGenerator.OnAltFormatChanged(); }; NightLightEnabled.SettingChanged += (_, _) => NightLightValueChanged(); RemovePowerSpaceLimitEnabled.SettingChanged += (_, _) => RemovePowerSpaceLimitValueChanged(); BoostWindPowerEnabled.SettingChanged += (_, _) => BoostWindPowerValueChanged(); @@ -369,8 +371,11 @@ public static class FactoryPatch var matcher = new CodeMatcher(instructions, generator); matcher.MatchForward(false, new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(GC), nameof(GC.Collect))) - ).Insert( - new CodeInstruction(OpCodes.Ldarg_0), + ); + var labels = matcher.Labels; + matcher.Labels = null; + matcher.Insert( + new CodeInstruction(OpCodes.Ldarg_0).WithLabels(labels), new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(BuildTool), nameof(BuildTool.factory))), new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(FactoryPatch), nameof(ArrivePlanet))) ); @@ -544,6 +549,36 @@ public static class FactoryPatch _signalBeltsCapacity = 0; } + public static void OnAltFormatChanged() + { + var factories = GameMain.data?.factories; + if (factories == null) return; + var factoryCount = GameMain.data.factoryCount; + var altFormat = BeltSignalNumberAltFormat.Value; + for (var i = Math.Min(_signalBelts.Length, factoryCount) - 1; i >= 0; i--) + { + var factory = factories[i]; + var cargoTraffic = factory?.cargoTraffic; + if (cargoTraffic == null) continue; + var entitySignPool = factory.entitySignPool; + if (entitySignPool == null) continue; + var belts = _signalBelts[i]; + foreach (var pair in belts) + { + var beltId = pair.Key; + ref var belt = ref cargoTraffic.beltPool[beltId]; + if (belt.id != beltId) continue; + ref var signal = ref entitySignPool[belt.entityId]; + if (signal.iconId0 < 1000) continue; + var signalBelt = pair.Value; + if (altFormat) + signal.count0 = signalBelt.SpeedLimit + signalBelt.Stack * 10000 + signalBelt.Inc / signalBelt.Stack * 100000; + else + signal.count0 = signalBelt.SpeedLimit * 100 + signalBelt.Stack + signalBelt.Inc / signalBelt.Stack * 10; + } + } + } + private static void InitSignalBelts() { if (!GameMain.isRunning) return; @@ -621,9 +656,18 @@ public static class FactoryPatch int speedLimit; if (signalId >= 1000) { - stack = Mathf.Clamp(number % 10, 1, 4); - inc = number / 10 % 10 * stack; - speedLimit = number / 100 % 4000; + if (!BeltSignalNumberAltFormat.Value) + { + stack = Mathf.Clamp(number % 10, 1, 4); + inc = number / 10 % 10 * stack; + speedLimit = number / 100; + } + else + { + stack = Mathf.Clamp(number / 10000 % 10, 1, 4); + inc = number / 100000 % 10 * stack; + speedLimit = number % 10000; + } } else { @@ -856,7 +900,7 @@ public static class FactoryPatch { var beltId = pair.Key; var cargoTraffic = factory.cargoTraffic; - var belt = cargoTraffic.beltPool[beltId]; + ref var belt = ref cargoTraffic.beltPool[beltId]; var cargoPath = cargoTraffic.GetCargoPath(belt.segPathId); int itemId; if ((itemId = cargoPath.TryPickItem(belt.segIndex + belt.segPivotOffset - 5, 12, out var stack, out _)) > 0) @@ -898,7 +942,7 @@ public static class FactoryPatch { beltSignal.Progress += beltSignal.SpeedLimit; if (beltSignal.Progress < 3600) continue; - beltSignal.Progress -= 3600; + beltSignal.Progress %= 3600; } var beltId = pair.Key; diff --git a/CheatEnabler/README.md b/CheatEnabler/README.md index 8c651c5..8c09ad8 100644 --- a/CheatEnabler/README.md +++ b/CheatEnabler/README.md @@ -4,6 +4,11 @@ #### 添加一些作弊功能,同时屏蔽异常检测 ## Changlog +* 2.2.2 + + New function: `Assign game to currrnet account` + + New subfunction: `Belt signal alt format` + + Fix a crash on using `Initialize this Planet` + + Fix belt build in `Finish build immediately` * 2.2.1 + Check condition for miners even when `Build without condition` is enabled. + Fix a patch issue that may cause `Build without condition` not working. @@ -31,15 +36,17 @@ + Enable Dev Shortcuts (check config panel for usage) + Disable Abnormal Checks + Unlock techs with key-modifiers (Ctrl/Alt/Shift) + + Assign game to currrnet account + Factory: + Finish build immediately + Architect mode (Infinite buildings) + Unlimited interactive range + Build without condition + No collision + + Sunlight at night + Belt signal item generation + Count all raws and intermediates in statistics - + Sunlight at night + + Belt signal alt format + Remove space limit between wind turbines and solar panels + Boost power generations for kinds of power generators + Planet: @@ -73,6 +80,11 @@ * [LSTM](https://github.com/hetima/DSP_LSTM) & [PlanetFinder](https://github.com/hetima/DSP_PlanetFinder): UI implementations ## 更新日志 +* 2.2.2 + + 新功能:`将游戏绑定给当前账号` + + 新子功能:`传送带信号替换格式` + + 修复了`初始化本行星`可能导致崩溃的问题 + + 修复了`建造秒完成`中传送带建造的问题 * 2.2.1 + 即使在启用`无条件建造`时依然检查矿机的建造条件 + 修复一个可能导致`无条件建造`不生效的问题 @@ -100,14 +112,17 @@ + 启用开发模式快捷键(使用说明见设置面板) + 屏蔽异常检测 + 使用组合键解锁科技(Ctrl/Alt/Shift) + + 将游戏绑定给当前账号 + 工厂: + 建造秒完成 + 建筑师模式(无限建筑) + 无限交互距离 + 无条件建造 + 无碰撞 - + 传送带信号物品生成 + 夜间日光灯 + + 传送带信号物品生成 + + 统计面板中计算所有原材料和中间产物 + + 传送带信号替换格式 + 风力发电机和太阳能板无间距限制 + 提升各种发电设备发电量 + 行星: diff --git a/CheatEnabler/UIConfigWindow.cs b/CheatEnabler/UIConfigWindow.cs index 5d1002b..7f9dae2 100644 --- a/CheatEnabler/UIConfigWindow.cs +++ b/CheatEnabler/UIConfigWindow.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.UI; namespace CheatEnabler; @@ -6,6 +7,7 @@ public class UIConfigWindow : UI.MyWindowWithTabs { private RectTransform _windowTrans; + private UIButton _resignGameBtn; private readonly UIButton[] _dysonLayerBtn = new UIButton[10]; static UIConfigWindow() @@ -22,6 +24,7 @@ public class UIConfigWindow : UI.MyWindowWithTabs I18N.Add("Unlock Tech with Key-Modifiers Tips", "Click tech on tree while holding:\n Shift: Tech level + 1\n Ctrl: Tech level + 10\n Ctrl + Shift: Tech level + 100\n Alt: Tech level to MAX\n\nNote: all direct prerequisites will be unlocked as well.", "按住以下组合键点击科技树:\n Shift:科技等级+1\n Ctrl:科技等级+10\n Ctrl+Shift:科技等级+100\n Alt:科技等级升到最大\n\n注意:所有直接前置科技也会被解锁"); + I18N.Add("Assign game to current account", "Assign game to current account", "将游戏绑定给当前账号"); I18N.Add("Factory", "Factory", "工厂"); I18N.Add("Finish build immediately", "Finish build immediately", "建造秒完成"); I18N.Add("Architect mode", "Architect mode", "建筑师模式"); @@ -29,6 +32,10 @@ public class UIConfigWindow : UI.MyWindowWithTabs I18N.Add("Build without condition", "Build without condition check", "无条件建造"); I18N.Add("No collision", "No collision", "无碰撞"); I18N.Add("Belt signal generator", "Belt signal generator", "传送带信号物品生成"); + I18N.Add("Belt signal alt format", "Belt signal alt format", "传送带信号替换格式"); + I18N.Add("Belt signal alt format tips", + "Belt signal number format alternative format:\n AAAABC by default\n BCAAAA as alternative\nAAAA=generation speed in minutes, B=proliferate points, C=stack count", + "传送带信号物品生成数量格式:\n 默认为AAAABC\n 勾选替换为BCAAAA\nAAAA=生成速度,B=增产点数,C=堆叠数量"); I18N.Add("Count all raws and intermediates in statistics","Count all raw materials in statistics", "统计信息里计算所有原料和中间产物"); I18N.Add("Night Light", "Sunlight at night", "夜间日光灯"); I18N.Add("Remove power space limit", "Remove space limit for winds and geothermals", "移除风力发电和地热发电的间距限制"); @@ -75,7 +82,7 @@ public class UIConfigWindow : UI.MyWindowWithTabs public override void _OnCreate() { _windowTrans = GetComponent(); - _windowTrans.sizeDelta = new Vector2(580f, 400f); + _windowTrans.sizeDelta = new Vector2(580f, 420f); CreateUI(); } @@ -99,6 +106,11 @@ public class UIConfigWindow : UI.MyWindowWithTabs x += 52f; y += 72f; AddTipsButton(x, y, tab1, "Unlock Tech with Key-Modifiers", "Unlock Tech with Key-Modifiers Tips", "unlock-tech-tips"); + x = 300f; + y = 10f; + _resignGameBtn = AddButton(x, y, tab1, "Assign game to current account", 16, "resign-game-btn", () => { GameMain.data.account = AccountData.me; }); + var rect = (RectTransform)_resignGameBtn.transform; + rect.sizeDelta = new Vector2(200f, rect.sizeDelta.y); var tab2 = AddTab(136f, 1, _windowTrans, "Factory"); x = 0f; @@ -119,11 +131,18 @@ public class UIConfigWindow : UI.MyWindowWithTabs y += 26f; x += 26f; var cb = UI.MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.BeltSignalCountRecipeEnabled, "Count all raws and intermediates in statistics", 13); + y += 26f; + var cb2 = UI.MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.BeltSignalNumberAltFormat, "Belt signal alt format", 13); cb.gameObject.SetActive(FactoryPatch.BeltSignalGeneratorEnabled.Value); + cb2.gameObject.SetActive(FactoryPatch.BeltSignalGeneratorEnabled.Value); FactoryPatch.BeltSignalGeneratorEnabled.SettingChanged += (_, _) => { cb.gameObject.SetActive(FactoryPatch.BeltSignalGeneratorEnabled.Value); + cb2.gameObject.SetActive(FactoryPatch.BeltSignalGeneratorEnabled.Value); }; + x += 180f; + y += 6f; + AddTipsButton(x, y, tab2, "Belt signal alt format", "Belt signal alt format tips", "belt-signal-alt-format-tips"); x = 240f; y = 10f; UI.MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.RemovePowerSpaceLimitEnabled, "Remove power space limit"); @@ -244,9 +263,17 @@ public class UIConfigWindow : UI.MyWindowWithTabs public void UpdateUI() { + UpdateResignButton(); UpdateDysonShells(); } + private void UpdateResignButton() + { + var resignEnabled = GameMain.data.account != AccountData.me; + if (_resignGameBtn.gameObject.activeSelf == resignEnabled) return; + _resignGameBtn.gameObject.SetActive(resignEnabled); + } + private void UpdateDysonShells() { if (!Tabs[3].Item1.gameObject.activeSelf) return; diff --git a/CheatEnabler/package/manifest.json b/CheatEnabler/package/manifest.json index 935e288..a645f28 100644 --- a/CheatEnabler/package/manifest.json +++ b/CheatEnabler/package/manifest.json @@ -1,6 +1,6 @@ { "name": "CheatEnabler", - "version_number": "2.2.1", + "version_number": "2.2.2", "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/CheatEnabler", "description": "Add various cheat functions while disabling abnormal determinants / 添加一些作弊功能,同时屏蔽异常检测", "dependencies": [