diff --git a/CheatEnabler/Functions/DysonSphereFunctions.cs b/CheatEnabler/Functions/DysonSphereFunctions.cs index b560be3..5306c14 100644 --- a/CheatEnabler/Functions/DysonSphereFunctions.cs +++ b/CheatEnabler/Functions/DysonSphereFunctions.cs @@ -1334,46 +1334,13 @@ public static class DysonSphereFunctions } } - public static void CreateIllegalDysonShellWithMaxOutput() + private static bool CreateIllegalDysonShellWithMaxOutputForLayer(DysonSphereLayer layer) { - StarData star = null; - var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor; - if (dysonEditor != null && dysonEditor.gameObject.activeSelf) - { - star = dysonEditor.selection.viewStar; - } - if (star == null) - { - star = GameMain.data?.localStar; - if (star == null) - { - UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null); - return; - } - } - 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); var shellsChanged = false; var mutex = new object(); - Dictionary<(int, int), int> availableFrames = []; - HashSet unusedFrameIds = []; - var layer = dysonSphere.layersIdBased[1]; - if (layer != null) - { - dysonSphere.RemoveLayer(1); - } - var maxOrbitRadius = Patches.DysonSpherePatch.UnlockMaxOrbitRadiusEnabled.Value ? Patches.DysonSpherePatch.UnlockMaxOrbitRadiusValue.Value : dysonSphere.maxOrbitRadius; - layer = dysonSphere.AddLayerOnId(1, maxOrbitRadius, Quaternion.Euler(0f, 0f, 0f), Mathf.Sqrt(dysonSphere.gravity / maxOrbitRadius) / maxOrbitRadius * 57.2957802f); - if (layer == null) return; - var supposedShells = new List(60 * 59 * 58); Vector3[] nodePos = new Vector3[60]; for (var i = 0; i < 60; i++) @@ -1397,7 +1364,7 @@ public static class DysonSphereFunctions var maxJ = -1; var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 }; - var gridScale = (int)(Math.Pow(maxOrbitRadius / 4000.0, 0.75) + 0.5); + var gridScale = (int)(Math.Pow(layer.orbitRadius / 4000.0, 0.75) + 0.5); gridScale = (gridScale < 1) ? 1 : gridScale; var cpPerVertex = gridScale * gridScale * 2; var barrier = 0x7FFFFFFF / cpPerVertex; @@ -1457,6 +1424,85 @@ public static class DysonSphereFunctions } shellsChanged = true; } + return shellsChanged; + } + + public static void CreateIllegalDysonShellWithMaxOutput() + { + StarData star = null; + var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor; + if (dysonEditor != null && dysonEditor.gameObject.activeSelf) + { + star = dysonEditor.selection.viewStar; + } + if (star == null) + { + star = GameMain.data?.localStar; + if (star == null) + { + UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, null); + return; + } + } + 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) + { + dysonSphere.RemoveLayer(1); + } + var maxOrbitRadius = Patches.DysonSpherePatch.UnlockMaxOrbitRadiusEnabled.Value ? Patches.DysonSpherePatch.UnlockMaxOrbitRadiusValue.Value : dysonSphere.maxOrbitRadius; + layer = dysonSphere.AddLayerOnId(1, maxOrbitRadius, Quaternion.Euler(0f, 0f, 0f), Mathf.Sqrt(dysonSphere.gravity / maxOrbitRadius) / maxOrbitRadius * 57.2957802f); + if (layer == null) return; + + 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; + } + + public static void CreateIllegalDysonShellWithMaxOutput2() + { + StarData star = null; + var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor; + if (dysonEditor != null && dysonEditor.gameObject.activeSelf) + { + star = dysonEditor.selection.viewStar; + } + if (star == null) + { + star = GameMain.data?.localStar; + if (star == null) + { + UIMessageBox.Show("CheatEnabler".Translate(), "You are not in any system.".Translate(), "确定".Translate(), UIMessageBox.ERROR, 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 shellsChanged = false; + for (int i = dysonSphere.layersSorted.Length - 1; i >= 0; i--) + { + var layer = dysonSphere.layersSorted[i]; + if (layer == null) continue; + shellsChanged = CreateIllegalDysonShellWithMaxOutputForLayer(layer) || shellsChanged; + } dysonSphere.CheckAutoNodes(); if (dysonSphere.autoNodeCount <= 0) dysonSphere.PickAutoNode(); diff --git a/CheatEnabler/UIConfigWindow.cs b/CheatEnabler/UIConfigWindow.cs index 240b416..3d6d1ca 100644 --- a/CheatEnabler/UIConfigWindow.cs +++ b/CheatEnabler/UIConfigWindow.cs @@ -74,6 +74,7 @@ public static class UIConfigWindow I18N.Add("Complete Dyson Sphere shells instantly", "Complete Dyson Sphere shells instantly", "立即完成戴森壳建造"); I18N.Add("Remove all frames on Dyson Sphere", "Remove all frames on Dyson Sphere", "移除戴森球上的所有框架"); I18N.Add("Generate illegal dyson shell", "Generate an illegal dyson shell (!!1st shell layer will be replaced!!)", "生成单层仙术戴森壳(!!会先删除第一层戴森壳!!)"); + I18N.Add("Generate illegal dyson shell 2", "Generate illegal dyson shells for all layers without nodes and shells", "为所有没有节点和壳的层级生成仙术戴森壳"); I18N.Add("Keep max production shells and remove others", "Keep max production shells and remove others", "保留发电量最高的戴森壳并移除其他戴森壳"); I18N.Add("Duplicate shells from that with highest production", "Duplicate shells from that with highest production", "从发电量最高的壳复制戴森壳"); I18N.Add("Generate illegal dyson shell quickly", "Generate illegal dyson shell quickly", "快速生成仙术戴森壳"); @@ -316,12 +317,18 @@ public static class UIConfigWindow { y += 72f; var originalY = y; - var btn1 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell", 16, "button-generate-illegal-dyson-shells", () => + var btn0 = wnd.AddButton(x, y, 300f, tab4, "Generate illegal dyson shell", 16, "button-generate-illegal-dyson-shells", () => { UIMessageBox.Show("Generate illegal dyson shell".Translate(), "WARNING: This operation can be very slow, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null, () => { DysonSphereFunctions.CreateIllegalDysonShellWithMaxOutput(); }); }); y += 36f; + 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(); }); + }); + y += 36f; var btn2 = wnd.AddButton(x, y, 300f, tab4, "Keep max production shells and remove others", 16, "button-keep-max-production-shells", () => { UIMessageBox.Show("Keep max production shells and remove others".Translate(), "WARNING: This operation is DANGEROUS, continue?".Translate(), "取消".Translate(), "确定".Translate(), UIMessageBox.WARNING, null, @@ -352,6 +359,7 @@ public static class UIConfigWindow void onIllegalDysonShellFunctionsChanged(object o, EventArgs e) { var enabled = Functions.DysonSphereFunctions.IllegalDysonShellFunctionsEnabled.Value; + btn0.gameObject.SetActive(enabled); btn1.gameObject.SetActive(enabled); btn2.gameObject.SetActive(enabled); btn3.gameObject.SetActive(enabled);