Decompiled source of Augmented Enhancer v0.6.0

com.github.lordfirespeed.augmented_enhancer.dll

Decompiled 11 months ago
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