From 68a18c113d5c5bf850f06b0077ee6979de7230bf Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Thu, 24 Apr 2025 17:25:47 +0800 Subject: [PATCH] work in progress --- UXAssist/Functions/UIFunctions.cs | 443 ++++++++++++++++---------- UXAssist/Functions/WindowFunctions.cs | 62 ++-- UXAssist/Patches/GamePatch.cs | 10 +- UXAssist/UI/MyCheckButton.cs | 37 +-- UXAssist/UXAssist.csproj | 15 + UXAssist/assets/planet_icon/07.png | Bin 0 -> 1683 bytes UXAssist/assets/planet_icon/09.png | Bin 0 -> 1612 bytes UXAssist/assets/planet_icon/10.png | Bin 0 -> 1722 bytes UXAssist/assets/planet_icon/13.png | Bin 0 -> 1758 bytes UXAssist/assets/planet_icon/14.png | Bin 0 -> 1670 bytes UXAssist/assets/planet_icon/15.png | Bin 0 -> 1760 bytes UXAssist/assets/planet_icon/16.png | Bin 0 -> 1603 bytes UXAssist/assets/planet_icon/17.png | Bin 0 -> 1809 bytes UXAssist/assets/planet_icon/18.png | Bin 0 -> 1788 bytes UXAssist/assets/planet_icon/19.png | Bin 0 -> 1738 bytes UXAssist/assets/planet_icon/21.png | Bin 0 -> 1737 bytes UXAssist/assets/planet_icon/22.png | Bin 0 -> 1853 bytes UXAssist/assets/planet_icon/23.png | Bin 0 -> 1714 bytes UXAssist/assets/planet_icon/24.png | Bin 0 -> 2016 bytes UXAssist/assets/planet_icon/25.png | Bin 0 -> 1833 bytes 20 files changed, 339 insertions(+), 228 deletions(-) create mode 100644 UXAssist/assets/planet_icon/07.png create mode 100644 UXAssist/assets/planet_icon/09.png create mode 100644 UXAssist/assets/planet_icon/10.png create mode 100644 UXAssist/assets/planet_icon/13.png create mode 100644 UXAssist/assets/planet_icon/14.png create mode 100644 UXAssist/assets/planet_icon/15.png create mode 100644 UXAssist/assets/planet_icon/16.png create mode 100644 UXAssist/assets/planet_icon/17.png create mode 100644 UXAssist/assets/planet_icon/18.png create mode 100644 UXAssist/assets/planet_icon/19.png create mode 100644 UXAssist/assets/planet_icon/21.png create mode 100644 UXAssist/assets/planet_icon/22.png create mode 100644 UXAssist/assets/planet_icon/23.png create mode 100644 UXAssist/assets/planet_icon/24.png create mode 100644 UXAssist/assets/planet_icon/25.png diff --git a/UXAssist/Functions/UIFunctions.cs b/UXAssist/Functions/UIFunctions.cs index aaf4686..57a288a 100644 --- a/UXAssist/Functions/UIFunctions.cs +++ b/UXAssist/Functions/UIFunctions.cs @@ -7,7 +7,7 @@ using UnityEngine; using UnityEngine.UI; using System; using System.Linq; -using System.Collections.Generic; +using System.Threading; public static class UIFunctions { @@ -19,6 +19,7 @@ public static class UIFunctions private static int _cornerComboBoxIndex; private static string[] _starOrderNames; private static bool _starmapFilterInitialized; + private static ulong[] _starmapStarFilterValues; private static bool _starFilterEnabled; private static UI.MyCheckButton _starmapFilterToggler; public static bool[] ShowStarName; @@ -34,82 +35,16 @@ public static class UIFunctions }); I18N.Add("KEYOpenUXAssistConfigWindow", "[UXA] Open UXAssist Config Window", "[UXA] 打开UX助手设置面板"); I18N.OnInitialized += RecreateConfigWindow; - GameLogic.OnGameBegin += () => - { - var galaxy = GameMain.data.galaxy; - ShowStarName = new bool[galaxy.starCount]; - _starOrderNames = new string[galaxy.starCount]; - StarData[] stars = [.. galaxy.stars.Where(star => star != null)]; - Array.Sort(stars, (a, b) => - { - int res = a.position.sqrMagnitude.CompareTo(b.position.sqrMagnitude); - if (res != 0) return res; - return a.index.CompareTo(b.index); - }); - for (int i = 0; i < stars.Length; i++) - { - var star = stars[i]; - _starOrderNames[star.index] = star.displayName; - } - int[] spectrCount = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - for (int i = 0; i < stars.Length; i++) - { - var star = stars[i]; - var index = star.index; - switch (star.type) - { - case EStarType.MainSeqStar: - switch (star.spectr) - { - case ESpectrType.M: - _starOrderNames[index] = String.Format("M{0}", ++spectrCount[0]); - break; - case ESpectrType.K: - _starOrderNames[index] = String.Format("K{0}", ++spectrCount[1]); - break; - case ESpectrType.G: - _starOrderNames[index] = String.Format("G{0}", ++spectrCount[2]); - break; - case ESpectrType.F: - _starOrderNames[index] = String.Format("F{0}", ++spectrCount[3]); - break; - case ESpectrType.A: - _starOrderNames[index] = String.Format("A{0}", ++spectrCount[4]); - break; - case ESpectrType.B: - _starOrderNames[index] = String.Format("B{0}", ++spectrCount[5]); - break; - case ESpectrType.O: - _starOrderNames[index] = String.Format("O{0}", ++spectrCount[6]); - break; - } - break; - case EStarType.GiantStar: - _starOrderNames[index] = String.Format("GS{0}", ++spectrCount[7]); - break; - case EStarType.WhiteDwarf: - _starOrderNames[index] = String.Format("WD{0}", ++spectrCount[8]); - break; - case EStarType.NeutronStar: - _starOrderNames[index] = String.Format("NS{0}", ++spectrCount[9]); - break; - case EStarType.BlackHole: - _starOrderNames[index] = String.Format("BH{0}", ++spectrCount[10]); - break; - } - } - }; - GameLogic.OnGameEnd += () => - { - _starOrderNames = null; - ShowStarName = null; - }; } public static void OnUpdate() { if (!_starmapFilterInitialized || _starmapFilterToggler == null || _starmapFilterToggler.gameObject.activeSelf) return; - if (PlanetModelingManager.scnPlanetReqList.Count == 0) _starmapFilterToggler.gameObject.SetActive(true); + if (PlanetModelingManager.scnPlanetReqList.Count == 0) + { + StarmapUpdateFilterValues(); + _starmapFilterToggler.gameObject.SetActive(true); + } } public static void OnInputUpdate() @@ -139,6 +74,23 @@ public static class UIFunctions } } + private static readonly Sprite[] PlanetIcons = [ + Common.Util.LoadEmbeddedSprite("assets/planet_icon/07.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/09.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/10.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/13.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/14.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/15.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/16.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/17.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/18.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/19.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/21.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/22.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/23.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/24.png"), + Common.Util.LoadEmbeddedSprite("assets/planet_icon/25.png") + ]; public static void InitMenuButtons() { if (_initialized) return; @@ -205,20 +157,28 @@ public static class UIFunctions { Functions.UIFunctions.CornerComboBoxIndex = index; }; - _starmapFilterToggler = UI.MyCheckButton.CreateCheckButton(20, 0, rtrans, false, ">>").WithSize(20, 20); + _starmapFilterToggler = UI.MyCheckButton.CreateCheckButton(10, 0, rtrans, false, ">>").WithSize(24, 24); MyCheckButton[] buttons = [ - UI.MyCheckButton.CreateCheckButton(40, 0, rtrans, false).WithIcon().WithSize(20, 20), // Kimberlite - UI.MyCheckButton.CreateCheckButton(60, 0, rtrans, false).WithIcon().WithSize(20, 20), // Fractal Silicon - UI.MyCheckButton.CreateCheckButton(80, 0, rtrans, false).WithIcon().WithSize(20, 20), // Organic Crystal - UI.MyCheckButton.CreateCheckButton(100, 0, rtrans, false).WithIcon().WithSize(20, 20), // Grating Crystal - UI.MyCheckButton.CreateCheckButton(120, 0, rtrans, false).WithIcon().WithSize(20, 20), // Stalagmite Crystal - UI.MyCheckButton.CreateCheckButton(140, 0, rtrans, false).WithIcon().WithSize(20, 20), // Unipolar Magnet - UI.MyCheckButton.CreateCheckButton(160, 0, rtrans, false).WithIcon().WithSize(20, 20), // Crude Oil - UI.MyCheckButton.CreateCheckButton(180, 0, rtrans, false).WithIcon().WithSize(20, 20), // Fire Ice - UI.MyCheckButton.CreateCheckButton(200, 0, rtrans, false).WithIcon().WithSize(20, 20), // Sulfuric Acid - UI.MyCheckButton.CreateCheckButton(220, 0, rtrans, false).WithIcon().WithSize(20, 20), // Water - UI.MyCheckButton.CreateCheckButton(240, 0, rtrans, false).WithIcon().WithSize(20, 20), // Hydrogen - UI.MyCheckButton.CreateCheckButton(260, 0, rtrans, false).WithIcon().WithSize(20, 20), // Deuterium + UI.MyCheckButton.CreateCheckButton(34, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Kimberlite + UI.MyCheckButton.CreateCheckButton(58, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Fractal Silicon + UI.MyCheckButton.CreateCheckButton(82, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Organic Crystal + UI.MyCheckButton.CreateCheckButton(106, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Grating Crystal + UI.MyCheckButton.CreateCheckButton(130, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Stalagmite Crystal + UI.MyCheckButton.CreateCheckButton(154, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Unipolar Magnet + UI.MyCheckButton.CreateCheckButton(178, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Crude Oil + UI.MyCheckButton.CreateCheckButton(202, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Fire Ice + UI.MyCheckButton.CreateCheckButton(226, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Sulfuric Acid + UI.MyCheckButton.CreateCheckButton(250, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Water + UI.MyCheckButton.CreateCheckButton(274, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Hydrogen + UI.MyCheckButton.CreateCheckButton(298, 0, rtrans, false).WithIcon().WithSize(24, 24).WithIconWidth(24), // Deuterium + + UI.MyCheckButton.CreateCheckButton(34, 24, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 48, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 72, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 96, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 120, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 144, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), + UI.MyCheckButton.CreateCheckButton(34, 168, rtrans, false).WithIcon().WithSize(120, 24).WithIconWidth(24), ]; _starmapFilterToggler.OnChecked += UpdateButtons; foreach (var button in buttons) @@ -246,15 +206,118 @@ public static class UIFunctions buttons[10].WithTip(itemProto.Name).SetIcon(itemProto.iconSprite); itemProto = LDB.items.Select(1121); buttons[11].WithTip(itemProto.Name).SetIcon(itemProto.iconSprite); + + // [ 0] = 07.png + // [ 1] = 09.png + // [ 2] = 10.png + // [ 3] = 13.png + // [ 4] = 14.png + // [ 5] = 15.png + // [ 6] = 16.png + // [ 7] = 17.png + // [ 8] = 18.png + // [ 9] = 19.png + // [10] = 21.png + // [11] = 22.png + // [12] = 23.png + // [13] = 24.png + // [14] = 25.png + + var themeProto = LDB.themes.Select(16); + buttons[12].SetLabelText(themeProto.DisplayName); + buttons[12].SetIcon(PlanetIcons[6]); + themeProto = LDB.themes.Select(23); + buttons[13].SetLabelText(themeProto.DisplayName); + buttons[13].SetIcon(PlanetIcons[12]); + themeProto = LDB.themes.Select(10); + buttons[14].SetLabelText(themeProto.DisplayName); + buttons[14].SetIcon(PlanetIcons[2]); + themeProto = LDB.themes.Select(15); + buttons[15].SetLabelText(themeProto.DisplayName); + buttons[15].SetIcon(PlanetIcons[5]); + themeProto = LDB.themes.Select(18); + buttons[16].SetLabelText(themeProto.DisplayName); + buttons[16].SetIcon(PlanetIcons[8]); + themeProto = LDB.themes.Select(22); + buttons[17].SetLabelText(themeProto.DisplayName); + buttons[17].SetIcon(PlanetIcons[11]); + themeProto = LDB.themes.Select(25); + buttons[18].SetLabelText(themeProto.DisplayName); + buttons[18].SetIcon(PlanetIcons[14]); }; + GameLogic.OnGameBegin += () => { if (DSPGame.IsMenuDemo) return; + + var galaxy = GameMain.data.galaxy; + ShowStarName = new bool[galaxy.starCount]; + _starOrderNames = new string[galaxy.starCount]; + _starmapStarFilterValues = new ulong[galaxy.starCount]; + StarData[] stars = [.. galaxy.stars.Where(star => star != null)]; + Array.Sort(stars, (a, b) => + { + int res = a.position.sqrMagnitude.CompareTo(b.position.sqrMagnitude); + if (res != 0) return res; + return a.index.CompareTo(b.index); + }); + for (int i = 0; i < stars.Length; i++) + { + var star = stars[i]; + _starOrderNames[star.index] = star.displayName; + } + int[] spectrCount = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (int i = 0; i < stars.Length; i++) + { + var star = stars[i]; + var index = star.index; + switch (star.type) + { + case EStarType.MainSeqStar: + switch (star.spectr) + { + case ESpectrType.M: + _starOrderNames[index] = String.Format("M{0}", ++spectrCount[0]); + break; + case ESpectrType.K: + _starOrderNames[index] = String.Format("K{0}", ++spectrCount[1]); + break; + case ESpectrType.G: + _starOrderNames[index] = String.Format("G{0}", ++spectrCount[2]); + break; + case ESpectrType.F: + _starOrderNames[index] = String.Format("F{0}", ++spectrCount[3]); + break; + case ESpectrType.A: + _starOrderNames[index] = String.Format("A{0}", ++spectrCount[4]); + break; + case ESpectrType.B: + _starOrderNames[index] = String.Format("B{0}", ++spectrCount[5]); + break; + case ESpectrType.O: + _starOrderNames[index] = String.Format("O{0}", ++spectrCount[6]); + break; + } + break; + case EStarType.GiantStar: + _starOrderNames[index] = String.Format("GS{0}", ++spectrCount[7]); + break; + case EStarType.WhiteDwarf: + _starOrderNames[index] = String.Format("WD{0}", ++spectrCount[8]); + break; + case EStarType.NeutronStar: + _starOrderNames[index] = String.Format("NS{0}", ++spectrCount[9]); + break; + case EStarType.BlackHole: + _starOrderNames[index] = String.Format("BH{0}", ++spectrCount[10]); + break; + } + } _starmapFilterToggler.gameObject.SetActive(false); _starmapFilterToggler.Checked = false; UpdateButtons(); SetStarFilterEnabled(false); - foreach (var star in GameMain.data.galaxy.stars) + foreach (var star in galaxy.stars) { if (star != null) PlanetModelingManager.RequestScanStar(star); } @@ -262,6 +325,9 @@ public static class UIFunctions }; GameLogic.OnGameEnd += () => { + _starOrderNames = null; + ShowStarName = null; + _starmapStarFilterValues = null; _starmapFilterInitialized = false; }; void UpdateButtons() @@ -285,50 +351,70 @@ public static class UIFunctions } void UpdateStarmapStarFilters() { - List<(int, int)> filters = []; - bool showAny = false; + var filterValue = 0UL; if (_starmapFilterToggler.Checked) { for (int i = 0; i < 6; i++) { if (buttons[i].Checked) { - filters.Add((i + 9, 0)); - showAny = true; + filterValue |= 1UL << (i + 9); } } if (buttons[6].Checked) { - filters.Add((7, 0)); - showAny = true; + filterValue |= 1UL << 7; } if (buttons[7].Checked) { - filters.Add((8, 1011)); - showAny = true; + filterValue |= 1UL << 8; } if (buttons[8].Checked) { - filters.Add((0, 1116)); - showAny = true; + filterValue |= 1UL << 22; } if (buttons[9].Checked) { - filters.Add((0, 1000)); - showAny = true; + filterValue |= 1UL << 23; } if (buttons[10].Checked) { - filters.Add((0, 1120)); - showAny = true; + filterValue |= 1UL << 20; } if (buttons[11].Checked) { - filters.Add((0, 1121)); - showAny = true; + filterValue |= 1UL << 21; + } + if (buttons[12].Checked) + { + filterValue |= 1UL << (30 + 16); + } + if (buttons[13].Checked) + { + filterValue |= 1UL << (30 + 23); + } + if (buttons[14].Checked) + { + filterValue |= 1UL << (30 + 10); + } + if (buttons[15].Checked) + { + filterValue |= 1UL << (30 + 15); + } + if (buttons[16].Checked) + { + filterValue |= 1UL << (30 + 18); + } + if (buttons[17].Checked) + { + filterValue |= 1UL << (30 + 22); + } + if (buttons[18].Checked) + { + filterValue |= 1UL << (30 + 25); } } - if (!showAny) + if (filterValue == 0UL) { for (int i = 0; i < ShowStarName.Length; i++) { @@ -337,69 +423,9 @@ public static class UIFunctions SetStarFilterEnabled(false); return; } - var galaxy = GameMain.data.galaxy; - var stars = galaxy.stars; - for (int i = 0; i < galaxy.starCount; i++) + for (int i = _starmapStarFilterValues.Length - 1; i >= 0; i--) { - var star = stars[i]; - if (star == null) continue; - ShowStarName[i] = false; - var allMatch = true; - foreach (var filter in filters) - { - var match = false; - foreach (var planet in star.planets) - { - if (planet == null) continue; - if (planet.type == EPlanetType.Gas) - { - if (filter.Item2 != 0) - { - foreach (var n in planet.gasItems) - { - if (n == filter.Item2) - { - match = true; - break; - } - } - if (match) break; - } - } - else - { - if (filter.Item2 != 0) - { - if (planet.waterItemId == filter.Item2) - { - match = true; - break; - } - } - if (filter.Item1 != 0) - { - foreach (var group in planet.veinGroups) - { - if (group.amount > 0 && (int)group.type == filter.Item1) - { - match = true; - break; - } - } - if (match) break; - } - } - } - if (!match) - { - allMatch = false; - break; - } - } - if (allMatch) - { - ShowStarName[i] = true; - } + ShowStarName[i] = (_starmapStarFilterValues[i] & filterValue) == filterValue; } SetStarFilterEnabled(true); } @@ -407,6 +433,93 @@ public static class UIFunctions _initialized = true; } + private static void StarmapUpdateFilterValues() + { + var galaxy = GameMain.data.galaxy; + var stars = galaxy.stars; + for (int i = 0; i < galaxy.starCount; i++) + { + var star = stars[i]; + if (star == null) continue; + var value = 0UL; + foreach (var planet in star.planets) + { + if (planet == null) continue; + while (planet.scanning) + { + Thread.Sleep(50); + } + var planetValue = 0UL; + if (planet.type == EPlanetType.Gas) + { + foreach (var n in planet.gasItems) + { + switch (n) + { + case 1011: + planetValue |= 1UL << 8; + break; + case 1120: + planetValue |= 1UL << 20; + break; + case 1121: + planetValue |= 1UL << 21; + break; + } + } + } + else + { + foreach (var group in planet.veinGroups) + { + if (group.amount > 0) + { + planetValue |= 1UL << (int)group.type; + } + } + switch (planet.waterItemId) + { + case 1116: + planetValue |= 1UL << 22; + break; + case 1000: + planetValue |= 1UL << 23; + break; + } + } + if ((value & (1UL << (30 + planet.theme))) == 0) + { + switch (planet.theme) + { + case 7: case 9: case 13: case 17: case 19: case 24: + { + const ulong needed = 0x7EUL; + if ((planetValue & needed) == needed) + { + value |= 1UL << (30 + planet.theme); + } + break; + } + case 14: + { + const ulong needed = 0x2200UL; + if ((planetValue & needed) == needed) + { + value |= 1UL << (30 + planet.theme); + } + break; + } + case 10: case 15: case 16: case 18: case 21: case 22: case 23: case 25: + value |= 1UL << (30 + planet.theme); + break; + } + } + value |= planetValue; + } + _starmapStarFilterValues[i] = value; + } + } + public static void RecreateConfigWindow() { if (!_configWinInitialized) return; diff --git a/UXAssist/Functions/WindowFunctions.cs b/UXAssist/Functions/WindowFunctions.cs index 18170f1..5899467 100644 --- a/UXAssist/Functions/WindowFunctions.cs +++ b/UXAssist/Functions/WindowFunctions.cs @@ -18,7 +18,6 @@ public static class WindowFunctions private static IntPtr _oldWndProc = IntPtr.Zero; private static IntPtr _gameWindowHandle = IntPtr.Zero; - private static bool _gameLoaded; public static WinApi.LogicalProcessorDetails ProcessorDetails { get; private set; } public static ConfigEntry ProcessPriority; @@ -48,7 +47,6 @@ public static class WindowFunctions public static void Start() { - GameLogic.OnDataLoaded += OnDataLoaded; var wndProc = new WinApi.WndProc(GameWndProc); var gameWnd = FindGameWindow(); if (gameWnd != IntPtr.Zero) @@ -65,7 +63,7 @@ public static class WindowFunctions UpdateAffinity(); return; - void UpdateAffinity() + static void UpdateAffinity() { var process = WinApi.GetCurrentProcess(); if (!WinApi.GetProcessAffinityMask(process, out _, out var systemMask)) @@ -94,16 +92,6 @@ public static class WindowFunctions } } - public static void Uninit() - { - GameLogic.OnDataLoaded -= OnDataLoaded; - } - - private static void OnDataLoaded() - { - _gameLoaded = true; - } - private static IntPtr GameWndProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam) { switch (uMsg) @@ -122,13 +110,13 @@ public static class WindowFunctions switch ((long)wParam & 0xFFF0L) { case WinApi.SC_MOVE: - if (GamePatch.LoadLastWindowRectEnabled.Value && !_gameLoaded) return (IntPtr)1L; + if (GamePatch.LoadLastWindowRectEnabled.Value && !GameMain.isRunning) return (IntPtr)1L; break; } break; case WinApi.WM_MOVING: - if (!GamePatch.LoadLastWindowRectEnabled.Value || _gameLoaded) break; + if (!GamePatch.LoadLastWindowRectEnabled.Value || GameMain.isRunning) break; var rect = GamePatch.LastWindowRect.Value; if (rect is { z: 0f, w: 0f }) break; var x = Mathf.RoundToInt(rect.x); @@ -137,9 +125,9 @@ public static class WindowFunctions rect2.Left = x; rect2.Top = y; Marshal.StructureToPtr(rect2, lParam, false); - break; + return (IntPtr)1L; case WinApi.WM_SIZING: - if (!GamePatch.LoadLastWindowRectEnabled.Value || _gameLoaded) break; + if (!GamePatch.LoadLastWindowRectEnabled.Value || Screen.fullScreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow || GameMain.isRunning) break; rect = GamePatch.LastWindowRect.Value; if (rect is { z: 0f, w: 0f }) break; x = Mathf.RoundToInt(rect.x); @@ -152,7 +140,7 @@ public static class WindowFunctions rect2.Right = x + w; rect2.Bottom = y + h; Marshal.StructureToPtr(rect2, lParam, false); - break; + return (IntPtr)1L; } return WinApi.CallWindowProc(_oldWndProc, hWnd, uMsg, wParam, lParam); @@ -219,24 +207,32 @@ public static class WindowFunctions { // Get profile name from command line arguments, and set window title accordingly var args = Environment.GetCommandLineArgs(); - for (var i = 0; i < args.Length - 1; i++) + for (var i = args.Length - 2; i >= 0; i--) { - // Doorstop 3.x and 4.x use different arguments to pass the target assembly path - if (args[i] != "--doorstop-target" && args[i] != "--doorstop-target-assembly") continue; - var arg = args[i + 1]; - const string doorstopPathSuffix = @"\BepInEx\core\BepInEx.Preloader.dll"; - if (!arg.EndsWith(doorstopPathSuffix, StringComparison.OrdinalIgnoreCase)) - break; - arg = arg.Substring(0, arg.Length - doorstopPathSuffix.Length); - const string profileSuffix = @"\profiles\"; - var index = arg.LastIndexOf(profileSuffix, StringComparison.OrdinalIgnoreCase); - if (index < 0) - break; - arg = arg.Substring(index + profileSuffix.Length); + if (args[i] == "--gale-profile") + { + // We use gale profile name directly + ProfileName = args[i + 1]; + } + else + { + // Doorstop 3.x and 4.x use different arguments to pass the target assembly path + if (args[i] != "--doorstop-target" && args[i] != "--doorstop-target-assembly") continue; + var arg = args[i + 1]; + const string doorstopPathSuffix = @"\BepInEx\core\BepInEx.Preloader.dll"; + if (!arg.EndsWith(doorstopPathSuffix, StringComparison.OrdinalIgnoreCase)) + break; + arg = arg.Substring(0, arg.Length - doorstopPathSuffix.Length); + const string profileSuffix = @"\profiles\"; + var index = arg.LastIndexOf(profileSuffix, StringComparison.OrdinalIgnoreCase); + if (index < 0) + break; + arg = arg.Substring(index + profileSuffix.Length); + ProfileName = arg; + } var wnd = FindGameWindow(); if (wnd == IntPtr.Zero) return; - ProfileName = arg; - _gameWindowTitle = $"Dyson Sphere Program - {arg}"; + _gameWindowTitle = $"Dyson Sphere Program - {ProfileName}"; WinApi.SetWindowText(wnd, _gameWindowTitle); break; } diff --git a/UXAssist/Patches/GamePatch.cs b/UXAssist/Patches/GamePatch.cs index 70075ef..5869e79 100644 --- a/UXAssist/Patches/GamePatch.cs +++ b/UXAssist/Patches/GamePatch.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Reflection.Emit; +using System.Threading; using System.Xml; using BepInEx.Configuration; using CommonAPI.Systems; @@ -270,8 +271,6 @@ public class GamePatch : PatchImpl LastWindowRect.Value = new Vector4(x, y, w, h); } } - - MoveWindowPosition(); } protected override void OnDisable() @@ -311,13 +310,6 @@ public class GamePatch : PatchImpl 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) - { - MoveWindowPosition(); - } - private static void VFPreload_InvokeOnLoadWorkEnded_Postfix() { if (_loaded || Screen.fullScreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow) return; diff --git a/UXAssist/UI/MyCheckButton.cs b/UXAssist/UI/MyCheckButton.cs index 0509612..c7ae6c1 100644 --- a/UXAssist/UI/MyCheckButton.cs +++ b/UXAssist/UI/MyCheckButton.cs @@ -46,7 +46,11 @@ public class MyCheckButton : MonoBehaviour if (txt) { txt.text = ""; - txt.rectTransform.pivot = new Vector2(0.5f, 0.5f); + txt.alignment = TextAnchor.MiddleCenter; + txt.rectTransform.anchorMax = new Vector2(0f, 1f); + txt.rectTransform.anchorMin = new Vector2(0f, 1f); + txt.rectTransform.pivot = new Vector2(0f, 1f); + txt.rectTransform.localPosition = new Vector3(0f, 0f, 0f); } var localizer = comp.GetComponent(); if (localizer) DestroyImmediate(localizer); @@ -88,21 +92,16 @@ public class MyCheckButton : MonoBehaviour { cb.labelText.text = ""; cb.labelText.fontSize = fontSize; - cb.UpdateLabelTextWidth(); } } - cb._iconWidth = Mathf.Min(cb._iconWidth > 0f ? cb._iconWidth : 28f, rect.sizeDelta.y); + cb._iconWidth = Mathf.Min(cb._iconWidth > 0f ? cb._iconWidth : 32f, rect.sizeDelta.y); cb.UpdateCheckColor(); cb.uiButton.onClick += cb.OnClick; + cb.UpdateSize(); return cb; } - private void UpdateLabelTextWidth() - { - if (labelText) labelText.rectTransform.sizeDelta = new Vector2(labelText.preferredWidth, labelText.rectTransform.sizeDelta.y); - } - public bool Checked { get => _checked; @@ -118,7 +117,6 @@ public class MyCheckButton : MonoBehaviour if (labelText != null) { labelText.text = val.Translate(); - UpdateLabelTextWidth(); } } @@ -147,17 +145,19 @@ public class MyCheckButton : MonoBehaviour { var width = rectTrans.sizeDelta.x; var height = rectTrans.sizeDelta.y; + labelText.rectTransform.localPosition = new Vector3(icon != null ? _iconWidth : 0f, 0f, 0f); labelText.rectTransform.sizeDelta = new Vector2(icon != null ? width - _iconWidth : width, height); if (icon != null) { - icon.transform.localPosition = new Vector3((-width - _iconWidth) * 0.5f, 0f, 0f); + icon.rectTransform.sizeDelta = new Vector2(_iconWidth, _iconWidth); + icon.rectTransform.localPosition = new Vector3(0f, -height * 0.5f, 0f); } } public MyCheckButton WithSize(float width, float height) { rectTrans.sizeDelta = new Vector2(width, height); - if (height > _iconWidth) _iconWidth = height; + if (height < _iconWidth) _iconWidth = height; UpdateSize(); return this; } @@ -178,25 +178,21 @@ public class MyCheckButton : MonoBehaviour public MyCheckButton WithIcon(Sprite sprite = null) { - var trans = labelText.gameObject.transform; if (icon == null) { var iconGo = new GameObject("icon"); var rect = iconGo.AddComponent(); (icon = iconGo.AddComponent()).sprite = sprite; - iconGo.transform.SetParent(trans); - rect.localPosition = new Vector3(0f, 0f, 0f); + iconGo.transform.SetParent(rectTrans); rect.sizeDelta = new Vector2(_iconWidth, _iconWidth); rect.localScale = new Vector3(1f, 1f, 1f); rect.anchorMax = new Vector2(0f, 1f); rect.anchorMin = new Vector2(0f, 1f); rect.pivot = new Vector2(0f, 0.5f); + var height = rectTrans.sizeDelta.y; + rect.localPosition = new Vector3(0f, -height * 0.5f, 0f); iconGo.SetActive(sprite != null); - - var width = rectTrans.sizeDelta.x; - var originPosition = labelText.rectTransform.localPosition; - labelText.rectTransform.localPosition = new Vector3(originPosition.x + _iconWidth * 0.5f, originPosition.y, originPosition.z); - labelText.rectTransform.sizeDelta = new Vector2(width - _iconWidth, labelText.rectTransform.sizeDelta.y); + UpdateSize(); } else { @@ -220,7 +216,6 @@ public class MyCheckButton : MonoBehaviour public void SetIcon(Sprite sprite = null) { icon.sprite = sprite; - icon.transform.localPosition = new Vector3((-rectTrans.sizeDelta.x - _iconWidth) * 0.5f, 0f, 0f); icon.gameObject.SetActive(sprite != null); } @@ -258,7 +253,7 @@ public class MyCheckButton : MonoBehaviour { uiButton.transitions[0].mouseoverColor = closeMouseOverColor; uiButton.transitions[0].pressedColor = closePressColor; - uiButton.transitions[0].normalColor = closeNormalColor; + uiButton.transitions[0].normalColor = new Color(0.6557f, 0.9145f, 1f, 0.0627f); } } } diff --git a/UXAssist/UXAssist.csproj b/UXAssist/UXAssist.csproj index 19cffb2..aada2ab 100644 --- a/UXAssist/UXAssist.csproj +++ b/UXAssist/UXAssist.csproj @@ -42,6 +42,21 @@ + + + + + + + + + + + + + + + diff --git a/UXAssist/assets/planet_icon/07.png b/UXAssist/assets/planet_icon/07.png new file mode 100644 index 0000000000000000000000000000000000000000..f98a1019fd077c0084b17761d30e8da74ea7afff GIT binary patch literal 1683 zcmZ{kdolG{W>TPf!Gjc1Xb*$B%e3t3pqT#D4(`cb2`$%91hl)|D}CYR9W zQu(3Wt*~68QOdKl=ckKo$>qUnvpnlO=lst3{m%KF&v}2|=e$4Xb>9Dda=h?|HPv^j z0|20jb8{vr9Qs45TNL|`IQy>(gN3>gJOLoV1OQUf0YIvVQa%AdED``jrvL!M0079j z(spk<#bHZ``(bBb+zC>-3wF}b+mL4PBj^X^F8u#X$|IXhFA~hL(3uk$N5s& zOq#agW{sjKvznc7u09vyqHCt!f`t*?i?ERowDMXbMb0QXF5=^xUuB>FC9yp%bTDL& zG=Ibz(736}hG*oj9!^T{83Wu6?-w1)h|;3*=M!PGTIF_9oz$MPHgR8{xvzKMwml`^ zriKBGKytJ$(Xm_bn!0FUD)9pnC3DGz^7rpxx|9wZ>#LGpwfsVM?d_txlebGpMuf@m zK&EZ+aFHae{;X5qgT>NDL5%OlblpDrR8Q+-?a=J);O+}jv~_7ri9BKP$!Vo;Gv2Jv z6=S&z zbLN-Je{@;2Xd*IJB$uwN4=*?tFnczdON7Mj-W~%U{CR&T#3Kq8oB>LL#60K4VgP7c zA&dQ4>NiIHoiaa<#-4p&{|0G*4`IufOU|QY+!(Eqvu(mS##22$QO{RZ*XYyg@jE_| zYYT}fb93tW9`~wa)%>8)yU?1aN9`NmM@ZOIl~-q)9cuhvvichT%w`B=R=yS);LLwM z=$i!n-mvps#r1`@l>~A=c#OK#=};U=D%oD<2vbk93l+Ni1t%}LzKKm)7M5ABt7th^ z#4u%EsI5B^_ElXz^eGXPWdOHm4X30(YRb2Gr37CRj%U^-|Tlr(#N=>1{) zxsy8Ty>IVr5Tyqkf-G|EjlX(lP; z)_zWOYDBc2U&1YrSl{yk=Vn1k5I#zpUcm_{epWU|W?(B`-VI@!vM!{#*5!sXJ~1!n zt4#-Axlx3juq67rOjvI6bvMr4zlTUxf~gI_j7deuu zZeiJkw09~Cn!MA?`2p2_f!r6dLq2F|O@E8D$s;`IB9~!G{uu|h8|!Z(5F=XAfm2RwFIQEr%{9KJhVsSA`?$TRq@b) z-T$_Q%)nhY5e`;O-c?HGJoqRND9`{)GFUi7W@%xn^0n zp(lQ!URPJC=atJ99TTdu2`YY|`|!gF0Jck$A{veskLwFpf9+lgg>|kr2?C}b)0f*; z4)H`z$cyJYKPah;f9otjqXRgu`%gZ`hpWzL*ZR6oZWm&NUF#pU3j1G``NQzv#U^jo z)5NHyXXx{bS9Ib-Hx6Z?ZpH0-=6OSMETZ)eoN)C7kHW0ekiV>ktXFHy5>yQ8q+?05 z#VWJce(^bi`|_0?muO{iB5XEE@Org(S3f!Y;O+0@TKww{u{`?VZiBbA9cAPK+l0~= z1@CT*4Rx$_kaNEKFB=A9V~oq}kGxhqUt^j}044_6p~LZYn9k(TBtOCr(+ zV~NI~EzFQe3=)|Y?r-*A068WsG9v!}18X)5Hx&TlKMk}x(sVD$ zOD-a0-I#D0mA6!P5ko$H-dg|cL0oJSxH0FCailIx}3jFg4SbWb!=`K_X!img2Y;phm!hOM5i zhy6Ty?_3T#&kBI_rp1JE2HMI84J}IyDVC9D=+g0Aqp;fMOWUvFpgpS?WHrXMmbgp& zOS4Ij^Db9KZLz1xG5r+SBW@PP#Z>j|F`ZkimIKv=%r>5QaCWea#`*YxsX4+u^2|## zmBEYZ=D)u$jgd|eg21%n`!_bB7G)@d$KRN7pt}yQ2I8EfMR+O%JpZT(E)xbjE zo@DIal(+}AgLlu_f5g%0PnMHlZS)e=DScAd@Ja8s`giFnFFH67Z~EswJhMNF_x8_W zAuWi;<`A@wo6eT!kg$m@|?ehvCzPGY3M!Bu?SDLpYs(i3+ zl5$6{@aN_lf8rTNVA!HH(y}%DZEfn_Gqc90mdjH#hBlZt=J3XV_SBo4HLs3>HM*g9 zuhG>m412z0pHYpLPjhVpWmK3Q6!un4+&-3PF*xJBvt(_|X^5o}usT}2MP6|0I7kYp zTbGm$=Ao$`pPpqhVt0-O-vyh7v_9%t{jpm%1!v6ecwZ71Z*IPlwNYJ80EnHbCe(gvVKC9>A zwiW684sUFEbG`>&KRUA~5Z>|n>C4b{A$uYclG%FFrEuTEz=ac8#MGNtK5TTicTO^G zuoV}@s?_hkt23t>oU3aW{w9}=yP)<3WV~D!Z=%i>^RaSA0wI=cf47z)$(|77BHwxC z2h|=`V%lXwQ`rJvRE_0i0a zN(l`%P(9QoT*<(0I%kMV9(GsCBzdW2n|tOyP)1Sl3AKxQJl!24d~2x^lO>fmBv|fN zJlvI&CZ`>&;-~wAwwD$2Sf>2Oys0e3fL9T_i#FiC_0`oT<{qfMg{;cbSZuQ`=nuBX zdgOBZa)^%^e0N#%imY4O*SR}#y9^lv2GEI)vwVl`8Cqh%YLBDWnC-? z3Cc8i__nU1-_i{SIPtvZF<$0q%t>+MA z=Pljr&8Qx^)OE9B_=kiFIrvYL36EE{)yxjvfpqR4DeZ5mtbiPdt|a8;o55*%QQq#c z1Zp2TXB_>oNgT4ccH`oULo35#zOu#Edr-M6Nrw}y3qOABj{7;PgzsZBvrHLolNb#U zd*h#1_6d@wyO2*gV^a}B!L3MpG#~fCaaBT1nMSTW7{>XJ_yf?SV9`;!#O(-K-YQRq zVr{Iiw!`^;qqM`&o3HaDs?=GrB!d8vyOSVI8kCeOqKZ0?&%Rrbu)jfXOo=ySTJSUl zONmQDH{v1taoEU=y1n)N@3-BqIk>B_n_xU#E}$Pbw{?LaxC7%A#Ax&Bp(CF{Fo>l&S)t?L9&p;=3f(eRLu2XDqgwf}4 zQua0X(vf(2WH_B<7m+}c8Gys!2y>W~Io!$*W@~3P5h`UlYC#~8 zs8n4boKj7>l9V-^nrNj21SP3*gfJ8k!+mU=&g{(Ybl$x8o%z1`yzhVSy8u6Lb=4E9 z005}tu$Vx(8hmQyqw*=vLT<_B6agD}4gjv213-Qu0PM)EdpAZsUmT6`@x}m$pXwgFp;GRskg#E70MK~)sTGDUH^$0MB?|7Gm(n8GK-opDthg2d z07r^&7|#pXp(nQ@iWwo0p}drp6-0vIIn9;E^QHUJb?HkExCFI9)?+hG>j&1JR;sF~ zt$Ts85v7OOo+SZV#=7TQP?+Z6&p$8F54>7mm3Yh7#_x75&y=6(XKr6fBMY(wS<}>Q z5Yr^rbv+(TIL1>78jjA$b@$gc$_Ji8^<;6|#2p>3I zY_;hTCb@g}8q+QPkoOc8EJSsF!~aE4AHK&)oBwg38}s6B&ty0018;lVXXsKAAG(_} z<>mniVr}(NFQP@g1@L@t&MoO$NS-~aoBD1##kpnYm9X```=E1s?z`KFh;&auuaLvwkVwSlC-`qyFJ&SY|49%dkgVO>@H}^$B@>>6>?; zyGGRPeO6h@&he%qmjy|@hPIjQ$*}q1S9PW%BR#G;bTJ-xC+_`BO=gW_B)G)TSP2dF z=5$z0^^o7|8+Tn!-Ia8H&l!$st+!PTb<+L172_frb8f?QAuNFa{lj>p9}}yCtI`TxGGnFqUBhdh$)F zoq=JLFZQ>I3Kix}@DqRi*88&lDaKV0>79E=@>_|C;mS!Pr$m2p&;^LsTI8c(E$w%c zow;*x*hEWI;x_zCt0?6H13SG(?nA4<=?kY=>Vd64VEknRi-liy3Ff>%*&{;((LFI@ zS(9tLA->e{!mi1OH^2I2ls?KXJY$Qkre|LgkDd&PzgN=pQH`^%@6f9e@UJ@sw6kNj z#`_WP{rTky3qtJ~Zd~Cwthwr8gB3F850XG9BxW>_#_pSpfaH87Bvw8o=DzmAFS!=2 zA1r4^1EuP7^$pw}I5Kl%5tPS9Tw1P}&s()%?7IloS`NX?xV;ZeKgaZ0C-1`to8NG{N+Oi#sLcDVXdbmB1C zJ2JcT@$8!jA1fOQ&6Rp{``H36f=tgkVO#Td-Jd7ZG|1@Jrk!6`7g@(Zxpi+^kjHlKni4sd zjfei#+wI3e((PH)cq5y))ppvbu28?c|Cq?V|8_gl|M3Q_?troFe0y&NIK01QQEl*C z7&FfO^!CjtUZIrOXiA(LAtO#M00NG1w1zuaBOETkUECa;-0U1-aJU;BK4H#P_#c3H zIW{Ri=Pv-KKY^M`=qWj1`QHRe5;2ZUi6)Z%k8zZTApT@z-a}S$2EcjwVcNckD)wC*?-|Z!xW-^?7D&$Tv*y%vfQjld<9?VKKM*hNC8zl+_?Y}1t z4BJM%xIPlM^!;-ue~!J29<#SSuEMc&m%%9`gWI&`lOvygyG41o7lKbasQ0eFZ{MTK z6o=#H{>t|D#*5QaqBzm$(nPOIF<1yXVHR{Qx!qwv1k1rypr%y!K|sr|Dcmx5l4hz^8>q}IhuPd1Xa4~(pO7>YEMM-mp4^dbd;^mgV!>gh%U0b z#dOiM=$VJ@+G>sXTPJ5cTDRkx?nI;P^Tqkhmc?{?x6k*-R~UJ?wYi@k<9!8M8fnmb zm<%3I{b~50|81+|1!p+#kKK8*i`c<$rrC?3j6&MGBkd4rT3~OT?e9n8N~zinpadm>A8Az|eMWY49O``zIvvo0PE0r5=aI z$76tr;OiU3!&J1&^El4@{$o3oKChg?9rkI8T-)g*j#Fo|UXTXLa8;hByMIBWF}hmY zO4amHR%)=oP%%}&O`3WUknk+~#vcnB-?i7i%G)na=JT4l7Ul!E=WYXI`ZFSMkW}nT z(!fEa#;=_QMN_;&ew&#UV;9Oek&enX%01T~9D+_en@^mqWGgm`%Gsx*ddL2Rg>U?) z@#(pRA)kST-%L@pI74T{Sn82%h|&Tq%ri95OSc$PrKWOw^}cfbV3M_myuKLIIij;e;VO*;k!kuSjWVv(^i<+Rh@@76 zqnvdT;)L-QrT!5QKR&|}JgGO;NhefglbOlbJJ?%&TSnA{E%T->b@h{v-XbE-sSZVy zwN??!*+H6pa#%u(Yf}fd6J+enEpVX1tki z$D;!?ipPz6j`BhEgCK(31;f%&_tv&HWFlVF`-+eAZ+2+%K9m7B?_S9*Ed1RLXP9F6 z>C-1IJv}01SzTR0-E%UAU2-yN3-6BwNH)(tByYg$_M z8X|gnO-o9mB=j(23hg`>1*e}a(C?9{@obIqgPRWG?kY6#J|2j>SP8wqty>y0>gfu{ z$?sbq3+FWS&*y1X)P~g|Ev5&SV0U{oE18uw4JMkXm?FeOE6PLUYZ=2+=Gn#E6iQug z-pAa4FDpwEAqU@&CRwpV2lvwW7}{8lAiwq{C^N(y-_qK>xbyzXQJ_-6^`}fo8+Lnj z>f3yy)Ysk!50CUdKi`G(XNH=}C$Ef(wg`)~J?UTK`Zuf3do%`DyHKf)+#Q^p^dx+31ff@yy)vWr(Hj z&}4PEonib|mt*kMmvrtKR@=7v>-J4!c#25}5@dwj#5D-n!|8(_?lysPpT`8>VYIht zIhcg?;jP<^8(HaihP2X2MUr02Tt#R>NmYDFGKL zm!O2mOA-Mr!InqOz}9A#*4|(U)Y=AWdHgUK3crJ o`6q!A6n2SBxfn+JALghH^oZr(Au9-use}QLPH1@bsSAmJ0kzgS6aWAK literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/14.png b/UXAssist/assets/planet_icon/14.png new file mode 100644 index 0000000000000000000000000000000000000000..77e55ed7891435016bf2d497f2118e55606fc4b1 GIT binary patch literal 1670 zcmZvcc~H^`8^?e8Dkz@2Y98zLnip#saVQb$h?tV*m3cs-CCHLX9?)2tsA&zM;i}n| zXQgSDcx0xDXZx19F41b5;+3vup5&EyFU`*E%CtL+dIvl7kd({B>E=OMVv)O=*+Y^v98j=0PT6|>bHu}7pMO4TT_6ljtu`-E6J14 z+V<0ATsXUa1YRKqp;xZFwl{HVnQJW!r-33p$u+o>2gH5N`9WmKm1@Idbp`eXoOH6X zt{xIv2J=zkq2l&sH}rES=i4TBw{%9<$S>xlZ?v{NKE7=(501k^#yVpX9kH6Rdp@s6 zTJO(BTJ~hnNi~``eTqCyJN# z4e030t9_S-yr3UwqfH_8w1T9gG;JG_P{=+XV7s*+-)9h``7KC}es17l|3eIy-jE4} z$cw138Q)n7n&)A`s^PhSHTViYZJerm#@JV}F~&}?5%xUiYW3QG(`s_BK9zS|byF^( zM?JjA`8h5xqS2Lyl8CySHD8U~tT2`PtxV@A&AiR{?#0m}D8bMcCG3x&?X3F1mLmi| zFeDUyND+H+Vq+Ayr0cSb|v`TWyA8*l&m0i=S3ojNhy;Y9WFLa}aN2_sF9<%=$T#!FM zw5!~flyv;^mPe25-&(L-gIJU^EGi~EmMSv<4uhi(!jK2yNPid_gG6Fb_BJpW1_o;f zMN9qxFrp~*h)e$mK>r1}X*D*<0PDXSSab%J$vVS`{uhI?!yJbH#jLq?9*{8r!PN_2 Ig$uj#C*hC-od5s; literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/15.png b/UXAssist/assets/planet_icon/15.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2bc741b726c913e38b3f139f5c92a7b2def61f GIT binary patch literal 1760 zcmZ{kdobIH7RP_7(0JvhC`r4`prO<&QGy6tj}-A}MXC+DSkVe4(uR73cz3a=S6lI3 zG*rv#3QBQp>s4jfbCoV#Z;CecmXe#!o!ObaGk4CM^F8xD^O^5|C;5_-jjYrODF6Uu z?QE?{B87i#h=gdqzhky55@jD-k|O{_r~^Pu0s!obte7PL2tfnDiWdOj9s+<;a6z*( zUUZQ7-rmL<5Pq$aR&KV)kqow_+y(&X%dZXUrdLu$=251dBjM;W7!EO(N&DfUJ^+YU z+gV$XZM%87lXQdrkfs`Wz7&L1g!KV{~<9y7D)dOY**l2Z8)3a$QX^}Gz#oadi0Z;#+P_PbuL32oVXsh-Zp zQito+UxheEotjtBh+1Q~v*+he--YftO}DZ?Ecw;-$9Q`4>Rw$qhjJ>ZEgyGDAiJN< z>kN@I@Mo1hLdr6}aA4np-?Ss653-B<&IyL;!e@BHzS(Xl&wO_(uNB%SF(V<>5= zeDX*l`jC?{NSiWI-=%oMDz&?*zb2ESu5ePX6qf8Z+kMZ-ju*&lAQ8gNHG$E>lo6$4 zCu$}*(JU8JzurBRVH*I4W~DMn4A8PwI29nJ+F7}^-b52O<7r&M;_}Dwm0UgPQqU8g zD{D31N-*td99~kdEarTkiwK=V)%5qw!JS^jNLHf~Jgy03wRna%b$`aHk4elfg4;Sb zHm^~hqMtqm`?Ra*bIp9DJ5gEP-vwRArA&eXhs!ja3zHdEi`c{f&8`D|%as;bszKW~gZd%Brz zdELDy)=)$>fhTeSk^$`Z0|pT?qaPHKyk|4R4_?Sq^f$Wla-t^;gAhW93T9t3ah^9ao>w zYB^b4XKOLDa+WjG5ygZRO5rD3YO`t6-K=70t)djOT3xO9*4eW@psZw2Z5ibtjMC7Lziq_WP+v zebA#xYGnsVqUMjin646POm#%UU&nt6OZ=|UspToHL7HvXyiMuKm@Xi2W0E@u^1_Ah zlaos)&GkRLDSJWL-`~#6D@af&??-6q{bhPA_BDkbxKX?4H&aZnt{-&_PFLiC=BjXy(56^X=&1D-8oYU56f8}}- zEmvr#I1Op0KjF~J`*XP``g7SAUGlB9FXCn{8Ah$m7vuL#W>UsSAtn$UWuqtLCKP9}0e|>l3WHxgreir9IR|{QsZ%1-)mEW3b9!7X} zY9l2-U#|7S$r#5Sdd2yl=Jjdu_vZ-*EfvyyAAaJZZ~<9-p@rtf)vU;<#pcu zmp6nxT-`4~07!dr^^QsCiu5yVGOZ2jQ)Q^wrsk!MGRm^aI&tk^osir;<_cy literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/16.png b/UXAssist/assets/planet_icon/16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7cee6feb7800e9c14cbedec2e441d4cae9ce4ed GIT binary patch literal 1603 zcmZ{keKgYx7{`CP!y=3(vND9Yk@^aTX_uO;tJ?Eb1JkR%>?{hxqd(QL6lS?5J)Kv6T002-U zy5gvE)&1UJCHZ`xq+otm~n808oGNz1OudZiL89WfqZySN;sr1>0>nms4s30E+5F z+&*vDHeRvkjX;8Sn`3$>?SB1KgFI+o4UM7z>W82pE@+;U~ma6J~I(t@lW|sFMwRU_BdeVCAaO7&bEjJd6G?K;F%}N&5+SEBtX?0;+}( z-x`vi>V8V48*EXy)p_b>;js-ddSw39izhQ7EAJY#l=Xd~oxlUK&3)q;Iy;C|A$4v~`r_Y+*o#lAs8+ z2X2+zDyAjxsKn5~h?w)CQ8yY=`zzXH&IziCH~N!rU9VBZYn5#hrxacK`GtPv~R5d6(i-?SjtsfO_4cL}qwEBee=m zt+C*&G+$y07i6*x3yz)lyG|Qc@-+lGu6^uyFv5tUpOaLmV&CUi_bB!1vH~=JsM=T1 zb4Nq8KTNx^+t|qnwCEHYMm!quLYRasgG76*_W7`zN*0udRlmB!rNy9GYhh46zCnfM zMJ-W0;6(}Bi+XjpRg327Uos)T$r7V`>Ham|CdeLJaJp8+&cKy7=?9;36A96`3pQ`r zjI~%_A6{zOLZz0J@n0_rgE-sjU_SWV+pvsCH_mFhFFHUJbtJ((-;~@kP_{G|&R+cF z*ecjB8ix;vCaRoYH8*qm9)iS1667rFK9H5hx1OjqMt+>17{xc_v8|^$CL6IQq^fXs zD6O=?kKCV_jwM#l)EfC zR$mL@E`FDoR7 z6^f$Ag~|o6LD<+@B9N9gNNo<1g$}&ZGbU literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/17.png b/UXAssist/assets/planet_icon/17.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1ac59858a3050435a7eb8fa2e307af81ff293d GIT binary patch literal 1809 zcmZ{lc`(~~AIE=H_uY`NEnTW;E6CbVjr*1=QA^vprSjLMiLql)B=+i^P3A={z&f%=64V^O^VOJ@fv~Yu?{KzBAthYb!G${>%IT00<$? zjcwR2`Axjs>^&2#bHFwk7jqj+00>n8fT%bCIATXp%K#7v1Ax_M0DzzXfP`Om<9%)R z0k^Y-nK5wwZSq@+Ua=ECKXY^d00?({(*>IE8w@+-!6PkAcvd(ic{K%zFDYsO!1V=b zY+!3nt4Xu)dh7v=nBGOTf2C+US^E}peVIfjM36N~9_ zaSW_*JT8I=29tPV+i0h{)3TrEeuHNT-5T|5v{m_Jr?j9%8AaQXH8N9ELfipa&hoX! z48!=O(__Uw!M~nLeQpX1g^fv&f~u+A{0*4o8Vq3pAAPuB>=UT$Uu@HtGjVz#;+A&i zpR1~HV#28+vnND8dxi^VuCK`P96N7#bIM5{bZp4<*z$9Ert-g7sLbs1!!9a3oN9oe z%FCMPDWd{W0j;RRGmBy`zirhDJw2U3M({v(_VPOOqkHDBeqK>yH1>Ni=$(Ua}%yHOCl)pEQ!n zkI|^bm@CDWEoi0Y3-k%z+>`MiH#Y`+h|+o*cb;Q*V9C(gMioPI8BR;8sn4PCR4pvR z@#TCO>P;$Ptl_Ua%g;%K+b-}CMboWPe zNUALenS39vT2;b82uHh1%${AqkO|(Ilotj#xrF)q9z^5f>tb=uAf2Y84niIF;}!Sw z@V_GtcfKoDx_oD(t~ASDw|7X(_Z8ay!#k+dMAsZ^P9)g67wZodi`2a58VJs7jnAFE zw0fxh+L)uxCZ8%7!x$8{t12A|N&wXJ*DkddUW?0rs`83*3Lw*X@q2&2vAa>Eft)-O zNAEhNSS%Naw#@yyT~|}!ewk3h@Q^&v=C6X90bp1yhYS)#!WPsn3+9IWZu;8LDUeH6 zsh$*zu5d}YJHqcT8bg0)#@87n7bnx``w~}d?zyLsS*QcEcWCNZDKrr*Lh_bFg09+8%bIwG{VTndgeV^-74r1X z&9riQ`sG1un6z~I$-2f2WBYKB`2em{No=o%dQB9dOF3pVg-LVy+#H$&Q-!QfFUf$i zoY=jk02w$W9rEc>ujIN@Qs{cXvgQxXwjIhh%GZB*>$P^ zl(ovLcNhBUra1dWq&ZpNEuW)9lA% z0AAyL^}5d#1)OmYcPgRUnwe&|wKChLGXTZ{82Xu3}3Kj?FDfRqcAUw6ua6sKyY ztG4#$O&^5K_A}Zuit}27JZ5*kzxp_6fA@l4oBtEs;g`=VKPet@?{Av^JlInq54(%~ z-80pcng9|^Qb}nz+ScBhqL5X~-!@}LaS~HU8+Ad8vC8fKPtx0F2NPoDI#eSTX1bZy zZ*NO6r=;6)Dg&;!jIbyy|Z`S{|rWjjR{8JWlaMF4rc$s;_*36Dj% z;IM21)L?4r$}qUH8r&A9iGbfmz|@ssFa!+7v>GY+FTmRuyM$#%gR&U_X<}tuZul(bUtD8ZZ2$lO literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/18.png b/UXAssist/assets/planet_icon/18.png new file mode 100644 index 0000000000000000000000000000000000000000..e936342402b3c276c930fd23a9728d92e4c3e0dd GIT binary patch literal 1788 zcmZ{kc`)0H7RP^-Qd?6LS6g~fOVkxaxv@tqvE5P{OIy1TSuAmBqP5mq^x5jFwW@-& zwi~IXp{fm2`h=?IqE$o%t))dHG&h|$^Jdc_R{D*{?1WJe?6eA*C?Zh}DO5&zcd0AzK03gal zB5XVznY0pT>=pD+8P$9%blB@(jnH_N0w!LIF^I&z$gZ5Xck(!$>7?|tg6GNmsqNPN zsd%v6YKEt=|#SC{G5qhK=?@@FIT>tC&M z|AoI3w36`~3B}(_YPojfE(%EH2M<+Nt8A;dB-!5hvZ+5Ah7Xt9u19~Txb5~*Rl;)k zzU;OZUZKA`{mVyqc0Z#Qp<#^4loQiapKapUoMv9tLrF|aWjD@-gpI>U>OSxwZIQ7DMSndN#%DAHq#;;_o90@4ec3 zJ($O}^6w??zuY!M1FGo(MF?_nz(H4E^!43=_u9MzOHPvG)I$ND^VG8AJ_cvt>cS~YfRR&&L*!t*1(*PxdkJ5Og86g+g0 zd4Q~UjR`9*t*NOr%wKC;brcpJh%TzBbthoT9=?3%GC=Wsvzgm+us$$BX3&Z8?A~w3 zQxgxbQOxG{a*LSu`2}azYC)Y`&yHzD%$V9$HO6ypT-ubv`F*JZDhJdqZ4QMCRhylH z>3v98x51BEnjJQG%wL}gE~jOBAvTm&vE(3ZLcAI4thRp*r%>osAe}R>gS>RS-DF+v zjs#l=+9)1rTtP}3KKZQBrA@1cOf~!dqE_yyej_f`;*7=M^EMW?(@19oQVo^*OS)P; zMGbBO(!(J$`iO*$;^*b&*2GUHUSttL>;s&_^%DsujU1=S@rWLmv)Q;FJ@ zc%?JjPByKtD#1n=6IqmIKNS9nq;{)CB)$o@Q(i!rUb!rOM(kCoh#st)~So6$?R>2pi$af_zB zaRj5cw7Md;NVgt1e3ZjNWVdb~iv&r4;bEYk#LxZ-R7sY{Y=PreX@HYWVBPR&*R2Dm z!0QWjJVncyr5Gcv@?umyL0Ti2b0oC6WM&kUDVuYfTE~&qmD5rxmZSOSVP$@@EV?b`6aEyOr8$k83G^n4d6NOuIaUvBQ{F_4rbY z8zd)pvU`nggti`XUrzp(M6WZ*W!j2c6JOXTbgzl|9SOw3d4GLZH5%JJoea9yRq#At z;`c1QPu0AC_6Y^~1Vc}`e^eBF`Ex`&Z(>LwF%%XY6Dlyk5MpSo2Z8DtLOmg-FsKR4 zz*H9kfk7ZXMl}9^0XRZPMA-HJ4`}11Z3Te#e;SApxX@T)ATH{E7~=~t1H*rp>^Lyb P3m5=t=Z1I;4@mtRpmbzOsXw}h@ zS6k;+5ofGu998W&f@-QroRycjqM|mPcjldW-?r_*IDzzYCCnee#9 z<)Zi?<%>qx0{h>mw7nu%oJbRp9#H@w$Na7XJ>k#%#Ni<#%F*u7q67qFB9oa?00RI? zD$3UC3bKcqhYoe?Iod-p3>-AwzQ`ZG+{tQ71X}5~$m*x|PaSDFj!GWH+uBA;8fh)o z{WTbxUdy7?a}F`rPT7N)O-#C@jeTN1qGT#dAD0D%c8&`ZYRSjvi%IjvhQmp+5bTGI zT=Tccb>Ti^C!k{=WVyQA@6ke#Ap-`8wXG6x~@|?j2ctf^lNNo(^8;l=lH#j_I|`JgA~mj?@0H4_{fB^)Ek5^SDi6Uz6QbIJn-8O84Q<_LK2bo2Z=YN zB5z)}Qwd>$)a$l_yY=nWqGuHO-K$A`i%g5XK^528o^RJWW1_yIUitIN)c$}u{p(IruInMn+T2KY?_VFg0#vYOs`xcG zhcEdl%mYse4}75m*-sR*j@3LU85b44ss1G3vcdz#D1u655XMke+^_WZP|T(h8e_l(C-X;ZuXdDO&G@KVtc{p^D7G85Hx z_L#SdcLyWl&z+v;Z6}Y)`J^AgmTqW26xe=wfFVsMj zctvMvn`D-px|v<`l`i>%A`^R|dVilm%%!Hig0_aY&utn$1m31aP4}%WSL+|+1Fw|x z{Y~62m_d|NLw=B8X^_qsqX??07`?F81eIhY&!^h%My7FL?>FNZcGnB@ms;cA#MJ)j z#ktdzoOriZ{lQ!1s{ET6HeWB2+Z`cwx?+_HIiKNDbFWjQN)p$bBjqvFIV^48{A|X2 z)pFU**MIGB2xv8)U$6O_gr`OMQHhIK&$7uNOzH`duQYF$YdzE#`Le@)8`DB|Tms#} zO;o@%Mr~w|+>Zb?$7~Ts`9`A;`L$>o1`Gy`HvC7|(WB4~AIvtVdAa zSk~U|nsK-K8Epr;WIZFTJdJRFhg;+0a;mpNMJtB?ByX-4-FQ)m7w9s!$|tJyAEY-p zgQ}J>&S{p`S~4b|sn#Kq$1O5eE8RY7Nt|4$kbPA%926$Fx3hb*exf7q5p|vi*UjrJ zPzkOl`?qrfhBt$g705I#pVZhh{zaGw)$&<2u%zgTOX3>S#6?=cR(MDbwrg8YAZ>y( zw=(Z3UG>)fxdvVAA2^%PUvb(=^|(cpU*ey>4nC2poVy(?qGA;rWErccy>Uyf`O8{w zpK!BeKL6M!Z0yy%r$_5ws@J_sFREiXn;JI`c~x5kpX_VGs2>h%&Eh1M^3 zokz9pO@oyA#0%Gon}_KX5|253obsnUcGCL5y2!PQeoNU{ILRS?Ia5uya?S zCh&9T;f97fP$(PWu5QFjlQN-(b!v8Qv#&84J Vze_d|J-T8BK-oFj)>!)_{tcu>LjnK* literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/21.png b/UXAssist/assets/planet_icon/21.png new file mode 100644 index 0000000000000000000000000000000000000000..b532483f29c731804fe1b1932293d4a10f6873f4 GIT binary patch literal 1737 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 Zno6*Lhx{}dmZvj-nUN*pg@H@lzW{GfP09cO literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/23.png b/UXAssist/assets/planet_icon/23.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9ddc4775459894f4728b9d122c0c4bac55d9b2 GIT binary patch literal 1714 zcmZ{lc`(}v8^?d{&?0Gzx+7LqD-lP+20a`rwng3debg0FiD*elB3pH})UiEmQLD6F z-7R%)X}yRmQBAkhsyj;LMdAudz3IF&@67woyz|WSd}qGTeCGS#^JHIgc954-lLG)i z-Vtl(Ceq{I8YC^6(<#>5B7ufu-JAd*^#lM==m4-QvM7rHkc;dz*S8kyO{|R&nKDF2Cwm#L8Q zERgvKk(Gr&VQW%_=OT=q3koEVx!rFN?DSQ#aATAwe7baGV`v(6$xTY>ukXEue_7XP zKz}PGlfTS7!=m0S8BeFS#A?FZ?#gmTa6!HDq`vppcY=jt-^(1lJpy^X<=Bv3PUhqN zbJj|g=i%fQ>Tcyt%6w7TY*4~@pg)4twP|Dx;SGP?GFJZ;KtXI zQd!BP>8gmtj(Hhdd+Qsa2CfV}+qi9d6A|^otP<_;sA5!*+Unoosy`X;tT;9L?pZI| zy5JBkiI=PFva0y<&n@?}WG;L(IJiGt+92Fu-LGcmPoris&Q$QhmDBjNGV{v)QxEm< zI`}8!t(drVXDjl?mzC!9pyrHLxB{hKqO@af#5{db+Ey>KhklO=n$D@O{75fxbI$wtRr7?o`Rwv6v+ ze#Xn!vqSeZUgDzUd7qZPSAEgVuw!Bi$I9H|LK1Ss)jL}_Ce&`2x}R52?oi$KcH-6Z zX|sFz_ez=dG)_rNQ*0rJ{-hv)Y5_V^SYH?hTe!GJHIy%Z9;*z>^5avEsN|@_DiYu9aUJa^V(+&%HP z^2BIz5l8V_{WnnZ-PkP!NawXIMe3qeZ+>`yInkeAt&2h6tws=r3rAUyE1GszoID>! z65~$jq%EibX2y!$@bAo#thBR%K0}(?vUH++a`a!Wx2mBVjtR-}{4wZdaOb79Ru!~- zcPT-Akdia~Hwc&M$B-CGBlE$!BZk6`#N~j%j3SNk2_K_b61G_RMR6ajk09-k28 zuT@sX%GOXH&=`C4_>a7t5CgU|BV{eD?ZWtUk||_jkNKU8%fw;frZ*zF(Zk|`4coKC z;CCz8a}RkslbNTWc|Z0jNnHqjSEg0H6@3txGQXR~?JW0>^7eSZ;Wo6R3G00W=0QQL z$TfzUT7GKMNiXbg!V848$A!(hHnfJgg)t$n*Kx#E|%wL6iL<~8hD+lirNop!tZ_mWLY)v)xzq4d( zpJDYL>_$iA@C5-sfQ+sW)#v`2`DL6w1cwj&9(^)lb`Sh8D?MKLo9_zSkhD3FuV1!O z#88wPB#Ct|c^*s|WoiGjg6F+mtO~U*OrjU-7Oe2178#zO_)89F6%T$AB+}_@UUmLy zuIM)F5$%155uwCLOn6eHNB|S02?~xhgPWLnAT2Ov78qmnX(SSZL~hHJ82uN3ON@w# yy7vEpY(Mz7mvHhw3B(v&B!L);!~YM1LSu|g{vERE&}%4S07rXgyXQ6`w0{ATl@^cy literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/24.png b/UXAssist/assets/planet_icon/24.png new file mode 100644 index 0000000000000000000000000000000000000000..9abdae12bc099101d28c491b236d1295822f955b GIT binary patch literal 2016 zcmZ{lc~H`e7RP_3A(l(pwM-4YT`Me1GBhPMcg0+SaLJ`aEX7^GB^1|eaaYn5(=@k| z3oR;!UG?SynTneGN@bZQEoyGpl1DRd-pqS5Z_b?ao%x>m%=eG;$GLUR(MEQs%1!_P zWKp)37_lnS<0EmDCz$b42Ko$VNzOcKE zXe03g5)l2W(xz&f*pUviy+8s0xwc=ujTidBS8Pg=Q4Us8^ODM71DTAQ1-fF8 zfwDBi+VUduCql6!O5FI(yHtL6G?%n^IS4N`?VgHgbuB~TN6%4q3auuSCdTyK03D9ddc=HPp`MkJ%(D0qMfW=0UwhS@A(JhsYuZJl3g(0sSsgd&?DZOosnL#jh&gzy zzg)3xz|EDvmK{{o=}S6!i%c0z=MkYP!4pahcQ10_&;`#xeUnu?vpn@Tdq;NIHG$V! z?FLfvyBH6!wzLJ4dXoS8XNk?~BXYt6cYac*Dsr_g?a&O5$>%NndQQ=c$raUIs)1{Q zT?-!uD1j_Ui0dT{gVpd^vSth}Mj(!kq zo}}^aMOy?v_M5!PKkG!d*vGMa#$LhDdCqfO@bdm!a^P#Gf)jtXE^)&a_&I0p8f_HM zoH1N6W;WCoLsPRG9gpT|f{j?cy(IkBUiQEn{*=<}$9>YVbyRIhd!nzaV#bJc(E1p>Ui zLvZ|}&+3x1N+gXNnGBcV)ILj3J-9omdHVRfC(7Z3zSqN4pNV=Med9QJjr3TZxcb2< z!)8%y_uD@P=o6(KgW+_DxoLd>8Ww^(r4r3b`^teTl`SCAzbRNL*d-!lcB_$g)XZO83TD=z02LWYn~Oi3$CaM zmcg<2{$5+0JY4coQPKpX0ws{w9cM^5?!JncsFL?D-*=C`%!a|V@uz}(PS6s!AaSdF z`9d{8n{{}a26$ur-67#;5ayF`w7;kAhWw(@+L*JJLymm`dA9KblZfLUQ`*u@^gUV( z$@r0A$FWzAZl5_J_ob+PJmeei)5aT$B-pWHc8tL0%U6dyd zDSyN9-^m|yF!xb^NNH-CN=D-nFr~Mx@e@8*A3Eyh`4A~OaVEVzoT6)Hrc8G;t&~1V z=sBo+u9kIVmIk@AXG7;3V$Vul{I(g*w9VpYER~YfI~!Wdi4(Pk9$3)PZI0R5 zThl$wX;@;D=@=Rat^7I&*^WQ)s&Z%CZf`m$2hm49;4rXgyiXxoxeDbPRdW3^F?{vB zkG8aa13T$utzUfqa7MaO(c`Cj9@CROvLu!>I@Jzc8P&FM0%DEmIWK;+2uR5?}7zkZOn7h7(UhMB`LVMLzOg^9Dv6xhh(@Pdwd zU-QOnpp2Z*H;~a<-lJ%dOjR=>CrE4_LHmzp+Q1-3@^8{QtHw?@7oEB&0zs0}M2#vg z!>)0~%5n4eJ)WgW`m?6E@pZ(;!CZ>Pf!O)?>+K^q38}`H*@&s=q_1xxq!T4#%-wbZo>}_y$;lzIw+*{Af zxYTKHGxaF1q)X4#Oe<-P-0u+riWwiDsPjakj?-ER$WeA%$yD-R#IV#S z{Wy1;vTOR7R5qOp`HY7^sHz%q) z*rz+$XME1zV8en75sL-4W+;CeLBDORsJ>WPAnocH`mpxkj$>fqD#h1X68&8%f1@(r zDc#{%p&&&shINCyX%8!=Ht7{l?@8m4?6m0Y^J6TJw2PGnXt$) zj(i!3Ctel{pbOX4(}p9obrD#&0TN+=)YUx(ha=(eBpzGvUqEoEFX777{|_wFgism;q2$j+QKQ@1%bLh3>m^ literal 0 HcmV?d00001 diff --git a/UXAssist/assets/planet_icon/25.png b/UXAssist/assets/planet_icon/25.png new file mode 100644 index 0000000000000000000000000000000000000000..1406138e2b4f0e60ad4f819900c29104b5c2ab36 GIT binary patch literal 1833 zcmZ{lc`(!uAIHDg9Hn-75c=6=967T#=VE1B$GStVb>BC!?seo^Vv#Fy+vG^pT8Xtb zsYp+gV;oWVNzRZfXFS_HGtbQP%slg%_vbzH{>*FMe||D8%nUA`7d{UFz(uSf#**oR zf5geo+;dUd2TT+7FtjuUfLJL2NJ<5OBW9Ge3;+>u09bVe0AvXOTn;Vox~0WDu)7-@ zV1TnfQ%$cgU?yClhW6nAaH;Q)So%X6JeeT}9&4({u>un0ROcpTlpp}$+%6WQYi-yc zQPi31Y0FP!(7Nk>wKO?DuCMpmas~e~tmKqnO@|!AZh#D;rHM`>SKPjWEu4cFuE-B2Fun;R&;u8|EzM^UOCs>G=m| zj^vEf!JcezdVSFI^sd1lZ5a#rzc*bT{th|GO}5GG6gzaq*lSIy$n%$4s1rXpz`Cs z;&m7l;?(zf5tP_dt${l}!p3|m`nZO&36b!(QIDw>O=$8(-IcbG9VYU6?3v_)U9LFJ zCPb|L>OGzNe5H$_-FGSM2Oca$%9BTI2?6E*>>JEkI)A6*x9E3JC3IE7>GlWQL}W?ey4#|ykazs+MQ)O7OCl*al9ZtO z+Ea#t65GnFgy*9ZMuQj_a4F@^0Yr|gnAsu9n9p7^GC09{Z_!wjFu5$ zFzYfRqusleYIIfbJ)@3DpLV0@P3m~^;38?l^{J(U>d^Jtj;gmb;qL*Kn)O@?v4`fC zW8~UC)`ldp>yb;^XlKoVvmR~3|2g0Iz<3_rWH?qItHycd5dU(#C zV5iDEDN%gQRO5QG?lXl0>6bvo8);WiX>Lgqw`~+=sdy+z*|6v^ zR7XI?{+lmPAunPHYYLL2I@?8|$GG&w9h++!L1hN18Slma%E_du$vm;@8kHO-9y5+I zXMF=AeN#031p*i{MkdqMdLB*-(T`jOGkNW!(8K3%b9l)$jmU-r0M{5B+sN(31QV#5%AL4 zh=CMSPToOdek$<>y=f4jU9&5OQ4W@!iZ=<6uCdk2nHmS=EO1pq>Rl&2NWKe;AAn(9avVwrTZGW>F^ci7^WpC@S%z3bi94|+?#cm34pFM;Rtz{|Q1vqkd>p9{@w2<`F}wat?d5iT>)WqN_VE8i)LiYvucGNQ_ySNrL*9na-#6xZ=N%vk*F@!k}Gb zMe4x)dAIGv+C=y)q?K-OW1+oueUy?;I=_`BN#ofdsk>2GXlv|Uc{E6Qw zhknhqAW^C~^OFFQcs)D3ryJf2=@I6|Gynlds3^dd6%fkSaCM}zIufBF2Ztl!@T6Ds zlK%w+g?RdT$NYa_tHPm_2}u8^0q+;&6^?fc3jH5OMHQ)p_;<;kLBBkc0kC>zm=?5a G^1lFiW