Decompiled source of Flatline IL2CPP v1.0.0

Mods/Flatline-IL2Cpp.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using Flatline;
using HarmonyLib;
using Il2CppFishNet;
using Il2CppFishNet.Managing;
using Il2CppFishNet.Managing.Object;
using Il2CppFishNet.Object;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne;
using Il2CppScheduleOne.Audio;
using Il2CppScheduleOne.AvatarFramework;
using Il2CppScheduleOne.Building.Doors;
using Il2CppScheduleOne.Combat;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Dialogue;
using Il2CppScheduleOne.Doors;
using Il2CppScheduleOne.EntityFramework;
using Il2CppScheduleOne.Equipping;
using Il2CppScheduleOne.FX;
using Il2CppScheduleOne.GameTime;
using Il2CppScheduleOne.Interaction;
using Il2CppScheduleOne.ItemFramework;
using Il2CppScheduleOne.Map;
using Il2CppScheduleOne.Money;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.NPCs.CharacterClasses;
using Il2CppScheduleOne.ObjectScripts;
using Il2CppScheduleOne.Persistence;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.PlayerScripts.Health;
using Il2CppScheduleOne.Product;
using Il2CppScheduleOne.Property;
using Il2CppScheduleOne.Temperature;
using Il2CppScheduleOne.UI;
using Il2CppScheduleOne.UI.MainMenu;
using Il2CppScheduleOne.UI.Phone;
using Il2CppScheduleOne.UI.Phone.Messages;
using Il2CppScheduleOne.VoiceOver;
using Il2CppSystem;
using Il2CppSystem.Collections;
using Il2CppSystem.Collections.Generic;
using Il2CppTMPro;
using MelonLoader;
using MelonLoader.Preferences;
using MelonLoader.Support;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(global::Flatline.Flatline), "Flatline", "1.0.0", "XOWithSauce", "https://github.com/XOWithSauce/schedule-flatline")]
[assembly: MelonColor]
[assembly: MelonOptionalDependencies(new string[] { "FishNet.Runtime", "Il2Cpp" })]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: MelonPlatformDomain(/*Could not decode attribute arguments.*/)]
[assembly: VerifyLoaderVersion("0.7.0", true)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("XOWithSauce")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright XOWithSauce 2026 Source MIT")]
[assembly: AssemblyDescription("Schedule I Flatline Mod")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Flatline")]
[assembly: AssemblyTitle("Flatline-IL2Cpp")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/XOWithSauce/schedule-flatline")]
[assembly: NeutralResourcesLanguage("en-US")]
[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 Flatline
{
	public static class BedRotSimulator
	{
		[CompilerGenerated]
		private sealed class <>c__DisplayClass6_0
		{
			public NetworkManager instance;

			internal bool <InitBedRotModule>b__1()
			{
				return instance.Initialized;
			}
		}

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

			private object <>2__current;

			public InteractableObject intObj;

			public Bed bed;

			private Transform <playerTrRoot>5__2;

			private Vector3 <originalStandPoint>5__3;

			private Quaternion <originalRotation>5__4;

			private Vector3 <targetLocalPosition>5__5;

			private Quaternion <targetRotation>5__6;

			private float <animationDuration>5__7;

			private float <elapsed>5__8;

			private float <maxY>5__9;

			private Quaternion <currentRotation>5__10;

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

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

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

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

			private bool MoveNext()
			{
				//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0100: Unknown result type (might be due to invalid IL or missing references)
				//IL_0105: Unknown result type (might be due to invalid IL or missing references)
				//IL_0209: Unknown result type (might be due to invalid IL or missing references)
				//IL_020f: Unknown result type (might be due to invalid IL or missing references)
				//IL_022d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0233: Unknown result type (might be due to invalid IL or missing references)
				//IL_023d: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0351: Unknown result type (might be due to invalid IL or missing references)
				//IL_0362: Unknown result type (might be due to invalid IL or missing references)
				//IL_0137: Unknown result type (might be due to invalid IL or missing references)
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0143: Unknown result type (might be due to invalid IL or missing references)
				//IL_0154: Unknown result type (might be due to invalid IL or missing references)
				//IL_015a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0160: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
				//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					((Behaviour)intObj).enabled = false;
					((Behaviour)bed.intObj).enabled = false;
					Player.Local.CurrentBed = ((NetworkBehaviour)bed).NetworkObject;
					PlayerSingleton<PlayerCamera>.Instance.SetCanLook(false);
					PlayerSingleton<PlayerMovement>.Instance.CanMove = false;
					((Behaviour)PlayerSingleton<PlayerMovement>.Instance).enabled = false;
					((Collider)Player.Local.CapCol).enabled = false;
					<playerTrRoot>5__2 = ((Component)Player.Local).transform.root;
					<playerTrRoot>5__2.parent = ((Component)bed).transform;
					<originalStandPoint>5__3 = <playerTrRoot>5__2.localPosition;
					<originalRotation>5__4 = <playerTrRoot>5__2.localRotation;
					<targetLocalPosition>5__5 = new Vector3(0.009f, 0.23f, 0.012f);
					<targetRotation>5__6 = Quaternion.Euler(270f, 0f, 0f);
					<animationDuration>5__7 = 3f;
					<elapsed>5__8 = 0f;
					goto IL_0193;
				case 1:
					<>1__state = -1;
					goto IL_0193;
				case 2:
					<>1__state = -1;
					if (Quaternion.Angle(<playerTrRoot>5__2.localRotation, <targetRotation>5__6) > <maxY>5__9)
					{
						<playerTrRoot>5__2.localRotation = Quaternion.Slerp(<playerTrRoot>5__2.localRotation, <targetRotation>5__6, 0.05f);
					}
					if ((PlayerSingleton<Phone>.Instance.IsOpen || (!Input.GetKey((KeyCode)32) && !Input.GetKey((KeyCode)119) && !Input.GetKey((KeyCode)97) && !Input.GetKey((KeyCode)115) && !Input.GetKey((KeyCode)100))) && !FlatlinePlayer.isPassedOut && !FlatlinePlayer.isQueuedForDeath)
					{
						goto IL_028e;
					}
					goto IL_0298;
				case 3:
					{
						<>1__state = -1;
						break;
					}
					IL_028e:
					if (Flatline.registered)
					{
						<>2__current = Flatline.WaitFrame;
						<>1__state = 2;
						return true;
					}
					goto IL_0298;
					IL_0193:
					if (<elapsed>5__8 < <animationDuration>5__7 && Flatline.registered)
					{
						float num = <elapsed>5__8 / <animationDuration>5__7;
						<playerTrRoot>5__2.localPosition = Vector3.Lerp(<originalStandPoint>5__3, <targetLocalPosition>5__5, num);
						<playerTrRoot>5__2.localRotation = Quaternion.Slerp(<originalRotation>5__4, <targetRotation>5__6, num);
						<elapsed>5__8 += Time.deltaTime;
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
					<playerTrRoot>5__2.localPosition = <targetLocalPosition>5__5;
					<playerTrRoot>5__2.localRotation = <targetRotation>5__6;
					PlayerSingleton<PlayerCamera>.Instance.SetCanLook(true);
					<maxY>5__9 = 20f;
					goto IL_028e;
					IL_0298:
					PlayerSingleton<PlayerCamera>.Instance.SetCanLook(false);
					<elapsed>5__8 = 0f;
					<currentRotation>5__10 = <playerTrRoot>5__2.localRotation;
					break;
				}
				if (<elapsed>5__8 < <animationDuration>5__7 && Flatline.registered)
				{
					float num2 = <elapsed>5__8 / <animationDuration>5__7;
					<playerTrRoot>5__2.localPosition = Vector3.Lerp(<targetLocalPosition>5__5, <originalStandPoint>5__3, num2);
					<playerTrRoot>5__2.localRotation = Quaternion.Slerp(<currentRotation>5__10, <originalRotation>5__4, num2);
					<elapsed>5__8 += Time.deltaTime;
					<>2__current = null;
					<>1__state = 3;
					return true;
				}
				<playerTrRoot>5__2.localPosition = <originalStandPoint>5__3;
				<playerTrRoot>5__2.localRotation = <originalRotation>5__4;
				<playerTrRoot>5__2.parent = null;
				((Collider)Player.Local.CapCol).enabled = true;
				PlayerSingleton<PlayerCamera>.Instance.SetCanLook(true);
				((Behaviour)PlayerSingleton<PlayerMovement>.Instance).enabled = true;
				PlayerSingleton<PlayerMovement>.Instance.CanMove = true;
				((Behaviour)intObj).enabled = true;
				((Behaviour)bed.intObj).enabled = true;
				isBedrotting = false;
				Player.Local.CurrentBed = null;
				AfterBedrotEnd();
				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 <EvaluateBedState>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public InteractableObject intObj;

			public Bed bed;

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

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

			[DebuggerHidden]
			public <EvaluateBedState>d__11(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;
					if (Player.Local.IsSkating)
					{
						intObj.SetInteractableState((EInteractableState)1);
						intObj.message = "Can't bedrot while skateboarding";
					}
					else if ((Object)(object)bed.AssignedEmployee != (Object)null)
					{
						intObj.SetInteractableState((EInteractableState)1);
						intObj.message = "Can't bedrot in an employee's bed";
					}
					else if (NetworkSingleton<TimeManager>.Instance.IsCurrentTimeWithinRange(359, 700))
					{
						intObj.SetInteractableState((EInteractableState)1);
						intObj.message = "Can't bedrot at late night";
					}
					else if (Player.PlayerList.Count > 1)
					{
						Enumerator<Player> enumerator = Player.PlayerList.GetEnumerator();
						while (enumerator.MoveNext())
						{
							if ((Object)(object)enumerator.Current.CurrentBed == (Object)(object)((NetworkBehaviour)bed).NetworkObject)
							{
								intObj.SetInteractableState((EInteractableState)1);
								intObj.message = "Someone is already bedrotting here";
							}
						}
					}
					else
					{
						intObj.SetInteractableState((EInteractableState)0);
						intObj.message = "Rot in the bed";
					}
					<>2__current = Flatline.Wait1;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered)
					{
						return false;
					}
					isEvaluatingBedState = false;
					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 <InitBedRotModule>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			private <>c__DisplayClass6_0 <>8__1;

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

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

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

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

			private bool MoveNext()
			{
				//IL_009a: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Expected O, but got Unknown
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<>8__1 = new <>c__DisplayClass6_0();
					WaitUntil val2 = new WaitUntil(Func<bool>.op_Implicit((Func<bool>)(() => NetworkManager._instances != null && NetworkManager._instances.Count > 0)));
					<>2__current = val2;
					<>1__state = 1;
					return true;
				}
				case 1:
				{
					<>1__state = -1;
					<>8__1.instance = NetworkManager._instances[0];
					WaitUntil val = new WaitUntil(Func<bool>.op_Implicit((Func<bool>)(() => <>8__1.instance.Initialized)));
					<>2__current = val;
					<>1__state = 2;
					return true;
				}
				case 2:
					<>1__state = -1;
					PrepareBedRotInteractable();
					DebugModule.Log("Bed prefab changed succesfully", "InitBedRotModule");
					isInitialized = 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();
			}
		}

		public static bool isBedrotting = false;

		public static bool isInitialized = false;

		public static bool isEvaluatingBedState = false;

		public static readonly float energyRegenPerMinute = FlatlinePlayer.DefaultEnergyConsumption + 0.003f;

		public static readonly float healthRegenPerMinuteTarget = FlatlinePlayer.DefaultHealthRegeneration * 5f;

		public static readonly float healthRegenT = FlatlinePlayer.SystematicHomeostasisSpeed * 10f;

		[IteratorStateMachine(typeof(<InitBedRotModule>d__6))]
		public static IEnumerator InitBedRotModule()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <InitBedRotModule>d__6(0);
		}

		public static void ResetBedRotModule()
		{
			isBedrotting = false;
			isEvaluatingBedState = false;
		}

		public static void PrepareBedRotInteractable()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			PrefabObjects spawnablePrefabs = Object.FindObjectOfType<NetworkManager>(true).SpawnablePrefabs;
			for (int i = 0; i < spawnablePrefabs.GetObjectCount(); i++)
			{
				NetworkObject @object = spawnablePrefabs.GetObject(true, i);
				if (((@object != null) ? ((Object)((Component)@object).gameObject).name : null).Contains("SingleBed"))
				{
					((Component)@object).GetComponent<Bed>();
					GameObject val = new GameObject("BedRotIntObj");
					val.transform.parent = ((Component)@object).transform;
					((Object)val.gameObject).name = "BedRotIntObj";
					val.transform.position = new Vector3(0f, 0.264f, 0.8f);
					BoxCollider val2 = val.AddComponent<BoxCollider>();
					((Collider)val2).isTrigger = true;
					InteractableObject val3 = val.AddComponent<InteractableObject>();
					val3.message = "Rot in the bed";
					val3.SetInteractableState((EInteractableState)0);
					val.SetActive(true);
					((Collider)val2).enabled = true;
					((Behaviour)val3).enabled = true;
				}
			}
		}

		public static void BedRotInteracted(InteractableObject intObj, Bed bed)
		{
			if (!isBedrotting)
			{
				isBedrotting = true;
				Flatline.coros.Add(MelonCoroutines.Start(BedRotSimulatorRunner(intObj, bed)));
			}
		}

		public static void BedRotInteractableHovered(InteractableObject intObj, Bed bed)
		{
			if (!isEvaluatingBedState)
			{
				isEvaluatingBedState = true;
				Flatline.coros.Add(MelonCoroutines.Start(EvaluateBedState(intObj, bed)));
			}
		}

		[IteratorStateMachine(typeof(<EvaluateBedState>d__11))]
		public static IEnumerator EvaluateBedState(InteractableObject intObj, Bed bed)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <EvaluateBedState>d__11(0)
			{
				intObj = intObj,
				bed = bed
			};
		}

		[IteratorStateMachine(typeof(<BedRotSimulatorRunner>d__12))]
		public static IEnumerator BedRotSimulatorRunner(InteractableObject intObj, Bed bed)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <BedRotSimulatorRunner>d__12(0)
			{
				intObj = intObj,
				bed = bed
			};
		}

		public static void MinPassBedrotting()
		{
			if (!Flatline.registered || Flatline.isSaving || !isBedrotting || FlatlinePlayer.isQueuedForDeath || Flatline.haltExecution)
			{
				return;
			}
			if (Flatline.loadedPlayerData.State.Energy < 1f)
			{
				Flatline.loadedPlayerData.State.Energy = Mathf.Clamp01(Flatline.loadedPlayerData.State.Energy + energyRegenPerMinute);
			}
			if (Flatline.loadedPlayerData.State.healthData.CurrentHP < Flatline.loadedPlayerData.State.healthData.MaxHP)
			{
				if (FlatlinePlayer.HealthRegenPerMinute < healthRegenPerMinuteTarget)
				{
					FlatlinePlayer.HealthRegenPerMinute = Mathf.Lerp(FlatlinePlayer.HealthRegenPerMinute, healthRegenPerMinuteTarget, healthRegenT);
				}
				if (Random.Range(0f, 1f) > 0.9f)
				{
					Player.Local.Health.CurrentHealth = Mathf.Clamp(Player.Local.Health.CurrentHealth + 1f, 0f, Flatline.loadedPlayerData.State.healthData.MaxHP);
					if (Flatline.loadedPlayerData.State.Energy < 1f)
					{
						Mathf.Clamp01(Flatline.loadedPlayerData.State.Energy + energyRegenPerMinute * 8f);
					}
				}
			}
			if (Flatline.loadedPlayerData.State.Hunger < 1f && Flatline.loadedPlayerData.State.Hunger > 0.1f && FlatlinePlayer.FoodConsumptionPerMinute > FlatlinePlayer.DefaultFoodConsumption / 2f)
			{
				FlatlinePlayer.FoodConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.FoodConsumptionPerMinute, FlatlinePlayer.DefaultFoodConsumption / 2f, FlatlinePlayer.SystematicHomeostasisSpeed * 1.55f);
			}
			if (Flatline.loadedPlayerData.State.Thirst < 1f && Flatline.loadedPlayerData.State.Thirst > 0.1f && FlatlinePlayer.ThirstConsumptionPerMinute > FlatlinePlayer.DefaultThirstConsumption / 2f)
			{
				FlatlinePlayer.ThirstConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.ThirstConsumptionPerMinute, FlatlinePlayer.DefaultThirstConsumption / 2f, FlatlinePlayer.SystematicHomeostasisSpeed * 1.55f);
			}
		}

		public static void AfterBedrotEnd()
		{
			if (FlatlinePlayer.HealthRegenPerMinute > FlatlinePlayer.DefaultHealthRegeneration)
			{
				FlatlinePlayer.HealthRegenPerMinute = Mathf.Lerp(FlatlinePlayer.HealthRegenPerMinute, FlatlinePlayer.DefaultHealthRegeneration, 0.5f);
			}
			if (FlatlinePlayer.FoodConsumptionPerMinute < FlatlinePlayer.DefaultFoodConsumption)
			{
				FlatlinePlayer.FoodConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.FoodConsumptionPerMinute, FlatlinePlayer.DefaultFoodConsumption, 0.5f);
			}
			if (FlatlinePlayer.ThirstConsumptionPerMinute < FlatlinePlayer.DefaultThirstConsumption)
			{
				FlatlinePlayer.ThirstConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.ThirstConsumptionPerMinute, FlatlinePlayer.DefaultThirstConsumption, 0.5f);
			}
		}
	}
	[HarmonyPatch(typeof(Bed), "Awake")]
	public static class Bed_Awake_Patch
	{
		[HarmonyPrefix]
		public static bool Prefix(Bed __instance)
		{
			Transform val = ((Component)__instance).transform.Find("BedRotIntObj");
			if ((Object)(object)val == (Object)null)
			{
				return true;
			}
			InteractableObject bedRotInt = ((Component)val).gameObject.GetComponent<InteractableObject>();
			bedRotInt.onInteractStart.AddListener(UnityAction.op_Implicit((Action)OnBedRotInteraction));
			bedRotInt.onHovered.AddListener(UnityAction.op_Implicit((Action)OnBedRotHovered));
			return true;
			void OnBedRotHovered()
			{
				if (Flatline.registered)
				{
					BedRotSimulator.BedRotInteractableHovered(bedRotInt, __instance);
				}
			}
			void OnBedRotInteraction()
			{
				if (Flatline.registered)
				{
					BedRotSimulator.BedRotInteracted(bedRotInt, __instance);
				}
			}
		}
	}
	public static class DepressionSimulator
	{
		[CompilerGenerated]
		private sealed class <DepressionBlandWorld>d__4 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Depression depression;

			private float <duration>5__2;

			private float <current>5__3;

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

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

			[DebuggerHidden]
			public <DepressionBlandWorld>d__4(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;
					goto IL_0022;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered || !depression.data.Active || (FlatlinePlayer.isQueuedForDeath && Flatline.currentConfig.PermanentDeath))
					{
						return false;
					}
					if (!ShouldSkip() && !depression.isTemporaryCurePresent)
					{
						float num = Mathf.Lerp(0.95f, 0.75f, depression.data.Severity / 0.3f);
						if (!(Random.Range(0f, 1f) < num))
						{
							<duration>5__2 = Mathf.Lerp(Depression.minBlandEffectDuration, Depression.maxBlandEffectDuration, depression.data.Severity / 0.3f);
							<current>5__3 = 0f;
							Singleton<PostProcessingManager>.Instance.SaturationController.AddOverride(-56f, 25, "Depression");
							goto IL_010b;
						}
					}
					goto IL_0022;
				case 2:
					{
						<>1__state = -1;
						if (!Flatline.registered)
						{
							return false;
						}
						<current>5__3 += 1f;
						if (<current>5__3 >= <duration>5__2 || !depression.data.Active || depression.isTemporaryCurePresent)
						{
							Singleton<PostProcessingManager>.Instance.SaturationController.RemoveOverride("Depression");
							goto IL_0022;
						}
						goto IL_010b;
					}
					IL_0022:
					<>2__current = Flatline.Wait10;
					<>1__state = 1;
					return true;
					IL_010b:
					<>2__current = Flatline.Wait1;
					<>1__state = 2;
					return true;
				}
			}

			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 <DepressionDoorDisabler>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Depression depression;

			private PropertyDoorController[] <doors>5__2;

			private float <duration>5__3;

			private float <current>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_007c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0211: Unknown result type (might be due to invalid IL or missing references)
				//IL_0217: Invalid comparison between Unknown and I4
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					goto IL_0022;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered || !depression.data.Active || (FlatlinePlayer.isQueuedForDeath && Flatline.currentConfig.PermanentDeath))
					{
						return false;
					}
					if (!ShouldSkip() && (int)Player.Local.CrimeData.CurrentPursuitLevel == 0 && !depression.isTemporaryCurePresent)
					{
						float num = Mathf.Clamp01(((float)depression.data.Progression / 5f + depression.data.Severity / 0.3f) / 2f);
						float num2 = Mathf.Lerp(0.95f, 0.75f, num);
						if (!(Random.Range(0f, 1f) < num2) && (Object)(object)Player.Local.CurrentProperty != (Object)null && Player.Local.CurrentProperty.IsOwned)
						{
							if (PropertyTemperatureController.propertyDoors.TryGetValue(Player.Local.CurrentProperty.propertyCode, out <doors>5__2))
							{
								PropertyDoorController[] array = <doors>5__2;
								foreach (PropertyDoorController val2 in array)
								{
									if (!((DoorController)val2).IsOpen)
									{
										((DoorController)val2).PlayerAccess = (EDoorAccess)1;
										((DoorController)val2).noAccessErrorMessage = "You are too depressed right now";
									}
								}
								<duration>5__3 = Mathf.Lerp(Depression.minDisablerEffectDuration, Depression.maxDisablerEffectDuration, num);
								<current>5__4 = 0f;
								goto IL_019a;
							}
							goto IL_024d;
						}
					}
					goto IL_0022;
				case 2:
					{
						<>1__state = -1;
						if (!Flatline.registered)
						{
							return false;
						}
						<current>5__4 += 1f;
						if (!(<current>5__4 >= <duration>5__3) && depression.data.Active && !depression.isTemporaryCurePresent)
						{
							goto IL_019a;
						}
						PropertyDoorController[] array = <doors>5__2;
						foreach (PropertyDoorController val in array)
						{
							if ((int)((DoorController)val).PlayerAccess == 1 && ((DoorController)val).noAccessErrorMessage == "You are too depressed right now")
							{
								((DoorController)val).PlayerAccess = (EDoorAccess)0;
								((DoorController)val).noAccessErrorMessage = "";
							}
						}
						goto IL_024d;
					}
					IL_0022:
					<>2__current = Flatline.Wait10;
					<>1__state = 1;
					return true;
					IL_024d:
					<doors>5__2 = null;
					goto IL_0022;
					IL_019a:
					<>2__current = Flatline.Wait1;
					<>1__state = 2;
					return true;
				}
			}

			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 <DepressionMessagerDisabler>d__5 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Depression depression;

			private float <duration>5__2;

			private float <current>5__3;

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

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

			[DebuggerHidden]
			public <DepressionMessagerDisabler>d__5(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;
					goto IL_0022;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered || !depression.data.Active || (FlatlinePlayer.isQueuedForDeath && Flatline.currentConfig.PermanentDeath))
					{
						return false;
					}
					if (!ShouldSkip() && !depression.isTemporaryCurePresent)
					{
						float num = Mathf.Lerp(0.95f, 0.75f, depression.data.Severity / 0.3f);
						if (!(Random.Range(0f, 1f) < num))
						{
							<duration>5__2 = Mathf.Lerp(Depression.minDisablerEffectDuration, Depression.maxDisablerEffectDuration, depression.data.Severity / 0.3f);
							<current>5__3 = 0f;
							disabledOverlay.SetActive(true);
							goto IL_00fb;
						}
					}
					goto IL_0022;
				case 2:
					{
						<>1__state = -1;
						if (!Flatline.registered)
						{
							return false;
						}
						<current>5__3 += 1f;
						if (<current>5__3 >= <duration>5__2 || !depression.data.Active || depression.isTemporaryCurePresent)
						{
							disabledOverlay.SetActive(false);
							goto IL_0022;
						}
						goto IL_00fb;
					}
					IL_0022:
					<>2__current = Flatline.Wait10;
					<>1__state = 1;
					return true;
					IL_00fb:
					<>2__current = Flatline.Wait1;
					<>1__state = 2;
					return true;
				}
			}

			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 static GameObject disabledOverlay;

		public static void InitiateDepressionSimulatorModule()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0095: 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_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			disabledOverlay = new GameObject("DisableOverlay");
			disabledOverlay.transform.SetParent(((Component)PlayerSingleton<MessagesApp>.Instance).transform, false);
			RectTransform obj = disabledOverlay.AddComponent<RectTransform>();
			obj.sizeDelta = new Vector2(800f, 1200f);
			((Transform)obj).localScale = Vector3.one;
			((Transform)obj).localPosition = Vector3.zero;
			((Transform)obj).localRotation = Quaternion.identity;
			((Graphic)disabledOverlay.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.1f, 0.93f);
			GameObject val = new GameObject("Text");
			val.transform.SetParent(disabledOverlay.transform);
			val.transform.localScale = Vector3.one;
			val.transform.localPosition = Vector3.zero;
			val.transform.localRotation = Quaternion.identity;
			val.AddComponent<RectTransform>().sizeDelta = new Vector2(600f, 1200f);
			TextMeshProUGUI obj2 = val.AddComponent<TextMeshProUGUI>();
			((TMP_Text)obj2).text = "You are too depressed right now";
			((TMP_Text)obj2).alignment = (TextAlignmentOptions)514;
			((TMP_Text)obj2).fontSize = 52f;
			disabledOverlay.SetActive(false);
			DebugModule.Log("Initiated depression simulator", "InitiateDepressionSimulatorModule");
		}

		public static void ResetDepressionSimulatorModule()
		{
			disabledOverlay = null;
		}

		public static bool ShouldSkip()
		{
			if (Player.PlayerList.Count > 1 && !Player.Local.Health.IsAlive)
			{
				return true;
			}
			if (NetworkSingleton<TimeManager>.Instance.CurrentTime < 659 && NetworkSingleton<TimeManager>.Instance.CurrentTime > 400)
			{
				return true;
			}
			if (Flatline.isSaving)
			{
				return true;
			}
			if (Flatline.haltExecution)
			{
				return true;
			}
			return false;
		}

		[IteratorStateMachine(typeof(<DepressionBlandWorld>d__4))]
		public static IEnumerator DepressionBlandWorld(Depression depression)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DepressionBlandWorld>d__4(0)
			{
				depression = depression
			};
		}

		[IteratorStateMachine(typeof(<DepressionMessagerDisabler>d__5))]
		public static IEnumerator DepressionMessagerDisabler(Depression depression)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DepressionMessagerDisabler>d__5(0)
			{
				depression = depression
			};
		}

		[IteratorStateMachine(typeof(<DepressionDoorDisabler>d__6))]
		public static IEnumerator DepressionDoorDisabler(Depression depression)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DepressionDoorDisabler>d__6(0)
			{
				depression = depression
			};
		}
	}
	public static class AudioLoader
	{
		public static AudioClip ToAudioClip(byte[] fileBytes, string name = "wav")
		{
			int num = 0;
			int num2 = 16000;
			ushort num3 = 1;
			int dataSize = fileBytes.Length;
			bool flag = true;
			byte[] array = new byte[4];
			Array.Copy(fileBytes, 0, array, 0, 4);
			if (!Encoding.ASCII.GetString(array).Equals("RIFF"))
			{
				flag = false;
			}
			if (flag)
			{
				int num4 = BitConverter.ToInt32(fileBytes, 16);
				BitConverter.ToUInt16(fileBytes, 20);
				num3 = BitConverter.ToUInt16(fileBytes, 22);
				num2 = BitConverter.ToInt32(fileBytes, 24);
				BitConverter.ToUInt16(fileBytes, 34);
				num = 20 + num4 + 4;
				dataSize = BitConverter.ToInt32(fileBytes, num);
			}
			float[] array2 = Convert16BitByteArrayToAudioClipData(fileBytes, num, dataSize);
			AudioClip obj = AudioClip.Create(name, array2.Length / num3, (int)num3, num2, false);
			obj.SetData(Il2CppStructArray<float>.op_Implicit(array2), 0);
			return obj;
		}

		private static float[] Convert16BitByteArrayToAudioClipData(byte[] source, int headerOffset, int dataSize)
		{
			int num = dataSize;
			if (headerOffset != 0)
			{
				num = BitConverter.ToInt32(source, headerOffset);
				headerOffset += 4;
			}
			int num2 = 2;
			int num3 = num / num2;
			float[] array = new float[num3];
			short num4 = short.MaxValue;
			int num5 = 0;
			for (int i = 0; i < num3; i++)
			{
				num5 = i * num2 + headerOffset;
				array[i] = (float)BitConverter.ToInt16(source, num5) / (float)num4;
			}
			return array;
		}
	}
	[Serializable]
	public class FlatlinePlayerData
	{
		public FlatlinePlayerState State = new FlatlinePlayerState();

		public List<DiseaseData> DiseaseData = new List<DiseaseData>();

		public FlatlinePlayerData()
		{
		}

		public FlatlinePlayerData(FlatlinePlayerData original)
		{
			State = new FlatlinePlayerState(original.State);
			DiseaseData = new List<DiseaseData>();
			foreach (DiseaseData diseaseDatum in original.DiseaseData)
			{
				DiseaseData.Add(new DiseaseData(diseaseDatum));
			}
		}
	}
	[Serializable]
	public class FlatlinePlayerState
	{
		public Dictionary<string, ConsumptionData> consumptionDatas = new Dictionary<string, ConsumptionData>();

		public HealthData healthData = new HealthData();

		public float Thirst = 1f;

		public float Hunger = 1f;

		public float Energy = 1f;

		public float Temperature = 1f;

		public FlatlinePlayerState()
		{
		}

		public FlatlinePlayerState(FlatlinePlayerState original)
		{
			Thirst = original.Thirst;
			Hunger = original.Hunger;
			Energy = original.Energy;
			Temperature = original.Temperature;
			foreach (KeyValuePair<string, ConsumptionData> consumptionData in original.consumptionDatas)
			{
				consumptionDatas.Add(consumptionData.Key, new ConsumptionData(consumptionData.Value));
			}
			healthData = new HealthData(original.healthData);
		}
	}
	[Serializable]
	public class ConsumptionData
	{
		public float overtimeLungDamage;

		public float overtimeLiverDamage;

		public float currentAmountInSystem;

		public ConsumptionData()
		{
		}

		public ConsumptionData(ConsumptionData original)
		{
			overtimeLungDamage = original.overtimeLungDamage;
			overtimeLiverDamage = original.overtimeLiverDamage;
			currentAmountInSystem = original.currentAmountInSystem;
		}
	}
	[Serializable]
	public class HealthData
	{
		public float MaxHP = 100f;

		public float CurrentHP = 100f;

		public float MoveSpeedScale = 1f;

		public float Predisposition;

		public float Gluttony;

		public int TimesSmoked;

		public bool IsLegBoneBroken;

		public HealthData()
		{
		}

		public HealthData(HealthData original)
		{
			MaxHP = original.MaxHP;
			CurrentHP = original.CurrentHP;
			MoveSpeedScale = original.MoveSpeedScale;
			Predisposition = original.Predisposition;
			Gluttony = original.Gluttony;
			TimesSmoked = original.TimesSmoked;
			IsLegBoneBroken = original.IsLegBoneBroken;
		}
	}
	[Serializable]
	public class DiseaseData
	{
		public string DiseaseID = "";

		public bool Active;

		public int MinsSinceDiseaseStart;

		public int Progression = 1;

		public float Severity;

		public float HealState;

		[JsonProperty(/*Could not decode attribute arguments.*/)]
		public Dictionary<string, float> DiseaseStates;

		public DiseaseData()
		{
		}

		public DiseaseData(DiseaseData original)
		{
			DiseaseID = original.DiseaseID;
			Active = original.Active;
			MinsSinceDiseaseStart = original.MinsSinceDiseaseStart;
			Progression = original.Progression;
			Severity = original.Severity;
			HealState = original.HealState;
			if (original.DiseaseStates != null)
			{
				DiseaseStates = new Dictionary<string, float>(original.DiseaseStates);
			}
		}
	}
	public class FlatlineModConfig
	{
		public bool PermanentDeath = true;

		public bool FahrenheitTemp;
	}
	public static class ConfigLoader
	{
		private static readonly string BASE_USERDATA_NAME = "XO_WithSauce-Flatline";

		private static readonly string TS_PACKAGE_NAME = "XO_WithSauce-Flatline_";

		private static readonly string packagePathUserData = Path.Combine(MelonEnvironment.UserDataDirectory, TS_PACKAGE_NAME + "IL2CPP", BASE_USERDATA_NAME);

		private static readonly string manualPathUserData = Path.Combine(MelonEnvironment.UserDataDirectory, BASE_USERDATA_NAME);

		private static readonly string pathPlayerData = Path.Combine(packagePathUserData, "PlayerData");

		private static readonly string pathModImageResources = Path.Combine(packagePathUserData, "ModResources", "Images");

		private static readonly string pathModAudioResources = Path.Combine(packagePathUserData, "ModResources", "Audio");

		private static readonly string pathManualPlayerData = Path.Combine(manualPathUserData, "PlayerData");

		private static readonly string pathManualModImageResources = Path.Combine(manualPathUserData, "ModResources", "Images");

		private static readonly string pathManualModAudioResources = Path.Combine(manualPathUserData, "ModResources", "Audio");

		public static readonly List<string> imageResources = new List<string> { "bleed", "bonebreak", "cancer", "depression", "energy", "fever", "meat", "temperature", "water" };

		public static readonly List<string> audioResources = new List<string> { "malecough", "malesneeze", "femalecough", "femalesneeze", "bonebreak", "flatline", "singleheartbeat" };

		public static object playerDataLock = new object();

		public static Dictionary<string, Sprite> loadedSprites = new Dictionary<string, Sprite>();

		public static Dictionary<string, AudioClip> loadedAudios = new Dictionary<string, AudioClip>();

		public static FlatlinePlayerData LoadPlayerData()
		{
			string organisationName = Singleton<LoadManager>.Instance.ActiveSaveInfo.OrganisationName;
			int saveSlotNumber = Singleton<LoadManager>.Instance.ActiveSaveInfo.SaveSlotNumber;
			string path = $"{saveSlotNumber}_{SanitizeAndFormatName(organisationName)}";
			string text = "";
			if (Directory.Exists(pathPlayerData))
			{
				text = pathPlayerData;
			}
			else
			{
				if (!Directory.Exists(pathManualPlayerData))
				{
					MelonLogger.Error("Failed to locate Flatline PlayerData from the UserData folder!");
					return null;
				}
				text = pathManualPlayerData;
			}
			FlatlinePlayerData flatlinePlayerData;
			if (File.Exists(Path.Combine(text, path)))
			{
				try
				{
					flatlinePlayerData = JsonConvert.DeserializeObject<FlatlinePlayerData>(File.ReadAllText(Path.Combine(text, path)));
				}
				catch (Exception ex)
				{
					flatlinePlayerData = new FlatlinePlayerData();
					MelonLogger.Warning("Failed to read flatline player data: " + ex);
				}
			}
			else
			{
				flatlinePlayerData = new FlatlinePlayerData();
				flatlinePlayerData.State.healthData.Predisposition = Random.Range(0.0005f, 0.02f);
				Save(flatlinePlayerData);
			}
			return flatlinePlayerData;
		}

		public static void Save(FlatlinePlayerData playerData)
		{
			lock (playerDataLock)
			{
				FlatlinePlayerData flatlinePlayerData = new FlatlinePlayerData(playerData);
				try
				{
					string organisationName = Singleton<LoadManager>.Instance.ActiveSaveInfo.OrganisationName;
					int saveSlotNumber = Singleton<LoadManager>.Instance.ActiveSaveInfo.SaveSlotNumber;
					string path = $"{saveSlotNumber}_{SanitizeAndFormatName(organisationName)}";
					string text = "";
					text = (Directory.Exists(pathPlayerData) ? pathPlayerData : ((!Directory.Exists(pathManualPlayerData)) ? pathPlayerData : pathManualPlayerData));
					string path2 = Path.Combine(text, path);
					string contents = JsonConvert.SerializeObject((object)flatlinePlayerData, (Formatting)1);
					Directory.CreateDirectory(Path.GetDirectoryName(path2));
					File.WriteAllText(path2, contents);
				}
				catch (Exception ex)
				{
					MelonLogger.Warning("Failed to save Flatline player data: " + ex);
				}
			}
		}

		public static void RemoveSaveAssociatedData(string orgName, int slotNum)
		{
			string path = $"{slotNum}_{SanitizeAndFormatName(orgName)}";
			string text = "";
			if (Directory.Exists(pathPlayerData))
			{
				text = pathPlayerData;
			}
			else
			{
				if (!Directory.Exists(pathManualPlayerData))
				{
					MelonLogger.Error("Failed to locate Flatline PlayerData from the UserData folder!");
					return;
				}
				text = pathManualPlayerData;
			}
			if (File.Exists(Path.Combine(text, path)))
			{
				try
				{
					File.Delete(Path.Combine(text, path));
				}
				catch (Exception ex)
				{
					MelonLogger.Warning("Failed to remove save associated flatline player data: " + ex);
				}
			}
		}

		public static void LoadModResources()
		{
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			string text = "";
			string text2 = "";
			if (Directory.Exists(packagePathUserData))
			{
				text = pathModImageResources;
				text2 = pathModAudioResources;
			}
			else
			{
				if (!Directory.Exists(manualPathUserData))
				{
					MelonLogger.Error("Failed to locate Flatline mod resources from UserData!");
					return;
				}
				text = pathManualModImageResources;
				text2 = pathManualModAudioResources;
			}
			if (Directory.Exists(text))
			{
				foreach (string imageResource in imageResources)
				{
					string path = Path.Combine(text, imageResource + ".png");
					if (File.Exists(path))
					{
						byte[] array = File.ReadAllBytes(path);
						Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
						((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x34);
						ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(array));
						((Object)val).name = imageResource;
						((Texture)val).anisoLevel = 1;
						val.Apply();
						Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, 64f, 64f), new Vector2(0.5f, 0.5f), 100f);
						((Object)val2).hideFlags = (HideFlags)(((Object)val2).hideFlags | 0x34);
						loadedSprites.Add(imageResource, val2);
					}
					else
					{
						MelonLogger.Error("Flatline mod expected to find file '" + imageResource + "' but it's missing!");
					}
				}
			}
			else
			{
				MelonLogger.Error("Flatline mod expected to find directory '" + text + "' but it's missing!");
			}
			if (Directory.Exists(text2))
			{
				foreach (string audioResource in audioResources)
				{
					string path2 = Path.Combine(text2, audioResource + ".wav");
					if (File.Exists(path2))
					{
						AudioClip val3 = AudioLoader.ToAudioClip(File.ReadAllBytes(path2));
						((Object)val3).hideFlags = (HideFlags)(((Object)val3).hideFlags | 0x34);
						loadedAudios.Add(audioResource, val3);
					}
					else
					{
						MelonLogger.Error("Flatline mod expected to find file '" + audioResource + "' but it's missing!");
					}
				}
				return;
			}
			MelonLogger.Error("Flatline mod expected to find directory '" + text2 + "' but it's missing!");
		}

		public static string SanitizeAndFormatName(string orgName)
		{
			string text = orgName;
			if (text != null)
			{
				text = text.Replace(" ", "_").ToLower();
				text = text.Replace(",", "");
				text = text.Replace(".", "");
				text = text.Replace("<", "");
				text = text.Replace(">", "");
				text = text.Replace(":", "");
				text = text.Replace("\"", "");
				text = text.Replace("/", "");
				text = text.Replace("\\", "");
				text = text.Replace("|", "");
				text = text.Replace("?", "");
				text = text.Replace("*", "");
			}
			return text + ".json";
		}
	}
	public class Bleeding : Disease
	{
		[CompilerGenerated]
		private sealed class <RunBleedDamage>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Bleeding <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				Bleeding bleeding = <>4__this;
				float num2;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					goto IL_0029;
				case 1:
					<>1__state = -1;
					num2 = 0.5f;
					goto IL_0081;
				case 2:
					{
						<>1__state = -1;
						num2 = 1f;
						goto IL_0081;
					}
					IL_0081:
					if (!Flatline.registered || !bleeding.data.Active || bleeding.data.Progression >= 5)
					{
						return false;
					}
					if (!Flatline.haltExecution && !Flatline.isSaving && !FlatlinePlayer.isPassedOut && !NetworkSingleton<TimeManager>.Instance.IsSleepInProgress)
					{
						if (FlatlinePlayer.isQueuedForDeath)
						{
							return false;
						}
						if (bleeding.maxHPReduced >= bleeding.MaximumMaxHPReduction)
						{
							return false;
						}
						if (!(bleeding.data.HealState > 0.9f) && !PlayerDiseaseDamage.isBleedingStemmed)
						{
							float num3 = (float)bleeding.minsRequiredForProgression * (1f + bleeding.data.Severity);
							float num4 = num3 * 5f / 1440f;
							float num5 = num3 * 1f / 1440f;
							float num6 = num4 - num5;
							float num7 = bleeding.MaximumMaxHPReduction / 1440f * num6 / num2;
							float num8 = Mathf.Lerp(Mathf.Approximately(bleeding.data.HealState, 0f) ? 0.015f : bleeding.data.HealState, 0.001f, (float)bleeding.data.Progression / 5f - 0.2f);
							num7 = Mathf.Clamp01(Mathf.Lerp(num7, 0f, num8)) * (float)bleeding.data.Progression;
							DebugModule.Log("Calc bleed reduction: " + num7, "RunBleedDamage");
							if (Random.Range(0f, 1f) > 0.33f)
							{
								Player.Local.Health.PlayBloodMist();
							}
							if (Flatline.loadedPlayerData.State.healthData.MaxHP - num7 < Flatline.loadedPlayerData.State.healthData.CurrentHP)
							{
								float num9 = Flatline.loadedPlayerData.State.healthData.CurrentHP - (Flatline.loadedPlayerData.State.healthData.MaxHP - num7);
								if (Player.Local.Health.CurrentHealth - num9 <= 0f)
								{
									FlatlineUIModule.causeOfDeath = "Bleeding";
								}
								Player.Local.Health.TakeDamage(num9, Random.Range(0, 10) == 0, false);
								FlatlinePlayer.AppendDamageSource($"Bleeding damage (-{num9}HP)");
							}
							else
							{
								DebugModule.Log("Bleed amount not smaller than current hp", "RunBleedDamage");
							}
							bleeding.maxHPReduced += num7;
							Flatline.loadedPlayerData.State.healthData.MaxHP = Mathf.Clamp(Flatline.loadedPlayerData.State.healthData.MaxHP - num7, 0f, 100f);
						}
					}
					goto IL_0029;
					IL_0029:
					num2 = 0f;
					if (bleeding.data.Progression >= 3)
					{
						<>2__current = Flatline.Wait05;
						<>1__state = 1;
						return true;
					}
					<>2__current = Flatline.Wait1;
					<>1__state = 2;
					return true;
				}
			}

			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 static readonly float passiveDiseaseHealingMax = 0.003f;

		public static readonly float passiveDiseaseHealingMin = 0.0001f;

		public float MaximumMaxHPReduction = 100f;

		private float maxHPReduced;

		public Bleeding(DiseaseData data)
		{
			base.data = data;
			base.data.DiseaseID = "bleed";
			base.minsRequiredForProgression = 240;
			onDiseaseStarted = BleedingStarted;
			MaximumMaxHPReduction = Mathf.Lerp(40f, 150f, base.data.Severity / 0.3f);
			if (base.data.DiseaseStates == null)
			{
				base.data.DiseaseStates = new Dictionary<string, float>();
			}
			if (base.data.DiseaseStates.ContainsKey("maxHPReduced"))
			{
				maxHPReduced = base.data.DiseaseStates["maxHPReduced"];
			}
			else
			{
				base.data.DiseaseStates.Add("maxHPReduced", 0f);
			}
		}

		private void BleedingStarted()
		{
			PlayerDiseaseDamage.isBleedingStemmed = false;
			if (!PlayerDiseaseDamage.bleedPressureIntObj.activeSelf)
			{
				PlayerDiseaseDamage.bleedPressureIntObj.SetActive(true);
			}
			Flatline.coros.Add(MelonCoroutines.Start(RunBleedDamage()));
		}

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

		public override void DiseaseEffect()
		{
			float num = data.MinsSinceDiseaseStart;
			if (!PlayerDiseaseDamage.bleedPressureIntObj.activeSelf)
			{
				PlayerDiseaseDamage.bleedPressureIntObj.SetActive(true);
			}
			if (PlayerDiseaseDamage.isBleedingStemmed)
			{
				num *= 0.33f;
			}
			if (Mathf.Round(num * (1f + data.Severity)) / (float)base.minsRequiredForProgression >= (float)data.Progression)
			{
				data.Progression++;
			}
			if (data.Progression >= 5 && maxHPReduced >= MaximumMaxHPReduction && !PlayerDiseaseDamage.isBleedingStemmed)
			{
				DebugModule.Log("Player died of bleeding", "DiseaseEffect");
				FlatlineUIModule.causeOfDeath = "Bleeding";
				Flatline.coros.Add(MelonCoroutines.Start(FlatlinePlayer.PrePlayerDied()));
				data.Active = false;
				return;
			}
			if (data.Progression >= 4 && Flatline.loadedPlayerData.State.Thirst > 0.15f)
			{
				Flatline.loadedPlayerData.State.Thirst -= 0.0015f;
			}
			data.HealState += Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax);
			if (maxHPReduced >= MaximumMaxHPReduction)
			{
				data.HealState += Random.Range(passiveDiseaseHealingMin * 3f, passiveDiseaseHealingMax * 3f);
			}
			float num2 = Mathf.Lerp(12f, 24f, Mathf.Clamp01(data.HealState));
			float num3 = Mathf.Lerp(1f, 3f, Mathf.Clamp01((float)data.Progression / 5f));
			if (PlayerDiseaseDamage.isBleedingStemmed)
			{
				data.HealState += passiveDiseaseHealingMax * num2;
			}
			else
			{
				data.HealState = Mathf.Clamp01(data.HealState - passiveDiseaseHealingMax * num3);
			}
			DebugModule.Log("Bleeding Max HP reduction total so far: " + maxHPReduced, "DiseaseEffect");
		}

		public override void DiseaseHealed()
		{
			if (PlayerDiseaseDamage.bleedPressureIntObj.activeSelf)
			{
				PlayerDiseaseDamage.bleedPressureIntObj.SetActive(false);
			}
			PlayerDiseaseDamage.isBleedingStemmed = false;
			DebugModule.Log("Healed bleeding succesfully", "DiseaseHealed");
		}

		public override void UpdateDiseaseData()
		{
			if (data.DiseaseStates == null)
			{
				data.DiseaseStates = new Dictionary<string, float>();
			}
			if (data.DiseaseStates.ContainsKey("maxHPReduced"))
			{
				data.DiseaseStates["maxHPReduced"] = maxHPReduced;
			}
			else
			{
				data.DiseaseStates.Add("maxHPReduced", maxHPReduced);
			}
		}
	}
	public class BoneBreak : Disease
	{
		public static readonly float passiveDiseaseHealingMax = 0.001f;

		public static readonly float passiveDiseaseHealingMin = 0.0001f;

		public static readonly float healingReductionWhileSprinting = 0.008f;

		public static readonly float baseMoveSpeedReduction = 0.03f;

		public static readonly float minMoveSpeedScaleValue = 0.65f;

		private bool hasDisabledJump;

		public BoneBreak(DiseaseData data)
		{
			base.data = data;
			base.data.DiseaseID = "bonebreak";
			base.minsRequiredForProgression = 4320;
		}

		public override void DiseaseEffect()
		{
			if (Mathf.Round((float)data.MinsSinceDiseaseStart * (1f + data.Severity)) / (float)base.minsRequiredForProgression >= (float)data.Progression)
			{
				data.Progression++;
			}
			if (data.Progression >= 5)
			{
				DebugModule.Log("Player died of a broken bone", "DiseaseEffect");
				FlatlineUIModule.causeOfDeath = "Broken bone";
				Flatline.coros.Add(MelonCoroutines.Start(FlatlinePlayer.PrePlayerDied()));
				data.Active = false;
				return;
			}
			data.HealState += Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax);
			if (PlayerSingleton<PlayerMovement>.Instance.IsSprinting)
			{
				data.HealState = Mathf.Clamp01(data.HealState - healingReductionWhileSprinting * (float)data.Progression);
			}
			if (BedRotSimulator.isBedrotting)
			{
				data.HealState += Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax);
			}
			if (data.Progression >= 1)
			{
				float num = Mathf.Lerp(minMoveSpeedScaleValue, 1f, data.HealState);
				if (Flatline.loadedPlayerData.State.healthData.MoveSpeedScale > num)
				{
					float num2 = Mathf.Lerp(baseMoveSpeedReduction * (float)data.Progression * (1f + data.Severity), 0f, data.HealState);
					float moveSpeedScale = Mathf.Clamp(Flatline.loadedPlayerData.State.healthData.MoveSpeedScale - num2, minMoveSpeedScaleValue, 1f);
					Flatline.loadedPlayerData.State.healthData.MoveSpeedScale = moveSpeedScale;
				}
			}
			if (data.Progression < 3 || !(data.HealState < 0.5f) || !Flatline.loadedPlayerData.State.healthData.IsLegBoneBroken)
			{
				return;
			}
			if (PlayerSingleton<PlayerMovement>.Instance.CanJump && !hasDisabledJump)
			{
				if (Random.Range(0f, 1f) > 0.95f)
				{
					PlayerSingleton<PlayerMovement>.Instance.CanJump = false;
					hasDisabledJump = true;
				}
			}
			else if (!PlayerSingleton<PlayerMovement>.Instance.CanJump && hasDisabledJump)
			{
				PlayerSingleton<PlayerMovement>.Instance.CanJump = true;
				hasDisabledJump = false;
			}
		}

		public override void DiseaseHealed()
		{
			Flatline.loadedPlayerData.State.healthData.IsLegBoneBroken = false;
			DebugModule.Log("Healed bone break succesfully", "DiseaseHealed");
		}

		public override void UpdateDiseaseData()
		{
		}
	}
	public class Cancer : Disease
	{
		public static readonly float MaximumMaxHPReduction = 100f;

		public Cancer(DiseaseData data)
		{
			base.data = data;
			base.data.DiseaseID = "cancer";
			base.minsRequiredForProgression = 10080;
		}

		public override void DiseaseEffect()
		{
			float num = Mathf.Round((float)data.MinsSinceDiseaseStart * (1f + data.Severity));
			float num2 = (float)base.minsRequiredForProgression * (1f + data.Severity);
			if (num / (float)base.minsRequiredForProgression >= (float)data.Progression)
			{
				data.Progression++;
			}
			if (data.Progression >= 5)
			{
				DebugModule.Log("Player died of cancer", "DiseaseEffect");
				FlatlineUIModule.causeOfDeath = "Cancer";
				Flatline.coros.Add(MelonCoroutines.Start(FlatlinePlayer.PrePlayerDied()));
				data.Active = false;
				return;
			}
			if (data.Progression >= 3)
			{
				float num3 = num2 * 5f / 1440f;
				float num4 = num2 * 3f / 1440f;
				float num5 = num3 - num4;
				float num6 = MaximumMaxHPReduction / 1440f * num5 / 10f;
				DebugModule.Log("Cancer Max HP reduction: " + num6, "DiseaseEffect");
				if (Flatline.loadedPlayerData.State.healthData.MaxHP - num6 < Flatline.loadedPlayerData.State.healthData.CurrentHP)
				{
					float num7 = Flatline.loadedPlayerData.State.healthData.CurrentHP - (Flatline.loadedPlayerData.State.healthData.MaxHP - num6);
					if (Player.Local.Health.CurrentHealth - num7 <= 0f)
					{
						FlatlineUIModule.causeOfDeath = "Cancer";
					}
					Player.Local.Health.TakeDamage(num7, true, false);
					FlatlinePlayer.AppendDamageSource($"Cancer damage (-{num7}HP)");
				}
				Flatline.loadedPlayerData.State.healthData.MaxHP = Mathf.Clamp(Flatline.loadedPlayerData.State.healthData.MaxHP - num6, 0f, 100f);
			}
			if (!FlatlinePlayer.flatlinePlayerAudio.isPlaying)
			{
				AudioClip val = null;
				val = ((Player.Local.Avatar.CurrentSettings.Gender > 0.5f) ? ((!(Random.Range(0f, 1f) > 0.5f)) ? ConfigLoader.loadedAudios["femalesneeze"] : ConfigLoader.loadedAudios["femalecough"]) : ((!(Random.Range(0f, 1f) > 0.5f)) ? ConfigLoader.loadedAudios["malesneeze"] : ConfigLoader.loadedAudios["malecough"]));
				if (data.Progression == 2 && Random.Range(0f, 1f) > 0.99f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
				else if (data.Progression >= 3 && Random.Range(0f, 1f) > 0.95f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
			}
		}

		public override void DiseaseHealed()
		{
			DebugModule.Log("Healed cancer succesfully", "DiseaseHealed");
		}

		public override void UpdateDiseaseData()
		{
		}
	}
	public class Depression : Disease
	{
		public static readonly float passiveDiseaseHealingMax = 0.0025f;

		public static readonly float passiveDiseaseHealingMin = 0.0001f;

		public static readonly float baseEnergyConsumptionIncrease = 0.002f;

		public static readonly float baseFoodConsumptionIncrease = 0.0008f;

		public static readonly int maxTemporaryCureMins = 120;

		public static readonly float maxBlandEffectDuration = 180f;

		public static readonly float minBlandEffectDuration = 80f;

		public static readonly float maxDisablerEffectDuration = 120f;

		public static readonly float minDisablerEffectDuration = 50f;

		private static int minsSpentBedrotting = 0;

		public bool isTemporaryCurePresent;

		private int minsSinceTemporaryCureStarted;

		public static readonly List<string> temporaryDepressionCures = new List<string> { "weed", "shroom", "cocaine", "meth" };

		public Depression(DiseaseData data)
		{
			base.data = data;
			base.data.DiseaseID = "depression";
			base.minsRequiredForProgression = 4320;
			onDiseaseStarted = RunDepressionCoros;
		}

		private void RunDepressionCoros()
		{
			Flatline.coros.Add(MelonCoroutines.Start(DepressionSimulator.DepressionBlandWorld(this)));
			Flatline.coros.Add(MelonCoroutines.Start(DepressionSimulator.DepressionDoorDisabler(this)));
			Flatline.coros.Add(MelonCoroutines.Start(DepressionSimulator.DepressionMessagerDisabler(this)));
		}

		public override void DiseaseEffect()
		{
			if (Mathf.Round((float)data.MinsSinceDiseaseStart * (1f + data.Severity)) / (float)base.minsRequiredForProgression >= (float)data.Progression)
			{
				data.Progression++;
			}
			if (data.Progression >= 5)
			{
				DebugModule.Log("Player died of depression", "DiseaseEffect");
				FlatlineUIModule.causeOfDeath = "Depression";
				Flatline.coros.Add(MelonCoroutines.Start(FlatlinePlayer.PrePlayerDied()));
				data.Active = false;
				return;
			}
			if (BedRotSimulator.isBedrotting)
			{
				minsSpentBedrotting += 10;
				float num = Mathf.Lerp(0f, 1f, Mathf.Clamp01((float)minsSpentBedrotting / 1440f));
				if (num > data.HealState)
				{
					data.HealState = num;
				}
				else
				{
					data.HealState += num / 10f;
				}
			}
			data.HealState += Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax);
			if (isTemporaryCurePresent)
			{
				minsSinceTemporaryCureStarted += 10;
				if (minsSinceTemporaryCureStarted >= maxTemporaryCureMins)
				{
					isTemporaryCurePresent = false;
				}
			}
			if (Flatline.loadedPlayerData.State.healthData.TimesSmoked > 0 && Flatline.loadedPlayerData.State.consumptionDatas.Count > 0)
			{
				Dictionary<string, ConsumptionData> dictionary = new Dictionary<string, ConsumptionData>(Flatline.loadedPlayerData.State.consumptionDatas);
				float num2 = 0f;
				int num3 = 0;
				foreach (KeyValuePair<string, ConsumptionData> item in dictionary)
				{
					if (temporaryDepressionCures.Contains(item.Key))
					{
						num2 += item.Value.currentAmountInSystem;
						if (num2 > 0.15f && !isTemporaryCurePresent)
						{
							isTemporaryCurePresent = true;
							minsSinceTemporaryCureStarted = 0;
						}
						num3++;
					}
				}
				if (num3 > 0)
				{
					num2 = Mathf.Clamp01(num2 / (float)num3);
					float num4 = passiveDiseaseHealingMax * (1f + num2);
					float num5 = Random.Range(passiveDiseaseHealingMin * (1f + num2), num4);
					num5 = Mathf.Lerp(num5, num4, num2);
					data.HealState += Mathf.Clamp(num5, 0f, 0.01f);
				}
			}
			if (!BedRotSimulator.isBedrotting)
			{
				float num6 = Mathf.Lerp(3f, 5f, (float)data.Progression / 5f - 0.2f);
				float num7 = Mathf.Clamp(baseEnergyConsumptionIncrease * (float)data.Progression * (1f + data.Severity), 0f, 0.01f);
				float num8 = Mathf.Clamp(baseFoodConsumptionIncrease * (float)data.Progression * (1f + data.Severity), 0f, 0.0052f);
				FlatlinePlayer.EnergyConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.EnergyConsumptionPerMinute, FlatlinePlayer.EnergyConsumptionPerMinute + num7, MaximumSystematicPropertyChangePerTick * num6);
				FlatlinePlayer.FoodConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.FoodConsumptionPerMinute, FlatlinePlayer.FoodConsumptionPerMinute + num8, MaximumSystematicPropertyChangePerTick * num6);
			}
		}

		public override void DiseaseHealed()
		{
			if (FlatlinePlayer.FoodConsumptionPerMinute > FlatlinePlayer.DefaultFoodConsumption)
			{
				FlatlinePlayer.FoodConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.FoodConsumptionPerMinute, FlatlinePlayer.DefaultFoodConsumption, 0.5f);
			}
			if (FlatlinePlayer.EnergyConsumptionPerMinute > FlatlinePlayer.DefaultEnergyConsumption)
			{
				FlatlinePlayer.EnergyConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.EnergyConsumptionPerMinute, FlatlinePlayer.DefaultEnergyConsumption, 0.5f);
			}
			DebugModule.Log("Healed depression succesfully", "DiseaseHealed");
		}

		public override void UpdateDiseaseData()
		{
		}
	}
	public class Fever : Disease
	{
		[CompilerGenerated]
		private sealed class <BlurShort>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Fever <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				Fever fever = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (!Flatline.registered || FlatlinePlayer.isPassedOut || FlatlinePlayer.isQueuedForDeath)
					{
						return false;
					}
					DebugModule.Log("Start blur", "BlurShort");
					Mathf.Lerp(2f, 5f, (float)fever.data.Progression / 5f);
					PlayerSingleton<PlayerCamera>.Instance.FoVChangeSmoother.AddOverride(-8f, 5, "fever");
					PlayerSingleton<PlayerCamera>.Instance.SmoothLookSmoother.AddOverride(0.8f, 5, "fever");
					if (fever.data.Progression > 3)
					{
						Player.Local.Disoriented = true;
					}
					Player.Local.Seizure = true;
					Singleton<PostProcessingManager>.Instance.SetBlur(1f);
					<>2__current = Flatline.Wait5;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered)
					{
						return false;
					}
					Player.Local.Seizure = false;
					if (fever.data.Progression > 3 && Player.Local.Disoriented)
					{
						Player.Local.Disoriented = false;
					}
					Singleton<PostProcessingManager>.Instance.SetBlur(0f);
					PlayerSingleton<PlayerCamera>.Instance.FoVChangeSmoother.RemoveOverride("fever");
					PlayerSingleton<PlayerCamera>.Instance.SmoothLookSmoother.RemoveOverride("fever");
					DebugModule.Log("End blur", "BlurShort");
					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 static readonly float baseEnergyConsumptionIncrease = 7E-05f;

		public static readonly float baseTemperatureConsumptionIncrease = 0.00025f;

		public static readonly float baseThirstConsumptionIncrease = 0.00012f;

		public static readonly float passiveDiseaseHealingMax = 0.0055f;

		public static readonly float passiveDiseaseHealingMin = 0.0003f;

		public static readonly float MaximumMaxHPReduction = 33f;

		private int minsSinceLastFeverShiver;

		private int minsUntilNextFeverShiver = 120;

		public Fever(DiseaseData data)
		{
			base.data = data;
			base.data.DiseaseID = "fever";
			base.minsRequiredForProgression = 1080;
			onDiseaseStarted = FeverStarted;
		}

		private void FeverStarted()
		{
			Player.Local.Avatar.Effects.SetSicklySkinColor(true);
			Player.Local.Avatar.EmotionManager.AddEmotionOverride("Concerned", "Sickly", 0f, 5);
		}

		public override void DiseaseEffect()
		{
			minsSinceLastFeverShiver += 10;
			DebugModule.Log("Mins until next fever jitter " + (minsUntilNextFeverShiver - minsSinceLastFeverShiver), "DiseaseEffect");
			float num = Mathf.Round((float)data.MinsSinceDiseaseStart * (1f + data.Severity));
			float num2 = (float)base.minsRequiredForProgression * (1f + data.Severity);
			if (num / (float)base.minsRequiredForProgression >= (float)data.Progression)
			{
				data.Progression++;
			}
			if (data.Progression >= 5)
			{
				DebugModule.Log("Player died of fever", "DiseaseEffect");
				FlatlineUIModule.causeOfDeath = "Fever";
				Flatline.coros.Add(MelonCoroutines.Start(FlatlinePlayer.PrePlayerDied()));
				data.Active = false;
				return;
			}
			data.HealState += Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax);
			if (BedRotSimulator.isBedrotting)
			{
				data.HealState += Random.Range(passiveDiseaseHealingMin * 5f, passiveDiseaseHealingMax * 5f);
			}
			if (PlayerSingleton<PlayerMovement>.Instance.IsSprinting)
			{
				data.HealState = Mathf.Clamp01(data.HealState - Random.Range(passiveDiseaseHealingMin, passiveDiseaseHealingMax * 2f));
			}
			if (!FlatlinePlayer.flatlinePlayerAudio.isPlaying)
			{
				AudioClip val = null;
				val = ((Player.Local.Avatar.CurrentSettings.Gender > 0.5f) ? ((!(Random.Range(0f, 1f) > 0.5f)) ? ConfigLoader.loadedAudios["femalesneeze"] : ConfigLoader.loadedAudios["femalecough"]) : ((!(Random.Range(0f, 1f) > 0.5f)) ? ConfigLoader.loadedAudios["malesneeze"] : ConfigLoader.loadedAudios["malecough"]));
				if (data.Progression == 1 && Random.Range(0f, 1f) > 0.96f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
				else if (data.Progression == 2 && Random.Range(0f, 1f) > 0.94f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
				else if (data.Progression == 3 && Random.Range(0f, 1f) > 0.92f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
				else if (data.Progression >= 4 && Random.Range(0f, 1f) > 0.87f)
				{
					FlatlinePlayer.flatlinePlayerAudio.PlayOneShot(val);
				}
			}
			if (data.Progression >= 1)
			{
				float num3 = Mathf.Clamp(FlatlinePlayer.EnergyConsumptionPerMinute + Mathf.Clamp(baseEnergyConsumptionIncrease * (float)data.Progression * (1f + data.Severity), 0f, 0.0009f), 0f, FlatlinePlayer.DefaultEnergyConsumption * 3f);
				FlatlinePlayer.EnergyConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.EnergyConsumptionPerMinute, num3, MaximumSystematicPropertyChangePerTick * 2f);
				float num4 = Mathf.Clamp(FlatlinePlayer.TemperatureConsumption + Mathf.Clamp(baseTemperatureConsumptionIncrease * (float)data.Progression * (1f + data.Severity), 0f, 0.0015f), 0f, FlatlinePlayer.TemperatureConsumptionPerMinutePerDegreeDiff * 3f);
				FlatlinePlayer.TemperatureConsumption = Mathf.Lerp(FlatlinePlayer.TemperatureConsumption, num4, MaximumSystematicPropertyChangePerTick * 3f);
				float num5 = Mathf.Clamp(FlatlinePlayer.ThirstConsumptionPerMinute + Mathf.Clamp(baseThirstConsumptionIncrease * (float)data.Progression * (1f + data.Severity), 0f, 0.0015f), 0f, FlatlinePlayer.DefaultThirstConsumption * 3f);
				FlatlinePlayer.ThirstConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.ThirstConsumptionPerMinute, num5, MaximumSystematicPropertyChangePerTick * 3f);
			}
			if (data.Progression >= 2 && data.HealState < 0.8f && Flatline.loadedPlayerData.State.healthData.MaxHP > 100f - MaximumMaxHPReduction)
			{
				float num6 = num2 * 5f / 1440f;
				float num7 = num2 * 2f / 1440f;
				float num8 = num6 - num7;
				float num9 = MaximumMaxHPReduction / 1440f * num8 / 10f;
				num9 = Mathf.Clamp01(Mathf.Lerp(num9, 0f, data.HealState));
				DebugModule.Log("Fever Max HP reduction: " + num9, "DiseaseEffect");
				if (Flatline.loadedPlayerData.State.healthData.MaxHP - num9 < Flatline.loadedPlayerData.State.healthData.CurrentHP)
				{
					float num10 = Flatline.loadedPlayerData.State.healthData.CurrentHP - (Flatline.loadedPlayerData.State.healthData.MaxHP - num9);
					if (Player.Local.Health.CurrentHealth - num10 <= 0f)
					{
						FlatlineUIModule.causeOfDeath = "Fever";
					}
					Player.Local.Health.TakeDamage(num10, false, false);
					FlatlinePlayer.AppendDamageSource($"Fever damage (-{num10}HP)");
				}
				Flatline.loadedPlayerData.State.healthData.MaxHP = Mathf.Clamp(Flatline.loadedPlayerData.State.healthData.MaxHP - num9, 10f, 100f);
			}
			if (minsSinceLastFeverShiver >= minsUntilNextFeverShiver)
			{
				Flatline.coros.Add(MelonCoroutines.Start(BlurShort()));
				minsSinceLastFeverShiver = 0;
				switch (data.Progression)
				{
				case 1:
					minsUntilNextFeverShiver = Random.Range(100, 200);
					break;
				case 2:
					minsUntilNextFeverShiver = Random.Range(80, 180);
					break;
				case 3:
					minsUntilNextFeverShiver = Random.Range(70, 120);
					break;
				case 4:
					minsUntilNextFeverShiver = Random.Range(50, 100);
					break;
				default:
					minsUntilNextFeverShiver = Random.Range(80, 360);
					break;
				}
			}
		}

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

		public override void DiseaseHealed()
		{
			if (FlatlinePlayer.EnergyConsumptionPerMinute > FlatlinePlayer.DefaultEnergyConsumption)
			{
				FlatlinePlayer.EnergyConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.EnergyConsumptionPerMinute, FlatlinePlayer.DefaultFoodConsumption, 0.5f);
			}
			if (FlatlinePlayer.ThirstConsumptionPerMinute > FlatlinePlayer.DefaultThirstConsumption)
			{
				FlatlinePlayer.ThirstConsumptionPerMinute = Mathf.Lerp(FlatlinePlayer.ThirstConsumptionPerMinute, FlatlinePlayer.DefaultThirstConsumption, 0.5f);
			}
			if (FlatlinePlayer.TemperatureConsumption > FlatlinePlayer.TemperatureConsumptionPerMinutePerDegreeDiff)
			{
				FlatlinePlayer.TemperatureConsumption = Mathf.Lerp(FlatlinePlayer.TemperatureConsumption, FlatlinePlayer.TemperatureConsumptionPerMinutePerDegreeDiff, 0.5f);
			}
			Player.Local.Avatar.Effects.SetSicklySkinColor(false);
			Player.Local.Avatar.EmotionManager.RemoveEmotionOverride("Sickly");
			DebugModule.Log("Healed fever succesfully", "DiseaseHealed");
		}

		public override void UpdateDiseaseData()
		{
		}
	}
	public abstract class Disease
	{
		[CompilerGenerated]
		private sealed class <DiseaseEvaluator>d__12 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Disease <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				Disease disease = <>4__this;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					if (!FlatlinePlayer.isQueuedForDeath || Flatline.currentConfig.PermanentDeath || Player.PlayerList.Count <= 1)
					{
						if (!Flatline.registered || FlatlinePlayer.isQueuedForDeath)
						{
							return false;
						}
						if (!Flatline.isSaving && !FlatlinePlayer.isPassedOut && !NetworkSingleton<TimeManager>.Instance.IsSleepInProgress && !Flatline.haltExecution && (Player.PlayerList.Count <= 1 || Player.Local.Health.IsAlive) && (NetworkSingleton<TimeManager>.Instance.CurrentTime >= 659 || NetworkSingleton<TimeManager>.Instance.CurrentTime <= 400))
						{
							if (disease.data.DiseaseID != "cancer" && Flatline.loadedPlayerData.State.Hunger > 0.9f)
							{
								disease.data.HealState += disease.ParasympatheticHealing;
							}
							if (disease.data.HealState >= 1f)
							{
								goto IL_01bd;
							}
							if (HospitalHealing.hospitalChoiceInitialized)
							{
								disease.UpdateChoiceState((NPC)(object)HospitalHealing.lisaNPC, HospitalHealing.lisaCureChoices);
								disease.UpdateChoiceState((NPC)(object)HospitalHealing.ireneNPC, HospitalHealing.ireneCureChoices);
							}
							disease.data.MinsSinceDiseaseStart += 10;
							disease.DiseaseEffect();
						}
					}
				}
				else
				{
					<>1__state = -1;
					FlatlineUIModule.diseaseIcons[disease.data.DiseaseID].SetActive(true);
					if (disease.onDiseaseStarted != null)
					{
						disease.onDiseaseStarted();
					}
				}
				if (disease.data.Active)
				{
					<>2__current = Flatline.Wait10;
					<>1__state = 1;
					return true;
				}
				goto IL_01bd;
				IL_01bd:
				disease.data.Active = false;
				FlatlineUIModule.diseaseIcons[disease.data.DiseaseID].SetActive(false);
				disease.DiseaseHealed();
				if (HospitalHealing.hospitalChoiceInitialized)
				{
					disease.UpdateChoiceState((NPC)(object)HospitalHealing.lisaNPC, HospitalHealing.lisaCureChoices);
					disease.UpdateChoiceState((NPC)(object)HospitalHealing.ireneNPC, HospitalHealing.ireneCureChoices);
				}
				disease.diseaseCoroutine = null;
				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 readonly float ParasympatheticHealing = 0.0002f;

		public readonly float MaximumSystematicPropertyChangePerTick = 1f / 144f;

		public DiseaseData data;

		public object diseaseCoroutine;

		public Action onDiseaseStarted;

		public int minsRequiredForProgression { get; set; }

		public abstract void DiseaseEffect();

		public abstract void DiseaseHealed();

		public abstract void UpdateDiseaseData();

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

		private void UpdateChoiceState(NPC npc, Dictionary<string, DialogueChoice> choices)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)npc != (Object)null && choices.TryGetValue(data.DiseaseID, out var value))
			{
				value.Enabled = Vector3.Distance(npc.CenterPoint, HospitalHealing.hospitalDoorPoint) <= 7f && data.Active && data.HealState < 1f;
			}
		}
	}
	public static class PlayerConsumeDamage
	{
		public enum EConsumeType
		{
			None,
			Weed,
			Meth,
			Cocaine,
			Shroom,
			Paracetamol,
			Addy,
			Chili
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass31_0
		{
			public ProductItemInstance current;

			internal bool <CurrentProductMonitor>g__CanContinue|0()
			{
				if (Flatline.registered && !FlatlinePlayer.isQueuedForDeath && Player.Local.ConsumedProduct != null && Player.Local.ConsumedProduct == current)
				{
					return Flatline.haltExecution;
				}
				return true;
			}

			internal bool <CurrentProductMonitor>b__1()
			{
				return <CurrentProductMonitor>g__CanContinue|0();
			}
		}

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

			private object <>2__current;

			private <>c__DisplayClass31_0 <>8__1;

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

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

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

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

			private bool MoveNext()
			{
				//IL_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0095: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>8__1 = new <>c__DisplayClass31_0();
					if (ProductEffectRunning)
					{
						return false;
					}
					ProductEffectRunning = true;
					<>2__current = Flatline.Wait025;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>8__1.current = Player.Local.ConsumedProduct;
					if (<>8__1.current != null)
					{
						WaitUntil val = new WaitUntil(Func<bool>.op_Implicit((Func<bool>)(() => <>8__1.<CurrentProductMonitor>g__CanContinue|0())));
						<>2__current = val;
						<>1__state = 2;
						return true;
					}
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				DebugModule.Log("Current product has ended, disable", "CurrentProductMonitor");
				ProductEffectRunning = false;
				IsWeedEffectRunning = false;
				IsShroomEffectRunning = false;
				IsMethEffectRunning = false;
				IsCocaineEffectRunning = false;
				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 <HeartPumpOverride>d__34 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public string consumedID;

			private ConsumptionData <data>5__2;

			private float <maxTotalElapsed>5__3;

			private float <totalElapsed>5__4;

			private int <maxBeatsPerMinute>5__5;

			private int <minBeatsPerMinute>5__6;

			private float <elapsedSinceLast>5__7;

			private float <secondsForBeat>5__8;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					<totalElapsed>5__4 += 0.1f;
					<elapsedSinceLast>5__7 += 0.1f;
					if (<elapsedSinceLast>5__7 >= <secondsForBeat>5__8)
					{
						if ((Object)(object)heartBeatSource != (Object)null && !heartBeatSource.isPlaying)
						{
							heartBeatSource.PlayOneShot(ConfigLoader.loadedAudios["singleheartbeat"]);
						}
						if (Mathf.RoundToInt(<totalElapsed>5__4) % 5 == 0)
						{
							int num2 = Mathf.RoundToInt(Mathf.Lerp((float)<minBeatsPerMinute>5__6, (float)<maxBeatsPerMinute>5__5, Mathf.Clamp01(<data>5__2.currentAmountInSystem)));
							float num3 = (float)num2 / 60f;
							<secondsForBeat>5__8 = 1f / num3;
						}
					}
				}
				else
				{
					<>1__state = -1;
					if (heartPumpOverrideActive)
					{
						return false;
					}
					heartPumpOverrideActive = true;
					DebugModule.Log("Starting heart pump override", "HeartPumpOverride");
					if (!Flatline.loadedPlayerData.State.consumptionDatas.TryGetValue(consumedID, out <data>5__2))
					{
						DebugModule.Log("No match for id in consumption data", "HeartPumpOverride");
						heartPumpOverrideActive = false;
						return false;
					}
					if (!<HeartPumpOverride>g__CanContinue|34_0(<data>5__2))
					{
						heartPumpOverrideActive = false;
						return false;
					}
					<maxTotalElapsed>5__3 = 120f;
					<totalElapsed>5__4 = 0f;
					<maxBeatsPerMinute>5__5 = 200;
					<minBeatsPerMinute>5__6 = 70;
					int num2 = Mathf.RoundToInt(Mathf.Lerp((float)<minBeatsPerMinute>5__6, (float)<maxBeatsPerMinute>5__5, Mathf.Clamp01(<data>5__2.currentAmountInSystem)));
					DebugModule.Log("Setting bpm to " + num2, "HeartPumpOverride");
					<elapsedSinceLast>5__7 = 0f;
					float num3 = (float)num2 / 60f;
					<secondsForBeat>5__8 = 1f / num3;
				}
				if (!Flatline.registered)
				{
					return false;
				}
				if (<HeartPumpOverride>g__CanContinue|34_0(<data>5__2) && !(<totalElapsed>5__4 >= <maxTotalElapsed>5__3))
				{
					<>2__current = Flatline.Wait01;
					<>1__state = 1;
					return true;
				}
				DebugModule.Log("Finished heart pump override", "HeartPumpOverride");
				heartPumpOverrideActive = false;
				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 <ShroomEffectChanger>d__32 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			private float <amplitudeMax>5__2;

			private float <amplitudeMin>5__3;

			private float <blendMax>5__4;

			private float <blendMin>5__5;

			private float <noiseScaleMax>5__6;

			private float <noiseScaleMin>5__7;

			private float <targetAmp>5__8;

			private float <targetBld>5__9;

			private float <targetNoi>5__10;

			private MaterialProperties <activeProperties>5__11;

			private MaterialProperties <source>5__12;

			private MaterialProperties <targetMaterialProperties>5__13;

			private float <easeInTime>5__14;

			private float <currentEase>5__15;

			private float <sleepTime>5__16;

			private float <sleepCurrent>5__17;

			private bool <shouldBreak>5__18;

			private MaterialProperties <temp>5__19;

			private bool <useBlend>5__20;

			private bool <useNoise>5__21;

			private bool <useAmplitude>5__22;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<activeProperties>5__11 = null;
				<source>5__12 = null;
				<targetMaterialProperties>5__13 = null;
				<temp>5__19 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				ConsumptionData value2;
				float num2;
				float num3;
				float num4;
				float num5;
				List<int> list;
				int num6;
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					if (IsShroomEffectRunning)
					{
						return false;
					}
					IsShroomEffectRunning = true;
					<amplitudeMax>5__2 = 0.5f;
					<amplitudeMin>5__3 = 0.19f;
					<blendMax>5__4 = 0.4f;
					<blendMin>5__5 = 0.016f;
					<noiseScaleMax>5__6 = 50f;
					<noiseScaleMin>5__7 = 15f;
					float num = 0f;
					if (Flatline.loadedPlayerData.State.consumptionDatas.TryGetValue("shroom", out var value))
					{
						num = Mathf.Clamp01(value.currentAmountInSystem);
					}
					<targetAmp>5__8 = Mathf.Lerp(<amplitudeMin>5__3, <amplitudeMax>5__2, num) * Random.Range(0.95f, 1.05f);
					<targetBld>5__9 = Mathf.Lerp(<blendMin>5__5, <blendMax>5__4, num) * Random.Range(0.95f, 1.05f);
					<targetNoi>5__10 = Mathf.Lerp(<noiseScaleMin>5__7, <noiseScaleMax>5__6, num) * Random.Range(0.95f, 1.05f);
					<activeProperties>5__11 = Singleton<PostProcessingManager>.Instance.GetActivePsychedelicEffectProperties();
					<source>5__12 = <activeProperties>5__11.Clone();
					PsychedelicFullScreenData psychedelicEffectDataPreset = Singleton<PostProcessingManager>.Instance.GetPsychedelicEffectDataPreset("Active");
					<targetMaterialProperties>5__13 = psychedelicEffectDataPreset.ConvertToMaterialProperties();
					<targetMaterialProperties>5__13.Blend = <targetBld>5__9;
					<targetMaterialProperties>5__13.NoiseScale = <targetNoi>5__10;
					<targetMaterialProperties>5__13.Amplitude = <targetAmp>5__8;
					Singleton<EnvironmentFX>.Instance.SetEnvironmentScrollingActive(true);
					Singleton<PostProcessingManager>.Instance.SetPsychedelicEffectActive(true);
					<easeInTime>5__14 = 2f;
					<currentEase>5__15 = 0f;
					goto IL_0243;
				}
				case 1:
					<>1__state = -1;
					goto IL_0243;
				case 2:
					<>1__state = -1;
					goto IL_02d7;
				case 3:
					{
						<>1__state = -1;
						goto IL_0714;
					}
					IL_0281:
					if (<shouldBreak>5__18)
					{
						break;
					}
					goto IL_02d7;
					IL_02d7:
					if (<sleepCurrent>5__17 < <sleepTime>5__16)
					{
						<sleepCurrent>5__17 += Time.deltaTime;
						if (!Flatline.registered)
						{
							return false;
						}
						if (ProductEffectRunning && IsShroomEffectRunning)
						{
							<>2__current = null;
							<>1__state = 2;
							return true;
						}
						<shouldBreak>5__18 = true;
					}
					<sleepCurrent>5__17 = 0f;
					if (<shouldBreak>5__18)
					{
						break;
					}
					if (Flatline.isSaving || !Flatline.loadedPlayerData.State.consumptionDatas.TryGetValue("shroom", out value2))
					{
						goto IL_0281;
					}
					num2 = Mathf.Clamp01(value2.currentAmountInSystem);
					if (num2 > 0.75f && Random.Range(0f, 1f) > 0.98f)
					{
						Player.Local.Avatar.Effects.TriggerSick(false);
						Flatline.loadedPlayerData.State.Hunger = Mathf.Clamp01(Flatline.loadedPlayerData.State.Hunger - 0.05f);
						Flatline.loadedPlayerData.State.Thirst = Mathf.Clamp01(Flatline.loadedPlayerData.State.Thirst - 0.02f);
					}
					<targetAmp>5__8 = Mathf.Lerp(<amplitudeMin>5__3, <amplitudeMax>5__2, num2);
					<targetBld>5__9 = Mathf.Lerp(<blendMin>5__5, <blendMax>5__4, num2);
					<targetNoi>5__10 = Mathf.Lerp(<noiseScaleMin>5__7, <noiseScaleMax>5__6, num2);
					<temp>5__19 = Singleton<PostProcessingManager>.Instance.GetActivePsychedelicEffectProperties().Clone();
					<targetAmp>5__8 = Mathf.Clamp(<targetAmp>5__8, <temp>5__19.Amplitude - <amplitudeMax>5__2 / 10f, <temp>5__19.Amplitude + <amplitudeMax>5__2 / 10f);
					<targetBld>5__9 = Mathf.Clamp(<targetBld>5__9, <temp>5__19.Blend - <blendMax>5__4 / 10f, <temp>5__19.Blend + <blendMax>5__4 / 10f);
					<targetNoi>5__10 = Mathf.Clamp(<targetNoi>5__10, <temp>5__19.NoiseScale - <noiseScaleMax>5__6 / 10f, <temp>5__19.NoiseScale + <noiseScaleMax>5__6 / 10f);
					num3 = Random.Range(0f, 1f);
					num4 = Random.Range(0f, 1f);
					num5 = Random.Range(0f, 1f);
					<useBlend>5__20 = false;
					<useNoise>5__21 = false;
					<useAmplitude>5__22 = false;
					list = new List<int> { 0, 1, 2 };
					num6 = list.Count;
					while (num6 > 1)
					{
						num6--;
						int index = Random.Range(0, num6 + 1);
						int value3 = list[index];
						list[index] = list[num6];
						list[num6] = value3;
					}
					for (int i = 0; i < 2; i++)
					{
						if (list[i] == 0 && (double)num3 > 0.33)
						{
							<useBlend>5__20 = true;
						}
						if (list[i] == 1 && (double)num4 > 0.33)
						{
							<useNoise>5__21 = true;
						}
						if (list[i] == 2 && (double)num5 > 0.33)
						{
							<useAmplitude>5__22 = true;
						}
					}
					if (<useBlend>5__20 | <useNoise>5__21 | <useAmplitude>5__22)
					{
						<currentEase>5__15 = 0f;
						goto IL_0714;
					}
					goto IL_0778;
					IL_0714:
					if (<currentEase>5__15 < <easeInTime>5__14)
					{
						if (!Flatline.registered)
						{
							return false;
						}
						if (ProductEffectRunning && IsShroomEffectRunning)
						{
							<currentEase>5__15 += Time.deltaTime;
							float num7 = <currentEase>5__15 / <easeInTime>5__14;
							float num8 = Mathf.SmoothStep(0f, 1f, num7);
							if (<useBlend>5__20)
							{
								<activeProperties>5__11.Blend = Mathf.Lerp(<temp>5__19.Blend, <targetBld>5__9, num8);
							}
							if (<useNoise>5__21)
							{
								<activeProperties>5__11.NoiseScale = Mathf.Lerp(<temp>5__19.NoiseScale, <targetNoi>5__10, num8);
							}
							if (<useAmplitude>5__22)
							{
								<activeProperties>5__11.Amplitude = Mathf.Lerp(<temp>5__19.Amplitude, <targetAmp>5__8, num8);
							}
							<>2__current = null;
							<>1__state = 3;
							return true;
						}
						<shouldBreak>5__18 = true;
					}
					if (<shouldBreak>5__18)
					{
						break;
					}
					<targetMaterialProperties>5__13 = <activeProperties>5__11.Clone();
					Singleton<PostProcessingManager>.Instance.SetPsychedelicEffectProperties(<targetMaterialProperties>5__13);
					<sleepTime>5__16 = Random.Range(5f, 10f);
					<easeInTime>5__14 = Random.Range(2f, 6f);
					goto IL_0778;
					IL_0243:
					if (<currentEase>5__15 < <easeInTime>5__14)
					{
						if (!Flatline.registered)
						{
							return false;
						}
						<currentEase>5__15 += Time.deltaTime;
						float num9 = <currentEase>5__15 / <easeInTime>5__14;
						<activeProperties>5__11.Blend = Mathf.Lerp(<source>5__12.Blend, <targetMaterialProperties>5__13.Blend, num9);
						Singleton<EnvironmentFX>.Instance.SetEnvironmentScrollingSpeedByPercentage(Mathf.Lerp(0f, 1f, num9));
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
					Singleton<PostProcessingManager>.Instance.SetPsychedelicEffectProperties(<targetMaterialProperties>5__13);
					<sleepTime>5__16 = 5f;
					<sleepCurrent>5__17 = 0f;
					<shouldBreak>5__18 = false;
					goto IL_0281;
					IL_0778:
					<temp>5__19 = null;
					goto IL_0281;
				}
				DebugModule.Log("Shroom effect changer ended", "ShroomEffectChanger");
				IsShroomEffectRunning = false;
				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 <StimulantEffectChanger>d__33 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			private float <sleepTime>5__2;

			private float <sleepCurrent>5__3;

			private bool <shouldBreak>5__4;

			private float <rotAmount>5__5;

			private int <i>5__6;

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

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

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

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

			private bool MoveNext()
			{
				//IL_02f8: Unknown result type (might be due to invalid IL or missing references)
				//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
				//IL_0348: Unknown result type (might be due to invalid IL or missing references)
				//IL_034f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0362: Unknown result type (might be due to invalid IL or missing references)
				//IL_0369: Unknown result type (might be due to invalid IL or missing references)
				ConsumptionData value;
				ConsumptionData value2;
				float num5;
				float num6;
				float num7;
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (IsCocaineEffectRunning || IsMethEffectRunning)
					{
						return false;
					}
					IsCocaineEffectRunning = true;
					IsMethEffectRunning = true;
					<>2__current = Flatline.Wait2;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (!Flatline.registered)
					{
						return false;
					}
					<sleepTime>5__2 = 2f;
					<sleepCurrent>5__3 = 0f;
					<shouldBreak>5__4 = false;
					goto IL_0083;
				case 2:
					<>1__state = -1;
					goto IL_00e0;
				case 3:
					{
						<>1__state = -1;
						if (!Flatline.registered)
						{
							return false;
						}
						if (!ProductEffectRunning || !IsMethEffectRunning || !IsCocaineEffectRunning)
						{
							<shouldBreak>5__4 = true;
							goto IL_043a;
						}
						if (Random.Range(0f, 1f) > 0.55f)
						{
							float num = 0.5f;
							float num2 = 0f;
							Quaternion rotation = ((Component)Player.Local).transform.root.rotation;
							while (num2 < num)
							{
								if (!Flatline.registered)
								{
									return false;
								}
								if (!ProductEffectRunning || !IsMethEffectRunning || !IsCocaineEffectRunning)
								{
									<shouldBreak>5__4 = true;
									break;
								}
								num2 += Time.deltaTime;
								float num3 = num2 / num;
								((Component)Player.Local).transform.root.rotation = Quaternion.Lerp(rotation, Quaternion.Euler(0f, rotation.y + <rotAmount>5__5, 0f), num3);
							}
							if (<shouldBreak>5__4)
							{
								goto IL_043a;
							}
						}
						if (<i>5__6 % 2 == 0)
						{
							PlayerInventory instance = PlayerSingleton<PlayerInventory>.Instance;
							if (!GameInput.IsTyping && !Singleton<PauseMenu>.Instance.IsPaused && instance.HotbarEnabled)
							{
								int num4 = Random.Range(0, 8);
								if (num4 != instance.EquippedSlotIndex)
								{
									if (instance.EquippedSlotIndex != -1)
									{
										instance.IndexAllSlots(instance.EquippedSlotIndex).Unequip();
									}
									instance.PreviousEquippedSlotIndex = instance.EquippedSlotIndex;
									instance.EquippedSlotIndex = num4;
									instance.Equip(instance.IndexAllSlots(num4));
									PlayerSingleton<ViewmodelSway>.Instance.RefreshViewmodel();
								}
							}
						}
						<i>5__6++;
						goto IL_0428;
					}
					IL_043a:
					if (<shouldBreak>5__4)
					{
						break;
					}
					goto IL_0083;
					IL_0428:
					if (<i>5__6 < Random.Range(4, 8))
					{
						<>2__current = Flatline.Wait05;
						<>1__state = 3;
						return true;
					}
					goto IL_043a;
					IL_0083:
					if (<shouldBreak>5__4)
					{
						break;
					}
					goto IL_00e0;
					IL_00e0:
					if (<sleepCurrent>5__3 < <sleepTime>5__2)
					{
						<sleepCurrent>5__3 += Time.deltaTime;
						if (!Flatline.registered)
						{
							return false;
						}
						if (ProductEffectRunning && IsMethEffectRunning && IsCocaineEffectRunning)
						{
							<>2__current = null;
							<>1__state = 2;
							return true;
						}
						<shouldBreak>5__4 = true;
					}
					<sleepCurrent>5__3 = 0f;
					if (<shouldBreak>5__4)
					{
						break;
					}
					num5 = 0f;
					if (Flatline.loadedPlayerData.State.consumptionDatas.TryGetValue("meth", out value) && value.currentAmountInSystem > 0.001f)
					{
						num5 = value.currentAmountInSystem;
					}
					if (Flatline.loadedPlayerData.State.consumptionDatas.TryGetValue("cocaine", out value2) && value2.currentAmountInSystem > 0.001f && value2.currentAmountInSystem > num5)
					{
						num5 = value2.currentAmountInSystem;
					}
					num5 = Mathf.Clamp01(num5);
					if (num5 > 0.75f && Random.Range(0f, 1f) > 0.98f)
					{
						Player.Local.Avatar.Effects.TriggerSick(false);
						Flatline.loadedPlayerData.State.Hunger = Mathf.Clamp01(Flatline.loadedPlayerData.State.Hunger - 0.05f);
						Flatline.loadedPlayerData.State.Thirst = Mathf.Clamp01(Flatline.loadedPlayerData.State.Thirst - 0.02f);
					}
					num6 = Mathf.Lerp(0.9f, 0.75f, num5);
					if (Random.Range(0f, 1f) < num6)
					{