mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2025-12-09 03:33:29 +08:00
UXAssist v1.3.3
This commit is contained in:
@@ -7,7 +7,9 @@
|
||||
+ Starmap filter: Hide top overlaping windows while the filter UI is shown.
|
||||
+ `Auto-config logistic stations`: Can set Max. Charging Power for Battlefield Analysis Base now.
|
||||
+ `Re-initialize planet`: Fix a crash.
|
||||
+ `Auto navigation on sailings`: Do not auto-use Warper if required Tech is not researched.
|
||||
+ `Auto navigation on sailings`:
|
||||
- Add a button to enable/disable `Auto-cruise` quickly.
|
||||
- Do not auto-use Warper if required Tech is not researched.
|
||||
+ `Dismantle blueprint selected buildings`: Fix an issue that belt connected buildings are dismantled unexpectly.
|
||||
+ `Mod manager profile based save folder`: Fix compatibility with [SaveTheWindows](https://thunderstore.io/c/dyson-sphere-program/p/starfi5h/SaveTheWindows/).
|
||||
+ `Enhanced control for logistic storage capacities` & `Allow overflow for Logistic Stations and Advanced Mining Machines`:
|
||||
@@ -307,6 +309,19 @@
|
||||
|
||||
## 更新日志
|
||||
|
||||
* 1.3.3
|
||||
+ 星图过滤器:当过滤器UI显示时隐藏顶部重叠窗口
|
||||
+ `自动配置物流站`:现在可以为战场分析基站设置最大充能功率
|
||||
+ `重新初始化行星`:修复崩溃问题
|
||||
+ `航行时自动导航`:
|
||||
- 添加快速启用/禁用`自动巡航`的按钮
|
||||
- 如果所需科技未研究则不自动使用翘曲器
|
||||
+ `拆除蓝图选中建筑`:修复传送带连接建筑意外被拆除的问题
|
||||
+ `基于mod管理器配置档案的存档文件夹`:修复与[SaveTheWindows](https://thunderstore.io/c/dyson-sphere-program/p/starfi5h/SaveTheWindows/)的兼容性
|
||||
+ `物流存储容量控制改进`和`允许物流站和大型采矿机物品溢出`:
|
||||
- 如果物流存储容量已经超过升级后的最大容量,则在升级`物流运输机容量`时不会按比例提升
|
||||
- 粘贴蓝图时物流存储容量将降低至科技容量限制
|
||||
+ `物流站实时信息面板`:支持修改物流站槽位数的mod
|
||||
* 1.3.2
|
||||
+ 新功能:`在和平模式下隐藏战斗相关科技`
|
||||
+ 新按钮:`使用元数据解锁所有科技`
|
||||
|
||||
@@ -7,7 +7,6 @@ using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public static class UIFunctions
|
||||
@@ -17,13 +16,6 @@ public static class UIFunctions
|
||||
private static bool _configWinInitialized;
|
||||
private static MyConfigWindow _configWin;
|
||||
private static GameObject _buttonOnPlanetGlobe;
|
||||
private static int _cornerComboBoxIndex;
|
||||
private static string[] _starOrderNames;
|
||||
private static bool _starmapFilterInitialized;
|
||||
private static ulong[] _starmapStarFilterValues;
|
||||
private static bool _starFilterEnabled;
|
||||
public static UI.MyCheckButton StarmapFilterToggler;
|
||||
public static bool[] ShowStarName;
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
@@ -35,6 +27,9 @@ public static class UIFunctions
|
||||
canOverride = true
|
||||
});
|
||||
I18N.Add("KEYOpenUXAssistConfigWindow", "[UXA] Open UXAssist Config Window", "[UXA] 打开UX助手设置面板");
|
||||
|
||||
I18N.Add("Enable auto-cruise", "Enable auto-cruise", "启用自动巡航");
|
||||
I18N.Add("Disable auto-cruise", "Disable auto-cruise", "禁用自动巡航");
|
||||
I18N.Add("High yield", "High yield", "高产");
|
||||
I18N.Add("Perfect", "Perfect", "完美");
|
||||
I18N.Add("Union results", "Union results", "结果取并集");
|
||||
@@ -132,6 +127,7 @@ public static class UIFunctions
|
||||
_buttonOnPlanetGlobe.SetActive(true);
|
||||
}
|
||||
}
|
||||
InitToggleAutoCruiseCheckButton();
|
||||
InitStarmapButtons();
|
||||
_initialized = true;
|
||||
}
|
||||
@@ -161,7 +157,51 @@ public static class UIFunctions
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ToggleAutoCruiseCheckButton
|
||||
public static UI.MyCheckButton ToggleAutoCruise;
|
||||
|
||||
public static void InitToggleAutoCruiseCheckButton()
|
||||
{
|
||||
var lowGroup = GameObject.Find("UI Root/Overlay Canvas/In Game/Low Group");
|
||||
ToggleAutoCruise = MyCheckButton.CreateCheckButton(0, 0, lowGroup.GetComponent<RectTransform>(), Patches.PlayerPatch.AutoCruiseEnabled).WithSize(120f, 40f);
|
||||
UpdateToggleAutoCruiseCheckButtonVisiblility();
|
||||
ToggleAutoCruiseChecked();
|
||||
ToggleAutoCruise.OnChecked += ToggleAutoCruiseChecked;
|
||||
var rectTrans = ToggleAutoCruise.rectTrans;
|
||||
rectTrans.anchorMax = new Vector2(0.5f, 0f);
|
||||
rectTrans.anchorMin = new Vector2(0.5f, 0f);
|
||||
rectTrans.pivot = new Vector2(0.5f, 0f);
|
||||
rectTrans.anchoredPosition3D = new Vector3(0f, 185f, 0f);
|
||||
static void ToggleAutoCruiseChecked()
|
||||
{
|
||||
if (ToggleAutoCruise.Checked)
|
||||
{
|
||||
ToggleAutoCruise.SetLabelText("Disable auto-cruise");
|
||||
}
|
||||
else
|
||||
{
|
||||
ToggleAutoCruise.SetLabelText("Enable auto-cruise");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void UpdateToggleAutoCruiseCheckButtonVisiblility()
|
||||
{
|
||||
if (ToggleAutoCruise == null) return;
|
||||
var active = Patches.PlayerPatch.AutoNavigationEnabled.Value && Patches.PlayerPatch.AutoNavigation.IndicatorAstroId > 0;
|
||||
ToggleAutoCruise.gameObject.SetActive(active);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region StarMapButtons
|
||||
private static int _cornerComboBoxIndex;
|
||||
private static string[] _starOrderNames;
|
||||
private static bool _starmapFilterInitialized;
|
||||
private static ulong[] _starmapStarFilterValues;
|
||||
private static bool _starFilterEnabled;
|
||||
public static UI.MyCheckButton StarmapFilterToggler;
|
||||
public static bool[] ShowStarName;
|
||||
|
||||
private static readonly Sprite[] PlanetIcons = [
|
||||
null,
|
||||
null,
|
||||
|
||||
@@ -80,7 +80,12 @@ public class GamePatch : PatchImpl<GamePatch>
|
||||
I18N.Add("Logical frame rate: {0}x", "[UXA] Logical frame rate: {0}x", "[UXA] 逻辑帧速率: {0}x");
|
||||
|
||||
EnableWindowResizeEnabled.SettingChanged += (_, _) => EnableWindowResize.Enable(EnableWindowResizeEnabled.Value);
|
||||
LoadLastWindowRectEnabled.SettingChanged += (_, _) => LoadLastWindowRect.Enable(LoadLastWindowRectEnabled.Value);
|
||||
LoadLastWindowRectEnabled.SettingChanged += (_, _) => {
|
||||
if (LoadLastWindowRectEnabled.Value)
|
||||
{
|
||||
FixLastWindowRect();
|
||||
}
|
||||
};
|
||||
MouseCursorScaleUpMultiplier.SettingChanged += (_, _) =>
|
||||
{
|
||||
MouseCursorScaleUp.NeedReloadCursors = true;
|
||||
@@ -108,8 +113,16 @@ public class GamePatch : PatchImpl<GamePatch>
|
||||
public static void Start()
|
||||
{
|
||||
RefreshSavePath();
|
||||
if (LoadLastWindowRectEnabled.Value)
|
||||
{
|
||||
FixLastWindowRect();
|
||||
var wnd = WindowFunctions.FindGameWindow();
|
||||
if (wnd != IntPtr.Zero)
|
||||
{
|
||||
ThreadingHelper.Instance.StartCoroutine(SetWindowPositionCoroutine(wnd, (int)LastWindowRect.Value.x, (int)LastWindowRect.Value.y));
|
||||
}
|
||||
}
|
||||
EnableWindowResize.Enable(EnableWindowResizeEnabled.Value);
|
||||
LoadLastWindowRect.Enable(LoadLastWindowRectEnabled.Value);
|
||||
MouseCursorScaleUp.NeedReloadCursors = false;
|
||||
MouseCursorScaleUp.Enable(MouseCursorScaleUpMultiplier.Value > 1);
|
||||
// AutoSaveOpt.Enable(AutoSaveOptEnabled.Value);
|
||||
@@ -120,7 +133,6 @@ public class GamePatch : PatchImpl<GamePatch>
|
||||
public static void Uninit()
|
||||
{
|
||||
Enable(false);
|
||||
LoadLastWindowRect.Enable(false);
|
||||
EnableWindowResize.Enable(false);
|
||||
MouseCursorScaleUp.NeedReloadCursors = false;
|
||||
MouseCursorScaleUp.Enable(false);
|
||||
@@ -158,18 +170,145 @@ public class GamePatch : PatchImpl<GamePatch>
|
||||
var gameSaveFolder = GameConfig.gameSaveFolder;
|
||||
if (!Directory.Exists(gameSaveFolder))
|
||||
Directory.CreateDirectory(gameSaveFolder);
|
||||
if (UIRoot.instance.loadGameWindow.active) UIRoot.instance.loadGameWindow.RefreshList();
|
||||
if (UIRoot.instance.saveGameWindow.active) UIRoot.instance.saveGameWindow.RefreshList();
|
||||
if (UIRoot.instance?.loadGameWindow?.active == true) UIRoot.instance.loadGameWindow.RefreshList();
|
||||
if (UIRoot.instance?.saveGameWindow?.active == true) UIRoot.instance.saveGameWindow.RefreshList();
|
||||
}
|
||||
|
||||
[HarmonyPrefix, HarmonyPatch(typeof(GameMain), nameof(GameMain.HandleApplicationQuit))]
|
||||
private static void GameMain_HandleApplicationQuit_Prefix()
|
||||
{
|
||||
if (!LoadLastWindowRectEnabled.Value) return;
|
||||
var wnd = WindowFunctions.FindGameWindow();
|
||||
if (wnd == IntPtr.Zero) return;
|
||||
WinApi.GetWindowRect(wnd, out var rect);
|
||||
LastWindowRect.Value = new Vector4(rect.Left, rect.Top, Screen.width, Screen.height);
|
||||
}
|
||||
private static void FixLastWindowRect()
|
||||
{
|
||||
if (Screen.fullScreenMode is not (FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow))
|
||||
{
|
||||
var rect = LastWindowRect.Value;
|
||||
var x = Mathf.RoundToInt(rect.x);
|
||||
var y = Mathf.RoundToInt(rect.y);
|
||||
var w = Mathf.RoundToInt(rect.z);
|
||||
var h = Mathf.RoundToInt(rect.w);
|
||||
var needFix = false;
|
||||
if (w < 100)
|
||||
{
|
||||
w = 1280;
|
||||
needFix = true;
|
||||
}
|
||||
|
||||
if (h < 100)
|
||||
{
|
||||
h = 720;
|
||||
needFix = true;
|
||||
}
|
||||
|
||||
var rc = new WinApi.Rect { Left = x, Top = y, Right = x + w, Bottom = y + h };
|
||||
if (WinApi.MonitorFromRect(ref rc, 0) == IntPtr.Zero)
|
||||
{
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = 1280;
|
||||
h = 720;
|
||||
needFix = true;
|
||||
}
|
||||
if (needFix)
|
||||
{
|
||||
LastWindowRect.Value = new Vector4(x, y, w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerator SetWindowPositionCoroutine(IntPtr wnd, int x, int y)
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
yield return new WaitForEndOfFrame();
|
||||
WinApi.SetWindowPos(wnd, IntPtr.Zero, x, y, 0, 0, 0x0235);
|
||||
}
|
||||
|
||||
[HarmonyPrefix]
|
||||
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
|
||||
private static void Screen_SetResolution_Prefix(ref int width, ref int height, FullScreenMode fullscreenMode, ref Vector2Int __state)
|
||||
{
|
||||
if (fullscreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow) return;
|
||||
if (GameMain.isRunning)
|
||||
{
|
||||
var wnd = WindowFunctions.FindGameWindow();
|
||||
if (wnd == IntPtr.Zero) return;
|
||||
WinApi.GetWindowRect(wnd, out var rc);
|
||||
__state = new Vector2Int(rc.Left, rc.Top);
|
||||
return;
|
||||
}
|
||||
else if (!LoadLastWindowRectEnabled.Value) return;
|
||||
int x = 0, y = 0, w = 0, h = 0;
|
||||
var rect = LastWindowRect.Value;
|
||||
if (rect is not { z: 0f, w: 0f })
|
||||
{
|
||||
x = Mathf.RoundToInt(rect.x);
|
||||
y = Mathf.RoundToInt(rect.y);
|
||||
w = Mathf.RoundToInt(rect.z);
|
||||
h = Mathf.RoundToInt(rect.w);
|
||||
}
|
||||
width = w;
|
||||
height = h;
|
||||
}
|
||||
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
|
||||
private static void Screen_SetResolution_Postfix(FullScreenMode fullscreenMode, Vector2Int __state)
|
||||
{
|
||||
if (fullscreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow) return;
|
||||
var gameRunning = GameMain.isRunning;
|
||||
if (!LoadLastWindowRectEnabled.Value && !gameRunning) return;
|
||||
var wnd = WindowFunctions.FindGameWindow();
|
||||
if (wnd == IntPtr.Zero) return;
|
||||
int x, y;
|
||||
if (gameRunning)
|
||||
{
|
||||
x = __state.x;
|
||||
y = __state.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
var rect = LastWindowRect.Value;
|
||||
if (rect is { z: 0f, w: 0f }) return;
|
||||
x = Mathf.RoundToInt(rect.x);
|
||||
y = Mathf.RoundToInt(rect.y);
|
||||
}
|
||||
ThreadingHelper.Instance.StartCoroutine(SetWindowPositionCoroutine(wnd, x, y));
|
||||
}
|
||||
|
||||
private static GameOption _gameOption;
|
||||
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPatch(typeof(UIOptionWindow), nameof(UIOptionWindow._OnOpen))]
|
||||
private static void UIOptionWindow__OnOpen_Postfix()
|
||||
{
|
||||
_gameOption = DSPGame.globalOption;
|
||||
}
|
||||
|
||||
[HarmonyTranspiler]
|
||||
[HarmonyPatch(typeof(GameOption), nameof(GameOption.Apply))]
|
||||
private static IEnumerable<CodeInstruction> UIOptionWindow_ApplyOptions_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||
{
|
||||
var matcher = new CodeMatcher(instructions, generator);
|
||||
var label1 = generator.DefineLabel();
|
||||
matcher.MatchForward(false,
|
||||
new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(Screen), nameof(Screen.SetResolution), [typeof(int), typeof(int), typeof(bool), typeof(int)]))
|
||||
).Advance(1).Labels.Add(label1);
|
||||
matcher.Start().Insert(
|
||||
Transpilers.EmitDelegate(() =>
|
||||
_gameOption.fullscreen == DSPGame.globalOption.fullscreen &&
|
||||
_gameOption.resolution.width == DSPGame.globalOption.resolution.width &&
|
||||
_gameOption.resolution.height == DSPGame.globalOption.resolution.height &&
|
||||
_gameOption.resolution.refreshRate == DSPGame.globalOption.resolution.refreshRate
|
||||
),
|
||||
new CodeInstruction(OpCodes.Brtrue, label1)
|
||||
);
|
||||
return matcher.InstructionEnumeration();
|
||||
}
|
||||
|
||||
private class EnableWindowResize : PatchImpl<EnableWindowResize>
|
||||
{
|
||||
@@ -215,135 +354,6 @@ public class GamePatch : PatchImpl<GamePatch>
|
||||
}
|
||||
}
|
||||
|
||||
public class LoadLastWindowRect : PatchImpl<LoadLastWindowRect>
|
||||
{
|
||||
protected override void OnEnable()
|
||||
{
|
||||
if (Screen.fullScreenMode is not (FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow))
|
||||
{
|
||||
var rect = LastWindowRect.Value;
|
||||
var x = Mathf.RoundToInt(rect.x);
|
||||
var y = Mathf.RoundToInt(rect.y);
|
||||
var w = Mathf.RoundToInt(rect.z);
|
||||
var h = Mathf.RoundToInt(rect.w);
|
||||
var needFix = false;
|
||||
if (w < 100)
|
||||
{
|
||||
w = 1280;
|
||||
needFix = true;
|
||||
}
|
||||
|
||||
if (h < 100)
|
||||
{
|
||||
h = 720;
|
||||
needFix = true;
|
||||
}
|
||||
|
||||
var rc = new WinApi.Rect { Left = x, Top = y, Right = x + w, Bottom = y + h };
|
||||
if (WinApi.MonitorFromRect(ref rc, 0) == IntPtr.Zero)
|
||||
{
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = 1280;
|
||||
h = 720;
|
||||
needFix = true;
|
||||
}
|
||||
if (needFix)
|
||||
{
|
||||
LastWindowRect.Value = new Vector4(x, y, w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
//GameLogic.OnDataLoaded -= VFPreload_InvokeOnLoadWorkEnded_Postfix;
|
||||
}
|
||||
|
||||
public static IEnumerator SetWindowPosition(IntPtr wnd, int x, int y)
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
yield return new WaitForEndOfFrame();
|
||||
WinApi.SetWindowPos(wnd, IntPtr.Zero, x, y, 0, 0, 0x0235);
|
||||
}
|
||||
|
||||
[HarmonyPrefix]
|
||||
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
|
||||
private static void Screen_SetResolution_Prefix(ref int width, ref int height, FullScreenMode fullscreenMode, ref Vector2Int __state)
|
||||
{
|
||||
if (fullscreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow) return;
|
||||
int x = 0, y = 0, w = 0, h = 0;
|
||||
var rect = LastWindowRect.Value;
|
||||
if (rect is not { z: 0f, w: 0f })
|
||||
{
|
||||
x = Mathf.RoundToInt(rect.x);
|
||||
y = Mathf.RoundToInt(rect.y);
|
||||
w = Mathf.RoundToInt(rect.z);
|
||||
h = Mathf.RoundToInt(rect.w);
|
||||
}
|
||||
if (GameMain.isRunning)
|
||||
{
|
||||
__state = new Vector2Int(x, y);
|
||||
return;
|
||||
}
|
||||
width = w;
|
||||
height = h;
|
||||
}
|
||||
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
|
||||
private static void Screen_SetResolution_Postfix(FullScreenMode fullscreenMode, Vector2Int __state)
|
||||
{
|
||||
if (fullscreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow) return;
|
||||
var wnd = WindowFunctions.FindGameWindow();
|
||||
if (wnd == IntPtr.Zero) return;
|
||||
int x, y;
|
||||
if (GameMain.isRunning)
|
||||
{
|
||||
x = __state.x;
|
||||
y = __state.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
var rect = LastWindowRect.Value;
|
||||
if (rect is { z: 0f, w: 0f }) return;
|
||||
x = Mathf.RoundToInt(rect.x);
|
||||
y = Mathf.RoundToInt(rect.y);
|
||||
}
|
||||
ThreadingHelper.Instance.StartCoroutine(SetWindowPosition(wnd, x, y));
|
||||
}
|
||||
|
||||
private static GameOption _gameOption;
|
||||
|
||||
[HarmonyPostfix]
|
||||
[HarmonyPatch(typeof(UIOptionWindow), nameof(UIOptionWindow._OnOpen))]
|
||||
private static void UIOptionWindow__OnOpen_Postfix()
|
||||
{
|
||||
_gameOption = DSPGame.globalOption;
|
||||
}
|
||||
|
||||
[HarmonyTranspiler]
|
||||
[HarmonyPatch(typeof(GameOption), nameof(GameOption.Apply))]
|
||||
private static IEnumerable<CodeInstruction> UIOptionWindow_ApplyOptions_Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||
{
|
||||
var matcher = new CodeMatcher(instructions, generator);
|
||||
var label1 = generator.DefineLabel();
|
||||
matcher.MatchForward(false,
|
||||
new CodeMatch(OpCodes.Call, AccessTools.Method(typeof(Screen), nameof(Screen.SetResolution), [typeof(int), typeof(int), typeof(bool), typeof(int)]))
|
||||
).Advance(1).Labels.Add(label1);
|
||||
matcher.Start().Insert(
|
||||
Transpilers.EmitDelegate(() =>
|
||||
_gameOption.fullscreen == DSPGame.globalOption.fullscreen &&
|
||||
_gameOption.resolution.width == DSPGame.globalOption.resolution.width &&
|
||||
_gameOption.resolution.height == DSPGame.globalOption.resolution.height &&
|
||||
_gameOption.resolution.refreshRate == DSPGame.globalOption.resolution.refreshRate
|
||||
),
|
||||
new CodeInstruction(OpCodes.Brtrue, label1)
|
||||
);
|
||||
return matcher.InstructionEnumeration();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
private class AutoSaveOpt: PatchImpl<AutoSaveOpt>
|
||||
{
|
||||
|
||||
@@ -58,6 +58,8 @@ public class PlayerPatch : PatchImpl<PlayerPatch>
|
||||
HideTipsForSandsChangesEnabled.SettingChanged += (_, _) => HideTipsForSandsChanges.Enable(HideTipsForSandsChangesEnabled.Value);
|
||||
ShortcutKeysForStarsNameEnabled.SettingChanged += (_, _) => ShortcutKeysForStarsName.Enable(ShortcutKeysForStarsNameEnabled.Value);
|
||||
AutoNavigationEnabled.SettingChanged += (_, _) => AutoNavigation.Enable(AutoNavigationEnabled.Value);
|
||||
AutoNavigationEnabled.SettingChanged += (_, _) => Functions.UIFunctions.UpdateToggleAutoCruiseCheckButtonVisiblility();
|
||||
AutoCruiseEnabled.SettingChanged += (_, _) => Functions.UIFunctions.UpdateToggleAutoCruiseCheckButtonVisiblility();
|
||||
}
|
||||
|
||||
public static void Start()
|
||||
@@ -334,6 +336,8 @@ public class PlayerPatch : PatchImpl<PlayerPatch>
|
||||
private static bool _speedUp;
|
||||
private static Vector3 _direction;
|
||||
|
||||
public static int IndicatorAstroId => _indicatorAstroId;
|
||||
|
||||
public static void ToggleAutoCruise()
|
||||
{
|
||||
AutoCruiseEnabled.Value = !AutoCruiseEnabled.Value;
|
||||
@@ -361,9 +365,9 @@ public class PlayerPatch : PatchImpl<PlayerPatch>
|
||||
if (navi.indicatorAstroId != _indicatorAstroId)
|
||||
{
|
||||
_indicatorAstroId = navi.indicatorAstroId;
|
||||
if (_indicatorAstroId == 0) return;
|
||||
Functions.UIFunctions.UpdateToggleAutoCruiseCheckButtonVisiblility();
|
||||
}
|
||||
else if (_indicatorAstroId == 0) return;
|
||||
if (_indicatorAstroId == 0) return;
|
||||
switch (controller.movementStateInFrame)
|
||||
{
|
||||
case EMovementState.Walk:
|
||||
|
||||
@@ -5,7 +5,6 @@ using UnityEngine.UI;
|
||||
|
||||
namespace UXAssist.UI;
|
||||
|
||||
// MyCheckButton modified from LSTM: https://github.com/hetima/DSP_LSTM/blob/main/LSTM/MyCheckButton.cs
|
||||
public class MyCheckButton : MonoBehaviour
|
||||
{
|
||||
public RectTransform rectTrans;
|
||||
|
||||
95
UXAssist/UI/MyFlatButton.cs
Normal file
95
UXAssist/UI/MyFlatButton.cs
Normal file
@@ -0,0 +1,95 @@
|
||||
using System;
|
||||
using BepInEx.Configuration;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace UXAssist.UI;
|
||||
|
||||
public class MyFlatButton : MonoBehaviour
|
||||
{
|
||||
public RectTransform rectTrans;
|
||||
public UIButton uiButton;
|
||||
public Text labelText;
|
||||
|
||||
private static GameObject _baseObject;
|
||||
|
||||
public static void InitBaseObject()
|
||||
{
|
||||
if (_baseObject) return;
|
||||
var panel = UIRoot.instance.uiGame.dysonEditor.controlPanel.hierarchy.layerPanel;
|
||||
var go = Instantiate(panel.layerButtons[0].gameObject);
|
||||
var btn = go.GetComponent<UIButton>();
|
||||
btn.gameObject.name = "my-flatbutton";
|
||||
btn.highlighted = false;
|
||||
var img = btn.GetComponent<Image>();
|
||||
if (img != null)
|
||||
{
|
||||
img.sprite = panel.buttonDefaultSprite;
|
||||
img.color = new Color(img.color.r, img.color.g, img.color.b, 13f / 255f);
|
||||
}
|
||||
|
||||
img = btn.gameObject.transform.Find("frame")?.GetComponent<Image>();
|
||||
if (img != null)
|
||||
{
|
||||
img.color = new Color(img.color.r, img.color.g, img.color.b, 0f);
|
||||
}
|
||||
|
||||
btn.button.onClick.RemoveAllListeners();
|
||||
_baseObject = go;
|
||||
}
|
||||
|
||||
public static MyFlatButton CreateFlatButton(float x, float y, RectTransform parent, string label = "", int fontSize = 15, Action<int> onClick = null)
|
||||
{
|
||||
return CreateFlatButton(x, y, parent, fontSize, onClick).WithLabelText(label);
|
||||
}
|
||||
|
||||
public static MyFlatButton CreateFlatButton(float x, float y, RectTransform parent, int fontSize = 15, Action<int> onClick = null)
|
||||
{
|
||||
var go = Instantiate(_baseObject);
|
||||
go.name = "my-flatbutton";
|
||||
go.SetActive(true);
|
||||
var cb = go.AddComponent<MyFlatButton>();
|
||||
var rect = Util.NormalizeRectWithTopLeft(cb, x, y, parent);
|
||||
|
||||
cb.rectTrans = rect;
|
||||
cb.uiButton = go.GetComponent<UIButton>();
|
||||
|
||||
cb.labelText = go.transform.Find("Text")?.GetComponent<Text>();
|
||||
cb.uiButton.onClick += onClick;
|
||||
return cb;
|
||||
}
|
||||
|
||||
public void SetLabelText(string val)
|
||||
{
|
||||
if (labelText != null)
|
||||
{
|
||||
labelText.text = val.Translate();
|
||||
}
|
||||
}
|
||||
|
||||
public MyFlatButton WithLabelText(string val)
|
||||
{
|
||||
SetLabelText(val);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MyFlatButton WithSize(float width, float height)
|
||||
{
|
||||
rectTrans.sizeDelta = new Vector2(width, height);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MyFlatButton WithTip(string tip, float delay = 1f)
|
||||
{
|
||||
uiButton.tips.type = UIButton.ItemTipType.Other;
|
||||
uiButton.tips.topLevel = true;
|
||||
uiButton.tips.tipTitle = tip;
|
||||
uiButton.tips.tipText = null;
|
||||
uiButton.tips.delay = delay;
|
||||
uiButton.tips.corner = 2;
|
||||
uiButton.UpdateTip();
|
||||
return this;
|
||||
}
|
||||
public float Width => rectTrans.sizeDelta.x + labelText.rectTransform.sizeDelta.x;
|
||||
public float Height => Math.Max(rectTrans.sizeDelta.y, labelText.rectTransform.sizeDelta.y);
|
||||
}
|
||||
@@ -194,38 +194,13 @@ public class MyWindow : ManualBehaviour
|
||||
return btn;
|
||||
}
|
||||
|
||||
public UIButton AddFlatButton(float x, float y, RectTransform parent, string text = "", int fontSize = 12, string objName = "button", UnityAction onClick = null)
|
||||
public MyFlatButton AddFlatButton(float x, float y, RectTransform parent, string text = "", int fontSize = 12, string objName = "button", UnityAction onClick = null)
|
||||
{
|
||||
var panel = UIRoot.instance.uiGame.dysonEditor.controlPanel.hierarchy.layerPanel;
|
||||
var btn = Instantiate(panel.layerButtons[0]);
|
||||
var btn = MyFlatButton.CreateFlatButton(x, y, parent, text, fontSize, _ => onClick());
|
||||
btn.gameObject.name = objName;
|
||||
btn.highlighted = false;
|
||||
var img = btn.GetComponent<Image>();
|
||||
if (img != null)
|
||||
{
|
||||
img.sprite = panel.buttonDefaultSprite;
|
||||
img.color = new Color(img.color.r, img.color.g, img.color.b, 13f / 255f);
|
||||
}
|
||||
|
||||
img = btn.gameObject.transform.Find("frame")?.GetComponent<Image>();
|
||||
if (img != null)
|
||||
{
|
||||
img.color = new Color(img.color.r, img.color.g, img.color.b, 0f);
|
||||
}
|
||||
|
||||
var rect = Util.NormalizeRectWithTopLeft(btn, x, y, parent);
|
||||
var t = btn.gameObject.transform.Find("Text")?.GetComponent<Text>();
|
||||
if (t != null)
|
||||
{
|
||||
t.text = text.Translate();
|
||||
t.fontSize = fontSize;
|
||||
}
|
||||
|
||||
btn.button.onClick.RemoveAllListeners();
|
||||
if (onClick != null) btn.button.onClick.AddListener(onClick);
|
||||
|
||||
_maxX = Math.Max(_maxX, x + rect.sizeDelta.x);
|
||||
MaxY = Math.Max(MaxY, y + rect.sizeDelta.y);
|
||||
_maxX = Math.Max(_maxX, x + btn.Width);
|
||||
MaxY = Math.Max(MaxY, y + btn.Height);
|
||||
return btn;
|
||||
}
|
||||
|
||||
@@ -568,6 +543,7 @@ public abstract class MyWindowManager
|
||||
MyCheckBox.InitBaseObject();
|
||||
MyComboBox.InitBaseObject();
|
||||
MyCornerComboBox.InitBaseObject();
|
||||
MyFlatButton.InitBaseObject();
|
||||
}
|
||||
|
||||
public static T CreateWindow<T>(string name, string title = "") where T : MyWindow
|
||||
|
||||
@@ -195,7 +195,7 @@ public static class UIConfigWindow
|
||||
public override string FormatValue(string format, int value)
|
||||
{
|
||||
var sb = new StringBuilder(" ");
|
||||
StringBuilderUtility.WriteKMG(sb, 8, (long)value * 300000L, false);
|
||||
StringBuilderUtility.WriteKMG(sb, 8, value * 300000L, false);
|
||||
sb.Append('W');
|
||||
return sb.ToString().Trim();
|
||||
}
|
||||
@@ -207,7 +207,7 @@ public static class UIConfigWindow
|
||||
public override string FormatValue(string format, int value)
|
||||
{
|
||||
var sb = new StringBuilder(" ");
|
||||
StringBuilderUtility.WriteKMG(sb, 8, (long)value * 300000L, false);
|
||||
StringBuilderUtility.WriteKMG(sb, 8, value * 300000L, false);
|
||||
sb.Append('W');
|
||||
return sb.ToString().Trim();
|
||||
}
|
||||
@@ -219,7 +219,7 @@ public static class UIConfigWindow
|
||||
public override string FormatValue(string format, int value)
|
||||
{
|
||||
var sb = new StringBuilder(" ");
|
||||
StringBuilderUtility.WriteKMG(sb, 8, (long)value * 3000000L, false);
|
||||
StringBuilderUtility.WriteKMG(sb, 8, value * 3000000L, false);
|
||||
sb.Append('W');
|
||||
return sb.ToString().Trim();
|
||||
}
|
||||
@@ -246,7 +246,7 @@ public static class UIConfigWindow
|
||||
public override string FormatValue(string format, int value)
|
||||
{
|
||||
var sb = new StringBuilder(" ");
|
||||
StringBuilderUtility.WriteKMG(sb, 8, (long)value * 15000000L, false);
|
||||
StringBuilderUtility.WriteKMG(sb, 8, value * 15000000L, false);
|
||||
sb.Append('W');
|
||||
return sb.ToString().Trim();
|
||||
}
|
||||
@@ -717,9 +717,8 @@ public static class UIConfigWindow
|
||||
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;
|
||||
).WithSize(40f, 20f);
|
||||
DysonLayerBtn[i] = btn.uiButton;
|
||||
if (i == 4)
|
||||
{
|
||||
x -= 160f;
|
||||
|
||||
Reference in New Issue
Block a user