From eae0024ec3ddbb9b387b9f73b9f55c045e4b96cb Mon Sep 17 00:00:00 2001
From: Atony <75191600+AtonyGit@users.noreply.github.com>
Date: Mon, 22 Dec 2025 21:41:36 -0600
Subject: [PATCH] Add Accessibility settings for sabotages
---
MiraAPI/Keybinds/BaseKeybind.cs | 2 +-
MiraAPI/Keybinds/MiraKeybind.cs | 2 +-
MiraAPI/MiraApiSettings.cs | 14 ++++-
.../Accessibility/HudManagerFlashPatches.cs | 63 +++++++++++++++++++
.../Roles/LogicRoleSelectionHnsPatch.cs | 4 +-
.../Roles/LogicRoleSelectionNormalPatch.cs | 2 +-
6 files changed, 81 insertions(+), 6 deletions(-)
create mode 100644 MiraAPI/Patches/Accessibility/HudManagerFlashPatches.cs
diff --git a/MiraAPI/Keybinds/BaseKeybind.cs b/MiraAPI/Keybinds/BaseKeybind.cs
index e4e6ac8..525ffef 100644
--- a/MiraAPI/Keybinds/BaseKeybind.cs
+++ b/MiraAPI/Keybinds/BaseKeybind.cs
@@ -69,4 +69,4 @@ public class BaseKeybind
{
Handler -= action;
}
-}
\ No newline at end of file
+}
diff --git a/MiraAPI/Keybinds/MiraKeybind.cs b/MiraAPI/Keybinds/MiraKeybind.cs
index 52d64a1..0ce47ea 100644
--- a/MiraAPI/Keybinds/MiraKeybind.cs
+++ b/MiraAPI/Keybinds/MiraKeybind.cs
@@ -9,7 +9,7 @@ namespace MiraAPI.Keybinds;
public class MiraKeybind : BaseKeybind
{
///
- /// Gets name of the keybind
+ /// Gets name of the keybind.
///
public string Name { get; }
diff --git a/MiraAPI/MiraApiSettings.cs b/MiraAPI/MiraApiSettings.cs
index 397caa6..60e5e6a 100644
--- a/MiraAPI/MiraApiSettings.cs
+++ b/MiraAPI/MiraApiSettings.cs
@@ -6,7 +6,7 @@ using MiraAPI.Utilities.Assets;
namespace MiraAPI;
///
-/// Mira API Config File Handler
+/// Mira API Config File Handler.
///
public class MiraApiSettings(ConfigFile config) : LocalSettingsTab(config)
{
@@ -39,4 +39,16 @@ public class MiraApiSettings(ConfigFile config) : LocalSettingsTab(config)
///
[LocalToggleSetting]
public ConfigEntry PrettyTaskAdder { get; private set; } = config.Bind("Freeplay", "Pretty Task Laptop", true);
+
+ ///
+ /// Gets whether to show the red flash from sabotages.
+ ///
+ [LocalToggleSetting]
+ public ConfigEntry EnableSabotageFlashes { get; private set; } = config.Bind("Accessibility", "Enable Sabotage Flashes", true);
+
+ ///
+ /// Gets whether to enable the sabotage sound effects or not.
+ ///
+ [LocalToggleSetting]
+ public ConfigEntry EnableSabotageBlares { get; private set; } = config.Bind("Accessibility", "Enable Sabotage Blare", true);
}
diff --git a/MiraAPI/Patches/Accessibility/HudManagerFlashPatches.cs b/MiraAPI/Patches/Accessibility/HudManagerFlashPatches.cs
new file mode 100644
index 0000000..e3d3ab4
--- /dev/null
+++ b/MiraAPI/Patches/Accessibility/HudManagerFlashPatches.cs
@@ -0,0 +1,63 @@
+using System.Collections;
+using BepInEx.Unity.IL2CPP.Utils.Collections;
+using HarmonyLib;
+using MiraAPI.LocalSettings;
+using UnityEngine;
+
+namespace MiraAPI.Patches.Accessibility;
+[HarmonyPatch]
+public static class HudManagerFlashPatches
+{
+ [HarmonyPatch(typeof(HudManager), nameof(HudManager.StartReactorFlash))]
+ [HarmonyPrefix]
+ public static bool ReactorFlashPrefix(HudManager __instance)
+ {
+ if (__instance.ReactorFlash == null)
+ {
+ __instance.ReactorFlash = __instance.StartCoroutine(CoReactorFlash().WrapToIl2Cpp());
+ }
+
+ return false;
+ }
+ [HarmonyPatch(typeof(HudManager), nameof(HudManager.StartOxyFlash))]
+ [HarmonyPrefix]
+ public static bool OxygenFlashPrefix(HudManager __instance)
+ {
+ if (__instance.OxyFlash == null)
+ {
+ __instance.OxyFlash = __instance.StartCoroutine(CoReactorFlash().WrapToIl2Cpp());
+ }
+
+ return false;
+ }
+ public static IEnumerator CoReactorFlash()
+ {
+ if (!HudManager.InstanceExists)
+ {
+ yield break;
+ }
+ var hudManager = HudManager.Instance;
+ WaitForSeconds wait = new WaitForSeconds(1f);
+ bool light = false;
+
+ hudManager.FullScreen.color = new Color(1f, 0f, 0f, 0.37254903f);
+ while (true)
+ {
+ var settins = LocalSettingsTabSingleton.Instance;
+ hudManager.FullScreen.gameObject.SetActive(settins.EnableSabotageFlashes.Value && !hudManager.FullScreen.gameObject.activeSelf);
+ if (settins.EnableSabotageBlares.Value)
+ {
+ SoundManager.Instance.PlaySound(ShipStatus.Instance.SabotageSound, false, 1f, null);
+ }
+ if (hudManager.lightFlashHandle == null)
+ {
+ hudManager.lightFlashHandle = DestroyableSingleton.Instance.AllocateLight();
+ hudManager.lightFlashHandle.color = new Color(1f, 0f, 0f, 1f);
+ hudManager.lightFlashHandle.intensity = 1f;
+ }
+ light = !light;
+ hudManager.lightFlashHandle.color.SetAlpha(light ? 1f : 0f);
+ yield return wait;
+ }
+ }
+}
diff --git a/MiraAPI/Patches/Roles/LogicRoleSelectionHnsPatch.cs b/MiraAPI/Patches/Roles/LogicRoleSelectionHnsPatch.cs
index 4a9547b..c3ed277 100644
--- a/MiraAPI/Patches/Roles/LogicRoleSelectionHnsPatch.cs
+++ b/MiraAPI/Patches/Roles/LogicRoleSelectionHnsPatch.cs
@@ -39,7 +39,7 @@ public static class LogicRoleSelectionHnsPatch
foreach (RoleManager.RoleAssignmentData roleAssignmentData in guaranteedRoles.Select((x) =>
new RoleManager.RoleAssignmentData(x, roleOptions.GetNumPerGame(x.Role), 100)))
{
- for (;;)
+ while (true)
{
RoleManager.RoleAssignmentData roleAssignmentData2 = roleAssignmentData;
int count = roleAssignmentData2.Count;
@@ -122,7 +122,7 @@ public static class LogicRoleSelectionHnsPatch
foreach (RoleManager.RoleAssignmentData roleAssignmentData in guaranteedRoles.Select((x) =>
new RoleManager.RoleAssignmentData(x, roleOptions.GetNumPerGame(x.Role), 100)))
{
- for (;;)
+ while (true)
{
RoleManager.RoleAssignmentData roleAssignmentData2 = roleAssignmentData;
int count = roleAssignmentData2.Count;
diff --git a/MiraAPI/Patches/Roles/LogicRoleSelectionNormalPatch.cs b/MiraAPI/Patches/Roles/LogicRoleSelectionNormalPatch.cs
index 0d00008..b0540bb 100644
--- a/MiraAPI/Patches/Roles/LogicRoleSelectionNormalPatch.cs
+++ b/MiraAPI/Patches/Roles/LogicRoleSelectionNormalPatch.cs
@@ -36,7 +36,7 @@ public static class LogicRoleSelectionNormalPatch
foreach (RoleManager.RoleAssignmentData roleAssignmentData in guaranteedRoles.Select((x) =>
new RoleManager.RoleAssignmentData(x, roleOptions.GetNumPerGame(x.Role), 100)))
{
- for (;;)
+ while (true)
{
RoleManager.RoleAssignmentData roleAssignmentData2 = roleAssignmentData;
int count = roleAssignmentData2.Count;