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 R EA P O v1.0.0
R.EA.P.O.dll
Decompiled 11 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("TheASMRsonist")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("R.EA.P.O")] [assembly: AssemblyTitle("R.EA.P.O")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace R.EA.P.O { [HarmonyPatch] public static class DoorPatch { [CompilerGenerated] private sealed class <ClearProcessedDoor>d__9 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PhysGrabHinge door; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ClearProcessedDoor>d__9(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.75f); <>1__state = 1; return true; case 1: <>1__state = -1; if ((Object)(object)door != (Object)null) { _processedDoors.Remove(door); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static float _lastInteractionTime; private const float InteractionCooldown = 0.5f; private static readonly HashSet<PhysGrabHinge> _processedDoors = new HashSet<PhysGrabHinge>(); private static bool _isDoorLocked = false; private static readonly Dictionary<PhysGrabHinge, bool> _originalDoorStates = new Dictionary<PhysGrabHinge, bool>(); [RuntimeInitializeOnLoadMethod(/*Could not decode attribute arguments.*/)] private static void OnSubsystemRegistration() { SceneManager.sceneLoaded += OnSceneLoaded; } private static void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (!(((Scene)(ref scene)).name == "Lobby") && !(((Scene)(ref scene)).name == "Shop")) { R_EA_P_O.ResetMoney(); _isDoorLocked = false; _processedDoors.Clear(); _originalDoorStates.Clear(); R_EA_P_O.Logger.LogInfo((object)$"Level loaded: {((Scene)(ref scene)).name}, money reset to {R_EA_P_O.CurrentMoney}, and reset door locking state"); } } private static void LockAllDoors() { //IL_008c: 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) if (_isDoorLocked) { return; } PhysGrabHinge[] array = Object.FindObjectsOfType<PhysGrabHinge>(); PhysGrabHinge[] array2 = array; foreach (PhysGrabHinge val in array2) { if (!((Object)(object)val == (Object)null)) { if (!_originalDoorStates.ContainsKey(val)) { _originalDoorStates[val] = ((Behaviour)val).enabled; } ((Behaviour)val).enabled = false; Rigidbody component = ((Component)val).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.isKinematic = true; component.velocity = Vector3.zero; component.angularVelocity = Vector3.zero; } } } _isDoorLocked = true; } [HarmonyPrefix] [HarmonyPatch(typeof(PhysGrabHinge), "OpenImpulse")] [HarmonyPatch(typeof(PhysGrabHinge), "OpenImpulseRPC")] public static bool BeforeDoorUpdate(PhysGrabHinge __instance) { try { if (_processedDoors.Contains(__instance)) { return true; } PlayerController instance = PlayerController.instance; if ((Object)(object)instance == (Object)null) { R_EA_P_O.Logger.LogWarning((object)"Player instance not found."); return true; } if (!((Component)instance).CompareTag("Player")) { return true; } if (R_EA_P_O.CurrentMoney <= 0) { if (!_isDoorLocked) { R_EA_P_O.Logger.LogInfo((object)"No more money, doors have been locked."); LockAllDoors(); } return false; } if (Time.time - _lastInteractionTime < 0.5f) { return true; } int level = 1; int scaledCost = R_EA_P_O.GetScaledCost(R_EA_P_O.DoorCostBase.Value, level); bool flag = Random.value <= R_EA_P_O.DoorCostChance.Value; R_EA_P_O.Logger.LogInfo((object)$"Door interaction - Cost: {scaledCost}, Should charge: {flag}, Current money: {R_EA_P_O.CurrentMoney}"); if (flag && scaledCost > 0) { if (!R_EA_P_O.TryDeductMoney(scaledCost)) { R_EA_P_O.Logger.LogInfo((object)"Not enough money."); _processedDoors.Add(__instance); ((MonoBehaviour)R_EA_P_O.Instance).StartCoroutine(ClearProcessedDoor(__instance)); return false; } R_EA_P_O.Logger.LogInfo((object)$"Deducted {scaledCost} credits. Remaining: {R_EA_P_O.CurrentMoney}"); _processedDoors.Add(__instance); ((MonoBehaviour)R_EA_P_O.Instance).StartCoroutine(ClearProcessedDoor(__instance)); _lastInteractionTime = Time.time; } return true; } catch (Exception arg) { R_EA_P_O.Logger.LogError((object)$"Error in door interaction: {arg}"); return true; } } [IteratorStateMachine(typeof(<ClearProcessedDoor>d__9))] private static IEnumerator ClearProcessedDoor(PhysGrabHinge door) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ClearProcessedDoor>d__9(0) { door = door }; } } [HarmonyPatch(typeof(PlayerController))] internal static class ExamplePlayerControllerPatch { [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Prefix(PlayerController __instance) { R_EA_P_O.Logger.LogDebug((object)$"{__instance} Start Prefix"); } [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(PlayerController __instance) { R_EA_P_O.Logger.LogDebug((object)$"{__instance} Start Postfix"); } } public class MoneyDisplay : MonoBehaviour { private static TextMeshProUGUI moneyText; private static GameObject canvasObject; private static MoneyDisplay instance; private static bool isInitialized; public static void Initialize() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown if (!isInitialized) { GameObject val = new GameObject("MoneyDisplay"); Object.DontDestroyOnLoad((Object)(object)val); instance = val.AddComponent<MoneyDisplay>(); instance.SetupDisplay(); isInitialized = true; } } private void SetupDisplay() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) canvasObject = new GameObject("MoneyDisplayCanvas"); Canvas val = canvasObject.AddComponent<Canvas>(); val.renderMode = (RenderMode)0; val.sortingOrder = 1000; Object.DontDestroyOnLoad((Object)(object)canvasObject); GameObject val2 = new GameObject("MoneyText"); val2.transform.SetParent(((Component)val).transform, false); moneyText = val2.AddComponent<TextMeshProUGUI>(); ((TMP_Text)moneyText).fontSize = 28f; ((Graphic)moneyText).color = Color.yellow; ((TMP_Text)moneyText).fontStyle = (FontStyles)1; ((TMP_Text)moneyText).alignment = (TextAlignmentOptions)257; ((TMP_Text)moneyText).enableWordWrapping = false; ((TMP_Text)moneyText).overflowMode = (TextOverflowModes)0; RectTransform rectTransform = ((TMP_Text)moneyText).rectTransform; rectTransform.anchorMin = new Vector2(0f, 1f); rectTransform.anchorMax = new Vector2(0f, 1f); rectTransform.pivot = new Vector2(0f, 1f); rectTransform.anchoredPosition = new Vector2(20f, -20f); rectTransform.sizeDelta = new Vector2(300f, 50f); Outline val3 = val2.AddComponent<Outline>(); ((Shadow)val3).effectColor = Color.black; ((Shadow)val3).effectDistance = new Vector2(2f, -2f); UpdateMoneyDisplay(); } private void Update() { UpdateMoneyDisplay(); } private static void UpdateMoneyDisplay() { if ((Object)(object)moneyText != (Object)null && (Object)(object)R_EA_P_O.Instance != (Object)null) { ((TMP_Text)moneyText).text = $"Credit card: ${R_EA_P_O.CurrentMoney}"; } } } [BepInPlugin("TheASMRsonist.R.EA.P.O", "R_EA_P_O", "1.0")] public class R_EA_P_O : BaseUnityPlugin { public static ConfigEntry<int> StarterMoney; public static ConfigEntry<float> DoorCostChance; public static ConfigEntry<int> DoorCostBase; public static ConfigEntry<bool> ScaleCostsWithLevel; public static ConfigEntry<float> CostScaleFactor; private static bool _isInitialized; internal static R_EA_P_O Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } public static int CurrentMoney { get; private set; } private void Awake() { Instance = this; InitializeConfig(); CurrentMoney = StarterMoney.Value; _isInitialized = true; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); Logger.LogInfo((object)$"Starter money: {StarterMoney.Value}"); } private void InitializeConfig() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown StarterMoney = ((BaseUnityPlugin)this).Config.Bind<int>("General", "StarterMoney", 1000, "Amount of money you start with per round. Round restart required."); DoorCostChance = ((BaseUnityPlugin)this).Config.Bind<float>("Door", "CostChance", 1f, new ConfigDescription("Chance to lose money when opening a door (0 meaning 0%, 1 meaning 100%)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); DoorCostBase = ((BaseUnityPlugin)this).Config.Bind<int>("Door", "BaseCost", 10, new ConfigDescription("Base amount of money lost when opening a door", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())); ScaleCostsWithLevel = ((BaseUnityPlugin)this).Config.Bind<bool>("Scaling", "Enabled", true, "Should door costs scale with level?"); CostScaleFactor = ((BaseUnityPlugin)this).Config.Bind<float>("Scaling", "Factor", 1.5f, new ConfigDescription("If ScaleCostsWithLevel is true, value entered here will be the scale.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 10f), Array.Empty<object>())); } internal void Patch() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } public static bool CanAffordCost(int cost) { return CurrentMoney >= cost; } public static bool TryDeductMoney(int amount) { if (!_isInitialized) { return true; } if (amount <= 0) { return true; } if (CurrentMoney >= amount) { CurrentMoney -= amount; return true; } return false; } public static int GetScaledCost(int baseCost, int level = 1) { if (!ScaleCostsWithLevel.Value || level <= 1) { return baseCost; } return Mathf.RoundToInt((float)baseCost * Mathf.Pow(CostScaleFactor.Value, (float)(level - 1))); } public static void ResetMoney() { CurrentMoney = StarterMoney.Value; } private void Update() { MoneyDisplay.Initialize(); } } }