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 Augmented Enhancer v0.6.0
com.github.lordfirespeed.augmented_enhancer.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.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Enhancer.Config; using Enhancer.Config.AcceptableValues; using Enhancer.Extensions; using Enhancer.FeatureInfo; using Enhancer.Features; using GameNetcodeStuff; using HarmonyLib; using LC_API.GameInterfaceAPI.Events.EventArgs.Player; using LC_API.GameInterfaceAPI.Events.Handlers; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Steamworks.Data; using TMPro; using TerminalApi; using TerminalApi.Classes; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; using UnityEngine.UIElements.Collections; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("TerminalApi")] [assembly: AssemblyCompany("Crunchepillar, Lordfirespeed")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Tweaks plugin for Lethal Company")] [assembly: AssemblyFileVersion("0.6.0.0")] [assembly: AssemblyInformationalVersion("0.6.0+482db3cff81ad007a2b484c5ff5c63d81b81e570")] [assembly: AssemblyProduct("Augmented Enhancer")] [assembly: AssemblyTitle("com.github.lordfirespeed.augmented_enhancer")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Lordfirespeed/Lethal-Company-Augmented-Enhancer")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.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 Enhancer { public class EnhancerPatcher : MonoBehaviour { private readonly IList<IFeatureInfo<IFeature>> _features = new List<IFeatureInfo<IFeature>>(19) { new FeatureInfo<AlwaysShowTerminal> { Name = "Always show terminal", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.KeepConsoleEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.KeepConsoleEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<DaysPerQuota> { Name = "Days per quota", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.DaysPerQuotaAssignmentEnabled.Value && BoundConfig.QuotaFormulaEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[3] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.DaysPerQuotaAssignmentEnabled, (ConfigEntryBase)BoundConfig.QuotaFormulaEnabled }, DelegateToModGuids = new string[2] { "mom.llama.enhancer", "Haha.DynamicDeadline" } }, new FeatureInfo<DeathPenalty> { Name = "Death penalty", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.DeathPenaltyFormulaEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.DeathPenaltyFormulaEnabled } }, new FeatureInfo<HangarDoorCloseDuration> { Name = "Hangar door close duration", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.DoorPowerDurationEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.DoorPowerDurationEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<HideClock> { Name = "Hide Clock", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.HideClockEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[5] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.HideClockEnabled, (ConfigEntryBase)BoundConfig.HideClockOutside, (ConfigEntryBase)BoundConfig.HideClockOnShip, (ConfigEntryBase)BoundConfig.HideClockInFacility }, DelegateToModGuids = new string[1] { "atk.lethalcompany.shipclock" } }, new FeatureInfo<ThreatScanCommand> { Name = "Threat scanner", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.ThreatScanner.Value != ThreatScannerMode.Disabled, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.ThreatScanner }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<ItemProtection> { Name = "Item protection", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.ScrapProtectionEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.ScrapProtectionEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<LeaderboardUsesBestAttempt> { Name = "Leaderboard Uses Best Attempt", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.LeaderboardUsesBestAttemptEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.LeaderboardUsesBestAttemptEnabled } }, new FeatureInfo<LightswitchCommand> { Name = "Lightswitch Command", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.LightswitchCommandEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.LightswitchCommandEnabled } }, new FeatureInfo<MilitaryTime> { Name = "24-hour clock", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.MilitaryTime.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.MilitaryTime }, DelegateToModGuids = new string[1] { "com.zduniusz.lethalcompany.24hourclock" } }, new FeatureInfo<CompanyBuyingFactorTweaks> { Name = "Company buying factor tweaks", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.CompanyBuyingFactorTweaksEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.CompanyBuyingFactorTweaksEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<QuotaFormula> { Name = "Quota formula", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.QuotaFormulaEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.QuotaFormulaEnabled } }, new FeatureInfo<RemoveSavedItemCap> { Name = "Remove Saved Item Cap", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.RemoveSavedItemCapEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.RemoveSavedItemCapEnabled } }, new FeatureInfo<SavedItemCap> { Name = "Saved Item Cap", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.SavedItemCapEnabled.Value && !BoundConfig.RemoveSavedItemCapEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[3] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.SavedItemCapEnabled, (ConfigEntryBase)BoundConfig.RemoveSavedItemCapEnabled }, DelegateToModGuids = new string[1] { "MoreItems" } }, new FeatureInfo<ScrapTweaks> { Name = "Scrap Tweaks", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.ScrapTweaksEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[4] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.ScrapPlayercountScaling, (ConfigEntryBase)BoundConfig.ScrapQuantityScalar, (ConfigEntryBase)BoundConfig.ScrapValueScalar } }, new FeatureInfo<StartingCredits> { Name = "Starting credits", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.StartingCreditsEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.StartingCreditsEnabled } }, new FeatureInfo<PassiveIncome> { Name = "Passive income", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.PassiveIncomeEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.PassiveIncomeEnabled } }, new FeatureInfo<FreeUnlockables> { Name = "Suit unlock", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.FreeUnlockablesEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.FreeUnlockablesEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } }, new FeatureInfo<TimeSpeed> { Name = "Time speed", EnabledCondition = () => BoundConfig.Enabled.Value && BoundConfig.TimeSpeedEnabled.Value, ListenToConfigEntries = (ConfigEntryBase[])(object)new ConfigEntryBase[2] { (ConfigEntryBase)BoundConfig.Enabled, (ConfigEntryBase)BoundConfig.TimeSpeedEnabled }, DelegateToModGuids = new string[1] { "mom.llama.enhancer" } } }; internal static PluginInfo Info { get; set; } internal static ManualLogSource Logger { get; set; } internal static PluginConfig BoundConfig { get; set; } private void Start() { FeatureInfoInitializers.HarmonyFactory = (string harmonyName) => new Harmony("com.github.lordfirespeed.augmented_enhancer-" + harmonyName); FeatureInfoInitializers.LogSourceFactory = (string patchName) => Logger.CreateLogSource("Augmented Enhancer/" + patchName); Logger.LogInfo((object)"Initialising features..."); CollectionExtensions.Do<IFeatureInfo<IFeature>>((IEnumerable<IFeatureInfo<IFeature>>)_features, (Action<IFeatureInfo<IFeature>>)delegate(IFeatureInfo<IFeature> patch) { patch.Initialise(); }); Logger.LogInfo((object)"Done!"); } private void OnDestroy() { CollectionExtensions.Do<IFeatureInfo<IFeature>>((IEnumerable<IFeatureInfo<IFeature>>)_features, (Action<IFeatureInfo<IFeature>>)delegate(IFeatureInfo<IFeature> patch) { patch.Dispose(); }); } } [BepInPlugin("com.github.lordfirespeed.augmented_enhancer", "Augmented Enhancer", "0.6.0")] [BepInDependency("LC_API", "3.3.2")] [BepInDependency("atomic.terminalapi", "1.5.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; private set; } internal static PluginConfig BoundConfig { get; private set; } private void Awake() { //IL_004e: 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_005c: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Binding config..."); PluginConfig.RegisterTypeConverters(); BoundConfig = new PluginConfig((BaseUnityPlugin)(object)this); EnhancerPatcher.Info = ((BaseUnityPlugin)this).Info; EnhancerPatcher.Logger = Logger; EnhancerPatcher.BoundConfig = BoundConfig; GameObject val = new GameObject("Enhancer") { hideFlags = (HideFlags)61 }; val.AddComponent<EnhancerPatcher>(); Object.DontDestroyOnLoad((Object)(object)val); } } public class PluginConfig { public readonly ConfigEntry<bool> Enabled; public readonly ConfigEntry<bool> DelegationEnabled; public readonly ConfigEntry<bool> KeepConsoleEnabled; public readonly ConfigEntry<bool> FreeUnlockablesEnabled; public readonly ConfigEntry<List<string>> FreeUnlockablesList; public readonly ConfigEntry<bool> LightswitchCommandEnabled; public readonly ConfigEntry<bool> LeaderboardUsesBestAttemptEnabled; public readonly ConfigEntry<bool> SavedItemCapEnabled; public readonly ConfigEntry<int> SavedItemCap; public readonly ConfigEntry<bool> RemoveSavedItemCapEnabled; public readonly ConfigEntry<bool> MilitaryTime; public readonly ConfigEntry<bool> HideClockEnabled; public readonly ConfigEntry<bool> HideClockOnShip; public readonly ConfigEntry<bool> HideClockOutside; public readonly ConfigEntry<bool> HideClockInFacility; public readonly ConfigEntry<bool> CompanyBuyingFactorTweaksEnabled; public readonly ConfigEntry<bool> RandomiseCompanyBuyingFactor; public readonly ConfigEntry<float> MinimumCompanyBuyingFactor; public readonly ConfigEntry<bool> TimeSpeedEnabled; public readonly ConfigEntry<float> TimeSpeed; public readonly ConfigEntry<bool> DoorPowerDurationEnabled; public readonly ConfigEntry<float> DoorPowerDuration; public readonly ConfigEntry<bool> StartingCreditsEnabled; public readonly ConfigEntry<int> StartingCredits; public readonly ConfigEntry<bool> PassiveIncomeEnabled; public readonly ConfigEntry<int> PassiveIncomeQuantity; public readonly ConfigEntry<bool> DaysPerQuotaAssignmentEnabled; public readonly ConfigEntry<QuotaDurationBehaviour> DaysPerQuotaAssignmentBehaviour; public readonly ConfigEntry<int> DaysPerQuotaAssignment; public readonly ConfigEntry<Interval<int>> DaysPerQuotaAssignmentBounds; public readonly ConfigEntry<int> BaseTargetIncomePerDay; public readonly ConfigEntry<float> MaxTargetIncomePerDayScalar; public readonly ConfigEntry<int> AssignmentsToReachMaximumTargetIncomePerDay; public readonly ConfigEntry<float> TargetIncomePerDayScalarCurvature; public readonly ConfigEntry<float> TargetIncomePerDayRandomnessScalar; public readonly ConfigEntry<bool> QuotaFormulaEnabled; public readonly ConfigEntry<int> StartingQuota; public readonly ConfigEntry<float> QuotaIncreaseSteepnessCoefficient; public readonly ConfigEntry<float> QuotaIncreaseSteepnessExponent; public readonly ConfigEntry<float> QuotaBaseIncrease; public readonly ConfigEntry<float> QuotaIncreaseRandomFactor; public readonly ConfigEntry<bool> ScrapTweaksEnabled; public readonly ConfigEntry<float> ScrapValueScalar; public readonly ConfigEntry<float> ScrapQuantityScalar; public readonly ConfigEntry<float> ScrapPlayercountScaling; public readonly ConfigEntry<ThreatScannerMode> ThreatScanner; public readonly ConfigEntry<bool> ScrapProtectionEnabled; public readonly ConfigEntry<float> ScrapProtection; public readonly ConfigEntry<float> ScrapProtectionRandomness; public readonly ConfigEntry<bool> DeathPenaltyFormulaEnabled; public readonly ConfigEntry<float> MaximumDeathPenalty; public readonly ConfigEntry<float> MaximumDeathPenaltyPerPlayer; public readonly ConfigEntry<float> DeadBodyRecoveryDiscount; public readonly ConfigEntry<float> DeathPenaltyScalingCurvature; public static void RegisterTypeConverters() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0069: 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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00c8: 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_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Expected O, but got Unknown TomlTypeConverter.AddConverter(typeof(Interval<int>), new TypeConverter { ConvertToString = (object obj, Type type) => obj.ToString(), ConvertToObject = (string str, Type type) => Interval<int>.Parse(str) }); TomlTypeConverter.AddConverter(typeof(Interval<float>), new TypeConverter { ConvertToString = (object obj, Type type) => obj.ToString(), ConvertToObject = (string str, Type type) => Interval<float>.Parse(str) }); TomlTypeConverter.AddConverter(typeof(List<string>), new TypeConverter { ConvertToString = (object obj, Type type) => JsonConvert.SerializeObject(obj, type, new JsonSerializerSettings()), ConvertToObject = (string str, Type type) => JsonConvert.DeserializeObject(str, type) ?? throw new InvalidOperationException() }); } public PluginConfig(BaseUnityPlugin bindingPlugin) { //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_0434: Expected O, but got Unknown //IL_0464: Unknown result type (might be due to invalid IL or missing references) //IL_046e: Expected O, but got Unknown //IL_0494: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Expected O, but got Unknown //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_04cb: Expected O, but got Unknown //IL_04f1: Unknown result type (might be due to invalid IL or missing references) //IL_04fb: Expected O, but got Unknown //IL_052f: Unknown result type (might be due to invalid IL or missing references) //IL_0539: Expected O, but got Unknown //IL_0635: Unknown result type (might be due to invalid IL or missing references) //IL_063f: Expected O, but got Unknown //IL_0673: Unknown result type (might be due to invalid IL or missing references) //IL_067d: Expected O, but got Unknown //IL_06b1: Unknown result type (might be due to invalid IL or missing references) //IL_06bb: Expected O, but got Unknown //IL_06ef: Unknown result type (might be due to invalid IL or missing references) //IL_06f9: Expected O, but got Unknown //IL_073c: Unknown result type (might be due to invalid IL or missing references) //IL_0746: Expected O, but got Unknown //IL_077a: Unknown result type (might be due to invalid IL or missing references) //IL_0784: Expected O, but got Unknown //IL_07b8: Unknown result type (might be due to invalid IL or missing references) //IL_07c2: Expected O, but got Unknown //IL_0817: Unknown result type (might be due to invalid IL or missing references) //IL_0821: Expected O, but got Unknown //IL_0855: Unknown result type (might be due to invalid IL or missing references) //IL_085f: Expected O, but got Unknown //IL_0893: Unknown result type (might be due to invalid IL or missing references) //IL_089d: Expected O, but got Unknown Enabled = bindingPlugin.Config.Bind<bool>("Global", "Enabled", true, "Globally enable/disable the plugin"); DelegationEnabled = bindingPlugin.Config.Bind<bool>("Global", "Delegation Enabled", true, "Globally enables/disables delegation for the plugin. When this is true, features will be disabled automatically (delegated to other mods) depending on the mods you have installed."); KeepConsoleEnabled = bindingPlugin.Config.Bind<bool>("Misc Tweaks", "Always Show Terminal", false, "Whether to keep the terminal enabled after a player stops using it\nHost Required: No"); FreeUnlockablesEnabled = bindingPlugin.Config.Bind<bool>("Misc Tweaks", "Free Unlockables Enabled", false, "Unlocks unlockables (such as suits, furniture) by name at the start of round.\nHost Required: Yes"); FreeUnlockablesList = bindingPlugin.Config.Bind<List<string>>("Misc Tweaks", "Free Unlockables List", new List<string>(3) { "Green suit", "Hazard suit", "Purple Suit" }, "The unlockable item names to unlock when 'Free Unlockables' are enabled"); LightswitchCommandEnabled = bindingPlugin.Config.Bind<bool>("Misc Tweaks", "Lightswitch Commands Enabled", false, "Enabling this adds a 'lights' command to the terminal to control the interior ship lights, in case a trickster hides the switch.\nHost Required: No"); LeaderboardUsesBestAttemptEnabled = bindingPlugin.Config.Bind<bool>("Misc Tweaks", "Leaderboard uses Best Attempt", false, "Enabling this prevents you from overwriting better challenge moon attempts with a worse one.\nHost Required: Unknown"); SavedItemCapEnabled = bindingPlugin.Config.Bind<bool>("Saved Item Cap", "Saved Item Cap Enabled", false, "Feature flag for the 'saved item cap' option.\nHost Required: Yes"); SavedItemCap = bindingPlugin.Config.Bind<int>("Saved Item Cap", "Saved Item Cap", 45, "Increases the cap on the number of items that can be saved.\n +Can help to prevent items despawning when you have too many and re-load your lobby.\nHost Required: Yes"); RemoveSavedItemCapEnabled = bindingPlugin.Config.Bind<bool>("Saved Item Cap", "Remove Saved Item Cap", false, "Remove the cap on the number of items that can be saved entirely.\nHost Required: Yes"); MilitaryTime = bindingPlugin.Config.Bind<bool>("Clock Tweaks", "24-hour Clock", false, "Whether the time should display in 24-hour (military) format.\nHost Required: No"); HideClockEnabled = bindingPlugin.Config.Bind<bool>("Clock Tweaks", "Hide Clock Enabled", false, "Feature flag for the 'hide clock on x' options.\nHost Required: No"); HideClockOnShip = bindingPlugin.Config.Bind<bool>("Clock Tweaks", "Hide Clock on Ship", true, "Whether the HUD clock should be hidden on the ship.\nHost Required: No"); HideClockOutside = bindingPlugin.Config.Bind<bool>("Clock Tweaks", "Hide Clock Outside", false, "Whether the HUD clock should be hidden outside.\nHost Required: No"); HideClockInFacility = bindingPlugin.Config.Bind<bool>("Clock Tweaks", "Hide Clock in Facility", true, "Whether the HUD clock should be hidden in the facility.\nHost Required: No"); CompanyBuyingFactorTweaksEnabled = bindingPlugin.Config.Bind<bool>("Company Buying Prices", "Company Buying Factor Tweaks Enabled", false, "Whether or not the company buying price tweaks are enabled.\nHost required: Yes"); RandomiseCompanyBuyingFactor = bindingPlugin.Config.Bind<bool>("Company Buying Prices", "Company Buying Factor Randomizer Enabled", false, "Randomises the company buying % when enabled. Great if you're using longer quota deadlines.\nThis uses a variety of things to randomize prices such as the company mood, time passed in the quota, etc.\nRespects the minimum sale value, too.\nHost Required: Yes"); MinimumCompanyBuyingFactor = bindingPlugin.Config.Bind<float>("Company Buying Prices", "Minimum Company Buying Factor", 0f, "The default formula for selling items to the company isn't designed to handle more than 3 days remaining.\nThe Company will be prevented from offering a factor lower than this configured value.\nRecommended values for games above 3 days: 0.3 - 0.5\nHost Required: Yes"); TimeSpeedEnabled = bindingPlugin.Config.Bind<bool>("Time Speed", "Time Speed Enabled", false, "Feature flag for the 'time speed' variable.\nHost Required: Yes"); TimeSpeed = bindingPlugin.Config.Bind<float>("Time Speed", "Time Speed", 1f, "How fast time passes on moons. Lower values mean time passes more slowly.\nRecommended value for single play: 0.75\nHost Required: Yes"); DoorPowerDurationEnabled = bindingPlugin.Config.Bind<bool>("Door Power", "Door Power Duration Enabled", false, "Feature flag for the 'door power duration' variable.\nHost Required: Yes"); DoorPowerDuration = bindingPlugin.Config.Bind<float>("Door Power", "Door Power Duration", 30f, "How long the hangar door can be kept shut at a time (in seconds)\nRecommended values: 60.0 - 180.0\nHost Required: All players should use the same value."); StartingCreditsEnabled = bindingPlugin.Config.Bind<bool>("Starting Credits & Passive Income", "Starting Credits Enabled", false, "Feature flag for the 'starting credits' variable.\nHost Required: Yes"); StartingCredits = bindingPlugin.Config.Bind<int>("Starting Credits & Passive Income", "Starting Credits", 60, "How many credits the group starts with on a new run.\nHost Required: Yes"); PassiveIncomeEnabled = bindingPlugin.Config.Bind<bool>("Starting Credits & Passive Income", "Passive Income Enabled", false, "Feature flag for the 'passive income' variable.\nHost Required: Yes"); PassiveIncomeQuantity = bindingPlugin.Config.Bind<int>("Starting Credits & Passive Income", "Passive Income Amount", 0, "The number of credits you will be given at the end of each level.\nHost Required: Yes"); DaysPerQuotaAssignmentEnabled = bindingPlugin.Config.Bind<bool>("Quota Assignment Duration", "Quota Assignment Duration Enabled", false, "Feature flag for the 'days per quota' feature. 'Quota Formula' feature must also be enabled for this to take effect.\nHost Required: Yes"); DaysPerQuotaAssignmentBehaviour = bindingPlugin.Config.Bind<QuotaDurationBehaviour>("Quota Assignment Duration", "Quota Assignment Behaviour", QuotaDurationBehaviour.Constant, "The behaviour of the quota duration.\n- Constant: Quota duration remains constant throughout play.\n- Variable: Quota duration varies based upon 'target income per day' (configured below)\n- DynamicVariable: Quota duration varies upon your lifetime average income per day .\nHost Required: Yes"); DaysPerQuotaAssignment = bindingPlugin.Config.Bind<int>("Quota Assignment Duration", "Quota Assignment Days", 3, "How long you have to meet each quota (in days)\nRecommended values: 3 - 7\nHost Required: Yes"); DaysPerQuotaAssignmentBounds = bindingPlugin.Config.Bind<Interval<int>>("Quota Assignment Duration", "Quota Assignment Days Bounds", new Interval<int>(3, 10), new ConfigDescription("Bounds for the quota assignment duration when using variable quota duration behaviour.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableInterval<int>(new Interval<int>(1, int.MaxValue)), Array.Empty<object>())); BaseTargetIncomePerDay = bindingPlugin.Config.Bind<int>("Quota Assignment Duration", "Base Target Income per Day", 200, new ConfigDescription("Base target income per day. Used when calculating the quota duration with Variable behaviour.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, int.MaxValue), Array.Empty<object>())); MaxTargetIncomePerDayScalar = bindingPlugin.Config.Bind<float>("Quota Assignment Duration", "Maximum Target Income Per Day Scalar", 1.5f, new ConfigDescription("Upper bound for target income per day multiplier when using variable quota duration behaviour.\nHost Required: Yes", (AcceptableValueBase)null, Array.Empty<object>())); AssignmentsToReachMaximumTargetIncomePerDay = bindingPlugin.Config.Bind<int>("Quota Assignment Duration", "Assignment Count to Reach Maximum Target Income per Day", 10, new ConfigDescription("Number of assignments you must complete to reach the maximum target income per day multiplier.\nHost Required: Yes", (AcceptableValueBase)null, Array.Empty<object>())); TargetIncomePerDayScalarCurvature = bindingPlugin.Config.Bind<float>("Quota Assignment Duration", "Target Income Scalar Curvature", 0f, new ConfigDescription("How curved the graph of target income per day against quota assignments completed is.\n- 0: Target income per day increases linearly.\n- 1: ", (AcceptableValueBase)null, Array.Empty<object>())); TargetIncomePerDayRandomnessScalar = bindingPlugin.Config.Bind<float>("Quota Assignment Duration", "Target Income Scalar Randomness", 0.4f, new ConfigDescription("Randomness of target income per day value used to calculate the quota duration.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), Array.Empty<object>())); QuotaFormulaEnabled = bindingPlugin.Config.Bind<bool>("Quota Calculation", "Quota Formula Enabled", false, "Feature flag for the 'quota formula' variables, which include:\n - 'starting quota'\n - 'quota increase steepness'\n - 'quota base increase'\n - 'quota increase randomness'\nHost Required: Yes"); StartingQuota = bindingPlugin.Config.Bind<int>("Quota Calculation", "Starting Quota", 130, "The starting quota on a new run.\nHost Required: Yes"); QuotaIncreaseSteepnessCoefficient = bindingPlugin.Config.Bind<float>("Quota Calculation", "Quota Increase Steepness", 0.0625f, "Used in calculating quota increase. Coefficient for the increase factor dependent on the number of completed quota assignments.\nHost Required: Yes"); QuotaIncreaseSteepnessExponent = bindingPlugin.Config.Bind<float>("Quota Calculation", "Quota Increase Steepness Exponent", 2f, "Used in calculating quota increase. Exponent for the increase factor dependent on the number of completed quota assignments.\nHost Required: Yes"); QuotaBaseIncrease = bindingPlugin.Config.Bind<float>("Quota Calculation", "fQuotaBaseIncrease", 100f, "Used in calculating quota increase. Multiplier for the constant increase factor.\nHost Required: Yes"); QuotaIncreaseRandomFactor = bindingPlugin.Config.Bind<float>("Quota Calculation", "Quota Increase Random Factor", 0.5f, "Used in calculating quota increase. Multiplier for the random increase factor.\nHost Required: Yes"); ScrapTweaksEnabled = bindingPlugin.Config.Bind<bool>("Scrap Value, Quantity & Playercount Scaling", "Scrap Tweaks Enabled", false, new ConfigDescription("Whether or not to enable scrap tweaks.\nHost required: Yes", (AcceptableValueBase)null, Array.Empty<object>())); ScrapValueScalar = bindingPlugin.Config.Bind<float>("Scrap Value, Quantity & Playercount Scaling", "Scrap Value Scalar", 1f, new ConfigDescription("Multiplier for value of spawned scrap items. Should be a positive float.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), Array.Empty<object>())); ScrapQuantityScalar = bindingPlugin.Config.Bind<float>("Scrap Value, Quantity & Playercount Scaling", "Scrap Quantity Scalar", 1f, new ConfigDescription("Multiplier for quantity of spawned scrap items. Should be a positive float.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), Array.Empty<object>())); ScrapPlayercountScaling = bindingPlugin.Config.Bind<float>("Scrap Value, Quantity & Playercount Scaling", "Scrap Playercount Scaling", 0f, new ConfigDescription("Multiplier for 'playercount scaling' - Higher values increase scrap spawn quantity but decrease scrap value.\nHas no effect when 4 or fewer players are present.\nA value of 0 disables playercount scaling.\nA value of 1.0 means that each additional player will cause 25% more scrap items to spawn (linear, not compounding) and reduce scrap value by an equal factor.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), Array.Empty<object>())); ThreatScanner = bindingPlugin.Config.Bind<ThreatScannerMode>("Threat Scanner", "Threat Scanner Mode", ThreatScannerMode.Disabled, "How the threat scanner functions. Valid types:\n - Disabled\n - Contacts: Number of Enemies on level\n - ThreatLevelPercentage: Percentage of max enemies on level\n - ThreatLevelName: Vague Text description (In order of threat level) [Clear -> Green -> Yellow -> Orange - Red]\nHost Required: No"); ScrapProtectionEnabled = bindingPlugin.Config.Bind<bool>("Scrap Protection", "Scrap Protection Enabled", false, new ConfigDescription("Sets whether or not the scrap protection feature is enabled. \nHost Required: Yes", (AcceptableValueBase)null, Array.Empty<object>())); ScrapProtection = bindingPlugin.Config.Bind<float>("Scrap Protection", "Scrap Protection Probability", 0f, new ConfigDescription("Sets the average probability that each scrap item is kept in the event that that no players survive a mission.\nThat is, this is the approximate average fraction of secured scrap items kept.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); ScrapProtectionRandomness = bindingPlugin.Config.Bind<float>("Scrap Protection", "Scrap Protection Randomness Scalar", 0f, new ConfigDescription("Sets the randomness of the probability that each scrap item is kept in the event that that no players survive a mission.\n 0 -> no randomness, 0.5 -> ±0.5, 1 -> ±1\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); DeathPenaltyFormulaEnabled = bindingPlugin.Config.Bind<bool>("Death Penalty", "Death Penalty Formula Enabled", false, "Feature flag for the 'death penalty formula' variables, which includes\n - 'max death penalty'\n - 'max death penalty per player'\n - 'body recovery discount'\n - 'death penalty scaling curvature'\nHost Required: Yes"); MaximumDeathPenalty = bindingPlugin.Config.Bind<float>("Death Penalty", "Maximum Death Penalty", 0.8f, new ConfigDescription("The maximum fraction of your money that you can lose per round.\nValue should be in [0,1], e.g.\n0 - No money can be lost.\n0.5 - Half your money can be lost in one run.\n1 - All money can be lost in one run.\nUse 0.8 for vanilla behaviour.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MaximumDeathPenaltyPerPlayer = bindingPlugin.Config.Bind<float>("Death Penalty", "Maximum Death Penalty per Player", 0.2f, new ConfigDescription("The maximum fraction of your money that you can lose per round, per dead player.\nValue should be in [0,1].\nUse 0.2 for vanilla behaviour.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); DeadBodyRecoveryDiscount = bindingPlugin.Config.Bind<float>("Death Penalty", "Dead Body Recovery Discount", 0.6f, new ConfigDescription("How much recovering dead bodies reduces the penalty for that death by.\nValue should be in [0,1], e.g.\n0 - Recovering a body does not reduce the fine.\n1 - Recovering a body completely removes the fine for that death.\nUse 0.6 for vanilla behaviour.\nHost Required: Yes", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); DeathPenaltyScalingCurvature = bindingPlugin.Config.Bind<float>("Death Penalty", "Death Penalty Curve Degree", 0f, "How curved the death penalty scaling is. Positive -> less fine for fewer deaths. Negative -> more fine for fewer deaths.\ne.g. with a 4-player lobby:\n0 - The fine scales linearly: 25%, 50%, 75%, 100%.\n1 - The fine scales quadratically: 6.3%, 25%, 56.3%, 100%\n-1 - The fine scales anti-quadratically: 50%, 70.1%, 86.6%, 100%\nHost Required: Yes"); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.github.lordfirespeed.augmented_enhancer"; public const string PLUGIN_NAME = "Augmented Enhancer"; public const string PLUGIN_VERSION = "0.6.0"; } } namespace Enhancer.Features { public class AlwaysShowTerminal : IFeature { private static readonly MethodInfo WaitUntilFrameEndToSetActiveMethod = AccessTools.Method(typeof(Terminal), "waitUntilFrameEndToSetActive", (Type[])null, (Type[])null); private static readonly MethodInfo StartCoroutineMethod = AccessTools.Method(typeof(MonoBehaviour), "StartCoroutine", new Type[1] { typeof(IEnumerator) }, (Type[])null); private static readonly FieldInfo TerminalScrollBarVertical = AccessTools.Field(typeof(Terminal), "scrollBarVertical"); private static readonly PropertyInfo ScrollbarValue = AccessTools.Property(typeof(Scrollbar), "value"); [HarmonyPatch(typeof(Terminal), "QuitTerminal")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TerminalQuitTranspile(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Call, (object)WaitUntilFrameEndToSetActiveMethod, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)StartCoroutineMethod, (string)null) }).MatchBack(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null) }) .SetOpcodeAndAdvance(OpCodes.Ldc_I4_1) .MatchForward(false, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)TerminalScrollBarVertical, (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)0f, (string)null), new CodeMatch((OpCode?)OpCodes.Callvirt, (object)ScrollbarValue.GetSetMethod(), (string)null) }) .SetOpcodeAndAdvance(OpCodes.Nop) .RemoveInstructions(3); return val.InstructionEnumeration(); } [HarmonyPatch(typeof(Terminal), "BeginUsingTerminal")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TerminalOpenTranspile(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction instr) => instr.opcode == OpCodes.Ldc_I4_S && CodeInstructionExtensions.OperandIs(instr, (object)13)), (string)null) }).Advance(-4) .SetAndAdvance(OpCodes.Nop, (object)null) .RemoveInstructions(6); return val.InstructionEnumeration(); } } public class CompanyBuyingFactorTweaks : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } private static float GetRandomPriceFactor() { if (TimeOfDay.Instance.daysUntilDeadline < 1) { return 1f; } Logger.LogInfo((object)"Choosing random buying factor..."); float moodFactor = GetMoodFactor(); float num = 1f + 0.05f * (float)(Plugin.BoundConfig.DaysPerQuotaAssignment.Value - TimeOfDay.Instance.daysUntilDeadline); num = Mathf.Clamp(num, 1f, 2f); Random random = new Random(StartOfRound.Instance.randomMapSeed + 77); float num2 = (float)random.NextDouble() * (1f - moodFactor * num) + moodFactor; Logger.LogInfo((object)$"New buying % set at {num2}"); Logger.LogDebug((object)$" factors {moodFactor} : {num} : {StartOfRound.Instance.randomMapSeed + 77}"); return num2; } private static string? GetCompanyMoodName() { if (TimeOfDay.Instance == null) { return null; } if (TimeOfDay.Instance.currentCompanyMood == null) { return null; } return ((Object)TimeOfDay.Instance.currentCompanyMood).name; } private static float GetMoodFactor() { Logger.LogDebug((object)"Getting mood factor"); try { return GetCompanyMoodName() switch { "SilentCalm" => 0.35f, "SnoringGiant" => 0.45f, "Agitated" => 0.25f, _ => 0.4f, }; } finally { Logger.LogDebug((object)"Got mood factor"); } } [HarmonyPatch(typeof(TimeOfDay), "SetBuyingRateForDay")] [HarmonyPostfix] public static void BuyingRatePost(TimeOfDay __instance) { Logger.LogInfo((object)"Setting company buying rate ..."); if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { if (Plugin.BoundConfig.RandomiseCompanyBuyingFactor.Value) { StartOfRound.Instance.companyBuyingRate = GetRandomPriceFactor(); } if (StartOfRound.Instance.companyBuyingRate < Plugin.BoundConfig.MinimumCompanyBuyingFactor.Value) { StartOfRound.Instance.companyBuyingRate = Plugin.BoundConfig.MinimumCompanyBuyingFactor.Value; } StartOfRound.Instance.SyncCompanyBuyingRateServerRpc(); } } } public class DaysPerQuota : IFeature { protected static ManualLogSource Logger { get; set; } private static float DifficultyScalar { get { int timesFulfilledQuota = TimeOfDay.Instance.timesFulfilledQuota; int value = Plugin.BoundConfig.AssignmentsToReachMaximumTargetIncomePerDay.Value; if (timesFulfilledQuota >= value) { return Plugin.BoundConfig.MaxTargetIncomePerDayScalar.Value; } if (timesFulfilledQuota == 0) { return 1f; } float num = Mathf.Pow(2f, Plugin.BoundConfig.TargetIncomePerDayScalarCurvature.Value); float num2 = 1f + Mathf.Pow((float)timesFulfilledQuota / (float)value, num) * (Plugin.BoundConfig.MaxTargetIncomePerDayScalar.Value - 1f); Logger.LogInfo((object)$"Difficulty scalar calculated to be {num2:f1}"); return num2; } } private static float RandomnessScalar { get { float value = Plugin.BoundConfig.TargetIncomePerDayRandomnessScalar.Value; if (value == 0f) { return 0f; } float num = 1f + value * 2f * TimeOfDay.Instance.quotaVariables.randomizerCurve.Evaluate(Random.Range(0f, 1f)); Logger.LogInfo((object)$"Randomness scalar selected to be {num:f1}"); return num; } } private static float BaseTargetDailyIncome { get { switch (Plugin.BoundConfig.DaysPerQuotaAssignmentBehaviour.Value) { case QuotaDurationBehaviour.Constant: throw new InvalidOperationException(); case QuotaDurationBehaviour.Variable: return Plugin.BoundConfig.BaseTargetIncomePerDay.Value; case QuotaDurationBehaviour.DynamicVariable: try { float num = QuotaFormula.Instance.PastAssignments.Average((QuotaAssignmentInfo info) => (float)info.Income / (float)info.Duration); Logger.LogInfo((object)$"Average income is currently {num:f1}"); return num; } catch (InvalidOperationException) { return Plugin.BoundConfig.BaseTargetIncomePerDay.Value; } default: throw new ArgumentOutOfRangeException(); } } } private static float TargetDailyIncome => BaseTargetDailyIncome * DifficultyScalar * RandomnessScalar; private static float QuotaMagnitude { get { QuotaFormula instance = QuotaFormula.Instance; float num = instance.PastAssignments.Sum((QuotaAssignmentInfo info) => info.BaseIncreaseCoefficient * info.PolynomialIncreaseCoefficient); return (float)instance.RunQuotaVariables.StartingQuota + num; } } private static int AssignmentDuration { get { if (Plugin.BoundConfig.DaysPerQuotaAssignmentBehaviour.Value == QuotaDurationBehaviour.Constant) { return Plugin.BoundConfig.DaysPerQuotaAssignment.Value; } int value = Mathf.CeilToInt(QuotaMagnitude / TargetDailyIncome); return Plugin.BoundConfig.DaysPerQuotaAssignmentBounds.Value.Clamp(value); } } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } private static void SetQuotaDuration() { int assignmentDuration = AssignmentDuration; Logger.LogInfo((object)$"Setting quota duration to {assignmentDuration}..."); QuotaSettings quotaVariables = TimeOfDay.Instance.quotaVariables; quotaVariables.deadlineDaysAmount = assignmentDuration; } private static void TrySetQuotaDuration() { try { SetQuotaDuration(); } catch (Exception ex) { Logger.LogError((object)"Failed to set new quota duration."); Logger.LogError((object)ex); } } [HarmonyPatch(typeof(Terminal), "Start")] [HarmonyPrefix] public static void StartOfRoundShipStartPre() { TrySetQuotaDuration(); } [HarmonyPatch(typeof(TimeOfDay), "SetNewProfitQuota")] [HarmonyPostfix] [HarmonyAfter(new string[] { "com.github.lordfirespeed.augmented_enhancer-QuotaFormula" })] private static void SetDeadline() { TrySetQuotaDuration(); } } public enum QuotaDurationBehaviour { Constant, Variable, DynamicVariable } public class DeathPenalty : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } private static int CountTotalPlayersInSession() { return StartOfRound.Instance.connectedPlayersAmount + 1; } private static float DetermineMaximumPenaltyFactor() { return Mathf.Clamp(Mathf.Min(Plugin.BoundConfig.MaximumDeathPenalty.Value, (float)CountTotalPlayersInSession() * Plugin.BoundConfig.MaximumDeathPenaltyPerPlayer.Value), 0f, 1f); } private static float ComputePenaltyFactor(float deathCoefficient, float maximumPenaltyFactor) { float num = Mathf.Pow(2f, Plugin.BoundConfig.DeathPenaltyScalingCurvature.Value); float num2 = Mathf.Pow(deathCoefficient, num) * Mathf.Pow((float)CountTotalPlayersInSession(), 0f - num) * maximumPenaltyFactor; return Mathf.Clamp(num2, 0f, 1f); } private static float ComputeDeathCoefficient(int playersDead, int bodiesInsured) { return (float)(playersDead - bodiesInsured) + (1f - Mathf.Max(0f, Plugin.BoundConfig.DeadBodyRecoveryDiscount.Value)) * (float)bodiesInsured; } [HarmonyPatch(typeof(HUDManager), "ApplyPenalty")] [HarmonyPrefix] public static bool ApplyPenaltyPrefix(ref int playersDead, ref int bodiesInsured, HUDManager __instance) { playersDead = Mathf.Max(playersDead, 0); bodiesInsured = Mathf.Max(bodiesInsured, 0); float deathCoefficient = ComputeDeathCoefficient(playersDead, bodiesInsured); float maximumPenaltyFactor = DetermineMaximumPenaltyFactor(); float num = ComputePenaltyFactor(deathCoefficient, maximumPenaltyFactor); Terminal val = Object.FindObjectOfType<Terminal>(); int num2 = (int)((float)val.groupCredits * num); Logger.LogInfo((object)$"Death Penalty is {num:p1} of {val.groupCredits} = {num2} credits."); val.groupCredits = Mathf.Max(0, val.groupCredits - num2); ((TMP_Text)__instance.statsUIElements.penaltyAddition).text = $"{playersDead} casualties: -{num:p0}\n({bodiesInsured} bodies recovered)"; ((TMP_Text)__instance.statsUIElements.penaltyTotal).text = $"DUE: {num2}"; Logger.LogInfo((object)$"Death penalty has been applied. New group credits: {val.groupCredits}."); return false; } } public class FreeUnlockables : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyPostfix] public static void StartOfRoundSuitPatch(StartOfRound __instance) { StartOfRound __instance2 = __instance; Logger.LogInfo((object)"Unlocking items..."); CollectionExtensions.Do(from item in __instance2.unlockablesList.unlockables.Select((UnlockableItem unlockable, int index) => new { unlockable, index }).Tap(item => { Logger.LogDebug((object)$"Unlockable item {item.index}: '{item.unlockable.unlockableName}'"); }) where Plugin.BoundConfig.FreeUnlockablesList.Value.Contains(item.unlockable.unlockableName) select item, item => { __instance2.SpawnUnlockable(item.index); }); } } public class HangarDoorCloseDuration : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } [HarmonyPatch(typeof(HangarShipDoor), "Start")] [HarmonyPostfix] public static void HangarShipDoorPost(HangarShipDoor __instance) { Logger.LogInfo((object)$"Setting Hangar door power to last for {Plugin.BoundConfig.DoorPowerDuration.Value} seconds..."); __instance.doorPowerDuration = Plugin.BoundConfig.DoorPowerDuration.Value; } } public class HideClock : IFeature { [Flags] private enum Environment { None = 0, Outside = 1, Ship = 2, Facility = 4, Terminal = 8 } protected static ManualLogSource Logger { get; set; } private static PlayerControllerB? Player { get { if (!((Object)(object)HUDManager.Instance != (Object)null)) { return null; } return HUDManager.Instance.localPlayer; } } private static bool PlayerIsInFactory => Player?.isInsideFactory ?? false; private static bool PlayerIsInShip => Player?.isInHangarShipRoom ?? false; private static bool PlayerIsInTerminal => Player?.inTerminalMenu ?? false; private static HUDElement? Clock { get { if (!((Object)(object)HUDManager.Instance != (Object)null)) { return null; } return HUDManager.Instance.Clock; } } private static bool CurrentClockVisibility { get { HUDElement clock = Clock; if (clock != null) { return clock.targetAlpha > 0f; } return false; } } private static Environment CurrentPlayerLocationEnvironment { get { if (PlayerIsInShip) { return Environment.Ship; } if (PlayerIsInFactory) { return Environment.Facility; } return Environment.Outside; } } private static Environment CurrentPlayerEnvironment { get { Environment environment = CurrentPlayerLocationEnvironment; if (PlayerIsInTerminal) { environment |= Environment.Terminal; } return environment; } } private static Environment ClockVisibleEnvironments { get { Environment environment = Environment.None; if (!Plugin.BoundConfig.HideClockOutside.Value) { environment |= Environment.Outside; } if (!Plugin.BoundConfig.HideClockOnShip.Value) { environment |= Environment.Ship; } if (!Plugin.BoundConfig.HideClockInFacility.Value) { environment |= Environment.Facility; } return environment; } } private static Environment ClockInvisibleEnvironments => Environment.Terminal; private static bool DesiredClockVisibility { get { if (Convert.ToBoolean(CurrentPlayerEnvironment & ClockInvisibleEnvironments)) { return false; } return Convert.ToBoolean(CurrentPlayerEnvironment & ClockVisibleEnvironments); } } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } public static void SetDesiredClockVisibility() { if (HUDManager.Instance != null) { bool desiredClockVisibility = DesiredClockVisibility; if (CurrentClockVisibility != desiredClockVisibility) { Logger.LogDebug((object)((desiredClockVisibility ? "Showing" : "Hiding") + " clock")); HUDManager.Instance.SetClockVisible(desiredClockVisibility); } } } [HarmonyPatch(typeof(TimeOfDay), "SetInsideLightingDimness")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> RedirectSetClockVisible(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[6] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(HUDManager), "Instance"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "insideLighting"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ceq, (object)null, (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction instr) => instr.opcode == OpCodes.Callvirt), (string)null) }).SetAndAdvance(OpCodes.Nop, (object)null) .RemoveInstructions(5) .Insert((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(HideClock), "SetDesiredClockVisibility", (Type[])null, (Type[])null)) }); return val.InstructionEnumeration(); } } public interface IFeature { void SetLogger(ManualLogSource logger) { } void SetHarmony(Harmony harmony) { } void OnEnable() { } void OnDisable() { } void OnConfigChange() { } } [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] public class ItemProtection : IFeature { private static readonly FieldInfo ItemIsScrapField = AccessTools.Field(typeof(Item), "isScrap"); private static readonly MethodInfo ItemIsUnprotectedScrapMethod = AccessTools.Method(typeof(ItemProtection), "IsUnprotectedScrap", (Type[])null, (Type[])null); protected static ManualLogSource Logger { get; set; } = null; private static Random? RandomGenerator { get; set; } private static float? ThisPassProtectionProbability { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } public static bool IsUnprotectedScrap(Item item) { Logger.LogDebug((object)$"Considering item {item} for destruction..."); if (item.isScrap) { return !ShouldSaveScrap(); } return false; } [HarmonyTranspiler] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { return Transpilers.Manipulator(instructions, (Func<CodeInstruction, bool>)((CodeInstruction instruction) => instruction.opcode == OpCodes.Ldfld && CodeInstructionExtensions.OperandIs(instruction, (MemberInfo)ItemIsScrapField)), (Action<CodeInstruction>)delegate(CodeInstruction instruction) { instruction.opcode = OpCodes.Call; instruction.operand = ItemIsUnprotectedScrapMethod; }); } [HarmonyPrefix] private static void Prefix(RoundManager __instance, bool despawnAllItems) { Logger.LogInfo((object)"Getting ready to consider items for destruction"); if (despawnAllItems || !StartOfRound.Instance.allPlayersDead) { return; } ThisPassProtectionProbability = Plugin.BoundConfig.ScrapProtection.Value; if (!(Plugin.BoundConfig.ScrapProtectionRandomness.Value <= 0f) || (!(Plugin.BoundConfig.ScrapProtection.Value <= 0f) && !(Plugin.BoundConfig.ScrapProtection.Value >= 1f))) { RandomGenerator = new Random(StartOfRound.Instance.randomMapSeed + 83); if (!(Plugin.BoundConfig.ScrapProtectionRandomness.Value <= 0f)) { ThisPassProtectionProbability += Plugin.BoundConfig.ScrapProtectionRandomness.Value * 2f * TimeOfDay.Instance.quotaVariables.randomizerCurve.Evaluate((float)RandomGenerator.NextDouble()); ThisPassProtectionProbability = Mathf.Clamp(ThisPassProtectionProbability.Value, 0f, 1f); } } } [HarmonyPostfix] private static void Postfix() { Logger.LogInfo((object)"Finished considering items for destruction"); RandomGenerator = null; ThisPassProtectionProbability = null; } public static bool ShouldSaveScrap() { float value = Plugin.BoundConfig.ScrapProtection.Value; if (value != 0f) { if (value == 1f) { return true; } return (double?)ThisPassProtectionProbability > RandomGenerator?.NextDouble(); } return false; } } public class LeaderboardUsesBestAttempt : IFeature { protected static ManualLogSource Logger { get; set; } protected static Harmony Harmony { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } public void SetHarmony(Harmony harmony) { Logger.LogDebug((object)"Harmony assigned."); Harmony = harmony; } public void OnEnable() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown MethodInfo method = AccessTools.Method(typeof(MenuManager), "GetLeaderboardForChallenge", (Type[])null, (Type[])null).GetCustomAttribute<AsyncStateMachineAttribute>().StateMachineType.GetMethod("MoveNext", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(LeaderboardUsesBestAttempt), "DoNotOverwriteBetterChallengeAttempts", (Type[])null, (Type[])null)); Harmony.Patch((MethodBase)method, (HarmonyMethod)null, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null); } public static IEnumerable<CodeInstruction> DoNotOverwriteBetterChallengeAttempts(IEnumerable<CodeInstruction> instructions, ILGenerator generator) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, generator); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Leaderboard), "ReplaceScore", (Type[])null, (Type[])null), (string)null) }).SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(Leaderboard), "SubmitScoreAsync", (Type[])null, (Type[])null)); return val.InstructionEnumeration(); } } public class LightswitchCommand : IFeature { private bool _initialized; private TerminalKeyword? _lightsVerbKeyword; private TerminalKeyword? _helpNounKeyword; private TerminalKeyword? _onNounKeyword; private TerminalKeyword? _offNounKeyword; private TerminalKeyword? _toggleNounKeyword; private CommandInfo? _onCommandInfo; private CommandInfo? _offCommandInfo; private CommandInfo? _toggleCommandInfo; private static ShipLights? _shipLightsInstance = null; private static readonly string LightsHelpText = new StringBuilder().AppendLine(">LIGHTS HELP").AppendLine("Display this information.").AppendLine() .AppendLine(">LIGHTS ON") .AppendLine("Turns the ship interior lights on.") .AppendLine() .AppendLine(">LIGHTS OFF") .AppendLine("Turns the ship interior lights off.") .AppendLine() .AppendLine(">LIGHTS TOGGLE") .AppendLine("Toggles the ship interior lights on/off.") .AppendLine() .ToString(); protected static ManualLogSource Logger { get; set; } = null; protected static LightswitchCommand? Instance { get; set; } = null; private static ShipLights? ShipLightsInstance { get { if (_shipLightsInstance != null) { return _shipLightsInstance; } if (_shipLightsInstance == null) { _shipLightsInstance = Object.FindObjectOfType<ShipLights>(); } return _shipLightsInstance; } } private static bool ShipLightsAreOn { get { if (ShipLightsInstance != null) { return ShipLightsInstance.areLightsOn; } return false; } } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } private static void SetShipLights(bool lightsOn) { if (_shipLightsInstance != null) { _shipLightsInstance.SetShipLightsBoolean(lightsOn); } } public static string ToggleLightsTextSupplier() { return SetLightsTextSupplier(!ShipLightsAreOn); } public static string SetLightsTextSupplier(bool lightsOn) { SetShipLights(lightsOn); return "Lights " + (lightsOn ? "on" : "out") + "!\n\n"; } public void Initialize() { //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: 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_016c: Expected O, but got Unknown //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Expected O, but got Unknown //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Expected O, but got Unknown if (!_initialized) { _initialized = true; TerminalNode val = TerminalApi.CreateTerminalNode(LightsHelpText, true, ""); TerminalNode val2 = TerminalApi.CreateTerminalNode("Lights on\n", true, ""); TerminalNode val3 = TerminalApi.CreateTerminalNode("Lights out\n", true, ""); TerminalNode val4 = TerminalApi.CreateTerminalNode("Lights toggle\n", true, ""); _lightsVerbKeyword = TerminalApi.CreateTerminalKeyword("lights", true, val4); _helpNounKeyword = TerminalApi.GetKeyword("help"); _onNounKeyword = TerminalApi.CreateTerminalKeyword("on", false, (TerminalNode)null); _offNounKeyword = TerminalApi.CreateTerminalKeyword("off", false, (TerminalNode)null); _toggleNounKeyword = TerminalApi.CreateTerminalKeyword("toggle", false, (TerminalNode)null); TerminalExtenstionMethods.AddCompatibleNoun(_lightsVerbKeyword, _helpNounKeyword, val); TerminalExtenstionMethods.AddCompatibleNoun(_lightsVerbKeyword, _onNounKeyword, val2); TerminalExtenstionMethods.AddCompatibleNoun(_lightsVerbKeyword, _offNounKeyword, val3); TerminalExtenstionMethods.AddCompatibleNoun(_lightsVerbKeyword, _toggleNounKeyword, val4); TerminalApi.AddTerminalKeyword(_lightsVerbKeyword, new CommandInfo { Title = "Lights", Category = "Other", Description = "Lightswitch-related commands. Run 'lights help' for info." }); TerminalApi.AddTerminalKeyword(_helpNounKeyword, (CommandInfo)null); _onCommandInfo = new CommandInfo { TriggerNode = val2, DisplayTextSupplier = () => SetLightsTextSupplier(lightsOn: true) }; TerminalApi.AddTerminalKeyword(_onNounKeyword, (CommandInfo)null); TerminalApi.CommandInfos.Add(_onCommandInfo); _offCommandInfo = new CommandInfo { TriggerNode = val3, DisplayTextSupplier = () => SetLightsTextSupplier(lightsOn: false) }; TerminalApi.AddTerminalKeyword(_offNounKeyword, (CommandInfo)null); TerminalApi.CommandInfos.Add(_offCommandInfo); CommandInfo val5 = new CommandInfo(); val5.TriggerNode = val4; val5.DisplayTextSupplier = ToggleLightsTextSupplier; _toggleCommandInfo = val5; TerminalApi.AddTerminalKeyword(_toggleNounKeyword, (CommandInfo)null); TerminalApi.CommandInfos.Add(_toggleCommandInfo); } } public void OnEnable() { Instance = this; if (NetworkManager.Singleton != null && NetworkManager.Singleton.IsConnectedClient && Object.FindObjectOfType<Terminal>() != null) { Initialize(); } } public void OnDisable() { if (Instance == this) { Instance = null; } if (_initialized) { if (_lightsVerbKeyword != null) { TerminalApi.DeleteKeyword(_lightsVerbKeyword.word); } if (_onNounKeyword != null) { TerminalApi.DeleteKeyword(_onNounKeyword.word); } if (_offNounKeyword != null) { TerminalApi.DeleteKeyword(_offNounKeyword.word); } if (_toggleNounKeyword != null) { TerminalApi.DeleteKeyword(_toggleNounKeyword.word); } TerminalApi.CommandInfos.Remove(_onCommandInfo); TerminalApi.CommandInfos.Remove(_offCommandInfo); TerminalApi.CommandInfos.Remove(_toggleCommandInfo); } } [HarmonyPatch(typeof(Terminal), "Awake")] [HarmonyPostfix] public static void OnTerminalAwake() { Instance?.Initialize(); } } public class MilitaryTime : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } [HarmonyPatch(typeof(HUDManager), "SetClock")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> Transpile24HourClock(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Ldarg_3, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Brtrue, (object)null, (string)null) }); int pos = val.Pos; val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldloc_1, (object)null, (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction instr) => instr.opcode == OpCodes.Ldc_I4_S && CodeInstructionExtensions.OperandIs(instr, (object)12)), (string)null), new CodeMatch((OpCode?)OpCodes.Rem, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_1, (object)null, (string)null) }).RemoveInstructionsInRange(pos, val.Pos); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[5] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction instr) => instr.opcode == OpCodes.Ldc_I4_S && CodeInstructionExtensions.OperandIs(instr, (object)48)), (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction instr) => instr.opcode == OpCodes.Callvirt), (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(HUDManager), "amPM"), (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(string), "Concat", new Type[2] { typeof(string), typeof(string) }, (Type[])null), (string)null) }).RemoveInstructions(5); return val.InstructionEnumeration(); } } public class PassiveIncome : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } [HarmonyPatch(typeof(TimeOfDay), "OnDayChanged")] [HarmonyPostfix] public static void AddPassiveIncome(TimeOfDay __instance) { if (((NetworkBehaviour)__instance).IsServer) { Logger.LogInfo((object)$"Adding {Plugin.BoundConfig.PassiveIncomeQuantity.Value} passive income credits..."); Terminal val = Object.FindObjectOfType<Terminal>(); val.groupCredits += Plugin.BoundConfig.PassiveIncomeQuantity.Value; val.SyncGroupCreditsServerRpc(val.groupCredits, val.numberOfItemsInDropship); } } } public class QuotaFormula : IFeature { [HarmonyPatch(typeof(TimeOfDay), "SetNewProfitQuota")] private class SetNewProfitQuotaPatches { [HarmonyPrefix] public static void Prefix(TimeOfDay __instance) { if (Instance != null) { Instance._currentAssignmentInfo = new QuotaAssignmentInfo { Quota = __instance.profitQuota, Income = __instance.quotaFulfilled, Duration = __instance.quotaVariables.deadlineDaysAmount, BaseIncreaseCoefficient = Instance.RunQuotaVariables.BaseIncrease }; } } [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Expected O, but got Unknown //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Expected O, but got Unknown //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Expected O, but got Unknown //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Expected O, but got Unknown //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Expected O, but got Unknown //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Expected O, but got Unknown //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Expected O, but got Unknown //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Expected O, but got Unknown //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Expected O, but got Unknown //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Expected O, but got Unknown //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Expected O, but got Unknown //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_034d: Expected O, but got Unknown //IL_0368: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Expected O, but got Unknown //IL_03a9: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Expected O, but got Unknown //IL_03d0: Unknown result type (might be due to invalid IL or missing references) //IL_03d6: Expected O, but got Unknown //IL_03f7: Unknown result type (might be due to invalid IL or missing references) //IL_03fd: Expected O, but got Unknown //IL_0429: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Expected O, but got Unknown //IL_044a: Unknown result type (might be due to invalid IL or missing references) //IL_0450: Expected O, but got Unknown //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0471: Expected O, but got Unknown //IL_048b: Unknown result type (might be due to invalid IL or missing references) //IL_0491: Expected O, but got Unknown //IL_04a8: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Expected O, but got Unknown //IL_04bc: Unknown result type (might be due to invalid IL or missing references) //IL_04c2: Expected O, but got Unknown //IL_04d0: Unknown result type (might be due to invalid IL or missing references) //IL_04d6: Expected O, but got Unknown //IL_04fc: Unknown result type (might be due to invalid IL or missing references) //IL_0502: Expected O, but got Unknown //IL_051d: Unknown result type (might be due to invalid IL or missing references) //IL_0523: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[13] { new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)1f, (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "timesFulfilledQuota"), (string)null), new CodeMatch((OpCode?)OpCodes.Conv_R4, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "timesFulfilledQuota"), (string)null), new CodeMatch((OpCode?)OpCodes.Conv_R4, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "increaseSteepness"), (string)null), new CodeMatch((OpCode?)OpCodes.Div, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Mul, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Add, (object)null, (string)null) }).RemoveInstructions(13) .Insert((CodeInstruction[])(object)new CodeInstruction[4] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "timesFulfilledQuota")), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(QuotaFormula), "ComputePolynomialCoefficient", (Type[])null, (Type[])null)) }) .MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "baseIncrease"), (string)null) }) .RemoveInstructions(3) .Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "RunQuotaVariables")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(AugmentedQuotaVariables), "BaseIncrease")) }) .MatchForward(true, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Mul, (object)null, (string)null) }) .Advance(1) .Insert((CodeInstruction[])(object)new CodeInstruction[4] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "CurrentAssignmentInfo")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "CurrentAssignmentInfo")) }) .MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "randomizerMultiplier"), (string)null) }) .RemoveInstructions(3) .Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "RunQuotaVariables")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(AugmentedQuotaVariables), "RandomizerMultiplier")) }) .MatchForward(true, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Mul, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)1f, (string)null), new CodeMatch((OpCode?)OpCodes.Add, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Mul, (object)null, (string)null) }) .Insert((CodeInstruction[])(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(QuotaAssignmentInfo), "RandomizedIncreaseCoefficient")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaAssignmentInfo), "RandomizedIncreaseCoefficient")) }); return val.InstructionEnumeration(); } [HarmonyPostfix] public static void Postfix(TimeOfDay __instance) { if (Instance?.CurrentAssignmentInfo != null) { Instance.CurrentAssignmentInfo.NextQuota = __instance.profitQuota; Instance.CurrentAssignmentInfo.CombinedIncrease = __instance.profitQuota - Instance.CurrentAssignmentInfo.Quota; Logger.LogDebug((object)Instance.CurrentAssignmentInfo); Instance.PastAssignments.Add(Instance.CurrentAssignmentInfo); Instance._currentAssignmentInfo = null; } } } protected static readonly string QuotaVariablesKey = "com.github.lordfirespeed.augmented_enhancer-QuotaVariables"; protected static readonly string PastAssignmentsKey = "com.github.lordfirespeed.augmented_enhancer-PastAssignments"; private static readonly MethodInfo FindObjectOfTypeTimeOfDayMethodInfo = AccessTools.Method(typeof(Object), "FindObjectOfType", (Type[])null, new Type[1] { typeof(TimeOfDay) }); private AugmentedQuotaVariables? _runQuotaVariables; private QuotaAssignmentInfo? _currentAssignmentInfo; private List<QuotaAssignmentInfo>? _pastAssignments; protected static ManualLogSource Logger { get; set; } = null; public static QuotaFormula? Instance { get; private set; } public AugmentedQuotaVariables RunQuotaVariables { get { if (!NetworkManager.Singleton.IsConnectedClient) { throw new InvalidOperationException("Not currently in-game!"); } if (_runQuotaVariables == null) { _runQuotaVariables = ES3.Load<AugmentedQuotaVariables>(QuotaVariablesKey, GameNetworkManager.Instance.currentSaveFileName, (AugmentedQuotaVariables)null); } if (_runQuotaVariables == null) { _runQuotaVariables = ConfiguredQuotaVariables; } return _runQuotaVariables; } } private QuotaAssignmentInfo? CurrentAssignmentInfo { get { if (!NetworkManager.Singleton.IsConnectedClient) { throw new InvalidOperationException("Not currently in-game!"); } return _currentAssignmentInfo; } } public List<QuotaAssignmentInfo> PastAssignments { get { if (!NetworkManager.Singleton.IsConnectedClient) { throw new InvalidOperationException("Not currently in-game!"); } if (_pastAssignments == null) { _pastAssignments = ES3.Load<List<QuotaAssignmentInfo>>(PastAssignmentsKey, GameNetworkManager.Instance.currentSaveFileName, (List<QuotaAssignmentInfo>)null); } if (_pastAssignments == null) { _pastAssignments = new List<QuotaAssignmentInfo>(); } return _pastAssignments; } } public static AugmentedQuotaVariables ConfiguredQuotaVariables => new AugmentedQuotaVariables { StartingQuota = Plugin.BoundConfig.StartingQuota.Value, IncreaseSteepness = Plugin.BoundConfig.QuotaIncreaseSteepnessCoefficient.Value, IncreaseExponent = Plugin.BoundConfig.QuotaIncreaseSteepnessExponent.Value, BaseIncrease = Plugin.BoundConfig.QuotaBaseIncrease.Value, RandomizerMultiplier = Plugin.BoundConfig.QuotaIncreaseRandomFactor.Value * 2f }; public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } public void OnEnable() { Instance = this; } public void OnDisable() { if (Instance == this) { Instance = null; } } public static void ResetQuotaVariables() { AugmentedQuotaVariables configuredQuotaVariables = ConfiguredQuotaVariables; Instance._runQuotaVariables = configuredQuotaVariables; ES3.Save<AugmentedQuotaVariables>(QuotaVariablesKey, configuredQuotaVariables, GameNetworkManager.Instance.currentSaveFileName); Logger.LogDebug((object)"Saved quota variables to current save file."); } public static void ResetPastAssignments() { List<QuotaAssignmentInfo> list = new List<QuotaAssignmentInfo>(); Instance._pastAssignments = list; ES3.Save<List<QuotaAssignmentInfo>>(PastAssignmentsKey, list, GameNetworkManager.Instance.currentSaveFileName); Logger.LogDebug((object)"Saved past assignments to current save file."); } public static void ResetValues() { ResetQuotaVariables(); ResetPastAssignments(); } public static void SaveQuotaVariables() { if (!ES3.KeyExists(QuotaVariablesKey, GameNetworkManager.Instance.currentSaveFileName)) { ResetValues(); } } public static void SavePastAssignments() { ES3.Save<List<QuotaAssignmentInfo>>(PastAssignmentsKey, Instance.PastAssignments, GameNetworkManager.Instance.currentSaveFileName); } public static void SaveValues() { SaveQuotaVariables(); SavePastAssignments(); } public float ComputePolynomialCoefficient(int timesFulfilledQuota) { float num = 1f + Mathf.Pow((float)timesFulfilledQuota, RunQuotaVariables.IncreaseExponent) * RunQuotaVariables.IncreaseSteepness; Logger.LogDebug((object)$"Computed polynomial coefficient: {num}"); Instance._currentAssignmentInfo.PolynomialIncreaseCoefficient = num; return num; } [HarmonyPatch(typeof(GameNetworkManager), "ResetSavedGameValues")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TranspileResetSavedGameValues(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown //IL_00aa: 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_00ce: Expected O, but got Unknown //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Expected O, but got Unknown //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Expected O, but got Unknown //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Expected O, but got Unknown //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Expected O, but got Unknown //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(true, (CodeMatch[])(object)new CodeMatch[6] { new CodeMatch((OpCode?)OpCodes.Call, (object)FindObjectOfTypeTimeOfDayMethodInfo, (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldnull, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Brfalse, (object)null, (string)null) }).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)null, (object)null, (string)null) { labels = new List<Label>(1) { (Label)val.Operand } } }) .MatchBack(false, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldstr, (object)"ProfitQuota", (string)null), new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "startingQuota"), (string)null) }) .Insert((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(QuotaFormula), "ResetValues", (Type[])null, (Type[])null)) }) .Advance(2) .RemoveInstructions(3) .Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "RunQuotaVariables")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(AugmentedQuotaVariables), "StartingQuota")) }); return val.InstructionEnumeration(); } [HarmonyPatch(typeof(GameNetworkManager), "SaveGameValues")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TranspileSaveGameValues(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown //IL_00aa: 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_00ce: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(true, (CodeMatch[])(object)new CodeMatch[6] { new CodeMatch((OpCode?)OpCodes.Call, (object)FindObjectOfTypeTimeOfDayMethodInfo, (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldnull, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Brfalse, (object)null, (string)null) }).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)null, (object)null, (string)null) { labels = new List<Label>(1) { (Label)val.Operand } } }) .MatchBack(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null) }) .Insert((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(QuotaFormula), "SaveValues", (Type[])null, (Type[])null)) }); return val.InstructionEnumeration(); } [HarmonyPatch(typeof(StartOfRound), "SetTimeAndPlanetToSavedSettings")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TranspileSetTimeAndPlanetToSavedSettings(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(TimeOfDay), "Instance"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "startingQuota"), (string)null) }).RemoveInstructions(3) .Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "RunQuotaVariables")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(AugmentedQuotaVariables), "StartingQuota")) }); return val.InstructionEnumeration(); } [HarmonyPatch(typeof(StartOfRound), "ResetShip")] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> TranspileResetShip(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.Start().MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(TimeOfDay), "Instance"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(TimeOfDay), "quotaVariables"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(QuotaSettings), "startingQuota"), (string)null) }).RemoveInstructions(3) .Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "Instance")), new CodeInstruction(OpCodes.Call, (object)AccessTools.PropertyGetter(typeof(QuotaFormula), "RunQuotaVariables")), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(AugmentedQuotaVariables), "StartingQuota")) }); return val.InstructionEnumeration(); } } public class QuotaAssignmentInfo { public int Quota; public int Income; public int Duration; public float BaseIncreaseCoefficient; public float PolynomialIncreaseCoefficient; public float RandomizedIncreaseCoefficient; public int CombinedIncrease; public int NextQuota; public override string ToString() { return new StringBuilder("\n").AppendLine("QuotaAssignmentInfo {").AppendLine($" Quota: {Quota}").AppendLine($" Income: {Income}") .AppendLine($" Duration: {Duration}") .AppendLine($" BaseIncreaseCoefficient: {BaseIncreaseCoefficient}") .AppendLine($" PolynomialIncreaseCoefficient: {PolynomialIncreaseCoefficient}") .AppendLine($" RandomizedIncreaseCoefficient: {RandomizedIncreaseCoefficient}") .AppendLine($" CombinedIncrease: {CombinedIncrease}") .AppendLine($" NextQuota: {NextQuota}") .AppendLine("}") .ToString(); } } public class AugmentedQuotaVariables { public int StartingQuota; public float IncreaseSteepness; public float IncreaseExponent; public float BaseIncrease; public float RandomizerMultiplier; } public class RemoveSavedItemCap : IFeature { protected static ManualLogSource Logger { get; set; } public void SetLogger(ManualLogSource logger) { logger.LogDebug((object)"Logger assigned."); Logger = logger; } [HarmonyPatch(typeof(GameNetworkManager), "SaveItemsInShip")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> RemoveSavedItemCapTranspiler(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)n