diff --git a/UXAssist/Functions/DysonSphereFunctions.cs b/UXAssist/Functions/DysonSphereFunctions.cs new file mode 100644 index 0000000..45ef590 --- /dev/null +++ b/UXAssist/Functions/DysonSphereFunctions.cs @@ -0,0 +1,44 @@ +namespace UXAssist.Functions; + +public static class DysonSphereFunctions +{ + public static StarData CurrentStarForDysonSystem() + { + StarData star = null; + var dysonEditor = UIRoot.instance?.uiGame?.dysonEditor; + if (dysonEditor != null && dysonEditor.gameObject.activeSelf) + { + star = dysonEditor.selection.viewStar; + } + return star ?? GameMain.data?.localStar; + } + + public static void InitCurrentDysonLayer(StarData star, int index) + { + star ??= CurrentStarForDysonSystem(); + if (star == null) return; + var dysonSpheres = GameMain.data?.dysonSpheres; + if (dysonSpheres == null) return; + if (index < 0) + { + if (dysonSpheres[star.index] == null) return; + var dysonSphere = new DysonSphere(); + dysonSpheres[star.index] = dysonSphere; + dysonSphere.Init(GameMain.data, star); + dysonSphere.ResetNew(); + return; + } + + var ds = dysonSpheres[star.index]; + if (ds?.layersIdBased[index] == null) return; + var pool = ds.rocketPool; + for (var id = ds.rocketCursor - 1; id > 0; id--) + { + if (pool[id].id != id) continue; + if (pool[id].nodeLayerId != index) continue; + ds.RemoveDysonRocket(id); + } + + ds.RemoveLayer(index); + } +} diff --git a/UXAssist/Patches/DysonSpherePatch.cs b/UXAssist/Patches/DysonSpherePatch.cs index 717c56a..40c937e 100644 --- a/UXAssist/Patches/DysonSpherePatch.cs +++ b/UXAssist/Patches/DysonSpherePatch.cs @@ -40,35 +40,6 @@ public class DysonSpherePatch: PatchImpl Enable(false); } - public static void InitCurrentDysonSphere(int index) - { - var star = GameMain.localStar; - if (star == null) return; - var dysonSpheres = GameMain.data?.dysonSpheres; - if (dysonSpheres == null) return; - if (index < 0) - { - if (dysonSpheres[star.index] == null) return; - var dysonSphere = new DysonSphere(); - dysonSpheres[star.index] = dysonSphere; - dysonSphere.Init(GameMain.data, star); - dysonSphere.ResetNew(); - return; - } - - var ds = dysonSpheres[star.index]; - if (ds?.layersIdBased[index] == null) return; - var pool = ds.rocketPool; - for (var id = ds.rocketCursor - 1; id > 0; id--) - { - if (pool[id].id != id) continue; - if (pool[id].nodeLayerId != index) continue; - ds.RemoveDysonRocket(id); - } - - ds.RemoveLayer(index); - } - [HarmonyPrefix] [HarmonyPatch(typeof(DysonSwarm), nameof(DysonSwarm.AutoConstruct))] private static bool DysonSwarm_AutoConstruct_Prefix(DysonSwarm __instance) diff --git a/UXAssist/UIConfigWindow.cs b/UXAssist/UIConfigWindow.cs index d50fed7..087ed25 100644 --- a/UXAssist/UIConfigWindow.cs +++ b/UXAssist/UIConfigWindow.cs @@ -12,6 +12,7 @@ public static class UIConfigWindow { private static RectTransform _windowTrans; private static RectTransform _dysonTab; + private static UIButton _dysonInitBtn; private static readonly UIButton[] DysonLayerBtn = new UIButton[10]; public static void Init() @@ -365,9 +366,9 @@ public static class UIConfigWindow wnd.AddCheckBox(x, y, tab4, DysonSpherePatch.OnlyConstructNodesEnabled, "Construct only structure points but frames"); x = 400f; y = 10f; - wnd.AddButton(x, y, tab4, "Initialize Dyson Sphere", 16, "init-dyson-sphere", () => + _dysonInitBtn = wnd.AddButton(x, y, tab4, "Initialize Dyson Sphere", 16, "init-dyson-sphere", () => UIMessageBox.Show("Initialize Dyson Sphere".Translate(), "Initialize Dyson Sphere Confirm".Translate(), "取消".Translate(), "确定".Translate(), 2, null, - () => { DysonSpherePatch.InitCurrentDysonSphere(-1); }) + () => { DysonSphereFunctions.InitCurrentDysonLayer(null, -1); }) ); y += 36f; wnd.AddText2(x, y, tab4, "Click to dismantle selected layer", 16, "text-dismantle-layer"); @@ -376,8 +377,11 @@ public static class UIConfigWindow { var id = i + 1; var btn = wnd.AddFlatButton(x, y, tab4, id.ToString(), 12, "dismantle-layer-" + id, () => - UIMessageBox.Show("Dismantle selected layer".Translate(), "Dismantle selected layer Confirm".Translate(), "取消".Translate(), "确定".Translate(), 2, null, - () => { DysonSpherePatch.InitCurrentDysonSphere(id); }) + { + var star = DysonSphereFunctions.CurrentStarForDysonSystem(); + UIMessageBox.Show("Dismantle selected layer".Translate(), "Dismantle selected layer Confirm".Translate(), "取消".Translate(), "确定".Translate(), 2, null, + () => { DysonSphereFunctions.InitCurrentDysonLayer(star, id); }); + } ); ((RectTransform)btn.transform).sizeDelta = new Vector2(40f, 20f); DysonLayerBtn[i] = btn; @@ -440,26 +444,22 @@ public static class UIConfigWindow private static void UpdateDysonShells() { if (!_dysonTab.gameObject.activeSelf) return; - var star = GameMain.localStar; - if (star != null) + var star = DysonSphereFunctions.CurrentStarForDysonSystem(); + if (star == null) { - var dysonSpheres = GameMain.data?.dysonSpheres; - if (dysonSpheres?[star.index] != null) + for (var i = 0; i < 10; i++) { - var ds = dysonSpheres[star.index]; - for (var i = 1; i <= 10; i++) - { - var layer = ds.layersIdBased[i]; - DysonLayerBtn[i - 1].button.interactable = layer != null && layer.id == i; - } - - return; + DysonLayerBtn[i].button.interactable = false; } + return; } - - for (var i = 0; i < 10; i++) + var dysonSpheres = GameMain.data?.dysonSpheres; + if (dysonSpheres?[star.index] == null) return; + var ds = dysonSpheres[star.index]; + for (var i = 1; i <= 10; i++) { - DysonLayerBtn[i].button.interactable = false; + var layer = ds.layersIdBased[i]; + DysonLayerBtn[i - 1].button.interactable = layer != null && layer.id == i; } } } \ No newline at end of file