Merge branch 'dev' into options-improvements

This commit is contained in:
Atony authored and GitHub committed 2026-10-17 21:43:45 -05:00
commit 0224ac95bc
6 files changed
+140 -62

No files matched your search

+21 -7
View File
@@ -202,12 +202,6 @@ public class MiraApiSettings(ConfigFile config) : LocalSettingsTab(config)
[LocalSliderSetting(min: 0.3f, max: 2f, suffixType: MiraNumberSuffixes.Multiplier, formatString: "0.00", displayValue: true)] [LocalSliderSetting(min: 0.3f, max: 2f, suffixType: MiraNumberSuffixes.Multiplier, formatString: "0.00", displayValue: true)]
public ConfigEntry<float> TopRightButtonsFactorSlider { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.TopRightButtonScaleFactor", 1f); public ConfigEntry<float> TopRightButtonsFactorSlider { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.TopRightButtonScaleFactor", 1f);
/// <summary>
/// Gets the scale of the match info guide.
/// </summary>
[LocalSliderSetting(min: 0.5f, max: 1f, suffixType: MiraNumberSuffixes.Multiplier, formatString: "0.00", displayValue: true)]
public ConfigEntry<float> MatchInfoGuideScaleFactor { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.MatchInfoGuideScaleFactor", 1f);
/// <summary> /// <summary>
/// Gets the fps specified by the player. /// Gets the fps specified by the player.
/// </summary> /// </summary>
@@ -226,11 +220,24 @@ public class MiraApiSettings(ConfigFile config) : LocalSettingsTab(config)
[LocalToggleSetting] [LocalToggleSetting]
public ConfigEntry<bool> ShowKeybinds { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.ShowKeybindsOnButtons", true); public ConfigEntry<bool> ShowKeybinds { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.ShowKeybindsOnButtons", true);
/// <summary>
/// Gets the scale of the match info guide.
/// </summary>
[LocalSliderSetting(min: 0.5f, max: 1f, suffixType: MiraNumberSuffixes.Multiplier, formatString: "0.00", displayValue: true)]
public ConfigEntry<float> MatchInfoGuideScaleFactor { get; private set; } = config.Bind("MiraApi.MatchInfoGuide", "MiraApi.MatchInfoGuideScaleFactor", 1f);
/// <summary> /// <summary>
/// Gets the flag indicating whether the wiki is on the bottom row. /// Gets the flag indicating whether the wiki is on the bottom row.
/// </summary> /// </summary>
[LocalToggleSetting] [LocalToggleSetting]
public ConfigEntry<bool> WikiOnBottomRow { get; private set; } = config.Bind("MiraApi.VisualsUi", "MiraApi.WikiOnBottomRow", true); public ConfigEntry<bool> WikiOnBottomRow { get; private set; } = config.Bind("MiraApi.MatchInfoGuide", "MiraApi.WikiOnBottomRow", true);
/// <summary>
/// Gets the flag indicating the position for the wiki's tabs.
/// </summary>
[LocalEnumSetting(names: ["MiraApi.WikiTabPosition.LeftSide", "MiraApi.WikiTabPosition.RightSide", "MiraApi.WikiTabPosition.Below"])]
public ConfigEntry<MatchInfoTabPos> WikiTabPosition { get; private set; } =
config.Bind("MiraApi.MatchInfoGuide", "MiraApi.WikiTabPosition", MiraApiPlugin.IsMobile ? MatchInfoTabPos.RightSide : MatchInfoTabPos.LeftSide);
/// <summary> /// <summary>
/// Gets whether to show the red flash from sabotages. /// Gets whether to show the red flash from sabotages.
@@ -250,3 +257,10 @@ public class MiraApiSettings(ConfigFile config) : LocalSettingsTab(config)
[LocalToggleSetting] [LocalToggleSetting]
public ConfigEntry<bool> EnableVariableColors { get; private set; } = config.Bind("MiraApi.Accessibility", "MiraApi.EnableVariableColors", true); public ConfigEntry<bool> EnableVariableColors { get; private set; } = config.Bind("MiraApi.Accessibility", "MiraApi.EnableVariableColors", true);
} }
public enum MatchInfoTabPos
{
LeftSide,
RightSide,
Below,
}
@@ -2,9 +2,9 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using HarmonyLib; using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using MiraAPI.LocalSettings; using MiraAPI.LocalSettings;
using MiraAPI.Utilities.Assets; using MiraAPI.Utilities.Assets;
using Reactor.Utilities.Extensions;
using UnityEngine; using UnityEngine;
using UnityEngine.Events; using UnityEngine.Events;
using UnityEngine.UI; using UnityEngine.UI;
@@ -15,12 +15,18 @@ namespace MiraAPI.Patches.LocalSettings;
public static class OptionsMenuPatches public static class OptionsMenuPatches
{ {
private static readonly Dictionary<int, List<GameObject>> TabButtons = []; private static readonly Dictionary<int, List<GameObject>> TabButtons = [];
private static int currentPage = 1; private static int _currentPage = 1;
internal static OptionsMenuBehaviour? Instance { get; private set; } internal static OptionsMenuBehaviour? Instance { get; private set; }
[SuppressMessage("Critical Code Smell", "S2223:Non-constant static fields should not be visible", Justification = "Internal behaviour that does not need property-level validation.")] [SuppressMessage(
[SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:Fields should be private", Justification = "Read above.")] "Critical Code Smell",
"S2223:Non-constant static fields should not be visible",
Justification = "Internal behaviour that does not need property-level validation.")]
[SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules",
"SA1401:Fields should be private",
Justification = "Read above.")]
internal static BoxCollider2D MaskCollider = null!; internal static BoxCollider2D MaskCollider = null!;
private static SpriteRenderer? background; private static SpriteRenderer? background;
@@ -69,7 +75,7 @@ public static class OptionsMenuPatches
MaskCollider.isTrigger = true; MaskCollider.isTrigger = true;
MaskCollider.enabled = true; MaskCollider.enabled = true;
currentPage = 1; _currentPage = 1;
TabButtons.Clear(); TabButtons.Clear();
float yOffset = 0; float yOffset = 0;
var i = 0; var i = 0;
@@ -83,7 +89,7 @@ public static class OptionsMenuPatches
{ {
var button = settings.CreateTabButton(__instance, ref tabIdx, ref yOffset); var button = settings.CreateTabButton(__instance, ref tabIdx, ref yOffset);
button.GetComponent<TabGroup>().Content = tab; button.GetComponent<TabGroup>().Content = tab;
button.SetActive(page == currentPage); button.SetActive(page == _currentPage);
if (!TabButtons.TryGetValue(page, out var list)) if (!TabButtons.TryGetValue(page, out var list))
{ {
@@ -105,20 +111,6 @@ public static class OptionsMenuPatches
} }
} }
static void ChangePage(int increase)
{
currentPage += increase;
if (currentPage > TabButtons.Count)
{
currentPage = 1;
}
if (currentPage < 1)
{
currentPage = TabButtons.Count;
}
}
// Create page buttons // Create page buttons
// TODO: In-game menu has no close button. I tried making one from scratch but failed. Add one later plz // TODO: In-game menu has no close button. I tried making one from scratch but failed. Add one later plz
if (TabButtons.Count <= 1) if (TabButtons.Count <= 1)
@@ -126,44 +118,56 @@ public static class OptionsMenuPatches
return; return;
} }
var nextButton = Object.Instantiate(__instance.BackButton, __instance.transform).GetComponent<PassiveButton>(); CreatePageButton(__instance, 3.2f, false, 1);
nextButton.transform.localPosition = new Vector3(3.2f, 2.6f, -10); CreatePageButton(__instance, 2.9f, true, -1);
nextButton.transform.localScale = new Vector2(0.25f, 0.25f); }
var nextRend = nextButton.GetComponent<SpriteRenderer>();
nextRend.sprite = MiraAssets.NextButton.LoadAsset();
nextButton.gameObject.GetComponent<CloseButtonConsoleBehaviour>().DestroyImmediate();
var nextRollover = nextButton.gameObject.AddComponent<ButtonRolloverHandler>(); private static void CreatePageButton(OptionsMenuBehaviour menu, float x, bool flip, int direction)
nextRollover.Target = nextRend; {
nextRollover.OverColor = Palette.AcceptedGreen; var obj = new GameObject("PageButton") { layer = 5 };
obj.transform.SetParent(menu.transform);
obj.transform.localPosition = new Vector3(x, 2.6f, -10);
obj.transform.localScale = new Vector3(0.25f, 0.25f, 1);
nextButton.OnClick = new Button.ButtonClickedEvent(); var rend = obj.AddComponent<SpriteRenderer>();
nextButton.OnClick.AddListener( rend.sprite = MiraAssets.NextButton.LoadAsset();
rend.flipX = flip;
var col = obj.AddComponent<BoxCollider2D>();
col.size = rend.sprite.bounds.size;
var rollover = obj.AddComponent<ButtonRolloverHandler>();
rollover.Target = rend;
rollover.OverColor = Palette.AcceptedGreen;
rollover.OutColor = Color.white;
var button = obj.AddComponent<PassiveButton>();
button.Colliders = new Il2CppReferenceArray<Collider2D>([col]);
button.OnClick = new Button.ButtonClickedEvent();
button.OnClick.AddListener(
(UnityAction)(() => (UnityAction)(() =>
{ {
ChangePage(1); ChangePage(direction);
UpdatePages(); UpdatePages();
})); }));
button.OnMouseOver = new UnityEvent();
button.OnMouseOver.AddListener((UnityAction)(() => rollover.DoMouseOver()));
button.OnMouseOut = new UnityEvent();
button.OnMouseOut.AddListener((UnityAction)(() => rollover.DoMouseOut()));
}
var backButton = Object.Instantiate(__instance.BackButton, __instance.transform).GetComponent<PassiveButton>(); private static void ChangePage(int increase)
backButton.transform.localPosition = new Vector3(2.9f, 2.6f, -10); {
backButton.transform.localScale = new Vector2(0.25f, 0.25f); _currentPage += increase;
var backRend = backButton.GetComponent<SpriteRenderer>(); if (_currentPage > TabButtons.Count)
backRend.sprite = MiraAssets.NextButton.LoadAsset(); {
backRend.flipX = true; _currentPage = 1;
backButton.gameObject.GetComponent<CloseButtonConsoleBehaviour>().DestroyImmediate(); }
var backRollover = backButton.gameObject.AddComponent<ButtonRolloverHandler>(); if (_currentPage < 1)
backRollover.Target = backRend; {
backRollover.OverColor = Palette.AcceptedGreen; _currentPage = TabButtons.Count;
}
backButton.OnClick = new Button.ButtonClickedEvent();
backButton.OnClick.AddListener(
(UnityAction)(() =>
{
ChangePage(-1);
UpdatePages();
}));
} }
/// <summary> /// <summary>
@@ -194,7 +198,7 @@ public static class OptionsMenuPatches
public static void OpenPostfix() public static void OpenPostfix()
{ {
LocalSettingsManager.AvailableTabs.ForEach(CustomClose); LocalSettingsManager.AvailableTabs.ForEach(CustomClose);
currentPage = 1; _currentPage = 1;
UpdatePages(); UpdatePages();
} }
@@ -204,9 +208,7 @@ public static class OptionsMenuPatches
{ {
pages.Value? pages.Value?
.Where(x => x != null) .Where(x => x != null)
.Do( .Do(x => x?.SetActive(pages.Key == _currentPage));
x => x?.SetActive(
pages.Key == currentPage));
} }
} }
+52
View File
@@ -40,6 +40,8 @@ public static class RoleGuidePatches
private static readonly List<DetailedPanel> ModifierEntries = []; private static readonly List<DetailedPanel> ModifierEntries = [];
private static readonly List<string> UntrackedRolePanelDiagnostics = []; private static readonly List<string> UntrackedRolePanelDiagnostics = [];
private static GridLayoutGroup tabButtonContainer;
private static SpriteRenderer tabContainerRend;
private static GameObject searchComponentContainer; private static GameObject searchComponentContainer;
private static SpriteRenderer _searchIconIdle; private static SpriteRenderer _searchIconIdle;
private static SpriteRenderer _searchIconHover; private static SpriteRenderer _searchIconHover;
@@ -317,6 +319,8 @@ public static class RoleGuidePatches
Initialize(__instance); Initialize(__instance);
} }
SetUpTabGrids(LocalSettingsTabSingleton<MiraApiSettings>.Instance.WikiTabPosition.Value);
if (RoleEntries.Count == 0) if (RoleEntries.Count == 0)
{ {
BuildEntries(); BuildEntries();
@@ -385,6 +389,40 @@ public static class RoleGuidePatches
return false; return false;
} }
private static void SetUpTabGrids(MatchInfoTabPos position)
{
tabButtonContainer.startCorner = GridLayoutGroup.Corner.UpperLeft;
tabButtonContainer.startAxis = GridLayoutGroup.Axis.Horizontal;
tabButtonContainer.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
tabContainerRend.transform.localScale = new Vector3(0.4f, 0.4125f, 1);
tabContainerRend.transform.localRotation = Quaternion.Euler(new Vector3(0, 0, 0));
switch (position)
{
case MatchInfoTabPos.LeftSide:
tabButtonContainer.childAlignment = TextAnchor.MiddleLeft;
tabButtonContainer.transform.localPosition = new Vector3(-3.95f, 0, -0.2f);
tabContainerRend.transform.localPosition = new Vector3(0.325f, 0, 0);
break;
case MatchInfoTabPos.RightSide:
tabButtonContainer.childAlignment = TextAnchor.MiddleRight;
tabButtonContainer.transform.localPosition = new Vector3(3.95f, 0, -0.2f);
tabContainerRend.transform.localPosition = new Vector3(-0.325f, 0, 0);
break;
default:
tabButtonContainer.startCorner = GridLayoutGroup.Corner.LowerLeft;
tabButtonContainer.childAlignment = TextAnchor.LowerCenter;
tabButtonContainer.startAxis = GridLayoutGroup.Axis.Vertical;
tabButtonContainer.constraint = GridLayoutGroup.Constraint.FixedRowCount;
tabButtonContainer.transform.localPosition = new Vector3(0, -2.15f, -0.2f);
tabContainerRend.transform.localPosition = new Vector3(-0.025f, 0.3f, 0);
tabContainerRend.transform.localRotation = Quaternion.Euler(new Vector3(0, 0, 270));
tabContainerRend.transform.localScale = new Vector3(0.4f, 0.475f, 1);
break;
}
tabButtonContainer.constraintCount = 1;
}
private static void Initialize(MatchInfoGuide instance) private static void Initialize(MatchInfoGuide instance)
{ {
if (_uiInitialized) if (_uiInitialized)
@@ -411,6 +449,17 @@ public static class RoleGuidePatches
searchComponentContainer.transform.localPosition = Vector3.zero; searchComponentContainer.transform.localPosition = Vector3.zero;
instance.MatchInfoParent.transform.GetChild(1).transform.SetParent(searchComponentContainer.transform); instance.MatchInfoParent.transform.GetChild(1).transform.SetParent(searchComponentContainer.transform);
var newContainer = new GameObject("TabButtonContainer");
newContainer.transform.SetParent(instance.MatchInfoParent.transform);
tabButtonContainer = newContainer.AddComponent<GridLayoutGroup>();
tabButtonContainer.cellSize = new Vector2(0.65f, 0.55f);
tabButtonContainer.rectTransform.offsetMax = tabButtonContainer.rectTransform.offsetMin = Vector2.zero;
tabContainerRend = new GameObject("BackRenderer").AddComponent<SpriteRenderer>();
tabContainerRend.transform.SetParent(newContainer.transform);
tabContainerRend.sprite = MiraAssets.TabButtonContainer.LoadAsset();
tabContainerRend.transform.localPosition = Vector3.zero;
tabContainerRend.gameObject.layer = 5;
var sortingOrderButton = Object.Instantiate( var sortingOrderButton = Object.Instantiate(
HudManager.Instance.SettingsButton, HudManager.Instance.SettingsButton,
searchComponentContainer.transform); searchComponentContainer.transform);
@@ -661,6 +710,7 @@ public static class RoleGuidePatches
MiraAssets.WikiModifiersButtonIdleSprite, MiraAssets.WikiModifiersButtonIdleSprite,
MiraAssets.WikiModifiersButtonOpenSprite, MiraAssets.WikiModifiersButtonOpenSprite,
MiraAssets.WikiModifiersButtonHoverSprite); MiraAssets.WikiModifiersButtonHoverSprite);
modifiersButton.name = "ModifiersButton";
modifiersButton.OnClick = new Button.ButtonClickedEvent(); modifiersButton.OnClick = new Button.ButtonClickedEvent();
modifiersButton.OnClick.AddListener((Action)(() => OpenModifiersTab())); modifiersButton.OnClick.AddListener((Action)(() => OpenModifiersTab()));
instance.TabButtons.Add(modifiersButton); instance.TabButtons.Add(modifiersButton);
@@ -765,6 +815,8 @@ public static class RoleGuidePatches
buttonCollider.size = new Vector2(0.8f, 0.74f); buttonCollider.size = new Vector2(0.8f, 0.74f);
buttonCollider.offset = Vector2.zero; buttonCollider.offset = Vector2.zero;
button.transform.localScale = new Vector3(0.7f, 0.7f, 1); button.transform.localScale = new Vector3(0.7f, 0.7f, 1);
button.transform.SetParent(tabButtonContainer.transform);
button.gameObject.AddComponent<RectTransform>();
} }
private static void SetupSearchButton(PassiveButton button, string objName, Action onClick, Sprite inactive, Sprite hover, Vector3 pos, out SpriteRenderer inactiveSprite, out SpriteRenderer hoverSprite) private static void SetupSearchButton(PassiveButton button, string objName, Action onClick, Sprite inactive, Sprite hover, Vector3 pos, out SpriteRenderer inactiveSprite, out SpriteRenderer hoverSprite)
+6 -1
View File
@@ -2,6 +2,7 @@
<resources> <resources>
<string name="MiraApi">Mira API</string> <string name="MiraApi">Mira API</string>
<string name="MiraApi.VisualsUi">Visuals/UI</string> <string name="MiraApi.VisualsUi">Visuals/UI</string>
<string name="MiraApi.MatchInfoGuide">Match Info Guide</string>
<string name="MiraApi.Accessibility">Accessibility</string> <string name="MiraApi.Accessibility">Accessibility</string>
<string name="MiraApi.MiraApiBrand">MiraAPI</string> <string name="MiraApi.MiraApiBrand">MiraAPI</string>
<string name="MiraApi.ShowModifiersHudOnLeftSide">Show Modifiers HUD on Left Side</string> <string name="MiraApi.ShowModifiersHudOnLeftSide">Show Modifiers HUD on Left Side</string>
@@ -9,8 +10,12 @@
<string name="MiraApi.ButtonScaleFactor">Button Scale Factor</string> <string name="MiraApi.ButtonScaleFactor">Button Scale Factor</string>
<string name="MiraApi.TopRightButtonScaleFactor">Top-Right UI Scale Factor</string> <string name="MiraApi.TopRightButtonScaleFactor">Top-Right UI Scale Factor</string>
<string name="MiraApi.MatchInfoGuideScaleFactor">Match Info Guide Scale Factor</string> <string name="MiraApi.MatchInfoGuideScaleFactor">Match Info Guide Scale Factor</string>
<string name="MiraApi.WikiTabPosition">Tab Buttons Grid Placement</string>
<string name="MiraApi.WikiTabPosition.LeftSide">Left-Side</string>
<string name="MiraApi.WikiTabPosition.RightSide">Right-Side</string>
<string name="MiraApi.WikiTabPosition.Below">Below UI</string>
<string name="MiraApi.MaxFps">Max FPS</string> <string name="MiraApi.MaxFps">Max FPS</string>
<string name="MiraApi.WikiOnBottomRow">Display Wiki on Bottom Row</string> <string name="MiraApi.WikiOnBottomRow">Display Button on Bottom Row</string>
<string name="MiraApi.EnableSabotageFlashes">Enable Sabotage Flashes</string> <string name="MiraApi.EnableSabotageFlashes">Enable Sabotage Flashes</string>
<string name="MiraApi.EnableSabotageBlare">Enable Sabotage Blare</string> <string name="MiraApi.EnableSabotageBlare">Enable Sabotage Blare</string>
<string name="MiraApi.EnableVariableColors">Enable Variable Color Changes</string> <string name="MiraApi.EnableVariableColors">Enable Variable Color Changes</string>
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+5
View File
@@ -370,5 +370,10 @@ public static class MiraAssets
/// </summary> /// </summary>
public static LoadableResourceAsset PageRightIdle { get; } = new("MiraAPI.Resources.Wiki.PageRightIdle.png"); public static LoadableResourceAsset PageRightIdle { get; } = new("MiraAPI.Resources.Wiki.PageRightIdle.png");
/// <summary>
/// Gets the sprite used below the tab icons in the wiki.
/// </summary>
public static LoadableResourceAsset TabButtonContainer { get; } = new("MiraAPI.Resources.Wiki.TabButtonContainer.png");
internal static LoadableResourceAsset BlankSprite { get; } = new("MiraAPI.Resources.BlankSprite.png"); internal static LoadableResourceAsset BlankSprite { get; } = new("MiraAPI.Resources.BlankSprite.png");
} }