Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of For The Company Beta v3.0.0
plugins/Darkbrewery-Emblem/Emblem.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Emblem; using Emblem.Components; using Emblem.Managers; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Emblem")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Emblem")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e4927ee1-3a47-4f93-8784-804356949316")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("Darkbrewery.Emblem", "Emblem", "1.3.2")] public class EmblemPlugin : BaseUnityPlugin { private UIComponent uiComponent; private HeaderReplacement headerReplacement; private Boardwalk boardwalk; private BackgroundManager backgroundManager; private LoadingText loadingText; private MenuMoodSetter menuMoodSetter; private Harmony harmony; private CustomMediaManager customMediaManager; private SceneManagerHelper sceneManagerHelper; private InterfaceDecorator interfaceDecorator; private VersionStyler versionStyler; private Slideshow slideshow; private void Awake() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown LogWarden.Initialize(((BaseUnityPlugin)this).Logger); LogWarden.LogInfo(" ##################################################################### "); LogWarden.LogInfo(" %% %% "); LogWarden.LogInfo("# EEEEE M M BBBBB L EEEEE M M #"); LogWarden.LogInfo(" * == E MM MM B B L E MM MM == * "); LogWarden.LogInfo(" * * EEEE M M M M BBBBB L EEEE M M M M * * "); LogWarden.LogInfo(" * == E M M M B B L E M M M == * "); LogWarden.LogInfo("# EEEEE M M BBBBB LLLLL EEEEE M M #"); LogWarden.LogInfo(" %% %% "); LogWarden.LogInfo(" ######################### BY DARKBREWERY ############################ "); LogWarden.LogInfo("Stirring from darkness..."); try { harmony = new Harmony("com.darkbrewery.emblem.harmony"); Configurator.InitializeInstance(((BaseUnityPlugin)this).Config); customMediaManager = new CustomMediaManager(); uiComponent = new UIComponent(); backgroundManager = new BackgroundManager(); headerReplacement = new HeaderReplacement(); boardwalk = new Boardwalk(); loadingText = new LoadingText(); menuMoodSetter = new MenuMoodSetter(); versionStyler = new VersionStyler(); slideshow = new Slideshow(((Component)this).transform); interfaceDecorator = new InterfaceDecorator(uiComponent, backgroundManager, headerReplacement, boardwalk, loadingText, menuMoodSetter, versionStyler, slideshow); sceneManagerHelper = new SceneManagerHelper(interfaceDecorator); harmony.PatchAll(); LogWarden.LogInfo("Successfully deployed, its intent shrouded"); } catch (Exception arg) { LogWarden.LogError($"Error initializing Emblem plugin: {arg}"); } } } public class DelayHelper : MonoBehaviour { private static DelayHelper instance; private Dictionary<string, Coroutine> coroutineDictionary = new Dictionary<string, Coroutine>(); private Dictionary<TextMeshProUGUI, Coroutine> typingCoroutines = new Dictionary<TextMeshProUGUI, Coroutine>(); private static DelayHelper GetInstance() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if ((Object)(object)instance == (Object)null) { GameObject val = new GameObject("GlobalDelayHelper"); instance = val.AddComponent<DelayHelper>(); Object.DontDestroyOnLoad((Object)val); } return instance; } public static void StopAll() { foreach (Coroutine value in GetInstance().coroutineDictionary.Values) { ((MonoBehaviour)GetInstance()).StopCoroutine(value); } GetInstance().coroutineDictionary.Clear(); } public static void StartDelayedAction(float delayInSeconds, Action action) { GetInstance().DelayedAction(delayInSeconds, action); } private void DelayedAction(float delayInSeconds, Action action) { ((MonoBehaviour)this).StartCoroutine(DelayCoroutine(delayInSeconds, action)); } private IEnumerator DelayCoroutine(float delayInSeconds, Action action) { yield return (object)new WaitForSeconds(delayInSeconds); action?.Invoke(); } public static void StartRepeatingAction(string name, float intervalInSeconds, Action action) { StopRepeatingAction(name); Coroutine value = ((MonoBehaviour)GetInstance()).StartCoroutine(GetInstance().RepeatingActionCoroutine(intervalInSeconds, action)); GetInstance().coroutineDictionary[name] = value; } public static void StopRepeatingAction(string name) { if ((Object)(object)instance != (Object)null && instance.coroutineDictionary.TryGetValue(name, out var value)) { ((MonoBehaviour)instance).StopCoroutine(value); instance.coroutineDictionary.Remove(name); } } private IEnumerator RepeatingActionCoroutine(float intervalInSeconds, Action action) { while (true) { yield return (object)new WaitForSeconds(intervalInSeconds); action?.Invoke(); } } public static void StartFadeAction(Image image, float duration, Action onComplete = null) { GetInstance().FadeImageCoroutine(image, duration, onComplete); } private void FadeImageCoroutine(Image image, float duration, Action onComplete) { ((MonoBehaviour)this).StartCoroutine(FadeImage(image, duration, onComplete)); } private IEnumerator FadeImage(Image image, float duration, Action onComplete) { float currentTime = 0f; Color startColor = ((Graphic)image).color; Color endColor = new Color(startColor.r, startColor.g, startColor.b, 0f); while (currentTime < duration) { currentTime += Time.deltaTime; ((Graphic)image).color = Color.Lerp(startColor, endColor, currentTime / duration); yield return null; } ((Graphic)image).color = endColor; onComplete?.Invoke(); } public static void StartTypingText(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration = 0.3f, int flashCount = 2) { GetInstance().TypingTextCoroutine(textComponent, text, typingSpeed, flashDuration, flashCount); } private void TypingTextCoroutine(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration, int flashCount) { if (typingCoroutines.TryGetValue(textComponent, out var value)) { ((MonoBehaviour)this).StopCoroutine(value); typingCoroutines.Remove(textComponent); } Coroutine value2 = ((MonoBehaviour)this).StartCoroutine(TypeTextWithCursorFlash(textComponent, text, typingSpeed, flashDuration, flashCount)); typingCoroutines[textComponent] = value2; } private IEnumerator TypeTextWithCursorFlash(TextMeshProUGUI textComponent, string text, float typingSpeed, float flashDuration, int flashCount) { StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < flashCount; j++) { ((TMP_Text)textComponent).text = "_"; yield return (object)new WaitForSeconds(flashDuration); ((TMP_Text)textComponent).text = ""; yield return (object)new WaitForSeconds(flashDuration); } foreach (char value in text) { stringBuilder.Append(value); ((TMP_Text)textComponent).text = stringBuilder.ToString() + "_"; yield return (object)new WaitForSeconds(typingSpeed); ((TMP_Text)textComponent).text = stringBuilder.ToString(); } } } public class EmblemFolder { private readonly string basePluginsPath; private readonly Dictionary<string, string> fullPathCache = new Dictionary<string, string>(); private readonly Dictionary<string, IEnumerable<string>> validPathsCache = new Dictionary<string, IEnumerable<string>>(); private readonly Lazy<IEnumerable<string>> emblemDirectories; public EmblemFolder() { basePluginsPath = Path.Combine(Paths.BepInExRootPath, "plugins"); emblemDirectories = new Lazy<IEnumerable<string>>(() => FindEmblemDirectories()); } private IEnumerable<string> FindEmblemDirectories() { try { return (from dir in Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories) where Path.GetFileName(dir).Equals("Emblem", StringComparison.OrdinalIgnoreCase) select dir).ToList(); } catch (Exception ex) { LogWarden.LogError("[EmblemFolder] Error finding Emblem directories: " + ex.Message); return new List<string>(); } } public string FindFullPath(string inputPath) { if (fullPathCache.TryGetValue(inputPath, out var value)) { return value; } string path = ExtractRelativePathFromEmblem(inputPath); string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories); foreach (string text in directories) { if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase)) { string text2 = Path.Combine(text, path); if (File.Exists(text2) || Directory.Exists(text2)) { fullPathCache[inputPath] = text2; return text2; } } } LogWarden.LogError("[EmblemFolder] Could not find a valid path for: " + inputPath); return null; } public IEnumerable<string> FindAllValidPaths(string inputPathPattern) { if (validPathsCache.TryGetValue(inputPathPattern, out var value)) { return value; } string path = ExtractRelativePathFromEmblem(inputPathPattern); string[] directories = Directory.GetDirectories(basePluginsPath, "*", SearchOption.AllDirectories); List<string> list = new List<string>(); string[] array = directories; foreach (string text in array) { if (text.EndsWith("Emblem", StringComparison.OrdinalIgnoreCase)) { string searchPattern = Path.Combine(text, path); list.AddRange(Directory.GetFiles(text, searchPattern, SearchOption.AllDirectories)); } } validPathsCache[inputPathPattern] = list; return list; } private string ExtractRelativePathFromEmblem(string path) { string[] array = path.Split(new char[2] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); int num = Array.FindIndex(array, (string segment) => segment.Equals("Emblem", StringComparison.OrdinalIgnoreCase)); if (num != -1 && num < array.Length - 1) { return Path.Combine(array.Skip(num + 1).ToArray()); } return path; } } public class ImageFilters { private readonly Configurator configManager; public ImageFilters(Configurator configManager) { this.configManager = configManager; } public void Blend(string targetImagePath, Color vignetteColor) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) Transform val = PathFinder.Probe(targetImagePath); if ((Object)(object)val == (Object)null) { LogWarden.LogError("ImageFilters.Blend: Image with path '" + targetImagePath + "' not found."); return; } GameObject gameObject = ((Component)val).gameObject; Transform val2 = gameObject.transform.Find("VignetteOverlay"); if (!configManager.enableRadiantTaper.Value) { if ((Object)(object)val2 != (Object)null) { Object.Destroy((Object)(object)((Component)val2).gameObject); LogWarden.LogInfo("ImageFilters.Blend: Vignette effect removed from '" + targetImagePath + "'."); } return; } GameObject val3; if ((Object)(object)val2 != (Object)null) { val3 = ((Component)val2).gameObject; } else { val3 = new GameObject("VignetteOverlay"); RectTransform obj = val3.AddComponent<RectTransform>(); ((Transform)obj).SetParent(gameObject.transform, false); ((Transform)obj).SetAsLastSibling(); Rect rect = gameObject.GetComponent<RectTransform>().rect; float width = ((Rect)(ref rect)).width; rect = gameObject.GetComponent<RectTransform>().rect; obj.sizeDelta = new Vector2(width, ((Rect)(ref rect)).height); } Image obj2 = val3.GetComponent<Image>() ?? val3.AddComponent<Image>(); Texture2D val4 = CreateVignetteTexture(((Texture)gameObject.GetComponent<Image>().sprite.texture).width, ((Texture)gameObject.GetComponent<Image>().sprite.texture).height, vignetteColor); obj2.sprite = Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0.5f, 0.5f)); ((Graphic)obj2).raycastTarget = false; } private Texture2D CreateVignetteTexture(int width, int height, Color vignetteColor) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height, (TextureFormat)4, false); Color val2 = default(Color); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { float distance2 = j; float distance3 = width - j; float distance4 = height - i; float distance5 = i; float num = Mathf.Max(CalculateExponentialBlend(distance2, width), CalculateExponentialBlend(distance3, width)); float num2 = Mathf.Max(CalculateExponentialBlend(distance4, height), CalculateExponentialBlend(distance5, height)); float num3 = Mathf.Max(num, num2); ((Color)(ref val2))..ctor(vignetteColor.r, vignetteColor.g, vignetteColor.b, num3); val.SetPixel(j, i, val2); } } val.Apply(); return val; static float CalculateExponentialBlend(float distance, float totalDistance) { float num4 = 0.97f * totalDistance; if (distance > num4) { return Mathf.Clamp01(Mathf.Pow((distance - num4) / (totalDistance - num4), 2f)); } return 0f; } } } public class HotLoad { private GameObject mainButtons; private GameObject loadingScreen; private InputAction toggleAction; public static HotLoad Instance { get; private set; } public static void Initialize() { if (Instance == null) { Instance = new HotLoad(); } } private HotLoad() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown mainButtons = FindObject("Canvas/MenuContainer/MainButtons"); loadingScreen = FindObject("Canvas/MenuContainer/LoadingScreen"); toggleAction = new InputAction((string)null, (InputActionType)0, "<Keyboard>/backslash", (string)null, (string)null, (string)null); toggleAction.performed += delegate { ToggleUI(); }; toggleAction.Enable(); } public void OnDestroy() { InputAction obj = toggleAction; if (obj != null) { obj.Disable(); } InputAction obj2 = toggleAction; if (obj2 != null) { obj2.Dispose(); } Instance = null; } private GameObject FindObject(string path) { Transform val = PathFinder.Probe(path); if ((Object)(object)val != (Object)null) { return ((Component)val).gameObject; } Debug.LogError((object)("[HotLoad] '" + path + "' not found.")); return null; } private void ToggleUI() { if ((Object)(object)mainButtons != (Object)null && (Object)(object)loadingScreen != (Object)null) { bool activeSelf = mainButtons.activeSelf; mainButtons.SetActive(!activeSelf); loadingScreen.SetActive(activeSelf); } } } namespace Emblem { internal static class LethalConfigCompat { public const string GUID = "ainavt.lc.lethalconfig"; public static bool IsAvailable => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddIntSlider(ConfigEntry<int> entry, bool restartRequired) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown if (IsAvailable) { LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(entry, restartRequired)); } } } public class CRTEffect : MonoBehaviour { private Volume volume; public void SetupVolume(GameObject gameObject) { volume = gameObject.GetComponent<Volume>() ?? gameObject.AddComponent<Volume>(); if ((Object)(object)volume == (Object)null) { LogWarden.LogError("[CRT] Failed to add or get Volume component on gameObject."); return; } volume.isGlobal = true; volume.priority = 2.1474836E+09f; if ((Object)(object)volume.profile == (Object)null) { volume.profile = ScriptableObject.CreateInstance<VolumeProfile>(); if ((Object)(object)volume.profile == (Object)null) { LogWarden.LogError("[CRT] Failed to create a new VolumeProfile."); return; } } ((Behaviour)volume).enabled = true; LogWarden.LogInfo("[CRT] Volume component for CRT effects has been enabled."); SetupCRTEffects(); } private void SetupCRTEffects() { if ((Object)(object)volume.profile == (Object)null) { LogWarden.LogError("[CRT] VolumeProfile is null in SetupCRTEffects."); return; } ConfigureChromaticAberration(); ConfigureFilmGrain(); ConfigureVignette(); ConfigureLensDistortion(); } private T GetOrAddEffect<T>(bool overrides = true) where T : VolumeComponent, new() { VolumeComponent? obj = volume.profile.components.Find((VolumeComponent x) => x is T); return ((T)(object)((obj is T) ? obj : null)) ?? volume.profile.Add<T>(overrides); } public void DisableCRTEffects() { DisableEffect<ChromaticAberration>(); DisableEffect<FilmGrain>(); DisableEffect<Vignette>(); DisableEffect<LensDistortion>(); } private void DisableEffect<T>() where T : VolumeComponent { if (!((Object)(object)volume == (Object)null) && !((Object)(object)volume.profile == (Object)null)) { VolumeComponent? obj = volume.profile.components.Find((VolumeComponent x) => x is T); T val = (T)(object)((obj is T) ? obj : null); if ((Object)(object)val != (Object)null && ((VolumeComponent)val).active) { ((VolumeComponent)val).active = false; } else { LogWarden.LogWarning("[CRT] Attempted to disable a non-existent or inactive effect."); } } } private void ConfigureChromaticAberration() { ChromaticAberration orAddEffect = GetOrAddEffect<ChromaticAberration>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.04f; } private void ConfigureFilmGrain() { FilmGrain orAddEffect = GetOrAddEffect<FilmGrain>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f; ((VolumeParameter<FilmGrainLookup>)(object)orAddEffect.type).value = (FilmGrainLookup)2; ((VolumeParameter<float>)(object)orAddEffect.response).value = 0.2f; } private void ConfigureVignette() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) Vignette orAddEffect = GetOrAddEffect<Vignette>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.4f; ((VolumeParameter<Color>)(object)orAddEffect.color).value = Color.black; ((VolumeParameter<Vector2>)(object)orAddEffect.center).value = new Vector2(0.5f, 0.5f); ((VolumeParameter<float>)(object)orAddEffect.roundness).value = 1f; ((VolumeParameter<float>)(object)orAddEffect.smoothness).value = 0.5f; } private void ConfigureLensDistortion() { LensDistortion orAddEffect = GetOrAddEffect<LensDistortion>(overrides: true); ((VolumeComponent)orAddEffect).active = true; ((VolumeParameter<float>)(object)orAddEffect.intensity).value = 0.2f; ((VolumeParameter<float>)(object)orAddEffect.scale).value = 1f; } } public class ScanlineEffectApplier : MonoBehaviour { private static Material scanlineMaterial; private void LoadMaterialFromAssetBundle(string bundleResourceName, string materialName) { AssetBundle val = LoadAssetBundleFromEmbeddedResource(bundleResourceName); if ((Object)(object)val != (Object)null) { scanlineMaterial = val.LoadAsset<Material>(materialName); val.Unload(false); } else { LogWarden.LogError("[Scanlines] Failed to load the scanline material from the asset bundle."); } } private AssetBundle LoadAssetBundleFromEmbeddedResource(string resourceName) { using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); if (stream == null) { LogWarden.LogError("[Scanlines] Embedded resource not found."); return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); return AssetBundle.LoadFromMemory(array); } private void Awake() { if ((Object)(object)scanlineMaterial == (Object)null) { LoadMaterialFromAssetBundle("Emblem.Assets.scanlines", "Scanlines"); } } public void ApplyScanlines(string targetGameObjectName) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)scanlineMaterial == (Object)null)) { GameObject val = GameObject.Find(targetGameObjectName); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[Scanlines] GameObject with name '" + targetGameObjectName + "' not found."); return; } Transform obj = val.transform.Find("Scanlines"); GameObject val2 = (GameObject)(((object)((obj != null) ? ((Component)obj).gameObject : null)) ?? ((object)new GameObject("Scanlines"))); val2.transform.SetParent(val.transform, false); Image obj2 = val2.GetComponent<Image>() ?? val2.AddComponent<Image>(); ((Graphic)obj2).material = scanlineMaterial; ((Graphic)obj2).raycastTarget = false; RectTransform component = val2.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; ((Transform)component).localPosition = Vector3.zero; ((Transform)component).SetAsLastSibling(); } } public void RemoveScanlines(string targetGameObjectName) { GameObject val = GameObject.Find(targetGameObjectName); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[Scanlines] GameObject with name '" + targetGameObjectName + "' not found to remove scanlines."); return; } Transform val2 = val.transform.Find("Scanlines"); if ((Object)(object)val2 != (Object)null) { Object.Destroy((Object)(object)((Component)val2).gameObject); } else { LogWarden.LogInfo("[Scanlines] No scanlines effect found to remove."); } } } public class ConfigWatcher : IDisposable { private readonly FileSystemWatcher _watcher; public event Action OnConfigChanged; public ConfigWatcher(string filePath) { _watcher = new FileSystemWatcher { Path = Path.GetDirectoryName(filePath), Filter = Path.GetFileName(filePath), NotifyFilter = NotifyFilters.LastWrite }; _watcher.Changed += ConfigChanged; _watcher.EnableRaisingEvents = true; } private void ConfigChanged(object sender, FileSystemEventArgs e) { if (File.Exists(e.FullPath)) { _watcher.EnableRaisingEvents = false; Thread.Sleep(1000); _watcher.EnableRaisingEvents = true; this.OnConfigChanged?.Invoke(); } } public void Dispose() { if (_watcher != null) { _watcher.EnableRaisingEvents = false; _watcher.Changed -= ConfigChanged; _watcher.Dispose(); } } } public static class ColorParser { public static Color RGBA(string rgbaString) { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) string[] array = rgbaString.Split(new char[1] { ',' }); if (array.Length != 4) { return Color.white; } float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f); float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f); float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f); float num4 = Mathf.Clamp01(float.Parse(array[3])); return new Color(num, num2, num3, num4); } public static Color RGB(string rgbString) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) string[] array = rgbString.Split(new char[1] { ',' }); if (array.Length < 3 || array.Length > 4) { return Color.white; } float num = Mathf.Clamp01((float)int.Parse(array[0]) / 255f); float num2 = Mathf.Clamp01((float)int.Parse(array[1]) / 255f); float num3 = Mathf.Clamp01((float)int.Parse(array[2]) / 255f); return new Color(num, num2, num3, 1f); } } public static class LogWarden { private static ManualLogSource loggerInstance; public static void Initialize(ManualLogSource logger) { loggerInstance = logger; } public static void LogError(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogError((object)message); } } public static void LogWarning(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogWarning((object)message); } } public static void LogInfo(string message) { ManualLogSource obj = loggerInstance; if (obj != null) { obj.LogInfo((object)message); } } } public class MainThreadDispatcher : MonoBehaviour { private static readonly ConcurrentQueue<Action> _queue = new ConcurrentQueue<Action>(); private static MainThreadDispatcher _instance; public static MainThreadDispatcher EnsureInstance() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if ((Object)(object)_instance == (Object)null) { GameObject val = new GameObject("MainThreadDispatcher"); _instance = val.AddComponent<MainThreadDispatcher>(); Object.DontDestroyOnLoad((Object)val); Debug.Log((object)"[Emblem][MainThreadDispatcher] Instance created and set to DontDestroyOnLoad."); } return _instance; } public static void Enqueue(Action action) { EnsureInstance(); Debug.Log((object)"[Emblem][MainThreadDispatcher] Action enqueued."); _queue.Enqueue(action); } private void Update() { Action result; while (_queue.TryDequeue(out result)) { try { result(); } catch (Exception arg) { Debug.LogError((object)$"[MainThreadDispatcher] Exception during action execution: {arg}"); } } } } public static class PathFinder { public static Transform Probe(string path) { Transform val = null; string[] array = path.Split(new char[1] { '/' }); foreach (string text in array) { if ((Object)(object)val == (Object)null) { GameObject obj = GameObject.Find(text); val = ((obj != null) ? obj.transform : null); } else { val = val.Find(text); } if ((Object)(object)val == (Object)null) { GameObject[] array2 = Resources.FindObjectsOfTypeAll<GameObject>(); foreach (GameObject val2 in array2) { if (((Object)val2).name == text) { val = val2.transform; break; } } } if ((Object)(object)val == (Object)null) { LogWarden.LogError("[Pathfinder] Element '" + text + "' not found in path '" + path + "'."); return null; } } return val; } } public class Configurator { private static Configurator _instance; private static readonly object _lock = new object(); private ConfigWatcher _configWatcher; public ConfigFile Config { get; private set; } public static Configurator Instance { get { if (_instance == null) { throw new Exception("Configurator must be initialized with a ConfigFile before use."); } return _instance; } } public ConfigEntry<bool> enableReplaceMainHeader { get; private set; } public ConfigEntry<string> mainHeaderPath { get; private set; } public ConfigEntry<float> mainHeaderYOffset { get; private set; } public ConfigEntry<int> mainHeaderScale { get; private set; } public ConfigEntry<int> mainHeaderAlpha { get; private set; } public ConfigEntry<bool> enableMainBackground { get; private set; } public ConfigEntry<string> mainBackgroundPath { get; private set; } public ConfigEntry<string> mainBackgroundColor { get; private set; } public ConfigEntry<bool> enableMenuColorChange { get; private set; } public ConfigEntry<string> menuFontColor { get; private set; } public ConfigEntry<string> menuRolloverBGColor { get; private set; } public ConfigEntry<string> menuRolloverFontColor { get; private set; } public ConfigEntry<bool> enableReplaceLoadHeader { get; private set; } public ConfigEntry<string> loadHeaderPath { get; private set; } public ConfigEntry<float> loadHeaderYOffset { get; private set; } public ConfigEntry<int> loadHeaderScale { get; private set; } public ConfigEntry<int> loadHeaderAlpha { get; private set; } public ConfigEntry<bool> loadHeaderStretch { get; private set; } public ConfigEntry<bool> enableLoadBackground { get; private set; } public ConfigEntry<string> loadBackgroundPath { get; private set; } public ConfigEntry<string> loadBackgroundColor { get; private set; } public ConfigEntry<bool> enableLoadingTextChange { get; private set; } public ConfigEntry<string> loadTextString { get; private set; } public ConfigEntry<string> loadTextColor { get; private set; } public ConfigEntry<float> loadTextSize { get; private set; } public ConfigEntry<float> loadTextYOffset { get; private set; } public ConfigEntry<bool> enableReplaceBorder { get; private set; } public ConfigEntry<string> borderColor { get; private set; } public ConfigEntry<float> borderPadding { get; private set; } public ConfigEntry<bool> enableCustomVersion { get; private set; } public ConfigEntry<string> versionTextString { get; private set; } public ConfigEntry<string> versionColor { get; private set; } public ConfigEntry<float> versionFontSize { get; private set; } public ConfigEntry<float> versionYOffset { get; private set; } public ConfigEntry<string> versionAlign { get; private set; } public ConfigEntry<bool> enableRadiantTaper { get; private set; } public ConfigEntry<bool> enableCRT { get; private set; } public ConfigEntry<bool> enableScanlines { get; private set; } public ConfigEntry<bool> enableTypedLoadText { get; private set; } public ConfigEntry<bool> enableGlitchyLogo { get; private set; } public ConfigEntry<bool> enableSlideshow { get; private set; } public ConfigEntry<string> slideshowSections { get; private set; } public ConfigEntry<float> slideshowDelay { get; private set; } public ConfigEntry<float> slideTransTime { get; private set; } private Configurator(ConfigFile config) { Config = config; _configWatcher = new ConfigWatcher(config.ConfigFilePath); _configWatcher.OnConfigChanged += ApplyConfigChanges; Initialize(); } private void ApplyConfigChanges() { MainThreadDispatcher.Enqueue(delegate { Config.Reload(); LogWarden.LogInfo("[ConfigWatcher] Detected change in configuration file."); }); } public static Configurator InitializeInstance(ConfigFile config) { lock (_lock) { if (_instance == null) { _instance = new Configurator(config); } return _instance; } } private void Initialize() { enableReplaceMainHeader = BindConfig("1. Main Logo", "Enable", defaultValue: false, "Enable or disable header image replacement."); mainHeaderPath = BindConfig("1. Main Logo", "Path", "Defaults/Header/HeaderWhite.png", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Header'. Leave blank to use nothing."); mainHeaderYOffset = BindConfig("1. Main Logo", "Offset", 20f, "Vertical Y offset percentage from top. Set to -1 for no adjustment."); mainHeaderScale = BindConfig("1. Main Logo", "Scale", 60, "Image scale. This will maintain aspect ratio. 100 for apx original size"); mainHeaderAlpha = BindConfig("1. Main Logo", "Alpha", 100, "Image transparency. 0 for invisible and 100 for completely opaque."); enableMainBackground = BindConfig("2. Main Background", "Enable", defaultValue: true, "Enable or disable the custom main menu background."); mainBackgroundPath = BindConfig("2. Main Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'Background'. Separate multiple mp4 paths with a | to pick one randomly"); mainBackgroundColor = BindConfig("2. Main Background", "Color", "0,0,0", "Background color for Main Menu Screen in RGB format (ex: '0,0,0' for black). No alpha value as this is the bottom layer"); enableMenuColorChange = BindConfig("3. Menu Colors", "Enable", defaultValue: false, "Do you even want to mess with menu colors?"); menuFontColor = BindConfig("3. Menu Colors", "Color", "230,100,65,1", "Color of menu font."); menuRolloverBGColor = BindConfig("3. Menu Colors", "Highlight BG Color", "230,100,65,1", "Background color of a menu items on rollover."); menuRolloverFontColor = BindConfig("3. Menu Colors", "Highlight Font Color", "0,0,0,1", "Font color of menu items on rollover."); enableReplaceLoadHeader = BindConfig("4. Loading Image", "Enable", defaultValue: false, "Enable or disable loading image replacement."); loadHeaderPath = BindConfig("4. Loading Image", "Path", "Defaults/Loading", "Relative to your /Emblem/ folder: Specify a .png file. A folder will randomly select an image starting with the prefix 'Loading'. Leave blank to use nothing"); loadHeaderYOffset = BindConfig("4. Loading Image", "Offset", 50f, "Vertical Y offset percentage from top. Set to -1 for no adjustment."); loadHeaderScale = BindConfig("4. Loading Image", "Scale", 60, "Image scale. This will maintain aspect ratio."); loadHeaderAlpha = BindConfig("4. Loading Image", "Alpha", 100, "Image transparency. 0 for invisible and 100 for completely opaque."); loadHeaderStretch = BindConfig("4. Loading Image", "Stretch", defaultValue: false, "Stretch the loading image to fit the screen vertically. This will override scale and offset"); enableLoadBackground = BindConfig("5. Loading Background", "Enable", defaultValue: false, "Enable or disable the loading screen background."); loadBackgroundPath = BindConfig("5. Loading Background", "Path", "Defaults/Background", "Relative to your /Emblem/ folder: Specify a .png, .mp4. A folder will randomly select an image starting with the prefix 'LoadBackground'. Separate multiple mp4 paths with a | to pick one randomly"); loadBackgroundColor = BindConfig("5. Loading Background", "Color", "0,0,0,1", "Background color for Loading Screen in RGBA format (ex: '255,255,255,1' for white)."); enableLoadingTextChange = BindConfig("6. Loading Text", "Enable", defaultValue: false, "Enable or disable the custom loading text feature."); loadTextString = BindConfig("6. Loading Text", "Text", "Loading...", "Text displayed on the loading screen. Separate multiple texts with '|' to choose one at random. Use \\n for linebreaks"); loadTextColor = BindConfig("6. Loading Text", "Color", "255,139,0,1", "Color of the font in RGBA format (ex: '0,0,0,1' for blue)."); loadTextSize = BindConfig("6. Loading Text", "Font Size", 40f, "Size of the font used in the loading text."); loadTextYOffset = BindConfig("6. Loading Text", "Offset", 50f, "Vertical Y offset percentage from top."); enableReplaceBorder = BindConfig("7. Borders", "Hide", defaultValue: false, "Enable or disable the corner borders."); borderColor = BindConfig("7. Borders", "Color", "115,59,0,1", "The color of the border in RGBA format (ex: '0,255,0,1' for green)."); borderPadding = BindConfig("7. Borders", "Padding", 10f, "How far should the border be from corners of the screen."); enableCustomVersion = BindConfig("8. Version Number", "Enable", defaultValue: false, "Play around in version styling? This will disable word wrapping"); versionTextString = BindConfig("8. Version Number", "Text", "[ %VERSION% ]", "Format string for the version text. Use %VERSION% for the original string. Use \\n for linebreaks"); versionColor = BindConfig("8. Version Number", "Color", "230,100,65,0.45", "The color of the text in RGBA format (ex: '255,0,0,1' for red).."); versionFontSize = BindConfig("8. Version Number", "Font Size", 16f, "Font size of the version text."); versionYOffset = BindConfig("8. Version Number", "Offset", 95.8f, "Vertical Y offset percentage from top."); versionAlign = BindConfig("8. Version Number", "Alignment", "Center", "Text Position \nOptions: Left, Center, Right"); enableRadiantTaper = BindConfig("9. Experimental", "Radiant Taper", defaultValue: false, "Use the vignette blending effect on background images and their background color"); enableCRT = BindConfig("9. Experimental", "Retro TV Style", defaultValue: false, "Make the entire menu scene look like a CRT monitor"); enableScanlines = BindConfig("9. Experimental", "Scanline Shader", defaultValue: false, "Add subtle scanlines to the entire scene"); enableTypedLoadText = BindConfig("9. Experimental", "Typed Loading Text", defaultValue: false, "Enable the typing effect on the load text This requires multiple strings and slideshow enabled"); enableGlitchyLogo = BindConfig("9. Experimental", "Glitchy Logo", defaultValue: false, "Add fancy effects to the main logo"); enableSlideshow = BindConfig("Slideshow", "Enable", defaultValue: false, "Use the slideshow feature. Each path section must be using image prefixs."); slideshowSections = BindConfig("Slideshow", "Apply To", "", "Specify which sections the slideshow applies to. Separate multiple sections with commas.\nOptions: Header, Background, Loading, LoadBackground, LoadText."); slideshowDelay = BindConfig("Slideshow", "Timer", 10f, "Set the delay timer in seconds for the slideshow feature. Range: 0.1 - 30 seconds."); slideTransTime = BindConfig("Slideshow", "Transition Length", 2f, "How many seconds the transition should take to fade."); } private ConfigEntry<T> BindConfig<T>(string section, string key, T defaultValue, string description) { return Config.Bind<T>(section, key, defaultValue, description); } } public class LoadingText { private string[] textOptions; private int lastIndex = -1; private Configurator ConfigManager => Configurator.Instance; public LoadingText() { ConfigManager.enableLoadingTextChange.SettingChanged += delegate { ToggleLoadText(); }; ConfigManager.loadTextString.SettingChanged += delegate { UpdateTextOptions(); }; ConfigManager.loadTextString.SettingChanged += delegate { UpdateTextProperties(); }; ConfigManager.loadTextSize.SettingChanged += delegate { UpdateTextProperties(); }; ConfigManager.loadTextColor.SettingChanged += delegate { UpdateTextProperties(); }; ConfigManager.loadTextYOffset.SettingChanged += delegate { UpdateTextProperties(); }; ConfigManager.enableTypedLoadText.SettingChanged += delegate { StartTextUpdates(); }; ConfigManager.slideshowSections.SettingChanged += delegate { StartTextUpdates(); }; } public void ToggleLoadText() { RectTransform val = FindLoadingTextContainer(); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] LoadingTextContainer not found."); return; } TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(true); Transform obj = ((Transform)val).Find("LoadMessage"); TextMeshProUGUI val2 = ((obj != null) ? ((Component)obj).GetComponent<TextMeshProUGUI>() : null); if ((Object)(object)componentInChildren == (Object)null || (Object)(object)val2 == (Object)null) { LogWarden.LogError("[LoadText] Could not find the original or cloned LoadingText components."); return; } bool value = ConfigManager.enableLoadingTextChange.Value; ((Component)componentInChildren).gameObject.SetActive(!value); ((Component)val2).gameObject.SetActive(value); LogWarden.LogInfo("[LoadText] ToggleLoadText: Original is " + (value ? "inactive" : "active") + ", cloned is " + (value ? "active" : "inactive") + "."); } public void ApplyLoadingCustomizations() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) RectTransform val = FindLoadingTextContainer(); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] LoadingTextContainer not found."); return; } TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(); if ((Object)(object)componentInChildren == (Object)null) { LogWarden.LogError("[LoadText] Original TextMeshProUGUI component not found."); return; } GameObject val2 = new GameObject("LoadMessage"); val2.transform.SetParent((Transform)(object)val); val2.transform.localScale = Vector3.one; TextMeshProUGUI val3 = val2.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val3).rectTransform.sizeDelta = ((TMP_Text)componentInChildren).rectTransform.sizeDelta; ((TMP_Text)val3).rectTransform.anchoredPosition = ((TMP_Text)componentInChildren).rectTransform.anchoredPosition; ((TMP_Text)val3).text = ((TMP_Text)componentInChildren).text; ((TMP_Text)val3).font = ((TMP_Text)componentInChildren).font; ((TMP_Text)val3).fontStyle = ((TMP_Text)componentInChildren).fontStyle; ((TMP_Text)val3).fontSize = ((TMP_Text)componentInChildren).fontSize; ((Graphic)val3).color = Color.white; ((TMP_Text)val3).alignment = (TextAlignmentOptions)514; SetTextProperties(val3, ConfigManager.loadTextString.Value); AdjustTextContainerAnchors(((TMP_Text)val3).rectTransform); ((Transform)val).SetAsLastSibling(); ToggleLoadText(); StartTextUpdates(); } public void StartTextUpdates() { if (ShouldStartUpdates()) { float value = ConfigManager.slideshowDelay.Value; DelayHelper.StartRepeatingAction("textUpdates", value, UpdateLoadingText); } } private bool ShouldStartUpdates() { if (!(from s in ConfigManager.slideshowSections.Value.Split(new char[1] { ',' }) select s.Trim().ToLower()).Contains("loadtext") || !ConfigManager.enableLoadingTextChange.Value) { return false; } return true; } private TextMeshProUGUI GetTextComponent() { RectTransform val = FindLoadingTextContainer(); if ((Object)(object)val == (Object)null) { return null; } Transform val2 = ((Transform)val).Find("LoadMessage"); if ((Object)(object)val2 == (Object)null) { LogWarden.LogError("[LoadText] 'LoadMessage' GameObject not found."); return null; } TextMeshProUGUI component = ((Component)val2).GetComponent<TextMeshProUGUI>(); if ((Object)(object)component == (Object)null) { LogWarden.LogError("[LoadText] TextMeshProUGUI component not found on 'LoadMessage'."); return null; } return component; } public void UpdateLoadingText() { TextMeshProUGUI textComponent = GetTextComponent(); if (!((Object)(object)textComponent == (Object)null) && ConfigManager.enableLoadingTextChange.Value) { string randomLoadingText = GetRandomLoadingText(ConfigManager.loadTextString.Value); if (ConfigManager.enableTypedLoadText.Value) { DelayHelper.StartTypingText(textComponent, randomLoadingText, 0.05f, 0.5f); } else { ((TMP_Text)textComponent).text = randomLoadingText; } LogWarden.LogInfo("[LoadText] Updated loading text to: " + randomLoadingText); } } private RectTransform FindLoadingTextContainer() { Transform val = PathFinder.Probe("Canvas/MenuContainer/LoadingScreen/LoadingTextContainer"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[LoadText] Loading text container not found at path: Canvas/MenuContainer/LoadingScreen/LoadingTextContainer"); return null; } RectTransform component = ((Component)val).GetComponent<RectTransform>(); EnsureFullScreenContainer(component); return component; } private void EnsureFullScreenContainer(RectTransform container) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) container.anchorMin = Vector2.zero; container.anchorMax = Vector2.one; container.offsetMin = Vector2.zero; container.offsetMax = Vector2.zero; } private string GetRandomLoadingText(string allTexts) { if (textOptions == null || textOptions.Length == 0) { textOptions = allTexts.Split(new char[1] { '|' }); } if (textOptions.Length == 1) { return textOptions[0]; } int num; do { num = Random.Range(0, textOptions.Length); } while (num == lastIndex && textOptions.Length > 1); lastIndex = num; return textOptions[num]; } public void UpdateTextProperties() { TextMeshProUGUI textComponent = GetTextComponent(); if ((Object)(object)textComponent == (Object)null) { LogWarden.LogError("[LoadText] Text component not found."); } else { SetTextProperties(textComponent, ConfigManager.loadTextString.Value); } } private void UpdateTextOptions() { string value = ConfigManager.loadTextString.Value; textOptions = value.Split(new char[1] { '|' }); LogWarden.LogInfo("[LoadText] Text options updated."); } private void SetTextProperties(TextMeshProUGUI textComponent, string text) { if ((Object)(object)textComponent != (Object)null) { string arg = (((TMP_Text)textComponent).text = GetRandomLoadingText(text)); ((TMP_Text)textComponent).enableWordWrapping = false; ((TMP_Text)textComponent).fontSize = ConfigManager.loadTextSize.Value; SetTextColor(textComponent); AdjustTextContainerAnchors(((TMP_Text)textComponent).rectTransform); LogWarden.LogInfo($"[LoadText] Text properties updated: Text set to '{arg}' with size {ConfigManager.loadTextSize.Value} and color."); } } private void SetTextColor(TextMeshProUGUI textComponent) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) try { Color val2 = (((Graphic)textComponent).color = ColorParser.RGBA(ConfigManager.loadTextColor.Value)); LogWarden.LogInfo($"[LoadText] Font color set to: {val2}"); Color val3 = Color.Lerp(Color.black, val2, 0.3f); ((TMP_Text)textComponent).outlineColor = Color32.op_Implicit(val3); ((TMP_Text)textComponent).outlineWidth = 1f; ((TMP_Text)textComponent).enableVertexGradient = false; ((TMP_Text)textComponent).ForceMeshUpdate(false, false); LogWarden.LogInfo($"[LoadText] Outline color set to: {val3}"); } catch (Exception ex) { LogWarden.LogError("[LoadText] Error setting font color using ColorParser: " + ex.Message); } } private void AdjustTextContainerAnchors(RectTransform rectTransform) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) float value = ConfigManager.loadTextYOffset.Value; float num = Mathf.Lerp(-44f, 144f, value / 100f); float num2 = 1f - num / 100f; rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchorMin = new Vector2(0.5f, num2); rectTransform.anchorMax = new Vector2(0.5f, num2); rectTransform.anchoredPosition = new Vector2(0f, 0f); } } public static class UI { public const string MenuCont = "Canvas/MenuContainer"; public const string MainBtns = "Canvas/MenuContainer/MainButtons"; public const string MainImg = "Canvas/MenuContainer/MainButtons/HeaderImage"; public const string MainHeader = "Canvas/MenuContainer/MainButtons/MainHeader"; public const string CustBgImg = "Canvas/MenuContainer/MainButtons/Background"; public const string LoadScreen = "Canvas/MenuContainer/LoadingScreen"; public const string LoadImg = "Canvas/MenuContainer/LoadingScreen/Image"; public const string LoadHeader = "Canvas/MenuContainer/LoadingScreen/LoadHeader"; public const string LoadTextCont = "Canvas/MenuContainer/LoadingScreen/LoadingTextContainer"; public const string LoadText = "Canvas/MenuContainer/LoadingScreen/LoadingTextContainer/LoadingText"; } } namespace Emblem.Managers { public class InterfaceDecorator { private readonly UIComponent uiComponent; private readonly BackgroundManager backgroundManager; private readonly HeaderReplacement headerReplacement; private readonly Boardwalk boardwalk; private readonly LoadingText loadingText; private readonly MenuMoodSetter menuMoodSetter; private readonly VersionStyler versionStyler; private readonly Slideshow slideshow; public InterfaceDecorator(UIComponent uiComponent, BackgroundManager backgroundManager, HeaderReplacement headerReplacement, Boardwalk boardwalk, LoadingText loadingText, MenuMoodSetter menuMoodSetter, VersionStyler versionStyler, Slideshow slideshow) { this.uiComponent = uiComponent; this.backgroundManager = backgroundManager; this.headerReplacement = headerReplacement; this.boardwalk = boardwalk; this.loadingText = loadingText; this.menuMoodSetter = menuMoodSetter; this.versionStyler = versionStyler; this.slideshow = slideshow; } public void ApplyInitCustomizations() { uiComponent.SetVolumeLayerMaskOnAllCameras(-1); uiComponent.ToggleCRTEffect(); } public void ApplyMainMenuCustomizations() { uiComponent.SetVolumeLayerMaskOnAllCameras(-1); headerReplacement.InitializeAndReplaceHeaders(); backgroundManager.ApplyMainMenuBackground(); uiComponent.SetMainBackgroundColor(); uiComponent.ResetRectTransformProperties(); uiComponent.ToggleCRTEffect(); uiComponent.ToggleScanlines(); uiComponent.CreateBackgrounds(); menuMoodSetter.HarmonizeMenuHues("Canvas/MenuContainer/MainButtons"); boardwalk.ToggleBorder(); versionStyler.InitializeVersionStyling(); loadingText.ApplyLoadingCustomizations(); backgroundManager.ApplyLoadingBackground(); DelayHelper.StartDelayedAction(0.3f, delegate { menuMoodSetter.HarmonizeMenuHues("Canvas/MenuContainer/MainButtons"); }); } } public class SceneManagerHelper { private readonly InterfaceDecorator interfaceDecorator; public SceneManagerHelper(InterfaceDecorator interfaceDecorator) { this.interfaceDecorator = interfaceDecorator; SceneManager.sceneLoaded += OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { DelayHelper.StopAll(); HotLoad.Instance?.OnDestroy(); if (((Scene)(ref scene)).name == "InitSceneLaunchOptions" || ((Scene)(ref scene)).name == "InitScene" || ((Scene)(ref scene)).name == "InitSceneLANMode") { LogWarden.LogInfo("[SceneManager] Applying customizations to Init."); interfaceDecorator.ApplyInitCustomizations(); } if (((Scene)(ref scene)).name == "MainMenu") { MainThreadDispatcher.EnsureInstance(); LogWarden.LogInfo("[SceneManager] Applying customizations to MainMenu."); interfaceDecorator.ApplyMainMenuCustomizations(); HotLoad.Initialize(); } } public void Unsubscribe() { SceneManager.sceneLoaded -= OnSceneLoaded; } } } namespace Emblem.Components { public class BackgroundManager { private readonly ImageFilters imageFilters; private Configurator ConfigManager => Configurator.Instance; private CustomMediaManager MediaManager => CustomMediaManager.Instance; public BackgroundManager() { imageFilters = new ImageFilters(ConfigManager); ConfigManager.enableMainBackground.SettingChanged += delegate { ToggleBackground("main"); }; ConfigManager.enableLoadBackground.SettingChanged += delegate { ToggleBackground("load"); }; ConfigManager.mainBackgroundPath.SettingChanged += delegate { RefreshBackgroundPath("main"); }; ConfigManager.loadBackgroundPath.SettingChanged += delegate { RefreshBackgroundPath("load"); }; ConfigManager.mainBackgroundColor.SettingChanged += delegate { ApplyMainMenuBackground(); }; ConfigManager.loadBackgroundColor.SettingChanged += delegate { ApplyLoadingBackground(); }; ConfigManager.enableSlideshow.SettingChanged += delegate { ToggleBackgroundSlideshow(); }; ConfigManager.slideshowSections.SettingChanged += delegate { ToggleBackgroundSlideshow(); }; ConfigManager.slideshowDelay.SettingChanged += delegate { ToggleBackgroundSlideshow(); }; ConfigManager.slideTransTime.SettingChanged += delegate { ToggleBackgroundSlideshow(); }; } private void ToggleBackground(string type) { if (!(type == "main")) { if (type == "load") { bool value = ConfigManager.enableLoadBackground.Value; DestroyBackground("LoadingScreen/LoadBackground"); if (value) { ApplyLoadingBackground(); } } } else { bool value2 = ConfigManager.enableMainBackground.Value; DestroyBackground("MenuContainer/MainBackground"); if (value2) { ApplyMainMenuBackground(); } } } private void DestroyBackground(string path) { GameObject val = GameObject.Find(path); if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)val); } } private void RefreshBackgroundPath(string type) { if (!(type == "main")) { if (type == "load" && ConfigManager.enableLoadBackground.Value) { ApplyLoadingBackground(); } } else if (ConfigManager.enableMainBackground.Value) { ApplyMainMenuBackground(); } } public void ApplyMainMenuBackground() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) ApplyBackground(ConfigManager.enableMainBackground.Value, ConfigManager.mainBackgroundPath.Value, ColorParser.RGB(ConfigManager.mainBackgroundColor.Value), "MenuContainer", "MainBackground"); StartBackgroundSlideshow("main"); } public void ApplyLoadingBackground() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) ApplyBackground(ConfigManager.enableLoadBackground.Value, ConfigManager.loadBackgroundPath.Value, ColorParser.RGB(ConfigManager.loadBackgroundColor.Value), "LoadingScreen", "LoadBackground"); StartBackgroundSlideshow("load"); } private void ApplyBackground(bool isEnabled, string backgroundPath, Color backgroundColor, string parentObjectName, string backgroundObjectName) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (isEnabled && !string.IsNullOrEmpty(backgroundPath)) { Transform obj = PathFinder.Probe(parentObjectName); GameObject val = ((obj != null) ? ((Component)obj).gameObject : null); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[Background] " + parentObjectName + " not found in the scene."); } else if (backgroundPath.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase)) { HandleVideoBackground(val, backgroundPath, backgroundObjectName); } else { HandleImageBackground(val, backgroundPath, backgroundObjectName, backgroundColor); } } } private void HandleVideoBackground(GameObject parentObject, string backgroundPath, string videoObjectName) { string text = MediaManager.LoadCustomVideoPath(backgroundPath); if (text != null) { (parentObject.GetComponent<BackgroundVideoManager>() ?? parentObject.AddComponent<BackgroundVideoManager>()).InitializeVideo(parentObject, text, videoObjectName); } } public void HandleImageBackground(GameObject parentObject, string backgroundPath, string backgroundObjectName, Color backgroundColor) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) Sprite customSprite = MediaManager.LoadCustomImage(backgroundPath, backgroundObjectName); GameObject val = CreateBackgroundImage(parentObject.transform, customSprite, backgroundObjectName); imageFilters.Blend(((Object)val).name, backgroundColor); if (ConfigManager.enableSlideshow.Value) { float value = ConfigManager.slideTransTime.Value; if (val.GetComponent<DelayHelper>() == null) { val.AddComponent<DelayHelper>(); } new Slideshow(val.transform).StartFade(value); } } private GameObject CreateBackgroundImage(Transform parentTransform, Sprite customSprite, string objectName) { if ((Object)(object)customSprite == (Object)null) { LogWarden.LogError("[Background] No custom sprite provided for background image creation."); return null; } GameObject orCreateBackgroundObject = GetOrCreateBackgroundObject(parentTransform, objectName); Image val = SetImageComponent(orCreateBackgroundObject, customSprite); AdjustImageToFit(parentTransform, ((Component)val).GetComponent<RectTransform>(), customSprite); return orCreateBackgroundObject; } private GameObject GetOrCreateBackgroundObject(Transform parentTransform, string objectName) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown Transform val = parentTransform.Find(objectName); GameObject val2; if ((Object)(object)val != (Object)null) { val2 = ((Component)val).gameObject; val2.transform.SetAsFirstSibling(); } else { val2 = new GameObject(objectName); val2.transform.SetParent(parentTransform, false); val2.transform.SetAsFirstSibling(); } return val2; } private Image SetImageComponent(GameObject backgroundImageObject, Sprite customSprite) { Image val = backgroundImageObject.GetComponent<Image>(); if ((Object)(object)val == (Object)null) { val = backgroundImageObject.AddComponent<Image>(); } val.sprite = customSprite; val.preserveAspect = true; return val; } private void AdjustImageToFit(Transform parentTransform, RectTransform rectTransform, Sprite customSprite) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) rectTransform.anchorMin = new Vector2(0.5f, 0f); rectTransform.anchorMax = new Vector2(0.5f, 1f); rectTransform.pivot = new Vector2(0.5f, 0.5f); Rect rect = ((Component)parentTransform).GetComponent<RectTransform>().rect; float height = ((Rect)(ref rect)).height; Bounds bounds = customSprite.bounds; float num = ((Bounds)(ref bounds)).size.y * customSprite.pixelsPerUnit; float num2 = height / num; bounds = customSprite.bounds; rectTransform.sizeDelta = new Vector2(((Bounds)(ref bounds)).size.x * customSprite.pixelsPerUnit * num2, 0f); } public void ToggleBackgroundSlideshow() { if (ConfigManager.enableSlideshow.Value) { StartBackgroundSlideshow("main"); StartBackgroundSlideshow("load"); } else { DelayHelper.StopRepeatingAction("background"); DelayHelper.StopRepeatingAction("loadbackground"); } } public void StartBackgroundSlideshow(string type) { if (!ConfigManager.enableSlideshow.Value) { return; } string[] array = ConfigManager.slideshowSections.Value.Split(new char[1] { ',' }); float value = ConfigManager.slideshowDelay.Value; string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string text = array2[i].Trim().ToLower(); if (type == "main" && text == "background") { DelayHelper.StartRepeatingAction("background", value, delegate { ApplyMainMenuBackground(); }); } else if (type == "load" && text == "loadbackground") { DelayHelper.StartRepeatingAction("loadbackground", value, delegate { ApplyLoadingBackground(); }); } } } } public class BackgroundVideoManager : MonoBehaviour { private VideoPlayer videoPlayer; public string VideoPath { get; set; } public void InitializeVideo(GameObject targetGameObject, string videoPath, string videoObjectName) { VideoPath = videoPath; if ((Object)(object)targetGameObject == (Object)null) { LogWarden.LogError("[Video] Target GameObject not found in the scene."); } else { CreateBackgroundVideo(targetGameObject, videoObjectName); } } private void CreateBackgroundVideo(GameObject targetGameObject, string backgroundObjectName) { if (!string.IsNullOrEmpty(VideoPath)) { string text = (VideoPath.StartsWith("file://", StringComparison.OrdinalIgnoreCase) ? VideoPath : ("file://" + VideoPath)); string text2 = text.Replace(Paths.BepInExRootPath, ""); text2 = text2.TrimStart(new char[1] { Path.DirectorySeparatorChar }); LogWarden.LogInfo("[Video] Initializing video with relative path: " + text2); GameObject orCreateBackgroundObject = GetOrCreateBackgroundObject(targetGameObject.transform, backgroundObjectName); RawImage rawImage = orCreateBackgroundObject.GetComponent<RawImage>() ?? orCreateBackgroundObject.AddComponent<RawImage>(); videoPlayer = orCreateBackgroundObject.GetComponent<VideoPlayer>() ?? orCreateBackgroundObject.AddComponent<VideoPlayer>(); AudioSource audioSource = orCreateBackgroundObject.GetComponent<AudioSource>() ?? orCreateBackgroundObject.AddComponent<AudioSource>(); ConfigureVideoPlayer(text, audioSource, rawImage); AdjustRawImage(rawImage); LogWarden.LogInfo("[Video] Background video added to the scene."); } } private GameObject GetOrCreateBackgroundObject(Transform parentTransform, string objectName) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown Transform val = parentTransform.Find(objectName); GameObject val2; if ((Object)(object)val != (Object)null) { val2 = ((Component)val).gameObject; val2.transform.SetAsFirstSibling(); } else { val2 = new GameObject(objectName); val2.transform.SetParent(parentTransform, false); val2.transform.SetAsFirstSibling(); } return val2; } private void ConfigureVideoPlayer(string fullPath, AudioSource audioSource, RawImage rawImage) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown videoPlayer.playOnAwake = true; videoPlayer.isLooping = true; videoPlayer.renderMode = (VideoRenderMode)2; videoPlayer.audioOutputMode = (VideoAudioOutputMode)1; videoPlayer.SetTargetAudioSource((ushort)0, audioSource); videoPlayer.source = (VideoSource)1; videoPlayer.url = fullPath; videoPlayer.aspectRatio = (VideoAspectRatio)1; RenderTexture val = new RenderTexture(1920, 1080, 0); videoPlayer.targetTexture = val; rawImage.texture = (Texture)(object)val; videoPlayer.errorReceived += new ErrorEventHandler(OnVideoErrorReceived); videoPlayer.prepareCompleted += new EventHandler(OnVideoPrepared); videoPlayer.Prepare(); } private void AdjustRawImage(RawImage rawImage) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) RectTransform component = ((Component)rawImage).GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(1f, 1f); component.pivot = new Vector2(0.5f, 0.5f); component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } private void OnVideoErrorReceived(VideoPlayer source, string message) { LogWarden.LogError("Video Error: " + message); } private void OnVideoPrepared(VideoPlayer source) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown source.prepareCompleted -= new EventHandler(OnVideoPrepared); LogWarden.LogInfo("[Video] Prepared and ready to play."); source.Play(); } } public class Boardwalk { private RectTransform cloneRectTransform; private Image originalImage; private Image cloneImage; private Configurator ConfigManager => Configurator.Instance; public Boardwalk() { ConfigManager.enableReplaceBorder.SettingChanged += delegate { ToggleBorderVisibility(); }; ConfigManager.borderPadding.SettingChanged += delegate { SetBorderPadding(); }; ConfigManager.borderColor.SettingChanged += delegate { SetBorderColor(); }; } public void ToggleBorder() { foreach (string item in new List<string> { "MainButtons", "LobbyHostSettings", "DeleteFileConfirmation", "NewsPanel", "MenuNotification", "LANWarning", "LobbyList", "CreditsPanel" }) { Transform val = PathFinder.Probe(item); if ((Object)(object)val != (Object)null) { HideOriginalBorder(val); if (item == "MainButtons" && !ConfigManager.enableReplaceBorder.Value) { CreateBorderCopy(val); } } else { LogWarden.LogWarning("[Border] " + item + " not found."); } } } private void ToggleBorderVisibility() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)cloneRectTransform == (Object)null || (Object)(object)cloneImage == (Object)null) { ToggleBorder(); } if ((Object)(object)originalImage != (Object)null) { ((Graphic)originalImage).color = new Color(((Graphic)originalImage).color.r, ((Graphic)originalImage).color.g, ((Graphic)originalImage).color.b, ConfigManager.enableReplaceBorder.Value ? 1f : 0f); LogWarden.LogInfo("[Border] Border visibility has been toggled"); } if ((Object)(object)cloneRectTransform != (Object)null && (Object)(object)cloneImage != (Object)null) { ((Graphic)cloneImage).color = new Color(((Graphic)cloneImage).color.r, ((Graphic)cloneImage).color.g, ((Graphic)cloneImage).color.b, ConfigManager.enableReplaceBorder.Value ? 0f : 1f); } } private void HideOriginalBorder(Transform borderTransform) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) Image component = ((Component)borderTransform).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = new Color(((Graphic)component).color.r, ((Graphic)component).color.g, ((Graphic)component).color.b, 0f); } else { LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name); } } private void CreateBorderCopy(Transform borderTransform) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown GameObject gameObject = ((Component)borderTransform).gameObject; Image component = gameObject.GetComponent<Image>(); if ((Object)(object)component == (Object)null) { LogWarden.LogWarning("[Border] No Image component found on " + ((Object)borderTransform).name + ". Cannot clone."); } else if ((Object)(object)cloneRectTransform == (Object)null) { GameObject val = new GameObject("Corners"); val.transform.SetParent(gameObject.transform.parent); val.transform.SetSiblingIndex(3); cloneRectTransform = val.AddComponent<RectTransform>(); CopyRectTransformSettings(((Graphic)component).rectTransform, cloneRectTransform); float value = ConfigManager.borderPadding.Value; SetBorderPadding(); cloneImage = val.AddComponent<Image>(); SetImageProperties(cloneImage, component); SetBorderColor(); LogWarden.LogInfo("[Border] Updated with padding " + value + " and color set to " + ConfigManager.borderColor.Value); } } private void CopyRectTransformSettings(RectTransform original, RectTransform clone) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) ((Transform)clone).localPosition = ((Transform)original).localPosition; ((Transform)clone).localRotation = ((Transform)original).localRotation; ((Transform)clone).localScale = ((Transform)original).localScale; clone.anchorMin = original.anchorMin; clone.anchorMax = original.anchorMax; clone.anchoredPosition = original.anchoredPosition; clone.sizeDelta = original.sizeDelta; clone.pivot = original.pivot; } private void SetBorderPadding() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) float value = ConfigManager.borderPadding.Value; cloneRectTransform.offsetMax = new Vector2(0f - value, 0f - value); cloneRectTransform.offsetMin = new Vector2(value, value); LogWarden.LogInfo("[Border] Padding set to " + value); } private void SetBorderColor() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) string value = ConfigManager.borderColor.Value; ((Graphic)cloneImage).color = ColorParser.RGBA(value); LogWarden.LogInfo("[Border] Color set to " + value); } private void SetImageProperties(Image cloneImage, Image originalImage) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) cloneImage.sprite = originalImage.sprite; cloneImage.type = originalImage.type; cloneImage.fillCenter = originalImage.fillCenter; cloneImage.pixelsPerUnitMultiplier = originalImage.pixelsPerUnitMultiplier; ((Graphic)cloneImage).raycastTarget = false; } } public class MenuMoodSetter { private static readonly HashSet<string> loggedMessages = new HashSet<string>(); private Configurator ConfigManager => Configurator.Instance; public MenuMoodSetter() { ConfigManager.enableMenuColorChange.SettingChanged += delegate { ToggleMenuHues(); }; ConfigManager.menuFontColor.SettingChanged += delegate { HarmonizeMenuHues("MainButtons"); }; ConfigManager.menuRolloverFontColor.SettingChanged += delegate { HarmonizeMenuHues("MainButtons"); }; ConfigManager.menuRolloverBGColor.SettingChanged += delegate { HarmonizeMenuHues("MainButtons"); }; } private void ToggleMenuHues() { if (!ConfigManager.enableMenuColorChange.Value) { RemoveAllColorCustomizations("Canvas/MenuContainer/MainButtons"); LogWarden.LogInfo("[MoodSetter] Menu color change is disabled. All color tags removed."); } else { HarmonizeMenuHues("Canvas/MenuContainer/MainButtons"); } } private void RemoveAllColorCustomizations(string gameObject) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) Transform val = PathFinder.Probe(gameObject); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[MoodSetter] " + gameObject + " object not found. Cannot remove customizations."); return; } TMP_Text[] componentsInChildren = ((Component)val).GetComponentsInChildren<TMP_Text>(); foreach (TMP_Text val2 in componentsInChildren) { val2.text = RemoveColorTags(val2.text); } Button[] componentsInChildren2 = ((Component)val).GetComponentsInChildren<Button>(); for (int i = 0; i < componentsInChildren2.Length; i++) { Image component = ((Component)componentsInChildren2[i]).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = Color.white; } } LogWarden.LogInfo("[MoodSetter] All color customizations have been removed from " + gameObject); } public void HarmonizeMenuHues(string gameObject) { //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown if (!ConfigManager.enableMenuColorChange.Value) { LogWarden.LogInfo("[MoodSetter] Menu color change is disabled."); return; } LogOnce("[MoodSetter] Harmonizing menu hues..."); Transform val = PathFinder.Probe(gameObject); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[MoodSetter] " + gameObject + " object not found."); return; } LogOnce("[MoodSetter] " + gameObject + " object found. Processing children..."); LogOnce("[MoodSetter] Painting menu font color: " + ConfigManager.menuFontColor.Value); LogOnce("[MoodSetter] Painting menu rollover font color: " + ConfigManager.menuRolloverFontColor.Value); LogOnce("[MoodSetter] Painting menu rollover background: " + ConfigManager.menuRolloverBGColor.Value); foreach (Transform item in val) { Transform val2 = item; if (!((Object)(object)((Component)val2).GetComponent<Button>() == (Object)null)) { DisableAnimator(val2); SetupEventTriggers(val2); SetTextColor(val2, ConfigManager.menuFontColor.Value); } } } private void LogOnce(string message) { if (!loggedMessages.Contains(message)) { LogWarden.LogInfo(message); loggedMessages.Add(message); } } private void DisableAnimator(Transform buttonTransform) { Animator component = ((Component)buttonTransform).GetComponent<Animator>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } } private void SetupEventTriggers(Transform buttonTransform) { EventTrigger orAddComponent = GetOrAddComponent<EventTrigger>(((Component)buttonTransform).gameObject); AddEventTrigger(orAddComponent, (EventTriggerType)0, delegate { OnMouseEnter(buttonTransform); }); AddEventTrigger(orAddComponent, (EventTriggerType)1, delegate { OnMouseExit(buttonTransform); }); AddEventTrigger(orAddComponent, (EventTriggerType)4, delegate { ResetButtonState(buttonTransform); }); } private void OnMouseEnter(Transform buttonTransform) { if (ConfigManager.enableMenuColorChange.Value) { SetTextColor(buttonTransform, ConfigManager.menuRolloverFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: true, ConfigManager.menuRolloverBGColor.Value); } else { SetTextColor(buttonTransform, "0,0,0,1"); SetSelectionHighlight(buttonTransform, enabled: true, "230,100,65,1"); } } private void OnMouseExit(Transform buttonTransform) { if (ConfigManager.enableMenuColorChange.Value) { SetTextColor(buttonTransform, ConfigManager.menuFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: false, ""); } else { SetTextColor(buttonTransform, "230,100,65,1"); SetSelectionHighlight(buttonTransform, enabled: false, ""); } } private void ResetButtonState(Transform buttonTransform) { if (ConfigManager.enableMenuColorChange.Value) { SetTextColor(buttonTransform, ConfigManager.menuFontColor.Value); SetSelectionHighlight(buttonTransform, enabled: false, ""); } else { SetTextColor(buttonTransform, "230,100,65,1"); SetSelectionHighlight(buttonTransform, enabled: false, ""); } } private void SetTextColor(Transform buttonTransform, string colorString) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) TMP_Text componentInChildren = ((Component)buttonTransform).GetComponentInChildren<TMP_Text>(); if (!((Object)(object)componentInChildren == (Object)null)) { string text = RemoveColorTags(componentInChildren.text); Color val = ColorParser.RGBA(colorString); string text2 = ColorUtility.ToHtmlStringRGB(new Color(val.r, val.g, val.b)); componentInChildren.text = "<color=#" + text2 + ">" + text + "</color>"; componentInChildren.alpha = val.a; } } private string RemoveColorTags(string text) { return Regex.Replace(text, "<color=#[0-9A-Fa-f]{6,8}>(.*?)</color>", "$1"); } private void SetSelectionHighlight(Transform buttonTransform, bool enabled, string colorString) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) Transform val = buttonTransform.Find("SelectionHighlight"); Image val2 = default(Image); if (!((Object)(object)val == (Object)null) && ((Component)val).TryGetComponent<Image>(ref val2)) { ((Behaviour)val2).enabled = enabled; if (enabled) { Color color = ColorParser.RGBA(colorString); ((Graphic)val2).color = color; } } } private T GetOrAddComponent<T>(GameObject obj) where T : Component { return obj.GetComponent<T>() ?? obj.AddComponent<T>(); } private void AddEventTrigger(EventTrigger trigger, EventTriggerType type, UnityAction<BaseEventData> action) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Entry val = new Entry { eventID = type }; ((UnityEvent<BaseEventData>)(object)val.callback).AddListener(action); trigger.triggers.Add(val); } } public class Slideshow { private readonly Transform parentTransform; private Configurator ConfigManager => Configurator.Instance; public Slideshow(Transform parentTransform) { this.parentTransform = parentTransform; } public void StartFade(float duration) { if (!ConfigManager.enableSlideshow.Value) { return; } GameObject orCreateSlideObject = GetOrCreateSlideObject("FrameFlipper"); Image slideImage = orCreateSlideObject.GetComponent<Image>(); Image backgroundImage = ((Component)parentTransform).GetComponentInChildren<Image>(); DelayHelper.StartFadeAction(slideImage, duration, delegate { //IL_002a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)backgroundImage != (Object)null) { slideImage.sprite = backgroundImage.sprite; ((Graphic)slideImage).color = Color.white; } }); } private GameObject GetOrCreateSlideObject(string objectName) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) Transform val = parentTransform.Find(objectName); GameObject val2; if ((Object)(object)val != (Object)null) { val2 = ((Component)val).gameObject; } else { val2 = new GameObject(objectName); val2.transform.SetParent(parentTransform, false); Image val3 = val2.AddComponent<Image>(); val3.preserveAspect = false; Image componentInChildren = ((Component)parentTransform).GetComponentInChildren<Image>(); if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren.sprite != (Object)null) { val3.sprite = componentInChildren.sprite; ((Graphic)val3).color = Color.white; } else { ((Graphic)val3).color = Color.clear; } RectTransform component = val2.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(1f, 1f); component.sizeDelta = Vector2.zero; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; } val2.transform.SetAsFirstSibling(); return val2; } } public class VersionStyler { private GameObject versionStyled; private Configurator ConfigManager => Configurator.Instance; public VersionStyler() { ConfigManager.enableCustomVersion.SettingChanged += delegate { ToggleVersionStyling(); }; ConfigManager.versionTextString.SettingChanged += delegate { ApplyVersionStyling(versionStyled.transform); }; ConfigManager.versionColor.SettingChanged += delegate { ApplyVersionStyling(versionStyled.transform); }; ConfigManager.versionFontSize.SettingChanged += delegate { ApplyVersionStyling(versionStyled.transform); }; ConfigManager.versionYOffset.SettingChanged += delegate { ApplyVersionStyling(versionStyled.transform); }; ConfigManager.versionAlign.SettingChanged += delegate { ApplyVersionStyling(versionStyled.transform); }; } public void InitializeVersionStyling() { if (!((Object)(object)versionStyled != (Object)null)) { Transform val = PathFinder.Probe("Canvas/MenuContainer/VersionNum"); if ((Object)(object)val == (Object)null) { LogWarden.LogError("[Version] Original version number GameObject not found."); return; } versionStyled = Object.Instantiate<GameObject>(((Component)val).gameObject, val.parent); ((Object)versionStyled).name = "VersionStyled"; ApplyVersionStyling(versionStyled.transform); ((Component)val).gameObject.SetActive(!ConfigManager.enableCustomVersion.Value); versionStyled.SetActive(ConfigManager.enableCustomVersion.Value); } } private void ToggleVersionStyling() { InitializeVersionStyling(); bool value = ConfigManager.enableCustomVersion.Value; versionStyled.SetActive(value); ((Component)PathFinder.Probe("Canvas/MenuContainer/VersionNum")).gameObject.SetActive(!value); string text = (value ? "enabled" : "disabled"); LogWarden.LogInfo("[Version] Custom version styling is now " + text + "."); } private void ApplyVersionStyling(Transform versionTextTransform) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) Transform val = PathFinder.Probe("Canvas/MenuContainer/VersionNum"); TextMeshProUGUI val2 = default(TextMeshProUGUI); if ((Object)(object)val == (Object)null || !((Component)val).TryGetComponent<TextMeshProUGUI>(ref val2)) { LogWarden.LogError("[Version] Original TextMeshPro component not found on version number GameObject."); return; } TextMeshProUGUI val3 = default(TextMeshProUGUI); if (!((Component)versionTextTransform).TryGetComponent<TextMeshProUGUI>(ref val3)) { LogWarden.LogError("[Version] TextMeshPro component not found on styled version GameObject."); return; } string value = ConfigManager.versionTextString.Value; string text = ((TMP_Text)val2).text; string text2 = value.Replace("%VERSION%", text); Color val4 = ColorParser.RGBA(ConfigManager.versionColor.Value); ((TMP_Text)val3).text = "<color=#" + ColorUtility.ToHtmlStringRGB(val4) + ">" + text2 + "</color>"; ((TMP_Text)val3).alpha = val4.a; ((TMP_Text)val3).fontSize = ConfigManager.versionFontSize.Value; ((TMP_Text)val3).enableWordWrapping = false; AdjustTextAlignment(val3); float num = 1f - ConfigManager.versionYOffset.Value / 100f; RectTransform component = ((Component)val3).GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, num); component.anchorMax = new Vector2(1f, num); component.pivot = new Vector2(0.5f, 0.5f); component.sizeDelta = new Vector2(0f, component.sizeDelta.y); component.anchoredPosition = new Vector2(0f, 0f); } private void AdjustTextAlignment(TextMeshProUGUI versionText) { string value = ConfigManager.versionAlign.Value; switch (value) { case "Left": ((TMP_Text)versionText).alignment = (TextAlignmentOptions)513; break; case "Center": ((TMP_Text)versionText).alignment = (TextAlignmentOptions)514; break; case "Right": ((TMP_Text)versionText).alignment = (TextAlignmentOptions)516; break; default: LogWarden.LogWarning("[Version] Invalid alignment option '" + value + "' specified. Defaulting to 'Center'."); ((TMP_Text)versionText).alignment = (TextAlignmentOptions)514; break; } } } public class GlitchyLogo : MonoBehaviour { private RectTransform logoTransform; private Image logoImage; private Vector3 originalScale; private Vector3 originalPosition; private Quaternion originalRotation; private Color originalColor; private Vector2 originalSizeDelta; private Vector2 originalAnchorMin; private Vector2 originalAnchorMax; private Configurator ConfigManager => Configurator.Instance; private void Awake() { logoTransform = ((Component)this).GetComponent<RectTransform>(); logoImage = ((Component)this).GetComponent<Image>(); if ((Object)(object)logoTransform == (Object)null || (Object)(object)logoImage == (Object)null) { LogWarden.LogError("GlitchyLogo: Required components (RectTransform, Image) are missing from this GameObject."); } else { StoreOriginalProperties(); LogWarden.LogInfo("GlitchyLogo: Components successfully initialized and properties stored."); } SceneManager.sceneLoaded += OnSceneLoaded; ConfigManager.mainHeaderAlpha.SettingChanged += OnSettingsChanged; ConfigManager.mainHeaderScale.SettingChanged += OnSettingsChanged; ConfigManager.mainHeaderYOffset.SettingChanged += OnSettingsChanged; } private void OnEnable() { StartGlitchEffect(); LogWarden.LogInfo("GlitchyLogo: Glitch effect resumed due to GameObject being enabled."); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; ConfigManager.mainHeaderAlpha.SettingChanged -= OnSettingsChanged; ConfigManager.mainHeaderScale.SettingChanged -= OnSettingsChanged; ConfigManager.mainHeaderYOffset.SettingChanged -= OnSettingsChanged; } private void OnSettingsChanged(object sender, EventArgs e) { ((MonoBehaviour)this).StopAllCoroutines(); StoreOriginalProperties(); StartGlitchEffect(); } private void StoreOriginalProperties() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) originalScale = ((Transform)logoTransform).localScale; originalPosition = ((Transform)logoTransform).localPosition; originalRotation = ((Transform)logoTransform).localRotation; originalColor = ((Graphic)logoImage).color; originalSizeDelta = logoTransform.sizeDelta; originalAnchorMin = logoTransform.anchorMin; originalAnchorMax = logoTransform.anchorMax; } public void StartGlitchEffect() { ((MonoBehaviour)this).StartCoroutine(GlitchCycle()); } private IEnumerator GlitchCycle() { while (true) { yield return (object)new WaitForSeconds(Random.Range(0.5f, 5f)); int numberOfWaves = Random.Range(2, 7); for (int wave = 0; wave < numberOfWaves; wave++) { int num = Random.Range(1, 7); List<IEnumerator> list = new List<IEnumerator>(); for (int i = 0; i < num; i++) { list.Add(ApplyRandomEffect()); } foreach (IEnumerator item in list) { ((MonoBehaviour)this).StartCoroutine(item); } yield return (object)new WaitForSeconds(0.04f); RestoreOriginalProperties(); } } } private IEnumerator ApplyRandomEffect() { switch (Random.Range(0, 9)) { case 0: yield return ApplyPositionShiftEffect(); break; case 1: yield return ApplyRotationEffect(); break; case 2: yield return ApplyColorShiftEffect(); break; case 3: yield return ApplyScaleJitterEffect(); break; case 4: yield return ApplyOpacityFlickerEffect(); break; case 5: yield return ApplyHueShiftEffect(); break; case 6: yield return ApplyMirrorFlipEffect(); break; case 7: yield return ApplyVerticalMirrorFlipEffect(); break; case 8: yield return ApplyRectStretchEffect(); break; } } private IEnumerator ApplyPositionShiftEffect() { RectTransform obj = logoTransform; ((Transform)obj).localPosition = ((Transform)obj).localPosition + new Vector3((float)Random.Range(-25, 25), (float)Random.Range(-25, 25), 0f); yield return null; } private IEnumerator ApplyRotationEffect() { ((Transform)logoTransform).localRotation = Quaternion.Euler(0f, 0f, (float)Random.Range(-1, 1)); yield return null; } private IEnumerator ApplyColorShiftEffect() { ((Graphic)logoImage).color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), originalColor.a); yield return null; } private IEnumerator ApplyScaleJitterEffect() { float num = Random.Range(0.6f, 1.4f); ((Transform)logoTransform).localScale = new Vector3(originalScale.x * num, originalScale.y * num, originalScale.z); yield return null; } private IEnumerator ApplyOpacityFlickerEffect() { float num = Random.Range(0.3f, 1f); ((Graphic)logoImage).color = new Color(originalColor.r, originalColor.g, originalColor.b, num); yield return null; } private IEnumerator ApplyHueShiftEffect() { float duration = 0.03f; float elapsed = 0.01f; while (elapsed < duration) { elapsed += Time.deltaTime; float num = Mathf.Lerp(0f, 1f, elapsed / duration); ((Graphic)logoImage).color = Color.HSVToRGB(num, 1f, 1f); yield return null; } } private IEnumerator ApplyMirrorFlipEffect() { ((Transform)logoTransform).localScale = new Vector3(0f - ((Transform)logoTransform).localScale.x, ((Transform)logoTransform).localScale.y, ((Transform)logoTransform).localScale.z); yield return null; } private IEnumerator ApplyVerticalMirrorFlipEffect() { ((Transform)logoTransform).localScale = new Vector3(((Transform)logoTransform).localScale.x, 0f - ((Transform)logoTransform).localScale.y, ((Transform)logoTransform).localScale.z); yield return null; } private IEnumerator ApplyRectStretchEffect() { logoTransform.sizeDelta = new Vector2(originalSizeDelta.x * Random.Range(0.8f, 1.2f), originalSizeDelta.y * Random.Range(0.8f, 1.2f)); yield return null; } public void StopGlitchEffect() { ((MonoBehaviour)this).StopAllCoroutines(); RestoreOriginalProperties(); LogWarden.LogInfo("GlitchyLogo: Glitch effects stopped and properties restored."); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (((Scene)(ref scene)).name != "MainMenu") { StopGlitchEffect(); } } private void RestoreOriginalProperties() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) ((Transform)logoTransform).localScale = originalScale; ((Transform)logoTransform).localPosition = originalPosition; ((Transform)logoTransform).localRotation = originalRotation; ((Graphic)logoImage).color = originalColor; logoTransform.sizeDelta = originalSizeDelta; logoTransform.anchorMin = originalAnchorMin; logoTransform.anchorMax = originalAnchorMax; } } public class CustomMediaManager { private static CustomMediaManager _instance; private static readonly object _lock = new object(); private readonly EmblemFolder emblemFolder; private Dictionary<string, string> lastSelectedImages = new Dictionary<string, string>(); public static CustomMediaManager Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new CustomMediaManager(); } } } return _instance; } } public CustomMediaManager() { emblemFolder = new EmblemFolder(); } public string LoadCustomVideoPath(string path) { string text = path; if (path.Contains("|")) { string[] array = path.Split(new char[1] { '|' }); text = array[Ra