From 4c9f0f0178d4a819bae7f5102f2d5e102a4a248c Mon Sep 17 00:00:00 2001
From: Atony <75191600+AtonyGit@users.noreply.github.com>
Date: Sun, 8 Feb 2026 23:56:34 -0600
Subject: [PATCH 1/2] Add compatibility with MiraAPI / TOU Mira
---
src/AleLuduMod/AleLuduMod.csproj | 2 +-
src/AleLuduMod/AleLuduModPlugin.cs | 10 ++--
src/AleLuduMod/ModCompatibility.cs | 81 ++++++++++++++++++++++++++++++
3 files changed, 89 insertions(+), 4 deletions(-)
create mode 100644 src/AleLuduMod/ModCompatibility.cs
diff --git a/src/AleLuduMod/AleLuduMod.csproj b/src/AleLuduMod/AleLuduMod.csproj
index 854a6e8..d19f4d8 100644
--- a/src/AleLuduMod/AleLuduMod.csproj
+++ b/src/AleLuduMod/AleLuduMod.csproj
@@ -11,7 +11,7 @@
Steam
- 2025.3.25
+ 2025.9.9
diff --git a/src/AleLuduMod/AleLuduModPlugin.cs b/src/AleLuduMod/AleLuduModPlugin.cs
index 1502d84..1fd453e 100644
--- a/src/AleLuduMod/AleLuduModPlugin.cs
+++ b/src/AleLuduMod/AleLuduModPlugin.cs
@@ -22,9 +22,13 @@ public partial class AleLuduModPlugin : BasePlugin
public override void Load()
{
- NormalGameOptionsV09.RecommendedImpostors = NormalGameOptionsV09.MaxImpostors = Enumerable.Repeat(36, 36).ToArray();
- NormalGameOptionsV09.MinPlayers = Enumerable.Repeat(4, 36).ToArray();
- HideNSeekGameOptionsV09.MinPlayers = Enumerable.Repeat(4, 36).ToArray();
+ NormalGameOptionsV10.RecommendedImpostors = NormalGameOptionsV10.MaxImpostors = Enumerable.Repeat(36, 36).ToArray();
+ NormalGameOptionsV10.MinPlayers = Enumerable.Repeat(4, 36).ToArray();
+ HideNSeekGameOptionsV10.MinPlayers = Enumerable.Repeat(4, 36).ToArray();
+
+ IL2CPPChainloader.Instance.Finished +=
+ ModCompatibility
+ .Initialize; // Initialise AFTER the mods are loaded to ensure maximum parity
Force4Columns = Config.Bind("Settings", "Force 4 columns", true, "Always display 4 columns in meeting, vitals, etc.");
diff --git a/src/AleLuduMod/ModCompatibility.cs b/src/AleLuduMod/ModCompatibility.cs
new file mode 100644
index 0000000..fa7780f
--- /dev/null
+++ b/src/AleLuduMod/ModCompatibility.cs
@@ -0,0 +1,81 @@
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using BepInEx.Unity.IL2CPP;
+using HarmonyLib;
+using Reactor.Utilities;
+using UnityEngine;
+
+namespace AleLuduMod;
+
+public static class ModCompatibility
+{
+ public const string MiraApiGuid = "mira.api";
+ public static bool MiraApiLoaded { get; private set; }
+ private static BasePlugin MiraApiPlugin { get; set; }
+ private static Assembly MiraApiAssembly { get; set; }
+ private static Type[] MiraApiTypes { get; set; }
+ public static float XStart = -0.8f;
+ public static float YStart = 2.15f;
+ public static float XOffset = 1.95f;
+ public static float YOffset = -0.65f;
+
+ public static void Initialize()
+ {
+ InitMiraApi();
+ }
+
+ private static void InitMiraApi()
+ {
+ if (!IL2CPPChainloader.Instance.Plugins.TryGetValue(MiraApiGuid, out var value))
+ {
+ return;
+ }
+
+ MiraApiPlugin = (value.Instance as BasePlugin)!;
+ MiraApiAssembly = MiraApiPlugin.GetType().Assembly;
+
+ MiraApiTypes = AccessTools.GetTypesFromAssembly(MiraApiAssembly);
+
+ var playerMenu = MiraApiTypes.First(t => t.Name == "CustomPlayerMenu");
+ var menuBegin = AccessTools.Method(playerMenu, "Begin", new [] {typeof(Func), typeof(Action)});
+
+ var compatType = typeof(ModCompatibility);
+ var harmony = new Harmony("aleludu.miraapi.patch");
+ harmony.Patch(menuBegin, null,
+ new HarmonyMethod(AccessTools.Method(compatType, nameof(BeginPostfix))));
+
+ MiraApiLoaded = true;
+ Logger.Message("MiraAPI was detected and patched");
+ }
+ public static void BeginPostfix(dynamic __instance, Func playerMatch, Action onClick)
+ {
+ var targets = __instance.potentialVictims as List;
+ if (targets == null || targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value)
+ {
+ // dont change layout if players count is below 16
+ return;
+ }
+
+ var i = 0;
+
+ foreach (var panel in targets)
+ {
+ panel.gameObject.SetActive(true);
+
+ var row = i / 4;
+ var col = i % 4;
+ var buttonTransform = panel.transform;
+ buttonTransform.localScale *= 0.75f;
+ buttonTransform.localPosition = new Vector3(
+ XStart + XOffset * col * 1.1f - 2.65f,
+ YStart + YOffset * row * 0.865f - 0.65f,
+ buttonTransform.localPosition.z
+ );
+ i++;
+ }
+ }
+}
\ No newline at end of file
From 2f53a60ecf8e148f2592432e7d6b082453e45ffe Mon Sep 17 00:00:00 2001
From: Atony <75191600+AtonyGit@users.noreply.github.com>
Date: Mon, 9 Feb 2026 00:13:37 -0600
Subject: [PATCH 2/2] Adjust positions to line up better
---
src/AleLuduMod/ModCompatibility.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/AleLuduMod/ModCompatibility.cs b/src/AleLuduMod/ModCompatibility.cs
index fa7780f..ddb3035 100644
--- a/src/AleLuduMod/ModCompatibility.cs
+++ b/src/AleLuduMod/ModCompatibility.cs
@@ -71,8 +71,8 @@ public static void BeginPostfix(dynamic __instance, Func pl
var buttonTransform = panel.transform;
buttonTransform.localScale *= 0.75f;
buttonTransform.localPosition = new Vector3(
- XStart + XOffset * col * 1.1f - 2.65f,
- YStart + YOffset * row * 0.865f - 0.65f,
+ XStart + XOffset * col * 1.1f - 2.4f,
+ YStart + YOffset * row * 0.9255f - 0.65f,
buttonTransform.localPosition.z
);
i++;