Decompiled source of Malfunctions v1.10.1

Malfunctions.dll

Decompiled a week ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalNetworkAPI;
using Malfunctions.Helpers;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.VFX;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Malfunctions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Malfunctions")]
[assembly: AssemblyCopyright("Copyright © zealsprince 2024-2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("8c966d9e-bf7c-4f8b-a94b-b87b3b65b941")]
[assembly: AssemblyFileVersion("1.10.1")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.10.1.0")]
[module: UnverifiableCode]
namespace Malfunctions
{
	internal class Assets
	{
		public enum LoadStatusCode : ushort
		{
			Success,
			Failed,
			Exists
		}

		public static AssetBundle Bundle;

		public static Dictionary<string, GameObject> Prefabs = new Dictionary<string, GameObject>();

		public static readonly Dictionary<string, string> Manifest = new Dictionary<string, string> { { "sparks", "assets/exported/malfunctions/effects/sparks.prefab" } };

		public static LoadStatusCode Load()
		{
			if ((Object)(object)Bundle != (Object)null)
			{
				return LoadStatusCode.Exists;
			}
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Malfunctions");
			Bundle = AssetBundle.LoadFromFile(text);
			if ((Object)(object)Bundle == (Object)null)
			{
				Plugin.logger.LogInfo((object)("Failed to load asset bundle from path: " + text));
				return LoadStatusCode.Failed;
			}
			Plugin.logger.LogInfo((object)("Loaded asset bundle from path: " + text));
			string[] allAssetNames = Bundle.GetAllAssetNames();
			foreach (string text2 in allAssetNames)
			{
				Plugin.logger.LogDebug((object)("Loaded asset: " + text2));
			}
			foreach (KeyValuePair<string, string> item in Manifest)
			{
				Prefabs.Add(item.Key, Bundle.LoadAsset<GameObject>(item.Value));
			}
			return LoadStatusCode.Success;
		}

		public static GameObject SpawnPrefab(string name, Vector3 position)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (Prefabs.ContainsKey(name))
				{
					Plugin.logger.LogDebug((object)("Loading prefab '" + name + "'"));
					return Object.Instantiate<GameObject>(Prefabs[name], position, Quaternion.identity);
				}
				Plugin.logger.LogWarning((object)("Prefab " + name + " not found!"));
			}
			catch (Exception ex) when (ex is ArgumentException || ex is NullReferenceException)
			{
				Plugin.logger.LogError((object)ex.Message);
			}
			return null;
		}
	}
	public class Config
	{
		public static ConfigEntry<double> MalfunctionChanceNavigation;

		public static ConfigEntry<double> MalfunctionChanceTeleporter;

		public static ConfigEntry<double> MalfunctionChanceDistortion;

		public static ConfigEntry<double> MalfunctionChanceDoor;

		public static ConfigEntry<double> MalfunctionChanceLever;

		public static ConfigEntry<double> MalfunctionChancePower;

		public static ConfigEntry<int> MalfunctionPassedDaysNavigation;

		public static ConfigEntry<int> MalfunctionPassedDaysTeleporter;

		public static ConfigEntry<int> MalfunctionPassedDaysDistortion;

		public static ConfigEntry<int> MalfunctionPassedDaysDoor;

		public static ConfigEntry<int> MalfunctionPassedDaysLever;

		public static ConfigEntry<int> MalfunctionPassedDaysPower;

		public static ConfigEntry<bool> MalfunctionPenaltyEnabled;

		public static ConfigEntry<bool> MalfunctionPenaltyOnly;

		public static ConfigEntry<double> MalfunctionPenaltyMultiplier;

		public static ConfigEntry<bool> MalfunctionPowerBlockLever;

		public static ConfigEntry<double> MalfunctionPowerBlockLeverChance;

		public static ConfigEntry<bool> MalfunctionMiscAllowConsecutive;

		public static ConfigEntry<bool> MalfunctionVFXDisableSparks;

		public static ConfigEntry<bool> MalfunctionVFXDisableSparksSound;

		public static void Load()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Expected O, but got Unknown
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Expected O, but got Unknown
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Expected O, but got Unknown
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Expected O, but got Unknown
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Expected O, but got Unknown
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Expected O, but got Unknown
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Expected O, but got Unknown
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Expected O, but got Unknown
			//IL_02c9: 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_02fd: Expected O, but got Unknown
			//IL_0325: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Expected O, but got Unknown
			//IL_034f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Expected O, but got Unknown
			//IL_0397: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: Expected O, but got Unknown
			//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cb: Expected O, but got Unknown
			//IL_03eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f5: Expected O, but got Unknown
			//IL_0415: Unknown result type (might be due to invalid IL or missing references)
			//IL_041f: Expected O, but got Unknown
			MalfunctionChanceNavigation = Plugin.config.Bind<double>("Chances", "MalfunctionChanceNavigation", 7.5, new ConfigDescription("Set the chance of the navigation malfunction happening - this will force the ship to route to a random moon with no regard to cost", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionChanceTeleporter = Plugin.config.Bind<double>("Chances", "MalfunctionChanceTeleporter", 7.5, new ConfigDescription("Set the chance of the teleporter malfunction happening - this will cause teleporters to disable themselves either at landing or after a random interval into the match", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionChanceDistortion = Plugin.config.Bind<double>("Chances", "MalfunctionChanceDistortion", 5.0, new ConfigDescription("Set the chance of the distortion malfunction happening - this will cause the map and terminal displays as well as walkies to become unusable either at landing or after a random interval into the match", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionChanceDoor = Plugin.config.Bind<double>("Chances", "MalfunctionChanceDoor", 3.0, new ConfigDescription("Set the chance of the door malfunction happening - this will disable ship door controls either at landing or after a random interval into the match", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionChanceLever = Plugin.config.Bind<double>("Chances", "MalfunctionChanceLever", 3.0, new ConfigDescription("Set the chance of the lever malfunction happening - this will disable ship lever after a random but announced delay", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionChancePower = Plugin.config.Bind<double>("Chances", "MalfunctionChancePower", 1.5, new ConfigDescription("Set the chance of the power malfunction happening - this will make the entire ship to go dark after landing, disabling battery charging, door controls, terminal and map displays", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionPassedDaysNavigation = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysNavigation", 3, new ConfigDescription("Set how many days must have passed for the navigation malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPassedDaysTeleporter = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysTeleporter", 11, new ConfigDescription("Set how many days must have passed for the teleporter malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPassedDaysDistortion = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysDistortion", 3, new ConfigDescription("Set how many days must have passed for the distortion malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPassedDaysDoor = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysDoor", 7, new ConfigDescription("Set how many days must have passed for the door malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPassedDaysLever = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysLever", 0, new ConfigDescription("Set how many days must have passed for the lever malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPassedDaysPower = Plugin.config.Bind<int>("Passed Days", "MalfunctionPassedDaysPower", 11, new ConfigDescription("Set how many days must have passed for the power malfunction to enable", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPenaltyEnabled = Plugin.config.Bind<bool>("Penalty", "MalfunctionPenaltyEnabled", true, new ConfigDescription("Enable the penalty system that increases malfunction chances after not recovering a player", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPenaltyOnly = Plugin.config.Bind<bool>("Penalty", "MalfunctionPenaltyOnly", false, new ConfigDescription("Only enable malfunctions when a player has not been recovered", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPenaltyMultiplier = Plugin.config.Bind<double>("Penalty", "MalfunctionPenaltyMultiplier", 2.0, new ConfigDescription("Set the multiplier on triggering a malfunction after not recovering a player", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPowerBlockLever = Plugin.config.Bind<bool>("Power Malfunction", "MalfunctionPowerBlockLever", true, new ConfigDescription("Enable a chance of pulling the lever and taking off blocking when the power malfunction is active", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionPowerBlockLeverChance = Plugin.config.Bind<double>("Power Malfunction", "MalfunctionPowerBlockLeverChance", 50.0, new ConfigDescription("Chance that pulling the lever will not cause take-off", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.0, 100.0), Array.Empty<object>()));
			MalfunctionMiscAllowConsecutive = Plugin.config.Bind<bool>("Miscellaneous", "MalfunctionMiscAllowConsecutive", false, new ConfigDescription("Allow malfunctions to trigger consecutively - by default if a malfunction is triggered it can not repeat the next day", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionVFXDisableSparks = Plugin.config.Bind<bool>("VFX", "MalfunctionVFXDisableSparks", false, new ConfigDescription("Disable spark effects appearing on objects if they are having a malfunction", (AcceptableValueBase)null, Array.Empty<object>()));
			MalfunctionVFXDisableSparksSound = Plugin.config.Bind<bool>("VFX", "MalfunctionVFXDisableSparksSound", false, new ConfigDescription("Disable the loud snapping spark sound effects", (AcceptableValueBase)null, Array.Empty<object>()));
		}
	}
	internal class Malfunction
	{
		public bool Active;

		public bool Notified;

		public bool RollSucceeded;

		protected List<GameObject> effects;

		public Malfunction()
		{
			Active = false;
			Notified = false;
			RollSucceeded = false;
			effects = new List<GameObject>();
		}

		public void AssignChild(GameObject child)
		{
			effects.Add(child);
		}

		public void DestroyChildren()
		{
			foreach (GameObject effect in effects)
			{
				Object.Destroy((Object)(object)effect);
			}
			effects.Clear();
		}

		public virtual void Reset()
		{
			Active = false;
			Notified = false;
			DestroyChildren();
		}
	}
	internal class MalfunctionWithTrigger : Malfunction
	{
		public bool Triggered;

		public MalfunctionWithTrigger()
		{
			Triggered = false;
		}

		public override void Reset()
		{
			base.Reset();
			Triggered = false;
		}
	}
	internal class MalfunctionWithDelay : MalfunctionWithTrigger
	{
		public int Delay;

		public MalfunctionWithDelay()
		{
			Delay = 0;
		}

		public override void Reset()
		{
			base.Reset();
			Delay = 0;
		}
	}
	internal class State
	{
		public static int PreviousMoon;

		public static Malfunction MalfunctionNavigation;

		public static MalfunctionWithDelay MalfunctionTeleporter;

		public static MalfunctionWithDelay MalfunctionDistortion;

		public static MalfunctionWithDelay MalfunctionDoor;

		public static MalfunctionWithDelay MalfunctionLever;

		public static MalfunctionWithDelay MalfunctionPower;

		public static void Load()
		{
			PreviousMoon = -1;
			MalfunctionNavigation = new Malfunction();
			MalfunctionTeleporter = new MalfunctionWithDelay();
			MalfunctionDistortion = new MalfunctionWithDelay();
			MalfunctionDoor = new MalfunctionWithDelay();
			MalfunctionLever = new MalfunctionWithDelay();
			MalfunctionPower = new MalfunctionWithDelay();
		}

		public static void Reset()
		{
			MalfunctionNavigation.Reset();
			MalfunctionTeleporter.Reset();
			MalfunctionDistortion.Reset();
			MalfunctionDoor.Reset();
			MalfunctionLever.Reset();
			MalfunctionPower.Reset();
		}
	}
	[BepInPlugin("com.zealsprince.malfunctions", "Malfunctions", "1.10.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public const string ModGUID = "com.zealsprince.malfunctions";

		public const string ModName = "Malfunctions";

		public const string ModVersion = "1.10.1";

		public static ManualLogSource logger;

		public static ConfigFile config;

		private readonly Harmony harmony = new Harmony("com.zealsprince.malfunctions");

		private void Awake()
		{
			logger = ((BaseUnityPlugin)this).Logger;
			config = ((BaseUnityPlugin)this).Config;
			Config.Load();
			if (Assets.Load() == Assets.LoadStatusCode.Success)
			{
				State.Load();
				harmony.PatchAll();
			}
		}
	}
}
namespace Malfunctions.Patches
{
	[HarmonyPatch(typeof(HangarShipDoor))]
	internal class HangarShipDoorPatches
	{
		private static float lockdownTime;

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void OverwriteDoorPower(HangarShipDoor __instance)
		{
			if (!State.MalfunctionPower.Active && State.MalfunctionDoor.Active && State.MalfunctionDoor.Triggered)
			{
				__instance.doorPower = 1f;
				lockdownTime = (lockdownTime + Time.deltaTime) % 6f;
				((TMP_Text)__instance.doorPowerDisplay).text = ((lockdownTime > 3f) ? "LOCKED" : "OPEN 10PM") ?? "";
			}
		}
	}
	[HarmonyPatch(typeof(StartMatchLever))]
	internal class StartMatchLeverPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("PullLever")]
		private static bool InterruptPullLever(StartMatchLever __instance)
		{
			if (State.MalfunctionPower.Active && State.MalfunctionPower.Triggered)
			{
				if (Config.MalfunctionPowerBlockLever.Value && State.MalfunctionPower.Delay != 0)
				{
					((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP CORE DEPLETION:\nAWAIT 12AM EMERGENCY AUTOPILOT";
					HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
					HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
					__instance.triggerScript.disabledHoverTip = "[No power to hydraulics]";
					return false;
				}
			}
			else if (State.MalfunctionLever.Active && State.MalfunctionLever.Triggered)
			{
				((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP LEVER HYDRAULICS JAM:\nAWAIT 12AM EMERGENCY AUTOPILOT";
				HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
				HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(WalkieTalkie))]
	internal class WalkieTalkiePatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("ItemActivate")]
		private static bool InterruptItemActivate(WalkieTalkie __instance)
		{
			if (State.MalfunctionDistortion.Active && State.MalfunctionDistortion.Triggered)
			{
				__instance.thisAudio.PlayOneShot(__instance.playerDieOnWalkieTalkieSFX);
				((GrabbableObject)__instance).UseUpBatteries();
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ShipLights))]
	internal class ShipLightsPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("ToggleShipLights")]
		private static bool InterruptToggleShipLights()
		{
			if (State.MalfunctionPower.Active && State.MalfunctionPower.Triggered)
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ItemCharger))]
	internal class ItemChargerPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("ChargeItem")]
		private static bool InterruptChargeItem()
		{
			if (State.MalfunctionPower.Active && State.MalfunctionPower.Triggered)
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ManualCameraRenderer))]
	internal class ManualCameraRendererPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("SwitchScreenButton")]
		private static bool InterruptSwitchScreenButton()
		{
			if ((State.MalfunctionPower.Active && State.MalfunctionPower.Triggered) || (State.MalfunctionDistortion.Active && State.MalfunctionDistortion.Triggered))
			{
				return false;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("SwitchRadarTargetClientRpc")]
		private static bool InterruptSwitchCameraView()
		{
			if ((State.MalfunctionPower.Active && State.MalfunctionPower.Triggered) || (State.MalfunctionDistortion.Active && State.MalfunctionDistortion.Triggered))
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ShipTeleporter))]
	internal class ShipTeleporterPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("PressTeleportButtonOnLocalClient")]
		private static bool InterruptPressTeleportButton(ShipTeleporter __instance)
		{
			if ((State.MalfunctionTeleporter.Active && State.MalfunctionTeleporter.Triggered) || (State.MalfunctionPower.Active && State.MalfunctionPower.Triggered))
			{
				__instance.buttonAnimator.SetTrigger("press");
				__instance.buttonAudio.PlayOneShot(__instance.buttonPressSFX);
				return false;
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("PressTeleportButtonOnLocalClient")]
		private static void RandomizePressTeleportButton()
		{
			if (State.MalfunctionDistortion.Active && State.MalfunctionDistortion.Triggered)
			{
				PlayerControllerB[] array = (from player in Object.FindObjectsByType<PlayerControllerB>((FindObjectsSortMode)0)
					where player.isPlayerControlled
					select player).ToArray();
				if (array.Length != 0)
				{
					StartOfRound.Instance.mapScreen.targetedPlayer = array[Random.Range(0, array.Length)];
				}
			}
		}
	}
	[HarmonyPatch(typeof(Terminal))]
	internal class TerminalPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("LoadNewNodeIfAffordable")]
		private static bool BlockMoonConfirmNode(Terminal __instance, TerminalNode node)
		{
			if (State.MalfunctionNavigation.Active && node.buyRerouteToMoon > -1)
			{
				node.displayText = "ROUTE TABLE OFFSET: NAVIGATION ERROR\n\nIT IS ADVISED TO LAND THE SHIP TO ALLOW RECALIBRATION OF SYSTEMS AND RESTORATION OF FUNCTIONALITY\n\n";
				node.terminalEvent = "ERROR";
				__instance.PlayTerminalAudioServerRpc(3);
				__instance.LoadNewNode(node);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(TimeOfDay))]
	internal class TimeOfDayPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void CheckMalfunctionTeleporterTrigger(TimeOfDay __instance)
		{
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			if (!State.MalfunctionPower.Active && State.MalfunctionTeleporter.Active && !State.MalfunctionTeleporter.Triggered && ((Object)__instance.currentLevel).name != "CompanyBuildingLevel" && __instance.currentDayTimeStarted && __instance.hour >= 1 + State.MalfunctionTeleporter.Delay)
			{
				Plugin.logger.LogDebug((object)"Triggered teleporter malfunction!");
				State.MalfunctionTeleporter.Triggered = true;
				if (!State.MalfunctionTeleporter.Notified)
				{
					((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP TELEPORTER MALFUNCTION:\nTIMEOUT FROM ATOMIC MISALIGNMENT";
					HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
					HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
					State.MalfunctionTeleporter.Notified = true;
				}
				ShipTeleporter val = Object.FindObjectOfType<ShipTeleporter>();
				if ((Object)(object)val == (Object)null)
				{
					Plugin.logger.LogError((object)"Failed to find a teleporter object.");
					return;
				}
				GameObject val2 = Assets.SpawnPrefab("sparks", ((Component)val).transform.position);
				val2.transform.SetParent(((Component)val).transform, true);
				State.MalfunctionTeleporter.AssignChild(val2);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void CheckMalfunctionDistortionTrigger(TimeOfDay __instance)
		{
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			if (!State.MalfunctionPower.Active && State.MalfunctionDistortion.Active && !State.MalfunctionDistortion.Triggered && ((Object)__instance.currentLevel).name != "CompanyBuildingLevel" && __instance.currentDayTimeStarted && __instance.hour >= 1 + State.MalfunctionDistortion.Delay)
			{
				Plugin.logger.LogDebug((object)"Triggered distortion malfunction!");
				State.MalfunctionDistortion.Triggered = true;
				if (!State.MalfunctionDistortion.Notified)
				{
					((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP COMS DISTURBANCE:\nELECTROMAGNETIC ANOMALY";
					HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
					HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
					State.MalfunctionDistortion.Notified = true;
				}
				__instance.playersManager.mapScreen.SwitchScreenOn(false);
				Terminal val = Object.FindObjectOfType<Terminal>();
				if ((Object)(object)val == (Object)null)
				{
					Plugin.logger.LogError((object)"Failed to find the terminal object.");
					return;
				}
				((Component)val).gameObject.GetComponent<InteractTrigger>().interactable = false;
				GameObject val2 = Assets.SpawnPrefab("sparks", ((Component)val).transform.position);
				val2.transform.SetParent(((Component)val).transform, true);
				State.MalfunctionDistortion.AssignChild(val2);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void CheckMalfunctionDoorTrigger(TimeOfDay __instance)
		{
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			if (!State.MalfunctionPower.Active && State.MalfunctionDoor.Active && !State.MalfunctionDoor.Triggered && ((Object)__instance.currentLevel).name != "CompanyBuildingLevel")
			{
				if (!__instance.currentDayTimeStarted || __instance.hour < 1 + State.MalfunctionDoor.Delay || __instance.hour >= 16)
				{
					return;
				}
				Plugin.logger.LogDebug((object)"Triggered door malfunction!");
				State.MalfunctionDoor.Triggered = true;
				if (!State.MalfunctionDoor.Notified)
				{
					((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP DOOR LOCK FAIL:\nCRACKDOWN PROTOCOL ACTIVE";
					HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
					HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
					State.MalfunctionDoor.Notified = true;
				}
				HangarShipDoor val = Object.FindAnyObjectByType<HangarShipDoor>();
				if ((Object)(object)val != (Object)null)
				{
					val.SetDoorClosed();
					val.PlayDoorAnimation(true);
				}
				GameObject val2 = GameObject.Find("HangarDoorButtonPanel");
				if ((Object)(object)val2 == (Object)null)
				{
					Plugin.logger.LogError((object)"Failed to find door panel object.");
					return;
				}
				InteractTrigger[] componentsInChildren = val2.GetComponentsInChildren<InteractTrigger>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].interactable = false;
				}
				GameObject val3 = Assets.SpawnPrefab("sparks", val2.transform.position);
				val3.transform.SetParent(val2.transform, true);
				State.MalfunctionDoor.AssignChild(val3);
			}
			else
			{
				if (State.MalfunctionPower.Active || !State.MalfunctionDoor.Active || !State.MalfunctionDoor.Triggered || __instance.hour < 16)
				{
					return;
				}
				State.MalfunctionDoor.Triggered = false;
				HangarShipDoor val4 = Object.FindAnyObjectByType<HangarShipDoor>();
				if ((Object)(object)val4 != (Object)null)
				{
					val4.SetDoorOpen();
					val4.PlayDoorAnimation(false);
				}
				GameObject val5 = GameObject.Find("HangarDoorButtonPanel");
				if ((Object)(object)val5 != (Object)null)
				{
					InteractTrigger[] componentsInChildren = val5.GetComponentsInChildren<InteractTrigger>(true);
					for (int i = 0; i < componentsInChildren.Length; i++)
					{
						componentsInChildren[i].interactable = true;
					}
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void CheckMalfunctionLeverTrigger(TimeOfDay __instance)
		{
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			if (State.MalfunctionPower.Active || State.MalfunctionDoor.Active || !State.MalfunctionLever.Active || !(((Object)__instance.currentLevel).name != "CompanyBuildingLevel"))
			{
				return;
			}
			if (!State.MalfunctionLever.Notified && __instance.currentDayTimeStarted && __instance.hour >= 3 + State.MalfunctionLever.Delay && __instance.hour < 16)
			{
				Plugin.logger.LogDebug((object)"Notified lever malfunction!");
				int num = State.MalfunctionLever.Delay;
				if (num == 0)
				{
					num = 12;
				}
				((TMP_Text)HUDManager.Instance.globalNotificationText).text = $"MANUAL HYDRAULICS FAILURE IMMINENT:\nLEAVE BEFORE {num}PM OR AWAIT AUTOPILOT";
				HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
				HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
				State.MalfunctionLever.Notified = true;
			}
			else if (!State.MalfunctionLever.Triggered && __instance.currentDayTimeStarted && __instance.hour >= 6 + State.MalfunctionLever.Delay && __instance.hour < 16)
			{
				Plugin.logger.LogDebug((object)"Triggered lever malfunction!");
				State.MalfunctionLever.Triggered = true;
				StartMatchLever val = Object.FindObjectOfType<StartMatchLever>();
				if ((Object)(object)val == (Object)null)
				{
					Plugin.logger.LogError((object)"Failed to find lever device object.");
					return;
				}
				val.triggerScript.disabledHoverTip = "[The lever is jammed]";
				GameObject val2 = Assets.SpawnPrefab("sparks", ((Component)val).transform.position);
				val2.transform.SetParent(((Component)val).transform, true);
				State.MalfunctionLever.AssignChild(val2);
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatches
	{
		public class MalfunctionNavigationNetworkData
		{
			public bool result;

			public int levelId;

			public MalfunctionNavigationNetworkData(bool result, int levelId)
			{
				this.result = result;
				this.levelId = levelId;
			}
		}

		public class MalfunctionTeleporterNetworkData
		{
			public bool result;

			public int delay;

			public MalfunctionTeleporterNetworkData(bool result, int delay)
			{
				this.result = result;
				this.delay = delay;
			}
		}

		public class MalfunctionDistortionNetworkData
		{
			public bool result;

			public int delay;

			public MalfunctionDistortionNetworkData(bool result, int delay)
			{
				this.result = result;
				this.delay = delay;
			}
		}

		public class MalfunctionDoorNetworkData
		{
			public bool result;

			public int delay;

			public MalfunctionDoorNetworkData(bool result, int delay)
			{
				this.result = result;
				this.delay = delay;
			}
		}

		public class MalfunctionLeverNetworkData
		{
			public bool result;

			public int delay;

			public MalfunctionLeverNetworkData(bool result, int delay)
			{
				this.result = result;
				this.delay = delay;
			}
		}

		public class MalfunctionPowerNetworkData
		{
			public bool result;

			public bool blockResult;

			public MalfunctionPowerNetworkData(bool result, bool blockResult)
			{
				this.result = result;
				this.blockResult = blockResult;
			}
		}

		private static GameObject elevatorPanelScreen;

		private static GameObject floodlight1;

		private static GameObject floodlight2;

		private static Material floodlightMaterial;

		private static bool hadUnrecoveredDeadPlayers;

		private static string originalLeverDisableTooltip = "";

		public static LethalClientEvent MalfunctionResetNetworkClientMessage = new LethalClientEvent("MALFUNCTION_RESET", (Action)null, (Action<ulong>)null);

		public static LethalServerMessage<MalfunctionNavigationNetworkData> MalfunctionNavigationNetworkServerMessage = new LethalServerMessage<MalfunctionNavigationNetworkData>("MALFUNCTION_NAVIGATION", (Action<MalfunctionNavigationNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionNavigationNetworkData> MalfunctionNavigationNetworkClientMessage = new LethalClientMessage<MalfunctionNavigationNetworkData>("MALFUNCTION_NAVIGATION", (Action<MalfunctionNavigationNetworkData>)null, (Action<MalfunctionNavigationNetworkData, ulong>)null);

		public static LethalServerMessage<MalfunctionTeleporterNetworkData> MalfunctionTeleporterNetworkServerMessage = new LethalServerMessage<MalfunctionTeleporterNetworkData>("MALFUNCTION_TELEPORTER", (Action<MalfunctionTeleporterNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionTeleporterNetworkData> MalfunctionTeleporterNetworkClientMessage = new LethalClientMessage<MalfunctionTeleporterNetworkData>("MALFUNCTION_TELEPORTER", (Action<MalfunctionTeleporterNetworkData>)null, (Action<MalfunctionTeleporterNetworkData, ulong>)null);

		public static LethalServerMessage<MalfunctionDistortionNetworkData> MalfunctionDistortionNetworkServerMessage = new LethalServerMessage<MalfunctionDistortionNetworkData>("MALFUNCTION_DISTORTION", (Action<MalfunctionDistortionNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionDistortionNetworkData> MalfunctionDistortionNetworkClientMessage = new LethalClientMessage<MalfunctionDistortionNetworkData>("MALFUNCTION_DISTORTION", (Action<MalfunctionDistortionNetworkData>)null, (Action<MalfunctionDistortionNetworkData, ulong>)null);

		public static LethalServerMessage<MalfunctionDoorNetworkData> MalfunctionDoorNetworkServerMessage = new LethalServerMessage<MalfunctionDoorNetworkData>("MALFUNCTION_DOOR", (Action<MalfunctionDoorNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionDoorNetworkData> MalfunctionDoorNetworkClientMessage = new LethalClientMessage<MalfunctionDoorNetworkData>("MALFUNCTION_DOOR", (Action<MalfunctionDoorNetworkData>)null, (Action<MalfunctionDoorNetworkData, ulong>)null);

		public static LethalServerMessage<MalfunctionLeverNetworkData> MalfunctionLeverNetworkServerMessage = new LethalServerMessage<MalfunctionLeverNetworkData>("MALFUNCTION_LEVER", (Action<MalfunctionLeverNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionLeverNetworkData> MalfunctionLeverNetworkClientMessage = new LethalClientMessage<MalfunctionLeverNetworkData>("MALFUNCTION_LEVER", (Action<MalfunctionLeverNetworkData>)null, (Action<MalfunctionLeverNetworkData, ulong>)null);

		public static LethalServerMessage<MalfunctionPowerNetworkData> MalfunctionPowerNetworkServerMessage = new LethalServerMessage<MalfunctionPowerNetworkData>("MALFUNCTION_POWER", (Action<MalfunctionPowerNetworkData, ulong>)null);

		public static LethalClientMessage<MalfunctionPowerNetworkData> MalfunctionPowerNetworkClientMessage = new LethalClientMessage<MalfunctionPowerNetworkData>("MALFUNCTION_POWER", (Action<MalfunctionPowerNetworkData>)null, (Action<MalfunctionPowerNetworkData, ulong>)null);

		public static bool NetworkHandlersRegistered = false;

		public static void MalfunctionResetNetworkHandler()
		{
			Plugin.logger.LogDebug((object)"Received networking malfunction reset broadcast!");
			RestoreAfterMalfunctions();
		}

		public static void MalfunctionNavigationNetworkHandler(MalfunctionNavigationNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction navigation roll result: {message.result} (levelId: {message.levelId})");
			HandleRollNavigation(message.result, message.levelId);
		}

		public static void MalfunctionTeleporterNetworkHandler(MalfunctionTeleporterNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction teleporter roll result: {message.result} (Delay: {message.delay})");
			HandleRollTeleporter(message.result, message.delay);
		}

		public static void MalfunctionDistortionNetworkHandler(MalfunctionDistortionNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction distortion roll result: {message.result} (Delay: {message.delay})");
			HandleRollDistortion(message.result, message.delay);
		}

		public static void MalfunctionDoorNetworkHandler(MalfunctionDoorNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction door roll result: {message.result} (Delay: {message.delay})");
			HandleRollDoor(message.result, message.delay);
		}

		public static void MalfunctionLeverNetworkHandler(MalfunctionLeverNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction lever roll result: {message.result} (Delay: {message.delay})");
			HandleRollLever(message.result, message.delay);
		}

		public static void MalfunctionPowerNetworkHandler(MalfunctionPowerNetworkData message)
		{
			Plugin.logger.LogDebug((object)$"Received network message for malfunction power roll result: {message.result} (Block lever: {message.blockResult})");
			HandleRollPower(message.result, message.blockResult);
		}

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void RegisterNetworkHandlers()
		{
			if (!NetworkHandlersRegistered)
			{
				MalfunctionResetNetworkClientMessage.OnReceived += MalfunctionResetNetworkHandler;
				MalfunctionNavigationNetworkClientMessage.OnReceived += MalfunctionNavigationNetworkHandler;
				MalfunctionTeleporterNetworkClientMessage.OnReceived += MalfunctionTeleporterNetworkHandler;
				MalfunctionDistortionNetworkClientMessage.OnReceived += MalfunctionDistortionNetworkHandler;
				MalfunctionDoorNetworkClientMessage.OnReceived += MalfunctionDoorNetworkHandler;
				MalfunctionLeverNetworkClientMessage.OnReceived += MalfunctionLeverNetworkHandler;
				MalfunctionPowerNetworkClientMessage.OnReceived += MalfunctionPowerNetworkHandler;
				NetworkHandlersRegistered = true;
				Plugin.logger.LogDebug((object)"Registered network handlers!");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void DebugShowLevelIds()
		{
		}

		[HarmonyPrefix]
		[HarmonyPatch("EndOfGame")]
		private static void CheckDeadPlayers(StartOfRound __instance, int bodiesInsured)
		{
			int num = __instance.connectedPlayersAmount + 1 - __instance.livingPlayers;
			if (num > bodiesInsured)
			{
				hadUnrecoveredDeadPlayers = true;
				Plugin.logger.LogDebug((object)$"There were unrecovered players! (Players: {__instance.connectedPlayersAmount + 1} / Dead: {num} / Recovered: {bodiesInsured})");
			}
			else
			{
				hadUnrecoveredDeadPlayers = false;
				Plugin.logger.LogDebug((object)$"All players are alive or recovered! (Players: {__instance.connectedPlayersAmount + 1} / Dead: {num} / Recovered: {bodiesInsured})");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("ReviveDeadPlayers")]
		private static void RollMalfunctions(StartOfRound __instance)
		{
			RestoreAfterMalfunctions();
			if (Config.MalfunctionMiscAllowConsecutive.Value)
			{
				State.Reset();
			}
			int num = (int)(DateTime.Parse(DateTime.UtcNow.ToString("yyyy-MM-dd")) - new DateTime(1970, 1, 1)).TotalSeconds;
			int num2 = __instance.randomMapSeed + num;
			Random random = new Random(num2);
			Plugin.logger.LogDebug((object)$"Got random synced seed: {num2}");
			Plugin.logger.LogDebug((object)$"Elapsed days: {__instance.gameStats.daysSpent} / Days to next deadline: {TimeOfDay.Instance.daysUntilDeadline}");
			if (!((NetworkBehaviour)__instance).IsServer)
			{
				return;
			}
			double num3 = random.NextDouble() * 100.0;
			double num4 = random.NextDouble() * 100.0;
			double num5 = random.NextDouble() * 100.0;
			double num6 = random.NextDouble() * 100.0;
			double num7 = random.NextDouble() * 100.0;
			double num8 = random.NextDouble() * 100.0;
			double num9 = 1.0;
			if (Config.MalfunctionPenaltyEnabled.Value)
			{
				Plugin.logger.LogDebug((object)"Penalty multiplier active. Checking for unrecovered players.");
				if (hadUnrecoveredDeadPlayers)
				{
					num9 = Config.MalfunctionPenaltyMultiplier.Value;
					Plugin.logger.LogDebug((object)"Had unrecovered players. Increasing malfunction multiplier for this round.");
				}
				else if (Config.MalfunctionPenaltyOnly.Value)
				{
					num9 = 0.0;
					Plugin.logger.LogDebug((object)"No unrecovered players. Setting probability to zero as penalty mode only is enabled.");
				}
			}
			bool flag = Config.MalfunctionChanceNavigation.Value != 0.0 && num3 < Config.MalfunctionChanceNavigation.Value * num9;
			bool flag2 = Config.MalfunctionChanceTeleporter.Value != 0.0 && num4 < Config.MalfunctionChanceTeleporter.Value * num9;
			bool flag3 = Config.MalfunctionChanceDistortion.Value != 0.0 && num5 < Config.MalfunctionChanceDistortion.Value * num9;
			bool flag4 = Config.MalfunctionChanceDoor.Value != 0.0 && num8 < Config.MalfunctionChanceDoor.Value * num9;
			bool flag5 = Config.MalfunctionChanceLever.Value != 0.0 && num7 < Config.MalfunctionChanceLever.Value * num9;
			bool flag6 = Config.MalfunctionChancePower.Value != 0.0 && num6 < Config.MalfunctionChancePower.Value * num9;
			Plugin.logger.LogDebug((object)string.Format("Malfunction Navigation Roll: {0} < {1} ({2})", num3, Config.MalfunctionChanceNavigation.Value * num9, flag ? "SUCCESS" : "FAIL"));
			Plugin.logger.LogDebug((object)string.Format("Malfunction Teleporter Roll: {0} < {1} ({2})", num4, Config.MalfunctionChanceTeleporter.Value * num9, flag2 ? "SUCCESS" : "FAIL"));
			Plugin.logger.LogDebug((object)string.Format("Malfunction Distortion Roll: {0} < {1} ({2})", num5, Config.MalfunctionChanceDistortion.Value * num9, flag3 ? "SUCCESS" : "FAIL"));
			Plugin.logger.LogDebug((object)string.Format("Malfunction Door Roll: {0} < {1} ({2})", num8, Config.MalfunctionChanceDoor.Value * num9, flag4 ? "SUCCESS" : "FAIL"));
			Plugin.logger.LogDebug((object)string.Format("Malfunction Lever Roll: {0} < {1} ({2})", num7, Config.MalfunctionChanceLever.Value * num9, flag5 ? "SUCCESS" : "FAIL"));
			Plugin.logger.LogDebug((object)string.Format("Malfunction Power Roll: {0} < {1} ({2})", num6, Config.MalfunctionChancePower.Value * num9, flag6 ? "SUCCESS" : "FAIL"));
			double num10 = random.NextDouble() * 100.0;
			bool flag7 = Config.MalfunctionPowerBlockLeverChance.Value != 0.0 && num10 < Config.MalfunctionPowerBlockLeverChance.Value;
			Plugin.logger.LogDebug((object)string.Format("Malfunction Power - Block Lever Roll : {0} < {1} ({2})", num10, Config.MalfunctionPowerBlockLeverChance.Value, flag7 ? "SUCCESS" : "FAIL"));
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysNavigation.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking navigation malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysNavigation.Value}");
				flag = false;
			}
			SelectableLevel[] array = StartOfRound.Instance.levels.Where((SelectableLevel level) => ((Object)level).name != "CompanyBuildingLevel" && ((Object)level).name != "LiquidationLevel").ToArray();
			SelectableLevel val = random.NextFromCollection(array);
			if (flag)
			{
				SelectableLevel[] array2 = array;
				foreach (SelectableLevel val2 in array2)
				{
					Plugin.logger.LogDebug((object)$"Level ID: {val2.levelID} / Level Name: {((Object)val2).name}");
				}
				Plugin.logger.LogDebug((object)$"Selected Level ID: {val.levelID}");
			}
			MalfunctionNavigationNetworkServerMessage.SendAllClients(new MalfunctionNavigationNetworkData(flag, val.levelID), true);
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysTeleporter.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking teleporter malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysTeleporter.Value}");
				flag2 = false;
			}
			int delay = 1 + random.Next(11);
			MalfunctionTeleporterNetworkServerMessage.SendAllClients(new MalfunctionTeleporterNetworkData(flag2, delay), true);
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysDistortion.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking distortion malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysDistortion.Value}");
				flag3 = false;
			}
			int delay2 = random.Next(12);
			MalfunctionDistortionNetworkServerMessage.SendAllClients(new MalfunctionDistortionNetworkData(flag3, delay2), true);
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysDoor.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking door malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysDoor.Value}");
				flag4 = false;
			}
			int delay3 = 4 + random.Next(8);
			MalfunctionDoorNetworkServerMessage.SendAllClients(new MalfunctionDoorNetworkData(flag4, delay3), true);
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysLever.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking lever malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysLever.Value}");
				flag5 = false;
			}
			int delay4 = random.Next(4);
			MalfunctionLeverNetworkServerMessage.SendAllClients(new MalfunctionLeverNetworkData(flag5, delay4), true);
			if (StartOfRound.Instance.gameStats.daysSpent <= Config.MalfunctionPassedDaysPower.Value)
			{
				Plugin.logger.LogDebug((object)$"Blocking power malfunction because elapsed days hasn't passed required threshold: {StartOfRound.Instance.gameStats.daysSpent} / {Config.MalfunctionPassedDaysPower.Value}");
				flag6 = false;
			}
			MalfunctionPowerNetworkServerMessage.SendAllClients(new MalfunctionPowerNetworkData(flag6, flag7), true);
		}

		private static void RestoreAfterMalfunctions()
		{
			StartMatchLever val = Object.FindObjectOfType<StartMatchLever>();
			if ((Object)(object)val == (Object)null)
			{
				Plugin.logger.LogWarning((object)"Failed to find lever device object.");
			}
			else
			{
				val.triggerScript.disabledHoverTip = originalLeverDisableTooltip;
				Plugin.logger.LogDebug((object)"Reset lever");
			}
			Terminal val2 = Object.FindObjectOfType<Terminal>();
			if ((Object)(object)val2 != (Object)null)
			{
				((Component)val2).gameObject.GetComponent<InteractTrigger>().interactable = true;
				Plugin.logger.LogDebug((object)"Reset terminal");
			}
			if ((Object)(object)elevatorPanelScreen == (Object)null)
			{
				Plugin.logger.LogWarning((object)"Failed to find door panel screen from previous reference.");
			}
			else
			{
				elevatorPanelScreen.SetActive(true);
				Plugin.logger.LogDebug((object)"Reset door screen");
			}
			GameObject val3 = GameObject.Find("HangarDoorButtonPanel");
			if ((Object)(object)val3 != (Object)null)
			{
				InteractTrigger[] componentsInChildren = val3.GetComponentsInChildren<InteractTrigger>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].interactable = true;
				}
				Plugin.logger.LogDebug((object)"Reset door panel");
			}
			if ((Object)(object)floodlight1 != (Object)null && (Object)(object)floodlight2 != (Object)null)
			{
				Light[] componentsInChildren2 = floodlight1.GetComponentsInChildren<Light>(true);
				Light[] componentsInChildren3 = floodlight2.GetComponentsInChildren<Light>(true);
				Light[] array = componentsInChildren2;
				for (int i = 0; i < array.Length; i++)
				{
					((Behaviour)array[i]).enabled = true;
				}
				array = componentsInChildren3;
				for (int i = 0; i < array.Length; i++)
				{
					((Behaviour)array[i]).enabled = true;
				}
				MeshRenderer component = floodlight1.GetComponent<MeshRenderer>();
				MeshRenderer component2 = floodlight2.GetComponent<MeshRenderer>();
				if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null)
				{
					Material[] materials = ((Renderer)component).materials;
					materials[2] = floodlightMaterial;
					((Renderer)component).materials = materials;
					((Renderer)component2).materials = materials;
				}
				Plugin.logger.LogDebug((object)"Restored lights");
			}
		}

		private static void HandleRollNavigation(bool result, int level)
		{
			if (State.MalfunctionNavigation.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionNavigation.Reset();
			}
			else if (TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				StartOfRound.Instance.ChangeLevel(level);
				State.MalfunctionNavigation.Active = true;
			}
		}

		private static void HandleRollTeleporter(bool result, int delay)
		{
			if (State.MalfunctionTeleporter.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionTeleporter.Reset();
			}
			else if (!State.MalfunctionPower.Active && TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				if ((Object)(object)Object.FindObjectOfType<ShipTeleporter>() != (Object)null)
				{
					State.MalfunctionTeleporter.Delay = delay;
					State.MalfunctionTeleporter.Active = true;
					Plugin.logger.LogDebug((object)$"Teleporter malfunction will trigger at {7 + State.MalfunctionTeleporter.Delay}:00");
				}
				else
				{
					Plugin.logger.LogDebug((object)"Didn't find a teleporter! Skipping teleporter malfunction.");
				}
			}
		}

		public static void HandleRollDistortion(bool result, int delay)
		{
			if (State.MalfunctionDistortion.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionDistortion.Reset();
			}
			else if (!State.MalfunctionPower.Active && TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				State.MalfunctionDistortion.Delay = delay;
				State.MalfunctionDistortion.Active = true;
				Plugin.logger.LogDebug((object)$"Distortion malfunction will trigger at {7 + State.MalfunctionDistortion.Delay}:00");
			}
		}

		public static void HandleRollDoor(bool result, int delay)
		{
			if (State.MalfunctionDoor.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionDoor.Reset();
			}
			else if (!State.MalfunctionPower.Active && TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				State.MalfunctionDoor.Delay = delay;
				State.MalfunctionDoor.Active = true;
				Plugin.logger.LogDebug((object)$"Door malfunction will trigger at {7 + State.MalfunctionDoor.Delay}:00");
			}
		}

		public static void HandleRollLever(bool result, int delay)
		{
			if (State.MalfunctionLever.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionLever.Reset();
			}
			else if (!State.MalfunctionPower.Active && !State.MalfunctionDoor.Active && TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				State.MalfunctionLever.Delay = delay;
				State.MalfunctionLever.Active = true;
				Plugin.logger.LogDebug((object)$"Lever malfunction will trigger at {12 + State.MalfunctionLever.Delay}:00");
			}
		}

		public static void HandleRollPower(bool result, bool blockLever)
		{
			if (((Object)RoundManager.Instance.currentLevel).name == "CompanyBuildingLevel")
			{
				State.MalfunctionPower.Reset();
			}
			else if (State.MalfunctionPower.Active || TimeOfDay.Instance.daysUntilDeadline < 2)
			{
				State.MalfunctionPower.Reset();
			}
			else if (TimeOfDay.Instance.daysUntilDeadline >= 2 && result)
			{
				State.MalfunctionPower.Active = true;
				if (Config.MalfunctionPowerBlockLever.Value && blockLever)
				{
					State.MalfunctionPower.Delay = 1;
				}
				else
				{
					State.MalfunctionPower.Delay = 0;
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("SetMapScreenInfoToCurrentLevel")]
		[HarmonyAfter(new string[] { "jamil.corporate_restructure", "WeatherTweaks" })]
		private static void OverwriteMapScreenInfo(StartOfRound __instance)
		{
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			StartMatchLever val = Object.FindObjectOfType<StartMatchLever>();
			if ((Object)(object)val == (Object)null)
			{
				Plugin.logger.LogError((object)"Failed to find lever device object.");
			}
			else
			{
				originalLeverDisableTooltip = val.triggerScript.disabledHoverTip;
			}
			if (((Object)__instance.currentLevel).name != "CompanyBuildingLevel" && State.MalfunctionNavigation.Active && !State.MalfunctionNavigation.Notified)
			{
				((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP NAVIGATION MALFUNCTION:\nROUTE TABLE OFFSET ERROR";
				HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
				HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
				State.MalfunctionNavigation.Notified = true;
				((TMP_Text)__instance.screenLevelDescription).text = "SHIP NAVIGATION MALFUNCTION\nOrbiting: Unknown\nWeather: Unknown\nBE ADVISED THE ROUTE TABLE WILL RECALIBRATE AFTER LANDING";
				((Behaviour)__instance.screenLevelVideoReel).enabled = false;
				__instance.screenLevelVideoReel.clip = null;
				((Component)__instance.screenLevelVideoReel).gameObject.SetActive(false);
				__instance.screenLevelVideoReel.Stop();
				if ((Object)(object)val == (Object)null)
				{
					Plugin.logger.LogError((object)"Failed to find lever device object.");
					return;
				}
				GameObject val2 = Assets.SpawnPrefab("sparks", ((Component)val).transform.position);
				val2.transform.SetParent(((Component)val).transform, true);
				State.MalfunctionNavigation.AssignChild(val2);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("openingDoorsSequence")]
		private static void HandleLevelStart(StartOfRound __instance)
		{
			State.PreviousMoon = __instance.currentLevel.levelID;
			if (!State.MalfunctionPower.Active || !(((Object)__instance.currentLevel).name != "CompanyBuildingLevel"))
			{
				return;
			}
			Plugin.logger.LogDebug((object)"Triggered power malfunction!");
			State.MalfunctionPower.Triggered = true;
			if (State.MalfunctionPower.Notified)
			{
				return;
			}
			if ((Object)(object)floodlight1 != (Object)null && (Object)(object)floodlight2 != (Object)null)
			{
				Light[] componentsInChildren = floodlight1.GetComponentsInChildren<Light>(true);
				Light[] componentsInChildren2 = floodlight2.GetComponentsInChildren<Light>(true);
				Light[] array = componentsInChildren;
				for (int i = 0; i < array.Length; i++)
				{
					((Behaviour)array[i]).enabled = false;
				}
				array = componentsInChildren2;
				for (int i = 0; i < array.Length; i++)
				{
					((Behaviour)array[i]).enabled = false;
				}
				MeshRenderer component = floodlight1.GetComponent<MeshRenderer>();
				MeshRenderer component2 = floodlight2.GetComponent<MeshRenderer>();
				if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null)
				{
					Material[] materials = ((Renderer)component).materials;
					materials[2] = ((Renderer)component).materials[0];
					((Renderer)component).materials = materials;
					((Renderer)component2).materials = materials;
				}
			}
			Terminal val = Object.FindObjectOfType<Terminal>();
			if ((Object)(object)val != (Object)null)
			{
				((Component)val).gameObject.GetComponent<InteractTrigger>().interactable = false;
			}
			GameObject obj = elevatorPanelScreen;
			if (obj != null)
			{
				obj.SetActive(false);
			}
			GameObject val2 = GameObject.Find("HangarDoorButtonPanel");
			if ((Object)(object)val2 != (Object)null)
			{
				InteractTrigger[] componentsInChildren3 = val2.GetComponentsInChildren<InteractTrigger>(true);
				for (int i = 0; i < componentsInChildren3.Length; i++)
				{
					componentsInChildren3[i].interactable = false;
				}
			}
			__instance.PowerSurgeShip();
			StormyWeather val3 = Object.FindObjectOfType<StormyWeather>(true);
			RoundManager.PlayRandomClip(val.terminalAudio, val3.distantThunderSFX, true, 1f, 0, 1000);
			((TMP_Text)HUDManager.Instance.globalNotificationText).text = "SHIP CORE SURGE:\nRUNNING ON EMERGENCY POWER";
			HUDManager.Instance.globalNotificationAnimator.SetTrigger("TriggerNotif");
			HUDManager.Instance.UIAudio.PlayOneShot(HUDManager.Instance.radiationWarningAudio, 1f);
			State.MalfunctionPower.Notified = true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("OnShipLandedMiscEvents")]
		private static void CaptureGameObjects()
		{
			elevatorPanelScreen = GameObject.Find("ElevatorPanelScreen");
			if (!((Object)(object)floodlightMaterial == (Object)null))
			{
				return;
			}
			floodlight1 = GameObject.Find("Floodlight1");
			floodlight2 = GameObject.Find("Floodlight2");
			if ((Object)(object)floodlight1 == (Object)null || (Object)(object)floodlight2 == (Object)null)
			{
				Plugin.logger.LogWarning((object)"Failed to capture floodlight gameobjects!");
				return;
			}
			MeshRenderer component = floodlight1.GetComponent<MeshRenderer>();
			if ((Object)(object)component != (Object)null)
			{
				floodlightMaterial = ((Renderer)component).materials[2];
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void Reset()
		{
			State.Reset();
		}
	}
}
namespace Malfunctions.MonoBehaviours
{
	public class Sparks : MonoBehaviour
	{
		public float delayMin = 0.5f;

		public float delayMax = 10f;

		public float maxIntensity = 40000f;

		private float currentIntensity;

		private float now;

		private float next;

		private bool sentStop;

		private AudioSource audioSource;

		private Light pointLight;

		private VisualEffect visualEffect;

		private static VFXExposedProperty beginBurstTrigger;

		private static VFXExposedProperty stopBurstTrigger;

		private void Start()
		{
			beginBurstTrigger.name = "BeginBurst";
			stopBurstTrigger.name = "StopBurst";
			audioSource = ((Component)this).GetComponent<AudioSource>();
			pointLight = ((Component)this).GetComponent<Light>();
			visualEffect = ((Component)this).GetComponent<VisualEffect>();
			GameObject val = GameObject.Find("Player");
			Camera val2 = ((!((Object)(object)val == (Object)null)) ? val.GetComponentInChildren<Camera>() : Object.FindAnyObjectByType<Camera>());
			((Component)val2).gameObject.tag = "MainCamera";
		}

		private void Update()
		{
			now = Time.time;
			if (now > next)
			{
				next = now + Random.Range(delayMin, delayMax);
				if (!Config.MalfunctionVFXDisableSparks.Value)
				{
					sentStop = false;
					((Behaviour)pointLight).enabled = true;
					currentIntensity = maxIntensity;
					if (!Config.MalfunctionVFXDisableSparksSound.Value)
					{
						audioSource.pitch = Random.Range(0.7f, 2f);
						audioSource.Play();
					}
					visualEffect.SendEvent(beginBurstTrigger.name);
				}
			}
			else if (!sentStop)
			{
				visualEffect.SendEvent(stopBurstTrigger.name);
				sentStop = true;
			}
			pointLight.intensity = currentIntensity;
			currentIntensity = Mathf.Lerp(currentIntensity, 0f, Time.deltaTime * 100f);
		}
	}
}
namespace Malfunctions.Helpers
{
	public static class RandomHelper
	{
		public static TSource NextFromCollection<TSource>(this Random rand, IList<TSource> collection)
		{
			int index = rand.Next(collection.Count());
			return collection[index];
		}
	}
}