using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using HarmonyLib; using JumpScaresMod; using MelonLoader; using Mimic; using Mimic.Animation; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(JumpScares), "SORPRESA", "1.2.0", "xaxiflopi", null)] [assembly: MelonGame("ReLUGames", "MIMESIS")] [assembly: AssemblyVersion("0.0.0.0")] namespace JumpScaresMod; public static class JumpScareManager { private static float _lastJumpscareTime = -999f; private const float Cooldown = 120f; private static bool _initialized; private static bool _running; private static GameObject _overlayRoot; private static RawImage _faceImage; private static AudioSource _audioSource; private static CanvasGroup _canvasGroup; private static readonly List _faces = new List(); private static readonly List _screams = new List(); private static string _modDir; private static readonly Random Rng = new Random(); public static void OnSceneLoad(string sceneName) { _initialized = false; _overlayRoot = null; _faceImage = null; _audioSource = null; _canvasGroup = null; _running = false; } public static void OnUpdate() { if (!_initialized) { TryInitialize(); } } public static bool ShouldTrigger(float chance) { if (!_initialized || _running) { return false; } if ((Object)(object)_overlayRoot == (Object)null || _overlayRoot.activeSelf) { return false; } if (Time.time - _lastJumpscareTime < 120f) { return false; } if (_faces.Count == 0 || _screams.Count == 0) { return false; } return Rng.NextDouble() < (double)chance; } public static void TriggerJumpscare() { _lastJumpscareTime = Time.time; MelonCoroutines.Start(RunJumpscare()); } private static IEnumerator RunJumpscare() { _running = true; yield return (object)new WaitForSecondsRealtime((float)(Rng.NextDouble() * 2.0)); if ((Object)(object)_overlayRoot == (Object)null) { _running = false; yield break; } _faceImage.texture = (Texture)(object)_faces[Rng.Next(_faces.Count)]; _audioSource.clip = _screams[Rng.Next(_screams.Count)]; _overlayRoot.SetActive(true); if ((Object)(object)_canvasGroup != (Object)null) { _canvasGroup.alpha = 1f; } _audioSource.volume = 1f; _audioSource.Play(); yield return (object)new WaitForSecondsRealtime(1.5f + (float)(Rng.NextDouble() * 1.0)); float fadeTime = 0.3f; float elapsed = 0f; while (elapsed < fadeTime) { elapsed += Time.unscaledDeltaTime; if ((Object)(object)_canvasGroup != (Object)null) { _canvasGroup.alpha = 1f - elapsed / fadeTime; } yield return null; } _overlayRoot.SetActive(false); _running = false; } private static void TryInitialize() { if (!((Object)(object)Camera.main == (Object)null)) { _modDir = FindModDirectory(); CreateOverlay(); MelonCoroutines.Start(LoadAssets()); _initialized = true; ((MelonBase)JumpScares.Instance).LoggerInstance.Msg("[SORPRESA] Inicializado. Directorio: " + _modDir); } } private static string FindModDirectory() { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? AppDomain.CurrentDomain.BaseDirectory; } private static IEnumerator LoadAssets() { yield return MelonCoroutines.Start(LoadImages()); yield return MelonCoroutines.Start(LoadSounds()); ((MelonBase)JumpScares.Instance).LoggerInstance.Msg($"[SORPRESA] Assets cargados: {_faces.Count} imágenes, {_screams.Count} sonidos."); } private static IEnumerator LoadImages() { string[] obj = new string[4] { "*.jfif", "*.jpg", "*.jpeg", "*.png" }; List list = new List(); string[] array = obj; foreach (string searchPattern in array) { list.AddRange(Directory.GetFiles(_modDir, searchPattern)); } foreach (string path in list) { UnityWebRequest req = UnityWebRequestTexture.GetTexture("file:///" + path.Replace('\\', '/')); try { yield return req.SendWebRequest(); if ((int)req.result == 1) { Texture2D content = DownloadHandlerTexture.GetContent(req); ((Object)content).name = Path.GetFileNameWithoutExtension(path); _faces.Add(content); ((MelonBase)JumpScares.Instance).LoggerInstance.Msg("[SORPRESA] Imagen cargada: " + ((Object)content).name); } else { ((MelonBase)JumpScares.Instance).LoggerInstance.Warning("[SORPRESA] Error imagen " + path + ": " + req.error); } } finally { ((IDisposable)req)?.Dispose(); } } } private static IEnumerator LoadSounds() { string[] files = Directory.GetFiles(_modDir, "*.mp3"); string[] array = files; foreach (string path in array) { UnityWebRequest req = UnityWebRequestMultimedia.GetAudioClip("file:///" + path.Replace('\\', '/'), (AudioType)13); try { ((DownloadHandlerAudioClip)req.downloadHandler).streamAudio = false; yield return req.SendWebRequest(); if ((int)req.result == 1) { AudioClip content = DownloadHandlerAudioClip.GetContent(req); ((Object)content).name = Path.GetFileNameWithoutExtension(path); _screams.Add(content); ((MelonBase)JumpScares.Instance).LoggerInstance.Msg("[SORPRESA] Sonido cargado: " + ((Object)content).name); } else { ((MelonBase)JumpScares.Instance).LoggerInstance.Warning("[SORPRESA] Error sonido " + path + ": " + req.error); } } finally { ((IDisposable)req)?.Dispose(); } } } private static void CreateOverlay() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009e: 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_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_010b: 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_0129: Unknown result type (might be due to invalid IL or missing references) _overlayRoot = new GameObject("SORPRESA_Overlay"); Object.DontDestroyOnLoad((Object)(object)_overlayRoot); Canvas obj = _overlayRoot.AddComponent(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 9999; _canvasGroup = _overlayRoot.AddComponent(); _canvasGroup.blocksRaycasts = false; _canvasGroup.interactable = false; CanvasScaler obj2 = _overlayRoot.AddComponent(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); GameObject val = new GameObject("BG"); val.transform.SetParent(_overlayRoot.transform, false); ((Graphic)val.AddComponent()).color = Color.black; StretchRect(val.GetComponent()); GameObject val2 = new GameObject("Face"); val2.transform.SetParent(_overlayRoot.transform, false); _faceImage = val2.AddComponent(); ((Graphic)_faceImage).color = Color.white; _faceImage.uvRect = new Rect(0f, 0f, 1f, 1f); StretchRect(val2.GetComponent()); GameObject val3 = new GameObject("Audio"); val3.transform.SetParent(_overlayRoot.transform, false); _audioSource = val3.AddComponent(); _audioSource.spatialBlend = 0f; _audioSource.volume = 1f; _audioSource.priority = 0; _overlayRoot.SetActive(false); } private static void StretchRect(RectTransform rt) { //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) rt.anchorMin = Vector2.zero; rt.anchorMax = Vector2.one; rt.offsetMin = Vector2.zero; rt.offsetMax = Vector2.zero; } } [HarmonyPatch(typeof(LootingEventFeedbackTrigger), "Trigger")] public static class LootPickupPatch { [HarmonyPostfix] public static void Postfix() { if (JumpScareManager.ShouldTrigger(0.4f)) { ((MelonBase)JumpScares.Instance).LoggerInstance.Msg("[SORPRESA] Objeto recogido - ¡SUSTO!"); JumpScareManager.TriggerJumpscare(); } } } [HarmonyPatch(typeof(MonsterHummingSoundPlayer), "OnStateEnter", new Type[] { typeof(Animator), typeof(AnimatorStateInfo), typeof(int) })] public static class MonsterHummingPatch { [HarmonyPostfix] public static void Postfix(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (JumpScareManager.ShouldTrigger(0.35f)) { ((MelonBase)JumpScares.Instance).LoggerInstance.Msg("[SORPRESA] Monstruo activo cerca - ¡SUSTO!"); JumpScareManager.TriggerJumpscare(); } } } public class JumpScares : MelonMod { internal static JumpScares Instance { get; private set; } public override void OnInitializeMelon() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) Instance = this; new Harmony("com.xaxiflopi.sorpresa").PatchAll(); ((MelonBase)this).LoggerInstance.Msg("SORPRESA v1.2.0 activado. ¡Que empiece la diversión!"); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { JumpScareManager.OnSceneLoad(sceneName); } public override void OnUpdate() { JumpScareManager.OnUpdate(); } }