Decompiled source of TempDrones v1.0.0

plugins/TempDrones.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using On.RoR2;
using On.RoR2.UI;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TempDrones")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+eda26cb08b1550479e299b32e2f4bc095e582d9c")]
[assembly: AssemblyProduct("TempDrones")]
[assembly: AssemblyTitle("TempDrones")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace AdjustedDrones
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("AdoptedFatty.TempDrones", "TempDrones", "1.0.0")]
	public class AdjustedDrones : BaseUnityPlugin
	{
		private sealed class UnityColorTypeConverter : TypeConverter
		{
			public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
			{
				return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
			}

			public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
			{
				return destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
			}

			public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
			{
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
				if (value is string text)
				{
					string text2 = text.Trim();
					if (text2.Length == 0)
					{
						return Color.white;
					}
					string text3 = (text2.StartsWith("#", StringComparison.Ordinal) ? text2 : ("#" + text2));
					Color val = default(Color);
					if (ColorUtility.TryParseHtmlString(text3, ref val))
					{
						return val;
					}
					string[] array = text2.Split(',');
					int num = array.Length;
					bool flag = (uint)(num - 3) <= 1u;
					if (flag && float.TryParse(array[0], out var result) && float.TryParse(array[1], out var result2) && float.TryParse(array[2], out var result3))
					{
						float result4 = 1f;
						if (array.Length == 4)
						{
							float.TryParse(array[3], out result4);
						}
						return (object)new Color(result, result2, result3, result4);
					}
				}
				return base.ConvertFrom(context, culture, value);
			}

			public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				if (destinationType == typeof(string) && value is Color val)
				{
					return "#" + ColorUtility.ToHtmlStringRGBA(val);
				}
				return base.ConvertTo(context, culture, value, destinationType);
			}
		}

		[CompilerGenerated]
		private sealed class <ApplyRunGatedSystems>d__32 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public AdjustedDrones <>4__this;

			private float <startTime>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ApplyRunGatedSystems>d__32(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
				}
				else
				{
					<>1__state = -1;
					CaptureOriginalDroneCostsIfNeeded();
					SetGlobalDroneCosts(active: false);
					if (DisableWhenOperator == null || !DisableWhenOperator.Value)
					{
						goto IL_008f;
					}
					<startTime>5__1 = Time.unscaledTime;
				}
				if (Time.unscaledTime - <startTime>5__1 < 5f && !IsOperatorPlayerPresent())
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				goto IL_008f;
				IL_008f:
				if (IsModActiveNow())
				{
					SetGlobalDroneCosts(active: true);
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <InitializePerDroneConfigsWhenReady>d__24 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public AdjustedDrones <>4__this;

			private float <startTime>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <InitializePerDroneConfigsWhenReady>d__24(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<startTime>5__1 = Time.unscaledTime;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (DroneCatalog.droneCount <= 0 && Time.unscaledTime - <startTime>5__1 < 10f)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				<>4__this.InitializePerDroneConfigs();
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public const string PluginAuthor = "AdoptedFatty";

		public const string PluginName = "TempDrones";

		public const string PluginGUID = "AdoptedFatty.TempDrones";

		public const string PluginVersion = "1.0.0";

		internal static ConfigEntry<bool> ModEnabled;

		internal static ConfigEntry<bool> DisableWhenOperator;

		internal static ConfigEntry<string> TimerExemptDrones;

		internal static ConfigEntry<bool> DisableDroneAggro;

		internal static ConfigEntry<Color> TimerColor;

		internal static ConfigEntry<float> DifficultyExponent;

		internal static ConfigEntry<float> DifficultyCoefficientMultiplier;

		internal static ConfigEntry<float> RepairCostMultiplier;

		internal static ConfigEntry<float> DroneBaseCostMultiplier;

		internal static readonly Dictionary<(DroneUptimeRarityTier tier, DroneUptimeTierClass tierClass), ConfigEntry<float>> DurationSeconds = new Dictionary<(DroneUptimeRarityTier, DroneUptimeTierClass), ConfigEntry<float>>();

		internal static readonly Dictionary<DroneIndex, ConfigEntry<float>> PerDroneDurationSeconds = new Dictionary<DroneIndex, ConfigEntry<float>>();

		private static readonly HashSet<ConfigEntryBase> riskOfOptionsRegisteredEntries = new HashSet<ConfigEntryBase>();

		private static readonly Dictionary<PurchaseInteraction, int> originalDroneCosts = new Dictionary<PurchaseInteraction, int>();

		private static string cachedTimerExemptValue;

		private static HashSet<string> cachedTimerExemptTokens;

		internal static AdjustedDrones Instance { get; private set; }

		private void Awake()
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			Instance = this;
			Log.Init(((BaseUnityPlugin)this).Logger);
			TryRegisterColorTomlConverter();
			BindConfig();
			RegisterRiskOfOptionsOptions();
			if (!ModEnabled.Value)
			{
				Log.Info("AdjustedDrones is disabled via config (General.Enabled=false). Restart required to apply.");
				return;
			}
			CaptureOriginalDroneCostsIfNeeded();
			((MonoBehaviour)this).StartCoroutine(InitializePerDroneConfigsWhenReady());
			CharacterBody.onBodyStartGlobal += OnBodyStartGlobal;
			BullseyeSearch.GetResults += new hook_GetResults(BullseyeSearch_GetResults);
			AllyCardController.Awake += new hook_Awake(AllyCardController_Awake);
			Run.onRunStartGlobal += Run_onRunStartGlobal;
		}

		[IteratorStateMachine(typeof(<InitializePerDroneConfigsWhenReady>d__24))]
		private IEnumerator InitializePerDroneConfigsWhenReady()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <InitializePerDroneConfigsWhenReady>d__24(0)
			{
				<>4__this = this
			};
		}

		private void Run_onRunStartGlobal(Run run)
		{
			InitializePerDroneConfigs();
			((MonoBehaviour)this).StartCoroutine(ApplyRunGatedSystems());
		}

		private void OnDestroy()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			CharacterBody.onBodyStartGlobal -= OnBodyStartGlobal;
			BullseyeSearch.GetResults -= new hook_GetResults(BullseyeSearch_GetResults);
			AllyCardController.Awake -= new hook_Awake(AllyCardController_Awake);
			Run.onRunStartGlobal -= Run_onRunStartGlobal;
		}

		private void BindConfig()
		{
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable/disable the AdjustedDrones mod. Requires restart.");
			DisableWhenOperator = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "DisableWhenOperator", false, "If true, this mod is disabled when at least one player is Operator/DroneTech (body name contains 'Operator' or 'DroneTech').");
			TimerExemptDrones = ((BaseUnityPlugin)this).Config.Bind<string>("General", "TimerExemptDrones", string.Join("\n", "Drone_11_DroneBomberBodySeconds", "Drone_14_DTGunnerDroneBodySeconds", "Drone_15_DTHaulerDroneBodySeconds", "Drone_16_DTHealingDroneBodySeconds", "Drone_9_DroneCommanderBodySecons"), "List of drone body names (or per-drone config keys like 'Drone_11_DroneBomberBodySeconds') that should NEVER auto-break from the timer. One entry per line.");
			TimerColor = ((BaseUnityPlugin)this).Config.Bind<Color>("General", "TimerColor", new Color(0.3f, 0.6f, 1f, 1f), "Drone timer UI color.");
			DisableDroneAggro = ((BaseUnityPlugin)this).Config.Bind<bool>("Aggro", "DisableDroneAggro", true, "If true, enemies will not target player-owned drones/turrets (they won't draw aggro).");
			DifficultyExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Scaling", "DifficultyCoefficientExponent", 1f, "Effective duration = baseDuration / ((difficultyCoefficient * multiplier) ^ exponent). Uses Run.difficultyCoefficient only. Updates dynamically as the run difficulty ramps. Set to 0 to disable scaling.");
			DifficultyCoefficientMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Scaling", "DifficultyCoefficientMultiplier", 1f, "Multiplier applied to Run.difficultyCoefficient before exponentiation. 1 = unchanged.");
			RepairCostMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Repair", "RepairCostMultiplier", 0.5f, "Multiplier applied to the base repair cost of broken drone interactables 0.5 = half price.");
			DroneBaseCostMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Repair", "DroneBaseCostMultiplier", 0.5f, "Multiplier applied to the base purchase cost of drone purchase interactables (non-broken). 0.5 = half price.");
			BindDuration(DroneUptimeRarityTier.White, DroneUptimeTierClass.Utility, 240f);
			BindDuration(DroneUptimeRarityTier.White, DroneUptimeTierClass.Combat, 180f);
			BindDuration(DroneUptimeRarityTier.Green, DroneUptimeTierClass.Utility, 180f);
			BindDuration(DroneUptimeRarityTier.Green, DroneUptimeTierClass.Combat, 135f);
			BindDuration(DroneUptimeRarityTier.Red, DroneUptimeTierClass.Utility, 120f);
			BindDuration(DroneUptimeRarityTier.Red, DroneUptimeTierClass.Combat, 90f);
		}

		private void InitializePerDroneConfigs()
		{
			for (int i = 0; i < DroneCatalog.droneCount; i++)
			{
				DroneDef droneDef = DroneCatalog.GetDroneDef((DroneIndex)i);
				if ((Object)(object)droneDef != (Object)null)
				{
					EnsurePerDroneEntry(droneDef);
				}
			}
		}

		private void ApplyGlobalDroneCostMultipliers()
		{
			SetGlobalDroneCosts(active: true);
		}

		internal static bool IsModActiveNow()
		{
			if (ModEnabled == null || !ModEnabled.Value)
			{
				return false;
			}
			if (DisableWhenOperator != null && DisableWhenOperator.Value && IsOperatorPlayerPresent())
			{
				return false;
			}
			return true;
		}

		private static bool IsOperatorPlayerPresent()
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				ReadOnlyCollection<PlayerCharacterMasterController> instances = PlayerCharacterMasterController.instances;
				if (instances == null)
				{
					return false;
				}
				foreach (PlayerCharacterMasterController item in instances)
				{
					if (!Object.op_Implicit((Object)(object)item))
					{
						continue;
					}
					CharacterMaster master = item.master;
					CharacterBody val = (Object.op_Implicit((Object)(object)master) ? master.GetBody() : null);
					if (Object.op_Implicit((Object)(object)val))
					{
						string text = BodyCatalog.GetBodyName(val.bodyIndex);
						if (string.IsNullOrWhiteSpace(text))
						{
							text = ((Object)val).name;
						}
						if (!string.IsNullOrWhiteSpace(text) && (text.IndexOf("Operator", StringComparison.OrdinalIgnoreCase) >= 0 || text.IndexOf("DroneTech", StringComparison.OrdinalIgnoreCase) >= 0))
						{
							return true;
						}
					}
				}
			}
			catch
			{
			}
			return false;
		}

		[IteratorStateMachine(typeof(<ApplyRunGatedSystems>d__32))]
		private IEnumerator ApplyRunGatedSystems()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ApplyRunGatedSystems>d__32(0)
			{
				<>4__this = this
			};
		}

		private static void CaptureOriginalDroneCostsIfNeeded()
		{
			try
			{
				InteractableSpawnCard[] array = Resources.LoadAll<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard");
				if (array == null || array.Length == 0)
				{
					return;
				}
				InteractableSpawnCard[] array2 = array;
				foreach (InteractableSpawnCard val in array2)
				{
					if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)((SpawnCard)val).prefab))
					{
						PurchaseInteraction component = ((SpawnCard)val).prefab.GetComponent<PurchaseInteraction>();
						if (Object.op_Implicit((Object)(object)component) && component.isDrone && !originalDroneCosts.ContainsKey(component))
						{
							originalDroneCosts[component] = component.cost;
						}
					}
				}
			}
			catch
			{
			}
		}

		private static void SetGlobalDroneCosts(bool active)
		{
			try
			{
				InteractableSpawnCard[] array = Resources.LoadAll<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard");
				if (array == null || array.Length == 0)
				{
					return;
				}
				float num = (active ? Mathf.Max(0f, DroneBaseCostMultiplier.Value) : 1f);
				float num2 = (active ? Mathf.Max(0f, RepairCostMultiplier.Value) : 1f);
				InteractableSpawnCard[] array2 = array;
				foreach (InteractableSpawnCard val in array2)
				{
					if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)((SpawnCard)val).prefab))
					{
						continue;
					}
					PurchaseInteraction component = ((SpawnCard)val).prefab.GetComponent<PurchaseInteraction>();
					if (Object.op_Implicit((Object)(object)component) && component.isDrone)
					{
						if (!originalDroneCosts.TryGetValue(component, out var value))
						{
							value = component.cost;
							originalDroneCosts[component] = value;
						}
						float num3 = ((!string.IsNullOrEmpty(((Object)val).name) && ((Object)val).name.StartsWith("iscBroken", StringComparison.OrdinalIgnoreCase)) ? num2 : num);
						component.cost = Mathf.Max(0, Mathf.RoundToInt((float)value * num3));
					}
				}
			}
			catch (Exception data)
			{
				Log.Error(data);
			}
		}

		private void BindDuration(DroneUptimeRarityTier tier, DroneUptimeTierClass tierClass, float defaultSeconds)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			ConfigEntry<float> val = ((BaseUnityPlugin)this).Config.Bind<float>($"Duration.{tier}", $"{tierClass}Seconds", defaultSeconds, new ConfigDescription("Base active duration in seconds before the drone/turret breaks and requires repair. Set to 0 for infinite duration (no timer UI).", (AcceptableValueBase)null, Array.Empty<object>()));
			DurationSeconds[(tier, tierClass)] = val;
			RegisterRiskOfOptionsUnlimitedFloat(val);
		}

		internal ConfigEntry<float> EnsurePerDroneEntry(DroneDef droneDef)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Invalid comparison between Unknown and I4
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			DroneIndex val = (DroneIndex)((!Object.op_Implicit((Object)(object)droneDef)) ? (-1) : ((int)droneDef.droneIndex));
			if ((int)val == -1)
			{
				return null;
			}
			if (PerDroneDurationSeconds.TryGetValue(val, out var value))
			{
				return value;
			}
			string safeDroneConfigKeyName = GetSafeDroneConfigKeyName(droneDef);
			string droneDisplayNameForConfig = GetDroneDisplayNameForConfig(droneDef);
			ConfigEntry<float> val2 = ((BaseUnityPlugin)this).Config.Bind<float>("Overrides.PerDrone", safeDroneConfigKeyName + "Seconds", -1f, new ConfigDescription("Per-drone duration override for '" + droneDisplayNameForConfig + "' in seconds. Set to -1 to use the tier/class duration. Set to 0 for infinite duration (no timer UI).", (AcceptableValueBase)null, Array.Empty<object>()));
			PerDroneDurationSeconds[val] = val2;
			RegisterRiskOfOptionsUnlimitedFloat(val2);
			return val2;
		}

		private void RegisterRiskOfOptionsOptions()
		{
			try
			{
				RegisterRiskOfOptionsCheckbox(ModEnabled);
				RegisterRiskOfOptionsCheckbox(DisableWhenOperator);
				RegisterRiskOfOptionsStringInput(TimerExemptDrones);
				RegisterRiskOfOptionsColorPicker(TimerColor);
				RegisterRiskOfOptionsCheckbox(DisableDroneAggro);
				RegisterRiskOfOptionsUnlimitedFloat(DifficultyExponent);
				RegisterRiskOfOptionsUnlimitedFloat(DifficultyCoefficientMultiplier);
				RegisterRiskOfOptionsUnlimitedFloat(RepairCostMultiplier);
				RegisterRiskOfOptionsUnlimitedFloat(DroneBaseCostMultiplier);
				ModSettingsManager.SetModDescription("Adjust drone uptime/duration scaling and drone costs. Includes per-drone overrides.");
			}
			catch (Exception data)
			{
				Log.Error(data);
			}
		}

		private static void RegisterRiskOfOptionsUnlimitedFloat(ConfigEntry<float> entry)
		{
			if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry))
			{
				if (!TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.FloatFieldOption", entry) && !TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.FloatInputFieldOption", entry) && !TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.InputFieldOption", entry))
				{
					Log.Warning("RiskOfOptions float field option not found; skipping menu option for '" + ((ConfigEntryBase)entry).Definition.Section + "." + ((ConfigEntryBase)entry).Definition.Key + "' to avoid imposing an upper limit.");
				}
				else
				{
					riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry);
				}
			}
		}

		private static bool TryAddRiskOfOptionsOptionByTypeName(string fullTypeName, object ctorArg)
		{
			try
			{
				Assembly assembly = typeof(ModSettingsManager).Assembly;
				Type type = assembly.GetType(fullTypeName, throwOnError: false);
				if (type == null)
				{
					return false;
				}
				object obj = Activator.CreateInstance(type, ctorArg);
				if (obj == null)
				{
					return false;
				}
				MethodInfo methodInfo = typeof(ModSettingsManager).GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddOption" && m.GetParameters().Length == 1);
				if (methodInfo == null)
				{
					return false;
				}
				methodInfo.Invoke(null, new object[1] { obj });
				return true;
			}
			catch
			{
				return false;
			}
		}

		private static void RegisterRiskOfOptionsCheckbox(ConfigEntry<bool> entry)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry))
			{
				ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry));
				riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry);
			}
		}

		private static void RegisterRiskOfOptionsStringInput(ConfigEntry<string> entry)
		{
			if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry) && (TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.StringInputFieldOption", entry) || TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.InputFieldOption", entry)))
			{
				riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry);
			}
		}

		internal static bool IsDroneExemptFromTimer(DroneDef droneDef)
		{
			if (!Object.op_Implicit((Object)(object)droneDef))
			{
				return false;
			}
			string text = TimerExemptDrones?.Value ?? string.Empty;
			if (!string.Equals(text, cachedTimerExemptValue, StringComparison.Ordinal))
			{
				cachedTimerExemptValue = text;
				cachedTimerExemptTokens = ParseTimerExemptTokens(text);
			}
			if (cachedTimerExemptTokens == null || cachedTimerExemptTokens.Count == 0)
			{
				return false;
			}
			string s = (Object.op_Implicit((Object)(object)droneDef.bodyPrefab) ? ((Object)droneDef.bodyPrefab).name : string.Empty);
			string safeDroneConfigKeyName = GetSafeDroneConfigKeyName(droneDef);
			return cachedTimerExemptTokens.Contains(NormalizeToken(s)) || cachedTimerExemptTokens.Contains(NormalizeToken(safeDroneConfigKeyName)) || cachedTimerExemptTokens.Contains(NormalizeToken(safeDroneConfigKeyName + "Seconds"));
		}

		private static HashSet<string> ParseTimerExemptTokens(string raw)
		{
			HashSet<string> hashSet = new HashSet<string>(StringComparer.Ordinal);
			if (string.IsNullOrWhiteSpace(raw))
			{
				return hashSet;
			}
			string[] array = raw.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
			string[] array2 = array;
			foreach (string s in array2)
			{
				string text = NormalizeToken(s);
				if (text.Length == 0)
				{
					continue;
				}
				text = StripSuffix(text, "seconds");
				text = StripSuffix(text, "secons");
				hashSet.Add(text);
				if (!text.StartsWith("drone_", StringComparison.Ordinal))
				{
					continue;
				}
				int num = text.IndexOf('_', "drone_".Length);
				if (num >= 0 && num + 1 < text.Length)
				{
					string text2 = text.Substring(num + 1);
					if (text2.Length > 0)
					{
						hashSet.Add(text2);
					}
				}
			}
			return hashSet;
		}

		private static string NormalizeToken(string s)
		{
			if (string.IsNullOrWhiteSpace(s))
			{
				return string.Empty;
			}
			return s.Trim().ToLowerInvariant();
		}

		private static string StripSuffix(string s, string suffix)
		{
			if (s != null && suffix != null && s.EndsWith(suffix, StringComparison.Ordinal))
			{
				return s.Substring(0, s.Length - suffix.Length);
			}
			return s;
		}

		private static void RegisterRiskOfOptionsColorPicker(ConfigEntry<Color> entry)
		{
			if (entry != null && !riskOfOptionsRegisteredEntries.Contains((ConfigEntryBase)(object)entry) && (TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.ColorOption", entry) || TryAddRiskOfOptionsOptionByTypeName("RiskOfOptions.Options.ColorPickerOption", entry) || TryAddRiskOfOptionsOptionByHeuristic(entry)))
			{
				riskOfOptionsRegisteredEntries.Add((ConfigEntryBase)(object)entry);
			}
		}

		private static bool TryAddRiskOfOptionsOptionByHeuristic(object entry)
		{
			try
			{
				Assembly assembly = typeof(ModSettingsManager).Assembly;
				Type entryType = entry.GetType();
				Type[] array = (from t in assembly.GetTypes()
					where t != null && string.Equals(t.Namespace, "RiskOfOptions.Options", StringComparison.Ordinal) && t.Name.IndexOf("Color", StringComparison.OrdinalIgnoreCase) >= 0
					select t).ToArray();
				Type[] array2 = array;
				foreach (Type type in array2)
				{
					ConstructorInfo constructorInfo = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public).FirstOrDefault(delegate(ConstructorInfo c)
					{
						ParameterInfo[] parameters = c.GetParameters();
						return parameters.Length == 1 && parameters[0].ParameterType.IsAssignableFrom(entryType);
					});
					if (constructorInfo == null)
					{
						continue;
					}
					object obj = constructorInfo.Invoke(new object[1] { entry });
					if (obj != null)
					{
						MethodInfo methodInfo = typeof(ModSettingsManager).GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddOption" && m.GetParameters().Length == 1);
						if (methodInfo == null)
						{
							return false;
						}
						methodInfo.Invoke(null, new object[1] { obj });
						return true;
					}
				}
			}
			catch
			{
			}
			return false;
		}

		private static void TryRegisterColorTomlConverter()
		{
			try
			{
				Type typeFromHandle = typeof(TomlTypeConverter);
				MethodInfo methodInfo = typeFromHandle.GetMethods(BindingFlags.Static | BindingFlags.Public).FirstOrDefault((MethodInfo m) => m.Name == "AddConverter" && m.GetParameters().Length == 2);
				if (!(methodInfo == null))
				{
					methodInfo.Invoke(null, new object[2]
					{
						typeof(Color),
						new UnityColorTypeConverter()
					});
				}
			}
			catch
			{
			}
		}

		private static string GetDroneDisplayNameForConfig(DroneDef droneDef)
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected I4, but got Unknown
			if (!Object.op_Implicit((Object)(object)droneDef))
			{
				return "Unknown Drone";
			}
			if (!string.IsNullOrWhiteSpace(droneDef.nameToken))
			{
				string @string = Language.GetString(droneDef.nameToken);
				if (!string.IsNullOrWhiteSpace(@string))
				{
					return @string;
				}
				return droneDef.nameToken;
			}
			if (Object.op_Implicit((Object)(object)droneDef.bodyPrefab))
			{
				return ((Object)droneDef.bodyPrefab).name;
			}
			return $"Drone {(int)droneDef.droneIndex}";
		}

		private static string GetSafeDroneConfigKeyName(DroneDef droneDef)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected I4, but got Unknown
			string arg = "UnknownBody";
			if (Object.op_Implicit((Object)(object)droneDef) && Object.op_Implicit((Object)(object)droneDef.bodyPrefab))
			{
				arg = ((Object)droneDef.bodyPrefab).name;
			}
			return $"Drone_{(int)droneDef.droneIndex}_{arg}";
		}

		private void OnBodyStartGlobal(CharacterBody body)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Invalid comparison between Unknown and I4
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Invalid comparison between Unknown and I4
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.teamComponent) || (int)body.teamComponent.teamIndex != 1 || !Object.op_Implicit((Object)(object)body.master) || !Object.op_Implicit((Object)(object)body.master.minionOwnership) || !Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster) || !Object.op_Implicit((Object)(object)body.master.minionOwnership.ownerMaster.playerCharacterMasterController))
				{
					return;
				}
				DroneIndex droneIndexFromBodyIndex = DroneCatalog.GetDroneIndexFromBodyIndex(body.bodyIndex);
				if ((int)droneIndexFromBodyIndex != -1)
				{
					DroneUptimeTimer droneUptimeTimer = ((Component)body).GetComponent<DroneUptimeTimer>();
					if (!Object.op_Implicit((Object)(object)droneUptimeTimer))
					{
						droneUptimeTimer = ((Component)body).gameObject.AddComponent<DroneUptimeTimer>();
					}
					DroneDef droneDef = DroneCatalog.GetDroneDef(droneIndexFromBodyIndex);
					EnsurePerDroneEntry(droneDef);
					droneUptimeTimer.Configure(droneDef);
				}
			}
			catch (Exception data)
			{
				Log.Error(data);
			}
		}

		private IEnumerable<HurtBox> BullseyeSearch_GetResults(orig_GetResults orig, BullseyeSearch self)
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			IEnumerable<HurtBox> enumerable = orig.Invoke(self);
			if (!IsModActiveNow() || !DisableDroneAggro.Value)
			{
				return enumerable;
			}
			if (self == null || (Object)(object)self.viewer == (Object)null || (Object)(object)self.viewer.teamComponent == (Object)null)
			{
				return enumerable;
			}
			if ((int)self.viewer.teamComponent.teamIndex == 1)
			{
				return enumerable;
			}
			if (!(enumerable is HurtBox[] array) || array.Length == 0)
			{
				return enumerable;
			}
			return array.Where((HurtBox hb) => !ShouldIgnoreAsTarget(hb)).ToArray();
		}

		private static bool ShouldIgnoreAsTarget(HurtBox hb)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Invalid comparison between Unknown and I4
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Invalid comparison between Unknown and I4
			if (!Object.op_Implicit((Object)(object)hb) || (int)hb.teamIndex != 1)
			{
				return false;
			}
			HealthComponent healthComponent = hb.healthComponent;
			if (!Object.op_Implicit((Object)(object)healthComponent) || !Object.op_Implicit((Object)(object)healthComponent.body))
			{
				return false;
			}
			CharacterBody body = healthComponent.body;
			if ((int)DroneCatalog.GetDroneIndexFromBodyIndex(body.bodyIndex) == -1)
			{
				return false;
			}
			CharacterMaster master = body.master;
			if (!Object.op_Implicit((Object)(object)master) || Object.op_Implicit((Object)(object)master.playerCharacterMasterController))
			{
				return false;
			}
			if (!Object.op_Implicit((Object)(object)master.minionOwnership) || !Object.op_Implicit((Object)(object)master.minionOwnership.ownerMaster))
			{
				return false;
			}
			return Object.op_Implicit((Object)(object)master.minionOwnership.ownerMaster.playerCharacterMasterController);
		}

		private void AllyCardController_Awake(orig_Awake orig, AllyCardController self)
		{
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)self) && IsModActiveNow() && !Object.op_Implicit((Object)(object)((Component)self).GetComponent<DroneUptimeAllyCardOverlay>()))
			{
				((Component)self).gameObject.AddComponent<DroneUptimeAllyCardOverlay>();
			}
		}
	}
	internal enum DroneUptimeTierClass
	{
		Utility,
		Combat
	}
	internal enum DroneUptimeRarityTier
	{
		White,
		Green,
		Red
	}
	internal static class DroneUptimeDuration
	{
		public static float ComputeBaseDurationSeconds(DroneDef droneDef)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected I4, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Invalid comparison between Unknown and I4
			if (AdjustedDrones.IsDroneExemptFromTimer(droneDef))
			{
				return 0f;
			}
			DroneUptimeRarityTier item = DroneUptimeRarityTier.Green;
			if (Object.op_Implicit((Object)(object)droneDef))
			{
				ItemTier tier = droneDef.tier;
				if (1 == 0)
				{
				}
				DroneUptimeRarityTier droneUptimeRarityTier = (int)tier switch
				{
					0 => DroneUptimeRarityTier.White, 
					1 => DroneUptimeRarityTier.Green, 
					2 => DroneUptimeRarityTier.Red, 
					_ => DroneUptimeRarityTier.Green, 
				};
				if (1 == 0)
				{
				}
				item = droneUptimeRarityTier;
			}
			if (!AdjustedDrones.IsModActiveNow())
			{
				return 0f;
			}
			DroneUptimeTierClass item2 = DroneUptimeTierClass.Utility;
			if (Object.op_Implicit((Object)(object)droneDef) && (int)droneDef.droneType == 1)
			{
				item2 = DroneUptimeTierClass.Combat;
			}
			if (Object.op_Implicit((Object)(object)droneDef))
			{
				AdjustedDrones instance = AdjustedDrones.Instance;
				ConfigEntry<float> val = (Object.op_Implicit((Object)(object)instance) ? instance.EnsurePerDroneEntry(droneDef) : null);
				if (val != null && val.Value >= 0f)
				{
					return Mathf.Max(0f, val.Value);
				}
			}
			float result = 180f;
			if (AdjustedDrones.DurationSeconds.TryGetValue((item, item2), out var value))
			{
				result = Mathf.Max(0f, value.Value);
			}
			return result;
		}

		public static float GetScaledDurationSeconds(float baseSeconds)
		{
			float num = 1f;
			if (Object.op_Implicit((Object)(object)Run.instance))
			{
				num = Mathf.Max(1f, Run.instance.difficultyCoefficient);
			}
			float num2 = Mathf.Max(0f, AdjustedDrones.DifficultyCoefficientMultiplier.Value);
			num = Mathf.Max(1f, num * num2);
			float num3 = Mathf.Max(0f, AdjustedDrones.DifficultyExponent.Value);
			float num4 = ((num3 <= 0f) ? 1f : Mathf.Pow(num, num3));
			return (num4 <= 0f) ? baseSeconds : (baseSeconds / num4);
		}
	}
	internal sealed class DroneUptimeTimer : MonoBehaviour
	{
		private float baseDuration;

		private HealthComponent health;

		private bool configured;

		private bool broke;

		public float duration => DroneUptimeDuration.GetScaledDurationSeconds(baseDuration);

		public float age { get; private set; }

		public DroneDef droneDef { get; private set; }

		public float remaining => Mathf.Max(0f, duration - age);

		public float remainingFraction => (duration > 0f) ? Mathf.Clamp01(remaining / duration) : 0f;

		public void Configure(DroneDef def)
		{
			droneDef = def;
			baseDuration = DroneUptimeDuration.ComputeBaseDurationSeconds(def);
			age = 0f;
			configured = true;
			broke = false;
		}

		private void Start()
		{
			((Component)this).TryGetComponent<HealthComponent>(ref health);
		}

		private void Update()
		{
			if (!AdjustedDrones.IsModActiveNow() || !configured)
			{
				return;
			}
			float num = duration;
			if (num <= 0f)
			{
				return;
			}
			age += Time.deltaTime;
			if (!broke && age >= num)
			{
				broke = true;
				if (NetworkServer.active)
				{
					BreakToRepair();
				}
			}
		}

		[Server]
		private void BreakToRepair()
		{
			if (Object.op_Implicit((Object)(object)health) && Object.op_Implicit((Object)(object)health.body))
			{
				CharacterBody body = health.body;
				DroneDef val = droneDef;
				if (IsMegaDrone(body, val))
				{
					DroneUptimeRepairSpawner.SpawnBrokenAndRemove(body, val);
				}
				else if (Object.op_Implicit((Object)(object)body.master))
				{
					body.master.TrueKill();
				}
			}
		}

		private static bool IsMegaDrone(CharacterBody body, DroneDef droneDef)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)body))
			{
				return false;
			}
			string bodyName = BodyCatalog.GetBodyName(body.bodyIndex);
			if (!string.IsNullOrEmpty(bodyName) && bodyName.Contains("MegaDrone"))
			{
				return true;
			}
			if (((Object)body).name.Contains("MegaDrone"))
			{
				return true;
			}
			return false;
		}
	}
	internal sealed class DroneUptimeAllyCardOverlay : MonoBehaviour
	{
		private AllyCardController allyCard;

		private RectTransform portraitRect;

		private GameObject timerRoot;

		private GameObject tempItemIndicatorInstance;

		private Image timerImage;

		private TextMeshProUGUI fallbackText;

		private static bool triedLoadTempItemIndicator;

		private static GameObject cachedTempItemIndicatorPrefab;

		private void Awake()
		{
			allyCard = ((Component)this).GetComponent<AllyCardController>();
			TryBuildUi();
		}

		private void TryBuildUi()
		{
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Expected O, but got Unknown
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Expected O, but got Unknown
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Expected O, but got Unknown
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fa: Expected O, but got Unknown
			//IL_0306: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0334: Unknown result type (might be due to invalid IL or missing references)
			//IL_0341: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Invalid comparison between Unknown and I4
			if (!Object.op_Implicit((Object)(object)allyCard) || !Object.op_Implicit((Object)(object)allyCard.portraitIconImage))
			{
				return;
			}
			portraitRect = ((Component)allyCard.portraitIconImage).GetComponent<RectTransform>();
			if (!Object.op_Implicit((Object)(object)portraitRect))
			{
				return;
			}
			if (!triedLoadTempItemIndicator)
			{
				triedLoadTempItemIndicator = true;
				try
				{
					GameObject hiddenPickupDisplayPrefab = PickupCatalog.GetHiddenPickupDisplayPrefab();
					PickupDisplay val = (Object.op_Implicit((Object)(object)hiddenPickupDisplayPrefab) ? hiddenPickupDisplayPrefab.GetComponentInChildren<PickupDisplay>(true) : null);
					cachedTempItemIndicatorPrefab = (Object.op_Implicit((Object)(object)val) ? val.temporaryItemIndicator : null);
				}
				catch
				{
					cachedTempItemIndicatorPrefab = null;
				}
			}
			if (!Object.op_Implicit((Object)(object)timerRoot))
			{
				timerRoot = new GameObject("DroneUptimeTimer", new Type[1] { typeof(RectTransform) });
				timerRoot.transform.SetParent((Transform)(object)portraitRect, false);
				timerRoot.transform.SetAsLastSibling();
				RectTransform val2 = (RectTransform)timerRoot.transform;
				val2.anchorMin = new Vector2(0f, 0f);
				val2.anchorMax = new Vector2(0f, 0f);
				val2.pivot = new Vector2(0f, 0f);
				val2.anchoredPosition = new Vector2(0f, 0f);
				val2.sizeDelta = new Vector2(18f, 18f);
			}
			if (!Object.op_Implicit((Object)(object)tempItemIndicatorInstance) && Object.op_Implicit((Object)(object)cachedTempItemIndicatorPrefab))
			{
				tempItemIndicatorInstance = Object.Instantiate<GameObject>(cachedTempItemIndicatorPrefab, timerRoot.transform, false);
				((Object)tempItemIndicatorInstance).name = "TempItemIndicator";
				tempItemIndicatorInstance.transform.localPosition = Vector3.zero;
				tempItemIndicatorInstance.transform.localRotation = Quaternion.identity;
				tempItemIndicatorInstance.transform.localScale = Vector3.one;
				Image[] componentsInChildren = tempItemIndicatorInstance.GetComponentsInChildren<Image>(true);
				Image[] array = componentsInChildren;
				foreach (Image val3 in array)
				{
					if (Object.op_Implicit((Object)(object)val3) && (int)val3.type == 3)
					{
						timerImage = val3;
						break;
					}
				}
				ApplyTimerColorIfConfigured();
			}
			if (!Object.op_Implicit((Object)(object)timerImage) && !Object.op_Implicit((Object)(object)fallbackText))
			{
				GameObject val4 = new GameObject("FallbackTimerText", new Type[1] { typeof(RectTransform) });
				val4.transform.SetParent(timerRoot.transform, false);
				RectTransform val5 = (RectTransform)val4.transform;
				val5.anchorMin = new Vector2(0f, 0f);
				val5.anchorMax = new Vector2(1f, 1f);
				val5.pivot = new Vector2(0.5f, 0.5f);
				val5.anchoredPosition = Vector2.zero;
				val5.sizeDelta = Vector2.zero;
				fallbackText = val4.AddComponent<TextMeshProUGUI>();
				((TMP_Text)fallbackText).fontSize = 12f;
				((Graphic)fallbackText).color = new Color(0.3f, 0.6f, 1f, 1f);
				((TMP_Text)fallbackText).alignment = (TextAlignmentOptions)514;
				((TMP_Text)fallbackText).enableWordWrapping = false;
				((Graphic)fallbackText).raycastTarget = false;
				ApplyTimerColorIfConfigured();
			}
		}

		private void ApplyTimerColorIfConfigured()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			ConfigEntry<Color> timerColor = AdjustedDrones.TimerColor;
			if (timerColor != null)
			{
				Color value = timerColor.Value;
				if (Object.op_Implicit((Object)(object)timerImage))
				{
					((Graphic)timerImage).color = value;
				}
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Graphic)fallbackText).color = value;
				}
			}
		}

		private void LateUpdate()
		{
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Invalid comparison between Unknown and I4
			if (!Object.op_Implicit((Object)(object)timerImage) && !Object.op_Implicit((Object)(object)fallbackText))
			{
				TryBuildUi();
			}
			ApplyTimerColorIfConfigured();
			if (!Object.op_Implicit((Object)(object)allyCard))
			{
				return;
			}
			CharacterMaster sourceMaster = allyCard.sourceMaster;
			CharacterBody val = (Object.op_Implicit((Object)(object)sourceMaster) ? sourceMaster.GetBody() : null);
			if (!Object.op_Implicit((Object)(object)val))
			{
				if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance))
				{
					tempItemIndicatorInstance.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Behaviour)fallbackText).enabled = false;
				}
				return;
			}
			DroneUptimeTimer component = ((Component)val).GetComponent<DroneUptimeTimer>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance))
				{
					tempItemIndicatorInstance.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Behaviour)fallbackText).enabled = false;
				}
			}
			else if (component.duration <= 0f)
			{
				if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance))
				{
					tempItemIndicatorInstance.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Behaviour)fallbackText).enabled = false;
				}
			}
			else if ((int)DroneCatalog.GetDroneIndexFromBodyIndex(val.bodyIndex) == -1)
			{
				if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance))
				{
					tempItemIndicatorInstance.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Behaviour)fallbackText).enabled = false;
				}
			}
			else if (Object.op_Implicit((Object)(object)timerImage))
			{
				if (Object.op_Implicit((Object)(object)tempItemIndicatorInstance))
				{
					tempItemIndicatorInstance.SetActive(true);
				}
				timerImage.fillAmount = component.remainingFraction;
				if (Object.op_Implicit((Object)(object)fallbackText))
				{
					((Behaviour)fallbackText).enabled = false;
				}
			}
			else if (Object.op_Implicit((Object)(object)fallbackText))
			{
				((Behaviour)fallbackText).enabled = true;
				float remaining = component.remaining;
				int num = Mathf.FloorToInt(remaining / 60f);
				int num2 = Mathf.FloorToInt(remaining % 60f);
				((TMP_Text)fallbackText).text = $"{num}:{num2:00}";
			}
		}
	}
	internal static class DroneUptimeRepairSpawner
	{
		[Server]
		public static void SpawnBrokenAndRemove(CharacterBody droneBody, DroneDef droneDef)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Expected O, but got Unknown
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Invalid comparison between Unknown and I4
			if (!NetworkServer.active || !Object.op_Implicit((Object)(object)droneBody))
			{
				return;
			}
			SpawnCard brokenDroneSpawnCard = GetBrokenDroneSpawnCard(droneBody, droneDef);
			if ((Object)(object)brokenDroneSpawnCard != (Object)null && Object.op_Implicit((Object)(object)DirectorCore.instance))
			{
				Vector3 position = FindGround(droneBody.corePosition, droneBody.radius) + Vector3.up * 0.25f;
				DirectorPlacementRule val = new DirectorPlacementRule
				{
					placementMode = (PlacementMode)0,
					position = position
				};
				Xoroshiro128Plus val2 = (((Object)(object)Run.instance != (Object)null) ? new Xoroshiro128Plus(Run.instance.seed + (ulong)Run.instance.fixedTime) : new Xoroshiro128Plus(0uL));
				GameObject val3 = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(brokenDroneSpawnCard, val, val2));
				if (Object.op_Implicit((Object)(object)val3))
				{
					PurchaseInteraction component = val3.GetComponent<PurchaseInteraction>();
					if (Object.op_Implicit((Object)(object)component) && (int)component.costType == 1 && Object.op_Implicit((Object)(object)Run.instance))
					{
						component.Networkcost = Mathf.RoundToInt((float)Run.instance.GetDifficultyScaledCost(component.cost));
					}
				}
			}
			CharacterMaster master = droneBody.master;
			if (Object.op_Implicit((Object)(object)master))
			{
				master.TrueKill();
			}
			else
			{
				NetworkServer.Destroy(((Component)droneBody).gameObject);
			}
		}

		private static SpawnCard GetBrokenDroneSpawnCard(CharacterBody droneBody, DroneDef droneDef)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)droneDef) && Object.op_Implicit((Object)(object)droneDef.droneBrokenSpawnCard))
			{
				return droneDef.droneBrokenSpawnCard;
			}
			string text = BodyCatalog.GetBodyName(droneBody.bodyIndex);
			if (string.IsNullOrWhiteSpace(text))
			{
				text = ((Object)droneBody).name;
			}
			text = text.Replace("Body", "");
			string text2 = "iscBroken" + text;
			return LegacyResourcesAPI.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/" + text2);
		}

		private static Vector3 FindGround(Vector3 origin, float radius)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = origin + Vector3.up * 200f;
			RaycastHit val2 = default(RaycastHit);
			if (Physics.Raycast(val, Vector3.down, ref val2, 1200f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref val2)).point;
			}
			float num = Mathf.Max(0.25f, radius);
			if (Physics.SphereCast(val, num, Vector3.down, ref val2, 1200f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask), (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref val2)).point;
			}
			return origin;
		}
	}
	internal static class Log
	{
		private static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
}