diff --git a/CheatEnabler/CheatEnabler.cs b/CheatEnabler/CheatEnabler.cs index d557f9f..af97075 100644 --- a/CheatEnabler/CheatEnabler.cs +++ b/CheatEnabler/CheatEnabler.cs @@ -39,6 +39,8 @@ public class CheatEnabler : BaseUnityPlugin "Belt signal count removals as comsumption in statistics"); FactoryPatch.BeltSignalCountRecipeEnabled = Config.Bind("Build", "BeltSignalCountRecipe", false, "Belt signal count all raws and intermediates in statistics"); + FactoryPatch.BeltSignalUseProliferatorEnabled = Config.Bind("Build", "BeltSignalUseProliferator", false, + "Belt signal count proliferators used for raws/intermediates and finished products"); FactoryPatch.RemovePowerSpaceLimitEnabled = Config.Bind("Build", "RemovePowerDistanceLimit", false, "Remove distance limit for wind turbines and geothermals"); FactoryPatch.BoostWindPowerEnabled = Config.Bind("Build", "BoostWindPower", false, diff --git a/CheatEnabler/Patches/FactoryPatch.cs b/CheatEnabler/Patches/FactoryPatch.cs index 544a034..7f5ce28 100644 --- a/CheatEnabler/Patches/FactoryPatch.cs +++ b/CheatEnabler/Patches/FactoryPatch.cs @@ -23,6 +23,7 @@ public class FactoryPatch : PatchImpl public static ConfigEntry BeltSignalCountGenEnabled; public static ConfigEntry BeltSignalCountRemEnabled; public static ConfigEntry BeltSignalCountRecipeEnabled; + public static ConfigEntry BeltSignalUseProliferatorEnabled; public static ConfigEntry RemovePowerSpaceLimitEnabled; public static ConfigEntry BoostWindPowerEnabled; public static ConfigEntry BoostSolarPowerEnabled; @@ -68,6 +69,7 @@ public class FactoryPatch : PatchImpl NoCollisionEnabled.SettingChanged += (_, _) => NoCollisionValueChanged(); BeltSignalGeneratorEnabled.SettingChanged += (_, _) => BeltSignalGenerator.Enable(BeltSignalGeneratorEnabled.Value); BeltSignalNumberAltFormat.SettingChanged += (_, _) => BeltSignalGenerator.OnAltFormatChanged(); + BeltSignalUseProliferatorEnabled.SettingChanged += (_, _) => BeltSignalGenerator.OnUseProliferatorChanged(); RemovePowerSpaceLimitEnabled.SettingChanged += (_, _) => RemovePowerSpaceLimit.Enable(RemovePowerSpaceLimitEnabled.Value); BoostWindPowerEnabled.SettingChanged += (_, _) => BoostWindPower.Enable(BoostWindPowerEnabled.Value); BoostSolarPowerEnabled.SettingChanged += (_, _) => BoostSolarPower.Enable(BoostSolarPowerEnabled.Value); @@ -723,7 +725,7 @@ public class FactoryPatch : PatchImpl public byte Stack; public byte Inc; public int Progress; - public Tuple[] Sources; + public (int itemId, float itemCount, bool isExtra)[] Sources; public float[] SourceProgress; } @@ -774,6 +776,36 @@ public class FactoryPatch : PatchImpl } } + public static void OnUseProliferatorChanged() + { + if (_signalBelts == null) return; + 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]; + if (belts == null) continue; + foreach (var pair in belts) + { + var beltId = pair.Key; + ref var belt = ref cargoTraffic.beltPool[beltId]; + if (belt.id != beltId) continue; + var signalBelt = pair.Value; + signalBelt.Progress = 0; + signalBelt.Sources = null; + signalBelt.SourceProgress = null; + AddSourcesToBeltSignal(signalBelt); + } + } + } + private static void InitSignalBelts() { if (DSPGame.IsMenuDemo) return; @@ -879,13 +911,15 @@ public class FactoryPatch : PatchImpl var signalBelts = GetOrCreateSignalBelts(factory); if (signalBelts.TryGetValue(beltId, out var oldBeltSignal)) { + if (oldBeltSignal.SignalId == signalId && oldBeltSignal.SpeedLimit == speedLimit && oldBeltSignal.Stack == stack && oldBeltSignal.Inc == inc) return; oldBeltSignal.SpeedLimit = speedLimit; oldBeltSignal.Stack = (byte)stack; oldBeltSignal.Inc = (byte)inc; oldBeltSignal.Progress = 0; - if (oldBeltSignal.SignalId == signalId) return; oldBeltSignal.SignalId = signalId; - AddSourcesToBeltSignal(oldBeltSignal, signalId); + oldBeltSignal.Sources = null; + oldBeltSignal.SourceProgress = null; + AddSourcesToBeltSignal(oldBeltSignal); return; } @@ -896,27 +930,47 @@ public class FactoryPatch : PatchImpl Stack = (byte)stack, Inc = (byte)inc }; - if (signalId >= 1000) - { - AddSourcesToBeltSignal(beltSignal, signalId); - } - + AddSourcesToBeltSignal(beltSignal); signalBelts[beltId] = beltSignal; } - private static void AddSourcesToBeltSignal(BeltSignal beltSignal, int itemId) + private static void AddSourcesToBeltSignal(BeltSignal beltSignal) { + var itemId = beltSignal.SignalId; + if (itemId < 1000) return; var result = new Dictionary(); var extra = new Dictionary(); - CalculateAllProductions(result, extra, itemId); + var sprayedCount = 0f; + CalculateAllProductions(result, extra, ref sprayedCount, itemId); + + var proliferatorCount = 0f; + if (result.TryGetValue(1143, out var pv)) + { + proliferatorCount = pv; + result.Remove(1143); + } + if (BeltSignalUseProliferatorEnabled.Value) + { + if (beltSignal.Inc / beltSignal.Stack >= 4) + { + sprayedCount += 1f; + } + if (sprayedCount > 0) + { + proliferatorCount += sprayedCount / ProliferatorSpayCount; + } + } + if (proliferatorCount > 0f) + { + foreach (var p in ProliferatorSources) + { + result[p.Item1] = (result.TryGetValue(p.Item1, out var v) ? v : 0) + p.Item2 * proliferatorCount / ProliferatorDenom; + } + } result.Remove(itemId); - foreach (var p in extra) - { - result[p.Key] = (result.TryGetValue(p.Key, out var v) ? v : 0) + p.Value; - } - var cnt = result.Count; + var cnt = result.Count + extra.Count; if (cnt == 0) { beltSignal.Sources = null; @@ -924,11 +978,15 @@ public class FactoryPatch : PatchImpl return; } - var items = new Tuple[cnt]; + var items = new (int itemId, float itemCount, bool isExtra)[cnt]; var progress = new float[cnt]; + foreach (var p in extra) + { + items[--cnt] = (p.Key, p.Value, true); + } foreach (var p in result) { - items[--cnt] = Tuple.Create(p.Key, p.Value); + items[--cnt] = (p.Key, p.Value, false); } beltSignal.Sources = items; @@ -1198,13 +1256,13 @@ public class FactoryPatch : PatchImpl var stackf = (float)stack; for (var i = sources.Length - 1; i >= 0; i--) { - var newCnt = progress[i] + sources[i].Item2 * stackf; + var newCnt = progress[i] + sources[i].itemCount * stackf; if (newCnt > 0) { - var itemId = sources[i].Item1; + var itemId = sources[i].itemId; var cnt = Mathf.CeilToInt(newCnt); productRegister[itemId] += cnt; - consumeRegister[itemId] += cnt; + if (!sources[i].isExtra) consumeRegister[itemId] += cnt; progress[i] = newCnt - cnt; } else @@ -1235,6 +1293,14 @@ public class FactoryPatch : PatchImpl } /* BEGIN: Item sources calculation */ + private static readonly int[] ExtraOreItemIds = [1000, 1116, 1120, 1121, 1208, 5201, 5202, 5203, 5204, 5205, 5206]; + private static readonly HashSet ExtraProliferationItemIds = [1107, 1111, 1125, 1142, 1143, 1202, 1203, 1204, 1205, 1209, 1210, 1301, 1305, 1401, 1402, 1403, 1405, 1406, 1502, 1503, 1802, 6001, 6003, 6004, 6005, 6006]; + private static readonly HashSet NoProliferationItemIds = [1126, 6002]; + // All source items used to create 25 proliferators mk.III (not self-sprayed) + private static readonly List<(int, float)> ProliferatorSources = [(1015, 60f), (1124, 20f), (1006, 64f), (1012, 16f), (1112, 32f), (1141, 64f), (1142, 40f), (1143, 25f)]; + private const float ProliferatorDenom = 21f; + // One sprayed proliferator mk.III can spray 75 items, but one is used for spray itself, so the actual count is 74 + private const float ProliferatorSpayCount = 74f; private static readonly Dictionary ItemSources = []; private static bool _itemSourcesInitialized; @@ -1261,7 +1327,12 @@ public class FactoryPatch : PatchImpl } } - ItemSources[1208] = new ItemSource { Count = 1 }; + // 水、硫酸、氢、重氢、光子 + foreach (var itemId in ExtraOreItemIds) + { + ItemSources[itemId] = new ItemSource { Count = 1 }; + } + var recipes = LDB.recipes.dataArray; foreach (var recipe in recipes) { @@ -1334,7 +1405,7 @@ public class FactoryPatch : PatchImpl _itemSourcesInitialized = true; } - private static void CalculateAllProductions(IDictionary result, IDictionary extra, int itemId, float count = 1f) + private static void CalculateAllProductions(IDictionary result, IDictionary extra, ref float sprayedCount, int itemId, float count = 1f) { if (!ItemSources.TryGetValue(itemId, out var itemSource)) { @@ -1356,10 +1427,16 @@ public class FactoryPatch : PatchImpl } } - if (itemSource.From == null) return; + if (itemId == 1143 || itemSource.From == null) return; + var useProliferator = BeltSignalUseProliferatorEnabled.Value; + if (useProliferator && ExtraProliferationItemIds.Contains(itemId)) + { + times *= 0.8f; + } foreach (var p in itemSource.From) { var value = p.Value * times; + if (useProliferator && !NoProliferationItemIds.Contains(p.Key)) sprayedCount += value; if (extra.TryGetValue(p.Key, out var rcount)) { if (value <= rcount) @@ -1390,7 +1467,7 @@ public class FactoryPatch : PatchImpl } continue; } - CalculateAllProductions(result, extra, p.Key, value); + CalculateAllProductions(result, extra, ref sprayedCount, p.Key, value); } } /* END: Item sources calculation */ diff --git a/CheatEnabler/UIConfigWindow.cs b/CheatEnabler/UIConfigWindow.cs index 7142013..934180e 100644 --- a/CheatEnabler/UIConfigWindow.cs +++ b/CheatEnabler/UIConfigWindow.cs @@ -39,6 +39,10 @@ public static class UIConfigWindow 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("Count proliferators used for raws/intermediates and finished products", "Use proliferators for raws/intermediates and finished products", "原料、中间产物以及成品使用增产剂"); + I18N.Add("Count proliferators used for raws/intermediates and finished products tips", + "Following items use extra products: Titanium Alloy, Prism, Frame Material, Proliferator Mk.II, Proliferator Mk.III, Magnetic Coil, Electric Motor, Electromagnetic Turbine, Super-magnetic Ring, Circuit Board, Thruster, Reinforced Thruster, Plasma Exciter, Particle Broadband, Graviton Lens, Quantum Chip, Annihilation Constraint Sphere, Deuteron Fuel Rod, Space Warper, Dyson Sphere Component, Small Carrier Rocket, Electromagnetic Matrix, Structure Matrix, Information Matrix, Gravity Matrix, Universe Matrix\nFollowing items does not use proliferators: Casimir Crystal, Energy Matrix\nOther items use speed up production.", + "以下物品使用额外产出: 钛合金, 棱镜, 框架材料, 增产剂 Mk.II, 增产剂 Mk.III, 磁线圈, 电动机, 电磁涡轮, 超级磁场环, 电路板, 推进器, 加力推进器, 电浆激发器, 粒子宽带, 引力透镜, 量子芯片, 湮灭约束球, 氘核燃料棒, 空间翘曲器, 戴森球组件, 小型运载火箭, 电磁矩阵, 结构矩阵, 信息矩阵, 引力矩阵, 宇宙矩阵\n以下物品不使用增产剂: 卡西米尔晶体, 能量矩阵\n其他物品使用加速生产"); 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", @@ -192,10 +196,13 @@ public static class UIConfigWindow y += 26f; var cb3 = wnd.AddCheckBox(x, y, tab2, FactoryPatch.BeltSignalCountRecipeEnabled, "Count all raws and intermediates in statistics", 13); y += 26f; - var cb4 = wnd.AddCheckBox(x, y, tab2, FactoryPatch.BeltSignalNumberAltFormat, "Belt signal alt format", 13); - x += cb4.Width + 5f; + var cb4 = wnd.AddCheckBox(x, y, tab2, FactoryPatch.BeltSignalUseProliferatorEnabled, "Count proliferators used for raws/intermediates and finished products", 13); y += 6f; - var tip1 = wnd.AddTipsButton2(x, y, tab2, "Belt signal alt format", "Belt signal alt format tips", "belt-signal-alt-format-tips"); + var tip1 = wnd.AddTipsButton2(x + cb4.Width + 5f, y, tab2, "Count proliferators used for raws/intermediates and finished products", "Count proliferators used for raws/intermediates and finished products tips", "count-proliferators-used-for-raws-intermediates-and-finished-products-tips"); + y += 20f; + var cb5 = wnd.AddCheckBox(x, y, tab2, FactoryPatch.BeltSignalNumberAltFormat, "Belt signal alt format", 13); + y += 6f; + var tip2 = wnd.AddTipsButton2(x + cb5.Width + 5f, y, tab2, "Belt signal alt format", "Belt signal alt format tips", "belt-signal-alt-format-tips"); x = 0f; y += 30f; wnd.AddCheckBox(x, y, tab2, FactoryPatch.GreaterPowerUsageInLogisticsEnabled, "Increase maximum power usage in Logistic Stations and Advanced Mining Machines"); @@ -212,7 +219,9 @@ public static class UIConfigWindow cb2.gameObject.SetActive(on); cb3.gameObject.SetActive(on); cb4.gameObject.SetActive(on); + cb5.gameObject.SetActive(on); tip1.gameObject.SetActive(on); + tip2.gameObject.SetActive(on); } } x = 350f; diff --git a/LuaScriptEngine/LuaState.cs b/LuaScriptEngine/LuaState.cs index 6d71a76..0191d85 100644 --- a/LuaScriptEngine/LuaState.cs +++ b/LuaScriptEngine/LuaState.cs @@ -8,7 +8,7 @@ using OBSWebsocketDotNet; namespace LuaScriptEngine; -public class LuaState: IDisposable +public class LuaState : IDisposable { private readonly Lua state = new(); private readonly List PostDataLoadedFuncs = []; diff --git a/UXAssist/Patches/PersistPatch.cs b/UXAssist/Patches/PersistPatch.cs index 53682ef..f3a8702 100644 --- a/UXAssist/Patches/PersistPatch.cs +++ b/UXAssist/Patches/PersistPatch.cs @@ -183,7 +183,8 @@ public class PersistPatch : PatchImpl new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(NeutronStarHandler), nameof(NeutronStarHandler.streamRenderer))), new CodeMatch(OpCodes.Callvirt, AccessTools.PropertyGetter(typeof(Renderer), nameof(Renderer.sharedMaterial))) ).RemoveInstructions(3).InsertAndAdvance( - Transpilers.EmitDelegate(() => { + Transpilers.EmitDelegate(() => + { return Configs.builtin.neutronStarPrefab.streamRenderer.sharedMaterial; }) );