diff --git a/CheatEnabler/Functions/DysonSphere/GeometryHelpers.cs b/CheatEnabler/Functions/DysonSphere/GeometryHelpers.cs index ea170d0..9085da0 100644 --- a/CheatEnabler/Functions/DysonSphere/GeometryHelpers.cs +++ b/CheatEnabler/Functions/DysonSphere/GeometryHelpers.cs @@ -290,7 +290,7 @@ public static class GeometryHelpers } return vmap.Count; } - public static bool MyGenerateGeometry(this DysonShell shell) + public static bool GenerateCustomShellGeometry(this DysonShell shell) { VectorLF3 sum = VectorLF3.zero; double num = 0.0; @@ -718,7 +718,7 @@ public static class GeometryHelpers shell.nodes.Add(dysonNode); shell.frames.Add(dysonFrame); } - if (!shell.MyGenerateGeometry() || (limit && DysonShell.s_vmap.Count < 32000)) + if (!shell.GenerateCustomShellGeometry() || (limit && DysonShell.s_vmap.Count < 32000)) { CheatEnabler.Logger.LogDebug($"Stripped VertCount: {DysonShell.s_vmap.Count}"); shell.Free(); diff --git a/CheatEnabler/Functions/DysonSphere/IllegalShellFunctions.cs b/CheatEnabler/Functions/DysonSphere/IllegalShellFunctions.cs index 96855f2..74193e5 100644 --- a/CheatEnabler/Functions/DysonSphere/IllegalShellFunctions.cs +++ b/CheatEnabler/Functions/DysonSphere/IllegalShellFunctions.cs @@ -13,14 +13,54 @@ namespace CheatEnabler.Functions.DysonSphere; [ModFeature("IllegalShellFunctions")] public static class IllegalShellFunctions { + private static void EnsureDysonShellMaps() + { + DysonShell.s_vmap ??= new Dictionary(16384); + DysonShell.s_outvmap ??= new Dictionary(16384); + DysonShell.s_ivmap ??= new Dictionary(16384); + } + + private static void ResetLayerPools(DysonSphereLayer layer) + { + layer.nodePool = new DysonNode[64]; + layer.nodeRecycle = new int[64]; + layer.nodeRecycleCursor = 0; + layer.nodeCapacity = 64; + layer.nodeCursor = 1; + layer.framePool = new DysonFrame[64]; + layer.frameRecycle = new int[64]; + layer.frameRecycleCursor = 0; + layer.frameCapacity = 64; + layer.frameCursor = 1; + layer.shellPool = new DysonShell[64]; + layer.shellRecycle = new int[64]; + layer.shellRecycleCursor = 0; + layer.shellCapacity = 64; + layer.shellCursor = 1; + } + + private static void FinalizeDysonSphereChanges(global::DysonSphere sphere, DysonSphereLayer layer, bool notify = false, bool resetRenderMasks = false) + { + if (sphere == null) return; + sphere.CheckAutoNodes(); + if (sphere.autoNodeCount <= 0) sphere.PickAutoNode(); + sphere.modelRenderer.RebuildModels(); + if (notify) GameMain.gameScenario?.NotifyOnPlanDysonShell(); + if (resetRenderMasks) + { + sphere.inEditorRenderMaskS = 0; + sphere.inEditorRenderMaskL = 0; + sphere.inGameRenderMaskS = 0; + sphere.inGameRenderMaskL = 0; + } + } + public static void DuplicateShellsWithHighestProduction() { var resolved = DysonSphereResolver.ResolveEditorOrLocalSphere(); if (resolved == null) return; var (dysonSphere, star) = resolved.Value; - DysonShell.s_vmap ??= new Dictionary(16384); - DysonShell.s_outvmap ??= new Dictionary(16384); - DysonShell.s_ivmap ??= new Dictionary(16384); + EnsureDysonShellMaps(); DysonSphereLayer layer = null; var nodePos = new List(); var isEuler = new List(); @@ -98,17 +138,7 @@ public static class IllegalShellFunctions node.RecalcSpReq(); node.RecalcCpReq(); } - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) - { - dysonSphere.PickAutoNode(); - } - dysonSphere.modelRenderer.RebuildModels(); - GameMain.gameScenario?.NotifyOnPlanDysonShell(); - dysonSphere.inEditorRenderMaskS = 0; - dysonSphere.inEditorRenderMaskL = 0; - dysonSphere.inGameRenderMaskS = 0; - dysonSphere.inGameRenderMaskL = 0; + FinalizeDysonSphereChanges(dysonSphere, layer, true, true); } public static void KeepMaxProductionShells() @@ -213,29 +243,16 @@ public static class IllegalShellFunctions node.RecalcCpReq(); } } - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) - { - dysonSphere.PickAutoNode(); - } - dysonSphere.modelRenderer.RebuildModels(); + FinalizeDysonSphereChanges(dysonSphere, null); } public static void CreateIllegalDysonShellQuickly(int triangleCount) { - var star = DysonSphereResolver.ResolveEditorOrLocalStar(); - if (star == null) return; + var resolved = DysonSphereResolver.ResolveEditorOrLocalSphere(requireLayer: false); + if (resolved == null) return; + var (dysonSphere, _) = resolved.Value; - var dysonSphere = GameMain.data?.dysonSpheres[star.index]; - if (dysonSphere == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } - - DysonShell.s_vmap ??= new Dictionary(16384); - DysonShell.s_outvmap ??= new Dictionary(16384); - DysonShell.s_ivmap ??= new Dictionary(16384); + EnsureDysonShellMaps(); for (int i = 1; i <= 10; i++) { @@ -298,19 +315,14 @@ public static class IllegalShellFunctions node.RecalcSpReq(); node.RecalcCpReq(); } - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode(); - dysonSphere.modelRenderer.RebuildModels(); - GameMain.gameScenario?.NotifyOnPlanDysonShell(); + FinalizeDysonSphereChanges(dysonSphere, layer, true); return; } } private static bool CreateIllegalDysonShellWithMaxOutputForLayer(DysonSphereLayer layer) { - DysonShell.s_vmap ??= new Dictionary(16384); - DysonShell.s_outvmap ??= new Dictionary(16384); - DysonShell.s_ivmap ??= new Dictionary(16384); + EnsureDysonShellMaps(); var shellsChanged = false; var mutex = new object(); var supposedShells = new List(60 * 59 * 58); @@ -370,21 +382,7 @@ public static class IllegalShellFunctions }); if (maxJ >= 0) { - layer.nodePool = new DysonNode[64]; - layer.nodeRecycle = new int[64]; - layer.nodeRecycleCursor = 0; - layer.nodeCapacity = 64; - layer.nodeCursor = 1; - layer.framePool = new DysonFrame[64]; - layer.frameRecycle = new int[64]; - layer.frameRecycleCursor = 0; - layer.frameCapacity = 64; - layer.frameCursor = 1; - layer.shellPool = new DysonShell[64]; - layer.shellRecycle = new int[64]; - layer.shellRecycleCursor = 0; - layer.shellCapacity = 64; - layer.shellCursor = 1; + ResetLayerPools(layer); var sshell = supposedShells[maxJ]; DysonNode[] newNodes = [layer.QuickAddDysonNode(0, sshell.posA), layer.QuickAddDysonNode(0, sshell.posB), layer.QuickAddDysonNode(0, sshell.posC)]; DysonFrame[] newFrames = [layer.QuickAddDysonFrame(0, newNodes[0], newNodes[1], false), layer.QuickAddDysonFrame(0, newNodes[1], newNodes[2], false), layer.QuickAddDysonFrame(0, newNodes[2], newNodes[0], false)]; @@ -401,15 +399,10 @@ public static class IllegalShellFunctions public static void CreateIllegalDysonShellWithMaxOutput() { - var star = DysonSphereResolver.ResolveEditorOrLocalStar(); - if (star == null) return; + var resolved = DysonSphereResolver.ResolveEditorOrLocalSphere(requireLayer: false); + if (resolved == null) return; + var (dysonSphere, star) = resolved.Value; UXAssist.Functions.DysonSphereFunctions.InitCurrentDysonLayer(star, 0); - var dysonSphere = GameMain.data?.dysonSpheres[star.index]; - if (dysonSphere == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } var layer = dysonSphere.layersIdBased[1]; if (layer != null) { @@ -421,42 +414,23 @@ public static class IllegalShellFunctions var shellsChanged = CreateIllegalDysonShellWithMaxOutputForLayer(layer); - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode(); - dysonSphere.modelRenderer.RebuildModels(); - if (shellsChanged) GameMain.gameScenario?.NotifyOnPlanDysonShell(); - dysonSphere.inEditorRenderMaskS = 0; - dysonSphere.inEditorRenderMaskL = 0; - dysonSphere.inGameRenderMaskS = 0; - dysonSphere.inGameRenderMaskL = 0; + FinalizeDysonSphereChanges(dysonSphere, layer, shellsChanged, true); } - public static void CreateIllegalDysonShellWithMaxOutput2() + public static void CreateIllegalDysonShellWithMaxOutputForAllLayers() { - var star = DysonSphereResolver.ResolveEditorOrLocalStar(); - if (star == null) return; - var dysonSphere = GameMain.data?.dysonSpheres[star.index]; - if (dysonSphere == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } + var resolved = DysonSphereResolver.ResolveEditorOrLocalSphere(requireLayer: false); + if (resolved == null) return; + var (dysonSphere, _) = resolved.Value; var shellsChanged = false; - for (int i = dysonSphere.layersSorted.Length - 1; i >= 0; i--) - { + for (int i = dysonSphere.layersSorted.Length - 1; i >= 0; i--) + { var layer = dysonSphere.layersSorted[i]; - if (layer == null) continue; + if (layer == null) continue; shellsChanged = CreateIllegalDysonShellWithMaxOutputForLayer(layer) || shellsChanged; - } + } - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode(); - dysonSphere.modelRenderer.RebuildModels(); - if (shellsChanged) GameMain.gameScenario?.NotifyOnPlanDysonShell(); - dysonSphere.inEditorRenderMaskS = 0; - dysonSphere.inEditorRenderMaskL = 0; - dysonSphere.inGameRenderMaskS = 0; - dysonSphere.inGameRenderMaskL = 0; + FinalizeDysonSphereChanges(dysonSphere, dysonSphere.layersSorted.FirstOrDefault(l => l != null), shellsChanged, true); } public static void CreateIllegalDysonShellsSpecially() @@ -473,31 +447,12 @@ public static class IllegalShellFunctions CheatEnabler.Logger.LogDebug($"Grid Scale: {gridScale} from {r}"); } radiusList.Add(250000); - StarData star = null; - var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor; - if (dysonEditor != null && dysonEditor.gameObject.activeSelf) - { - star = dysonEditor.selection.viewStar; - } - if (star == null) - { - star = GameMain.localStar; - if (star == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } - } + var resolved = DysonSphereResolver.ResolveEditorOrLocalSphere(requireLayer: false); + if (resolved == null) return; + var (dysonSphere, star) = resolved.Value; UXAssist.Functions.DysonSphereFunctions.InitCurrentDysonLayer(star, 0); - var dysonSphere = GameMain.data?.dysonSpheres[star.index]; - if (dysonSphere == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), string.Format("There is no Dyson Sphere data on \"{0}\".".Translate(), star.displayName), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } - DysonShell.s_vmap ??= new Dictionary(16384); - DysonShell.s_outvmap ??= new Dictionary(16384); - DysonShell.s_ivmap ??= new Dictionary(16384); + + EnsureDysonShellMaps(); var shellsChanged = false; var mutex = new object(); @@ -583,21 +538,7 @@ public static class IllegalShellFunctions { continue; } - layer.nodePool = new DysonNode[64]; - layer.nodeRecycle = new int[64]; - layer.nodeRecycleCursor = 0; - layer.nodeCapacity = 64; - layer.nodeCursor = 1; - layer.framePool = new DysonFrame[64]; - layer.frameRecycle = new int[64]; - layer.frameRecycleCursor = 0; - layer.frameCapacity = 64; - layer.frameCursor = 1; - layer.shellPool = new DysonShell[64]; - layer.shellRecycle = new int[64]; - layer.shellRecycleCursor = 0; - layer.shellCapacity = 64; - layer.shellCursor = 1; + ResetLayerPools(layer); DysonNode[] newNodes = [layer.QuickAddDysonNode(0, sshell.posA * orbitRadius), layer.QuickAddDysonNode(0, sshell.posB * orbitRadius), layer.QuickAddDysonNode(0, sshell.posC * orbitRadius)]; DysonFrame[] newFrames = [layer.QuickAddDysonFrame(0, newNodes[0], newNodes[1], false), layer.QuickAddDysonFrame(0, newNodes[1], newNodes[2], false), layer.QuickAddDysonFrame(0, newNodes[2], newNodes[0], false)]; layer.QuickAddDysonShell(0, newNodes, newFrames, false); @@ -611,13 +552,6 @@ public static class IllegalShellFunctions } } - dysonSphere.CheckAutoNodes(); - if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode(); - dysonSphere.modelRenderer.RebuildModels(); - if (shellsChanged) GameMain.gameScenario?.NotifyOnPlanDysonShell(); - dysonSphere.inEditorRenderMaskS = 0; - dysonSphere.inEditorRenderMaskL = 0; - dysonSphere.inGameRenderMaskS = 0; - dysonSphere.inGameRenderMaskL = 0; + FinalizeDysonSphereChanges(dysonSphere, dysonSphere.layersIdBased[2], shellsChanged, true); } } diff --git a/CheatEnabler/Functions/DysonSphereFunctions.cs b/CheatEnabler/Functions/DysonSphereFunctions.cs index ba69d06..2c17894 100644 --- a/CheatEnabler/Functions/DysonSphereFunctions.cs +++ b/CheatEnabler/Functions/DysonSphereFunctions.cs @@ -27,6 +27,6 @@ public static class DysonSphereFunctions public static void KeepMaxProductionShells() => IllegalShellFunctions.KeepMaxProductionShells(); public static void CreateIllegalDysonShellQuickly(int triangleCount) => IllegalShellFunctions.CreateIllegalDysonShellQuickly(triangleCount); public static void CreateIllegalDysonShellWithMaxOutput() => IllegalShellFunctions.CreateIllegalDysonShellWithMaxOutput(); - public static void CreateIllegalDysonShellWithMaxOutput2() => IllegalShellFunctions.CreateIllegalDysonShellWithMaxOutput2(); + public static void CreateIllegalDysonShellWithMaxOutputForAllLayers() => IllegalShellFunctions.CreateIllegalDysonShellWithMaxOutputForAllLayers(); public static void CreateIllegalDysonShellsSpecially() => IllegalShellFunctions.CreateIllegalDysonShellsSpecially(); } diff --git a/CheatEnabler/UIConfigWindow.cs b/CheatEnabler/UIConfigWindow.cs index 666b596..8dfe2f2 100644 --- a/CheatEnabler/UIConfigWindow.cs +++ b/CheatEnabler/UIConfigWindow.cs @@ -323,7 +323,7 @@ public static class UIConfigWindow var btn1 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell 2", 16, "button-generate-illegal-dyson-shells", () => { UIMessageBox.Show("Generate illegal dyson shell 2".Translate(), "WARNING: This operation can be very slow, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null, - () => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutput2(); }); + () => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutputForAllLayers(); }); }); y += 36f; var btn2 = wnd.AddButton(x, y, 300f, tab4, "Keep max production shells and remove others", 16, "button-keep-max-production-shells", () =>