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": [