Decompiled source of ShipMeltdown v1.8.50

ShipMeltdown.dll

Decompiled a week ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using FacilityMeltdown.API;
using FacilityMeltdown.MeltdownSequence.Behaviours;
using GeneralImprovements.Utilities;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using OpenMonitors.Monitors;
using ShipMeltdown.Patches;
using ShipMeltdown.Utils;
using ShipMeltdown.Utils.Monitors;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ShipMeltdown")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+001aea35c7a4292b82e53ccfec88b06a5f305556")]
[assembly: AssemblyProduct("ShipMeltdown")]
[assembly: AssemblyTitle("ShipMeltdown")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ShipMeltdown
{
	public class Config
	{
		internal static Config? Instance;

		internal ConfigEntry<Key> toggleEmergencyLights;

		internal ConfigEntry<bool> shipDoorMalfunction;

		public Key getToggleEmergencyLights => toggleEmergencyLights.Value;

		public bool getShipDoorMalfunction => shipDoorMalfunction.Value;

		public Config(ConfigFile file)
		{
			Instance = this;
			toggleEmergencyLights = file.Bind<Key>("Main", "Toggle Emergency Lights", (Key)99, (ConfigDescription)null);
			shipDoorMalfunction = file.Bind<bool>("Main", "Ship Doors Malfunction", true, (ConfigDescription)null);
		}
	}
	[BepInPlugin("catragryff.ShipMeltdown", "ShipMeltdown", "1.7.50")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ShipMeltdown : BaseUnityPlugin
	{
		internal const string modGUID = "catragryff.ShipMeltdown";

		internal const string modName = "ShipMeltdown";

		internal const string modVersion = "1.7.50";

		internal readonly Harmony harmony = new Harmony("catragryff.ShipMeltdown");

		internal static ShipMeltdown instance;

		private static bool openMonitorSupport;

		private static bool generalImprovementsSupport;

		internal static ManualLogSource mls = Logger.CreateLogSource("ShipMeltdown");

		public static Config ShipMeltdownConfig { get; private set; }

		public void Awake()
		{
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Expected O, but got Unknown
			if ((Object)(object)instance == (Object)null)
			{
				instance = this;
			}
			mls.LogInfo((object)"ShipMeltdown loading...");
			ShipMeltdownConfig = new Config(((BaseUnityPlugin)this).Config);
			openMonitorSupport = Chainloader.PluginInfos.Keys.Contains("xxxstoner420bongmasterxxx.open_monitors");
			generalImprovementsSupport = Chainloader.PluginInfos.Keys.Contains("ShaosilGaming.GeneralImprovements");
			if (Chainloader.PluginInfos.Keys.Contains("PizzaProbability"))
			{
				mls.LogError((object)"PizzaProbability detected ! This mod is incompatible with ShipMeltdown. Trying to remove PizzaProbability patches to avoid breaking the game...");
				Harmony.UnpatchID("PizzaProbability");
			}
			harmony.PatchAll(typeof(StartOfRoundPatch1));
			if ((int)ShipMeltdownConfig.getToggleEmergencyLights != 0)
			{
				harmony.PatchAll(typeof(StartOfRoundPatch2));
			}
			harmony.PatchAll(typeof(MeltdownHandlerPatch));
			if (generalImprovementsSupport)
			{
				mls.LogInfo((object)"Adding GeneralImprovements support");
				MonitorCompatibilityHandler.AddMonitorCompatibilityHandler(new GeneralImprovements());
			}
			if (openMonitorSupport)
			{
				mls.LogInfo((object)"Adding OpenMonitor support");
				MonitorCompatibilityHandler.AddMonitorCompatibilityHandler(new OpenMonitor());
			}
			if (!openMonitorSupport && !generalImprovementsSupport)
			{
				mls.LogInfo((object)"No monitor support were added. Adding the default one");
				MonitorCompatibilityHandler.AddMonitorCompatibilityHandler(new DefaultMonitor(), removeDefaultHandler: false);
			}
			StartOfRoundPatch1.failure = (DialogueSegment[])(object)new DialogueSegment[1];
			StartOfRoundPatch1.failure[0] = new DialogueSegment
			{
				waitTime = 6f,
				bodyText = "Ship engines not detected. The company warned you not to play with radiations"
			};
			MeltdownAPI.RegisterMeltdownListener((Action)ShipPanic.OnMeltdownStarted);
			mls.LogInfo((object)"ShipMeltdown loaded");
		}
	}
	internal static class ShipPanic
	{
		internal static float delta;

		internal static bool repeat = true;

		internal static float delta2;

		internal static HangarShipDoor h;

		internal static Queue<(Light, Color)> colors;

		internal static Queue<(Light, bool)> toggleGroup;

		private static HashSet<Light> affected;

		internal static bool canTakeOff = true;

		internal static float meltdownTimer;

		internal static ControlledTask KillSystems;

		internal static ControlledTask BreakLever;

		internal static ControlledTask takeOff;

		internal static bool OnlyLights;

		public static bool CanTakeOff => canTakeOff;

		public static void OnMeltdownStarted()
		{
			if (KillSystems == null)
			{
				KillSystems = new ControlledTask(MostSystemsDead, shouldBeDoneOnlyOnce: true);
			}
			if (BreakLever == null)
			{
				BreakLever = new ControlledTask(ShipCantTakeOff, shouldBeDoneOnlyOnce: true);
			}
			if (takeOff == null)
			{
				takeOff = new ControlledTask(delegate
				{
					canTakeOff = true;
					StartOfRound.Instance.shipHasLanded = false;
					StartOfRound.Instance.shipIsLeaving = true;
					StartOfRound.Instance.shipAnimator.ResetTrigger("ShipLeave");
					StartOfRound.Instance.shipAnimator.SetTrigger("ShipLeave");
				}, shouldBeDoneOnlyOnce: true);
			}
			meltdownTimer = 120f;
			delta = 0f;
			delta2 = 0f;
			LightAlarm();
		}

		private static void ShipCantTakeOff()
		{
			canTakeOff = false;
			Object.FindObjectOfType<StartMatchLever>().triggerScript.interactable = false;
		}

		internal static void LightAlarm(int emergencyType = 0)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			StartOfRound instance = StartOfRound.Instance;
			if (colors == null)
			{
				colors = new Queue<(Light, Color)>();
			}
			if (toggleGroup == null)
			{
				toggleGroup = new Queue<(Light, bool)>();
			}
			if (affected == null)
			{
				affected = new HashSet<Light>();
			}
			while (colors.Count > 0)
			{
				var (val, color) = colors.Dequeue();
				val.color = color;
			}
			foreach (var (val2, enabled) in toggleGroup)
			{
				((Behaviour)val2).enabled = enabled;
			}
			toggleGroup.Clear();
			if (emergencyType == -1)
			{
				OnlyLights = false;
				return;
			}
			Light[] componentsInChildren = ((Component)instance.shipRoomLights).GetComponentsInChildren<Light>();
			Light[] componentsInChildren2 = ((Component)instance.shipAnimator).GetComponentsInChildren<Light>();
			foreach (Light val3 in componentsInChildren2)
			{
				if (affected.Add(val3))
				{
					colors.Enqueue((val3, val3.color));
					val3.color = Color.red;
					if (!componentsInChildren.Contains(val3))
					{
						toggleGroup.Enqueue((val3, ((Behaviour)val3).enabled));
					}
				}
			}
			if (emergencyType == 1)
			{
				OnlyLights = true;
			}
			if (emergencyType == 0)
			{
				h = Object.FindObjectOfType<HangarShipDoor>();
				h.SetDoorButtonsEnabled(false);
			}
		}

		internal static void ToggleLightsOnly()
		{
			foreach (var (val, flag) in toggleGroup)
			{
				((Behaviour)val).enabled = flag && !((Behaviour)val).enabled;
			}
			StartOfRound.Instance.shipRoomLights.ToggleShipLights();
		}

		internal static void TryWithoutNullPo(Action action)
		{
			try
			{
				action();
			}
			catch (NullReferenceException)
			{
			}
		}

		private static void MostSystemsDead()
		{
			h.hydraulicsDisplay.SetActive(false);
			MonitorCompatibilityHandler.MostSystemsDead();
		}

		internal static void ReviveSystems()
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			h.hydraulicsDisplay.SetActive(true);
			KillSystems.Reset();
			BreakLever.Reset();
			MonitorCompatibilityHandler.MaintainScreenOffReset();
			takeOff.Reset();
			canTakeOff = true;
			foreach (var (val, color) in colors)
			{
				val.color = color;
			}
			colors.Clear();
			foreach (var (val2, enabled) in toggleGroup)
			{
				((Behaviour)val2).enabled = enabled;
			}
			toggleGroup.Clear();
			affected.Clear();
			MonitorCompatibilityHandler.ReviveSystems();
			if (repeat)
			{
				h.shipDoorsAnimator.SetBool("Closed", true);
			}
		}
	}
}
namespace ShipMeltdown.Utils
{
	public class ControlledTask
	{
		private Action action;

		private bool hasBeenPerformed;

		private readonly bool shouldBeDoneOnlyOnce;

		public ControlledTask(Action action, bool shouldBeDoneOnlyOnce)
		{
			this.action = action;
			this.shouldBeDoneOnlyOnce = shouldBeDoneOnlyOnce;
			base..ctor();
		}

		public void Reset()
		{
			hasBeenPerformed = false;
		}

		public void Run()
		{
			if ((shouldBeDoneOnlyOnce && !hasBeenPerformed) || !shouldBeDoneOnlyOnce)
			{
				action();
				hasBeenPerformed = true;
			}
		}
	}
	public static class MonitorCompatibilityHandler
	{
		private static Queue<MonitorCompatibility> handlers = new Queue<MonitorCompatibility>();

		public static void AddMonitorCompatibilityHandler(MonitorCompatibility mc, bool removeDefaultHandler = true)
		{
			foreach (MonitorCompatibility handler in handlers)
			{
				if (mc.GetType() == handler.GetType())
				{
					LogQueueState(success: false, mc.GetType().ToString());
					return;
				}
			}
			MonitorCompatibility result = null;
			if (removeDefaultHandler && handlers.TryPeek(out result) && result.GetType() == typeof(DefaultMonitor))
			{
				handlers.Dequeue();
			}
			handlers.Enqueue(mc);
			LogQueueState();
		}

		private static void LogQueueState(bool success = true, string? type = null)
		{
			StringBuilder stringBuilder;
			if (success)
			{
				stringBuilder = new StringBuilder("A new monitor handler has been registered. ");
			}
			else
			{
				stringBuilder = new StringBuilder("Not registering handler of type ");
				stringBuilder.Append(type);
				stringBuilder.Append(" because one of the same type has already been registered. ");
			}
			stringBuilder.AppendLine($"There are now {handlers.Count} handlers loaded");
			int num = 0;
			foreach (MonitorCompatibility handler in handlers)
			{
				stringBuilder.Append(num++);
				stringBuilder.Append(" :");
				stringBuilder.AppendLine(handler.GetType().ToString());
			}
			ShipMeltdown.mls.LogInfo((object)stringBuilder);
		}

		internal static void MaintainScreenOff()
		{
			foreach (MonitorCompatibility handler in handlers)
			{
				handler.MaintainScreenOff().Run();
			}
		}

		internal static void MaintainScreenOffReset()
		{
			foreach (MonitorCompatibility handler in handlers)
			{
				handler.MaintainScreenOff().Reset();
			}
		}

		internal static void MostSystemsDead()
		{
			foreach (MonitorCompatibility handler in handlers)
			{
				handler.MostSystemsDead();
			}
		}

		internal static void ReviveSystems()
		{
			foreach (MonitorCompatibility handler in handlers)
			{
				handler.ReviveSystems();
			}
		}
	}
	public interface MonitorCompatibility
	{
		ControlledTask MaintainScreenOff();

		void MostSystemsDead();

		void ReviveSystems();
	}
}
namespace ShipMeltdown.Utils.Monitors
{
	public class DefaultMonitor : MonitorCompatibility
	{
		private ControlledTask maintainScreenOff = new ControlledTask(delegate
		{
			StartOfRound.Instance.mapScreen.SwitchScreenOn(false);
		}, shouldBeDoneOnlyOnce: false);

		internal DefaultMonitor()
		{
		}

		public ControlledTask MaintainScreenOff()
		{
			return maintainScreenOff;
		}

		public void MostSystemsDead()
		{
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorText).enabled = false;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorBGImage).enabled = false;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorText).enabled = false;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorBGImage).enabled = false;
			});
		}

		public void ReviveSystems()
		{
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorText).enabled = true;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorBGImage).enabled = true;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorText).enabled = true;
			});
			ShipPanic.TryWithoutNullPo(delegate
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorBGImage).enabled = true;
			});
		}
	}
	public class GeneralImprovements : MonitorCompatibility
	{
		internal static Queue<TextMeshProUGUI> monitors_text;

		internal static Queue<ManualCameraRenderer> monitors_cameras;

		internal static Queue<MeshRenderer> monitors_mesh;

		private ControlledTask maintainScreenOff = new ControlledTask(delegate
		{
			StartOfRound.Instance.mapScreen.SwitchScreenOn(false);
		}, shouldBeDoneOnlyOnce: false);

		internal GeneralImprovements()
		{
			ShipMeltdown.instance.harmony.PatchAll(typeof(StartOfRoundGeneralPatch));
			ShipMeltdown.instance.harmony.PatchAll(typeof(MonitorsHelperPatch));
		}

		public ControlledTask MaintainScreenOff()
		{
			return maintainScreenOff;
		}

		public void MostSystemsDead()
		{
			foreach (TextMeshProUGUI item in monitors_text)
			{
				((Behaviour)item).enabled = false;
			}
			foreach (ManualCameraRenderer monitors_camera in monitors_cameras)
			{
				((Behaviour)monitors_camera).enabled = false;
			}
			foreach (MeshRenderer item2 in monitors_mesh)
			{
				((Renderer)item2).enabled = false;
			}
			StartOfRound.Instance.mapScreen.SwitchScreenOn(false);
			MonitorsHelperPatch.allow = false;
		}

		public void ReviveSystems()
		{
			foreach (TextMeshProUGUI item in monitors_text)
			{
				((Behaviour)item).enabled = true;
			}
			foreach (ManualCameraRenderer monitors_camera in monitors_cameras)
			{
				((Behaviour)monitors_camera).enabled = true;
			}
			foreach (MeshRenderer item2 in monitors_mesh)
			{
				((Renderer)item2).enabled = true;
			}
			MonitorsHelperPatch.allow = true;
			StartOfRound.Instance.mapScreen.SwitchScreenOn(true);
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal static class StartOfRoundGeneralPatch
	{
		[HarmonyPatch(typeof(StartOfRound), "Start")]
		[HarmonyPostfix]
		[HarmonyAfter(new string[] { "ShaosilGaming.GeneralImprovements" })]
		private static void StartPatch()
		{
			if (GeneralImprovements.monitors_cameras == null)
			{
				GeneralImprovements.monitors_cameras = new Queue<ManualCameraRenderer>();
			}
			GeneralImprovements.monitors_cameras.Clear();
			if (GeneralImprovements.monitors_mesh == null)
			{
				GeneralImprovements.monitors_mesh = new Queue<MeshRenderer>();
			}
			GeneralImprovements.monitors_mesh.Clear();
			if (GeneralImprovements.monitors_text == null)
			{
				GeneralImprovements.monitors_text = new Queue<TextMeshProUGUI>();
			}
			GeneralImprovements.monitors_text.Clear();
			ManualCameraRenderer[] components = ((Component)StartOfRound.Instance).GetComponents<ManualCameraRenderer>();
			foreach (ManualCameraRenderer val in components)
			{
				if (((Behaviour)val).enabled)
				{
					GeneralImprovements.monitors_cameras.Enqueue(val);
				}
			}
			components = ((Component)StartOfRound.Instance).GetComponentsInChildren<ManualCameraRenderer>();
			foreach (ManualCameraRenderer val2 in components)
			{
				if (((Behaviour)val2).enabled)
				{
					GeneralImprovements.monitors_cameras.Enqueue(val2);
				}
			}
			MeshRenderer[] components2 = ((Component)StartOfRound.Instance).GetComponents<MeshRenderer>();
			foreach (MeshRenderer val3 in components2)
			{
				if (((Renderer)val3).enabled)
				{
					GeneralImprovements.monitors_mesh.Enqueue(val3);
				}
			}
			components2 = ((Component)StartOfRound.Instance).GetComponentsInChildren<MeshRenderer>();
			foreach (MeshRenderer val4 in components2)
			{
				if (((Renderer)val4).enabled)
				{
					GeneralImprovements.monitors_mesh.Enqueue(val4);
				}
			}
			TextMeshProUGUI[] components3 = ((Component)StartOfRound.Instance).GetComponents<TextMeshProUGUI>();
			foreach (TextMeshProUGUI val5 in components3)
			{
				if (((Behaviour)val5).enabled)
				{
					GeneralImprovements.monitors_text.Enqueue(val5);
				}
			}
			components3 = ((Component)StartOfRound.Instance).GetComponentsInChildren<TextMeshProUGUI>();
			foreach (TextMeshProUGUI val6 in components3)
			{
				if (((Behaviour)val6).enabled)
				{
					GeneralImprovements.monitors_text.Enqueue(val6);
				}
			}
			ShipMeltdown.mls.LogInfo((object)$"Found {GeneralImprovements.monitors_cameras.Count} ManualCameraRenderers, {GeneralImprovements.monitors_mesh.Count} MeshRenderers, {GeneralImprovements.monitors_text.Count} TextMeshProUGUIs while initializing queues for GeneralImprovements support");
		}
	}
	[HarmonyPatch(typeof(MonitorsHelper))]
	internal static class MonitorsHelperPatch
	{
		internal static bool allow = true;

		[HarmonyPatch("ToggleExtraMonitorsPower")]
		[HarmonyPrefix]
		private static bool ToggleExtraMonitorsPowerPatch()
		{
			return allow;
		}
	}
	public class OpenMonitor : MonitorCompatibility
	{
		private ControlledTask maintainScreenOff = new ControlledTask(delegate
		{
			StartOfRound.Instance.mapScreen.SwitchScreenOn(false);
		}, shouldBeDoneOnlyOnce: false);

		internal OpenMonitor()
		{
			ShipMeltdown.instance.harmony.PatchAll(typeof(CreditsMonitorPatch));
			ShipMeltdown.instance.harmony.PatchAll(typeof(LifeSupportMonitorPatch));
			if (CreditsMonitorPatch.act == null)
			{
				CreditsMonitorPatch.act = new ControlledTask(delegate
				{
					((Behaviour)((Component)CreditsMonitor.Instance).GetComponent<TextMeshProUGUI>()).enabled = CreditsMonitorPatch.meshEnable;
				}, shouldBeDoneOnlyOnce: true);
			}
			CreditsMonitorPatch.meshEnable = true;
			if (LifeSupportMonitorPatch.act == null)
			{
				LifeSupportMonitorPatch.act = new ControlledTask(delegate
				{
					((Behaviour)((Component)LifeSupportMonitor.Instance).GetComponent<TextMeshProUGUI>()).enabled = LifeSupportMonitorPatch.meshEnable;
				}, shouldBeDoneOnlyOnce: true);
			}
			LifeSupportMonitorPatch.meshEnable = true;
		}

		public ControlledTask MaintainScreenOff()
		{
			return maintainScreenOff;
		}

		public void MostSystemsDead()
		{
			if (!Config.HideCredits.Value)
			{
				CreditsMonitorPatch.meshEnable = false;
				CreditsMonitor.Instance.UpdateMonitor();
			}
			if (!Config.HideLifeSupport.Value)
			{
				LifeSupportMonitorPatch.meshEnable = false;
				LifeSupportMonitor.Instance.UpdateMonitor();
			}
			if (Config.KeepBlueBackground2.Value)
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorBGImage).enabled = false;
			}
			if (Config.KeepBlueBackground1.Value)
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorBGImage).enabled = false;
			}
			((Behaviour)StartOfRound.Instance.deadlineMonitorText).enabled = false;
			((Behaviour)StartOfRound.Instance.profitQuotaMonitorText).enabled = false;
			if (!Config.HideDay.Value)
			{
				((Behaviour)DayMonitor.Instance.textMesh).enabled = false;
			}
			if (!Config.HideLoot.Value)
			{
				((Behaviour)LootMonitor.Instance.textMesh).enabled = false;
			}
			if (!Config.HideTime.Value)
			{
				((Behaviour)TimeMonitor.Instance.textMesh).enabled = false;
			}
			if (!Config.HideLifeSupport.Value)
			{
				((Behaviour)LifeSupportMonitor.Instance).enabled = false;
			}
			if (!Config.HidePlayersLifeSupport.Value)
			{
				((Behaviour)PlayersLifeSupportMonitor.Instance.textMesh).enabled = false;
			}
		}

		public void ReviveSystems()
		{
			if (!Config.HideCredits.Value)
			{
				CreditsMonitorPatch.meshEnable = true;
				CreditsMonitor.Instance.UpdateMonitor();
			}
			if (!Config.HideLifeSupport.Value)
			{
				LifeSupportMonitorPatch.meshEnable = true;
				LifeSupportMonitor.Instance.UpdateMonitor();
			}
			if (Config.KeepBlueBackground2.Value)
			{
				((Behaviour)StartOfRound.Instance.deadlineMonitorBGImage).enabled = true;
			}
			if (Config.KeepBlueBackground1.Value)
			{
				((Behaviour)StartOfRound.Instance.profitQuotaMonitorBGImage).enabled = true;
			}
			((Behaviour)StartOfRound.Instance.deadlineMonitorText).enabled = true;
			((Behaviour)StartOfRound.Instance.profitQuotaMonitorText).enabled = true;
			if (!Config.HideCredits.Value)
			{
				((Behaviour)CreditsMonitor.Instance).enabled = true;
			}
			if (!Config.HideDay.Value)
			{
				((Behaviour)DayMonitor.Instance.textMesh).enabled = true;
			}
			if (!Config.HideLoot.Value)
			{
				((Behaviour)LootMonitor.Instance.textMesh).enabled = true;
			}
			if (!Config.HideTime.Value)
			{
				((Behaviour)TimeMonitor.Instance.textMesh).enabled = true;
			}
			if (!Config.HideLifeSupport.Value)
			{
				((Behaviour)LifeSupportMonitor.Instance).enabled = true;
			}
			if (!Config.HidePlayersLifeSupport.Value)
			{
				((Behaviour)PlayersLifeSupportMonitor.Instance.textMesh).enabled = true;
			}
		}
	}
	[HarmonyPatch(typeof(CreditsMonitor))]
	public class CreditsMonitorPatch
	{
		internal static bool meshEnable = true;

		internal static ControlledTask? act;

		[HarmonyPrefix]
		[HarmonyPatch("UpdateMonitor")]
		private static bool UpdatePatch()
		{
			if (!meshEnable)
			{
				act.Run();
				return false;
			}
			act.Reset();
			act.Run();
			act.Reset();
			return true;
		}
	}
	[HarmonyPatch(typeof(LifeSupportMonitor))]
	public class LifeSupportMonitorPatch
	{
		internal static bool meshEnable = true;

		internal static ControlledTask? act;

		[HarmonyPrefix]
		[HarmonyPatch("UpdateMonitor")]
		private static bool UpdatePatch()
		{
			if (!meshEnable)
			{
				act.Run();
				return false;
			}
			act.Reset();
			act.Run();
			act.Reset();
			return true;
		}
	}
}
namespace ShipMeltdown.Patches
{
	[HarmonyPatch(typeof(MeltdownHandler))]
	public class MeltdownHandlerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("OnDisable")]
		private static void onDisablePatch()
		{
			ShipPanic.ReviveSystems();
			ShipPanic.meltdownTimer = 120f;
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void UpdatePatch()
		{
			ShipPanic.meltdownTimer -= Time.deltaTime;
			if (ShipPanic.meltdownTimer >= 0f)
			{
				ShipPanic.delta += Time.deltaTime;
				ShipPanic.delta2 += Time.deltaTime;
			}
			if (ShipPanic.meltdownTimer >= 0f && ShipPanic.delta > 0.5f + ShipPanic.meltdownTimer / 120f * 5f)
			{
				ShipPanic.delta = 0f;
				foreach (var (val, flag) in ShipPanic.toggleGroup)
				{
					((Behaviour)val).enabled = flag && !((Behaviour)val).enabled;
				}
				StartOfRound.Instance.shipRoomLights.ToggleShipLights();
			}
			if (ShipPanic.meltdownTimer <= 30f)
			{
				ShipPanic.KillSystems.Run();
				MonitorCompatibilityHandler.MaintainScreenOff();
			}
			if (Config.Instance.shipDoorMalfunction.Value && ShipPanic.meltdownTimer >= 0f && ShipPanic.delta2 > 10f)
			{
				ShipPanic.h.shipDoorsAnimator.SetBool("Closed", ShipPanic.repeat);
				ShipPanic.repeat = !ShipPanic.repeat;
				ShipPanic.delta2 = 0f;
			}
			if (ShipPanic.meltdownTimer < 3f)
			{
				ShipPanic.BreakLever.Run();
			}
			if (ShipPanic.meltdownTimer <= -16f)
			{
				ShipPanic.takeOff.Run();
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal static class StartOfRoundPatch1
	{
		internal static DialogueSegment[] failure;

		[HarmonyPrefix]
		[HarmonyPatch("ShipLeave")]
		internal static bool ShipLeavePatch()
		{
			if (!ShipPanic.CanTakeOff)
			{
				StartOfRound.Instance.shipIsLeaving = false;
				HUDManager.Instance.ReadDialogue(failure);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal static class StartOfRoundPatch2
	{
		private static int emergencyType = 1;

		private static float delta = 0f;

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void UpdatePatch()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (((ButtonControl)Keyboard.current[Config.Instance.toggleEmergencyLights.Value]).wasReleasedThisFrame && !MeltdownAPI.MeltdownStarted && StartOfRound.Instance.localPlayerController.isInElevator)
			{
				ShipPanic.LightAlarm(emergencyType);
				emergencyType = -emergencyType;
			}
			if (ShipPanic.OnlyLights && delta >= 5f)
			{
				ShipPanic.ToggleLightsOnly();
				delta = 0f;
			}
			else if (ShipPanic.OnlyLights)
			{
				delta += Time.deltaTime;
			}
		}
	}
}