Decompiled source of Paranoia v0.8.9

Pix.Paranoia.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Pix.Paranoia.Creatures;
using Pix.Paranoia.Hallucinations;
using Pix.Paranoia.Infection;
using Pix.Paranoia.Nausea;
using Pix.Paranoia.Relics;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace Pix.Paranoia
{
	[BepInPlugin("Pix.Paranoia", "Paranoia", "0.8.9")]
	public sealed class ParanoiaPlugin : BaseUnityPlugin
	{
		private sealed class CreatureSfxIndex
		{
			public readonly List<string> Foreshadow = new List<string>();

			public readonly List<string> Displacement = new List<string>();

			public readonly List<string> Violation = new List<string>();
		}

		public const string PluginGuid = "Pix.Paranoia";

		public const string PluginName = "Paranoia";

		public const string PluginVersion = "0.8.9";

		private const string RpcParanoidinDamage = "PX_ParanoidinDamage";

		private Harmony _harmony;

		private Harmony _criticalHarmony;

		private static ParanoiaPlugin _self;

		internal static ConfigEntry<bool> Enabled;

		internal static ConfigEntry<bool> DebugLogging;

		internal static ConfigEntry<bool> UseSleepDeprivation;

		internal static ConfigEntry<int> DaysWithoutSleepThreshold;

		internal static ConfigEntry<float> TickIntervalSeconds;

		internal static ConfigEntry<float> BaseEventChancePerTick;

		internal static ConfigEntry<float> NightChanceMultiplier;

		internal static ConfigEntry<float> GlobalCooldownSeconds;

		internal static ConfigEntry<float> ForeshadowCooldownSeconds;

		internal static ConfigEntry<float> DisplacementCooldownSeconds;

		internal static ConfigEntry<float> ViolationCooldownSeconds;

		internal static ConfigEntry<float> ViolationForeignBiomeChance;

		internal static ConfigEntry<float> SameSoundRepeatBlockSeconds;

		internal static ConfigEntry<bool> EnableEatTrigger;

		internal static ConfigEntry<float> EatTriggerChance;

		internal static ConfigEntry<float> DisplacementMinDistance;

		internal static ConfigEntry<float> DisplacementMaxDistance;

		internal static ConfigEntry<float> ForeshadowDistance;

		internal static ConfigEntry<float> ViolationDistance;

		internal static ConfigEntry<bool> DisableDuringActiveEvent;

		internal static ConfigEntry<bool> ForcePlayAudioSources;

		internal static ConfigEntry<float> ForcedNearSpawnDistance;

		internal static ConfigEntry<float> SleepTest_DaySeconds;

		internal static ConfigEntry<string> Meadows_Foreshadow;

		internal static ConfigEntry<string> Meadows_Displacement;

		internal static ConfigEntry<string> Meadows_Violation;

		internal static ConfigEntry<string> BlackForest_Foreshadow;

		internal static ConfigEntry<string> BlackForest_Displacement;

		internal static ConfigEntry<string> BlackForest_Violation;

		internal static ConfigEntry<string> Swamp_Foreshadow;

		internal static ConfigEntry<string> Swamp_Displacement;

		internal static ConfigEntry<string> Swamp_Violation;

		internal static ConfigEntry<string> Mountains_Foreshadow;

		internal static ConfigEntry<string> Mountains_Displacement;

		internal static ConfigEntry<string> Mountains_Violation;

		internal static ConfigEntry<string> Plains_Foreshadow;

		internal static ConfigEntry<string> Plains_Displacement;

		internal static ConfigEntry<string> Plains_Violation;

		internal static ConfigEntry<string> Mistlands_Foreshadow;

		internal static ConfigEntry<string> Mistlands_Displacement;

		internal static ConfigEntry<string> Mistlands_Violation;

		internal static ConfigEntry<string> Ocean_Foreshadow;

		internal static ConfigEntry<string> Ocean_Displacement;

		internal static ConfigEntry<string> Ocean_Violation;

		internal static ConfigEntry<string> AshLands_Foreshadow;

		internal static ConfigEntry<string> AshLands_Displacement;

		internal static ConfigEntry<string> AshLands_Violation;

		internal static ConfigEntry<bool> EnableParanoidin;

		internal static ConfigEntry<float> ParanoidinChancePerTickSevere;

		internal static ConfigEntry<float> ParanoidinCooldownSeconds;

		internal static ConfigEntry<bool> ParanoidinEnvironmentEnabled;

		internal static ConfigEntry<bool> DisableParanoiaTickDuringRespawnLockout;

		internal static ConfigEntry<float> RespawnLockoutSeconds;

		internal static ConfigEntry<float> ParanoidinChancePerTickModerate;

		internal static ConfigEntry<float> ParanoidinChancePerTickMild;

		internal static ConfigEntry<string> ParanoidinMinTier;

		internal static ConfigEntry<string> ParanoidinPrefabNames;

		internal static ConfigEntry<bool> ParanoidinUseSafeVisuals = null;

		internal static ConfigEntry<bool> ParanoidinSpawnVisualGhost = null;

		internal static ConfigEntry<float> ParanoidinFarShowDistance;

		internal static ConfigEntry<float> ParanoidinFarShowSeconds;

		internal static ConfigEntry<float> ParanoidinStartDistance;

		internal static ConfigEntry<float> ParanoidinMinDistance;

		internal static ConfigEntry<float> ParanoidinTeleportStep;

		internal static ConfigEntry<float> ParanoidinTeleportCooldown;

		internal static ConfigEntry<float> ParanoidinDespawnDistance;

		internal static ConfigEntry<float> ParanoidinHoldSeconds;

		internal static ConfigEntry<float> ParanoidinAttackRange;

		internal static ConfigEntry<float> ParanoidinAttackWindupSeconds;

		internal static ConfigEntry<float> ParanoidinAttackDamage;

		internal static ConfigEntry<bool> ParanoidinDamageRequiresServer;

		internal static ConfigEntry<bool> ParanoidinDebugAllowClientDamage;

		internal static ConfigEntry<string> ParanoidinWarningSfx;

		internal static ConfigEntry<string> ParanoidinStepSfx;

		internal static ConfigEntry<string> ParanoidinAttackSfx;

		internal static ConfigEntry<string> ParanoidinHauntSfx;

		internal static ConfigEntry<bool> CfgHallucinationEnabled;

		internal static ConfigEntry<float> CfgHallucinationWarningTimeSeconds;

		internal static ConfigEntry<float> CfgHallucinationTriggerTimeSeconds;

		internal static ConfigEntry<float> CfgHallucinationDurationSeconds;

		internal static ConfigEntry<float> CfgHallucinationGlobalCooldownSeconds;

		internal static ConfigEntry<string> CfgHallucinationWarningMessage;

		internal static ConfigEntry<string> CfgHallucinationTriggerMessage;

		internal static ConfigEntry<bool> CfgHallucinationRainbowEnabled;

		internal static ConfigEntry<float> CfgHallucinationRainbowDistance;

		internal static ConfigEntry<int> CfgHallucinationMaxFakeCreatures;

		internal static ConfigEntry<float> CfgHallucinationFakeCreatureSpawnInterval;

		internal static ConfigEntry<float> CfgHallucinationFakeCreatureMinDistance;

		internal static ConfigEntry<float> CfgHallucinationFakeCreatureMaxDistance;

		internal static ConfigEntry<bool> CfgHallucinationFakeCreatureBiomeOnly;

		internal static ConfigEntry<bool> CfgHallucinationFakeCreatureChaotic;

		internal static ConfigEntry<float> CfgHallucinationBlurStrength;

		internal static ConfigEntry<int> CfgHallucinationBlurIterations;

		internal static ConfigEntry<int> CfgHallucinationBlurDownsample;

		internal static ConfigEntry<float> CfgHallucinationEdgeWidth;

		internal static ConfigEntry<float> CfgHallucinationEdgeSoftness;

		internal static ConfigEntry<float> CfgHallucinationPulseSpeed;

		internal static ConfigEntry<float> CfgHallucinationPulseAmplitude;

		internal static ConfigEntry<float> CfgHallucinationOnsetBurialChambers;

		internal static ConfigEntry<float> CfgHallucinationOnsetTrollCave;

		internal static ConfigEntry<float> CfgHallucinationOnsetSunkenCrypt;

		internal static ConfigEntry<float> CfgHallucinationOnsetFrostCave;

		internal static ConfigEntry<float> CfgHallucinationOnsetSealedTower;

		internal static ConfigEntry<float> CfgHallucinationOnsetInfestedMine;

		internal static ConfigEntry<float> CfgHallucinationOnsetPutridHole;

		internal static ConfigEntry<float> CfgHallucinationOnsetSmoulderingTomb;

		internal static ConfigEntry<bool> CfgWhisperingGreydwarfEnabled;

		internal static ConfigEntry<float> CfgWhisperingGreydwarfChance;

		private static bool _sfxIndexBuilt;

		private static readonly object _sfxIndexLock = new object();

		private static readonly HashSet<string> _availableSfxNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

		private static readonly Dictionary<string, CreatureSfxIndex> _sfxByCreatureKey = new Dictionary<string, CreatureSfxIndex>(StringComparer.OrdinalIgnoreCase);

		private static readonly Dictionary<Biome, string[]> _creaturesByBiome = new Dictionary<Biome, string[]>
		{
			{
				(Biome)1,
				new string[5] { "deer", "boar", "neck", "greyling", "seagal" }
			},
			{
				(Biome)8,
				new string[6] { "greydwarf", "troll", "skeleton", "ghost", "rancidremains", "crow" }
			},
			{
				(Biome)256,
				new string[3] { "serpent", "seagal", "leviathan" }
			},
			{
				(Biome)2,
				new string[7] { "draugr", "blob", "blobelite", "leech", "wraith", "abomination", "surtling" }
			},
			{
				(Biome)4,
				new string[6] { "wolf", "hatchling", "fenring", "stonegolem", "ulv", "bat" }
			},
			{
				(Biome)16,
				new string[6] { "goblin", "goblinbrute", "goblinshaman", "lox", "deathsquito", "blobtar" }
			},
			{
				(Biome)512,
				new string[8] { "seeker", "seekerbrute", "seekerbrood", "gjall", "tick", "dverger", "dvergermage", "hare" }
			},
			{
				(Biome)32,
				new string[6] { "charred", "volture", "asksvin", "bloblava", "bonemawserpent", "fallenvalkyrie" }
			}
		};

		private static bool _paranoidinRpcRegistered;

		private static void EnsureSfxIndexBuilt()
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			if (_sfxIndexBuilt)
			{
				return;
			}
			lock (_sfxIndexLock)
			{
				if (_sfxIndexBuilt)
				{
					return;
				}
				_availableSfxNames.Clear();
				_sfxByCreatureKey.Clear();
				try
				{
					if ((Object)ZNetScene.instance != (Object)null && ZNetScene.instance.m_prefabs != null)
					{
						foreach (GameObject prefab in ZNetScene.instance.m_prefabs)
						{
							if ((Object)prefab == (Object)null)
							{
								continue;
							}
							string name = ((Object)prefab).name;
							if (string.IsNullOrEmpty(name) || !name.StartsWith("sfx_", StringComparison.OrdinalIgnoreCase))
							{
								continue;
							}
							_availableSfxNames.Add(name);
							string text = ExtractCreatureKey(name);
							if (!string.IsNullOrEmpty(text))
							{
								if (!_sfxByCreatureKey.TryGetValue(text, out var value))
								{
									value = new CreatureSfxIndex();
									_sfxByCreatureKey[text] = value;
								}
								ClassifyAndAdd(value, name);
							}
						}
					}
				}
				catch (Exception ex)
				{
					LogWarn("SFX AUTO indexing failed (will fall back to config-only pools): " + ex.Message);
				}
				_sfxIndexBuilt = true;
				if (DebugLogging.Value)
				{
					LogInfo($"SFX AUTO index built: {_availableSfxNames.Count} sfx prefabs, {_sfxByCreatureKey.Count} creature keys.");
				}
			}
		}

		private static string ExtractCreatureKey(string sfxPrefabName)
		{
			if (string.IsNullOrEmpty(sfxPrefabName))
			{
				return null;
			}
			string text = sfxPrefabName;
			if (text.StartsWith("sfx_", StringComparison.OrdinalIgnoreCase))
			{
				text = text.Substring(4);
			}
			string[] array = text.Split(new char[3] { '_', ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
			if (array.Length == 0)
			{
				return null;
			}
			return array[0].Trim().ToLowerInvariant();
		}

		private static void ClassifyAndAdd(CreatureSfxIndex idx, string sfxPrefabName)
		{
			if (idx != null && !string.IsNullOrEmpty(sfxPrefabName))
			{
				string text = sfxPrefabName.ToLowerInvariant();
				bool flag = text.Contains("_idle") || text.Contains("_footstep") || text.Contains("_random") || text.Contains("_creak") || text.Contains("_greet") || text.Contains("_laugh") || text.Contains("_yea");
				bool flag2 = text.Contains("_alert") || text.Contains("_alerted") || text.Contains("_scream") || text.Contains("_howl") || text.Contains("_taunt") || text.Contains("_roar") || text.Contains("_shout");
				bool flag3 = text.Contains("_death") || text.Contains("_hurt") || text.Contains("_hit") || text.Contains("_attack") || text.Contains("_bite") || text.Contains("_slam") || text.Contains("_claw") || text.Contains("_spit");
				if (!flag && !flag2 && !flag3)
				{
					flag = true;
				}
				if (flag)
				{
					idx.Foreshadow.Add(sfxPrefabName);
				}
				if (flag2)
				{
					idx.Displacement.Add(sfxPrefabName);
				}
				if (flag3)
				{
					idx.Violation.Add(sfxPrefabName);
				}
			}
		}

		internal static List<string> GetAutoPool(Biome biome, ParanoiaCategory cat)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			EnsureSfxIndexBuilt();
			if (!_sfxIndexBuilt || _availableSfxNames.Count == 0)
			{
				return new List<string>();
			}
			if (!_creaturesByBiome.TryGetValue(biome, out var value) || value == null || value.Length == 0)
			{
				value = null;
			}
			List<string> list = new List<string>(64);
			if (value != null)
			{
				foreach (string text in value)
				{
					if (!string.IsNullOrEmpty(text) && _sfxByCreatureKey.TryGetValue(text, out var value2))
					{
						switch (cat)
						{
						case ParanoiaCategory.Foreshadow:
							list.AddRange(value2.Foreshadow);
							break;
						case ParanoiaCategory.Displacement:
							list.AddRange(value2.Displacement);
							break;
						case ParanoiaCategory.Violation:
							list.AddRange(value2.Violation);
							break;
						}
					}
				}
			}
			if (list.Count == 0)
			{
				foreach (KeyValuePair<string, CreatureSfxIndex> item in _sfxByCreatureKey)
				{
					CreatureSfxIndex value3 = item.Value;
					if (value3 != null)
					{
						switch (cat)
						{
						case ParanoiaCategory.Foreshadow:
							list.AddRange(value3.Foreshadow);
							break;
						case ParanoiaCategory.Displacement:
							list.AddRange(value3.Displacement);
							break;
						case ParanoiaCategory.Violation:
							list.AddRange(value3.Violation);
							break;
						}
					}
				}
			}
			if (list.Count > 1)
			{
				HashSet<string> hashSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
				List<string> list2 = new List<string>(list.Count);
				for (int j = 0; j < list.Count; j++)
				{
					string text2 = list[j];
					if (!string.IsNullOrEmpty(text2) && hashSet.Add(text2))
					{
						list2.Add(text2);
					}
				}
				list = list2;
			}
			return list;
		}

		internal static bool IsSfxAvailable(string sfxPrefabName)
		{
			if (string.IsNullOrEmpty(sfxPrefabName))
			{
				return false;
			}
			EnsureSfxIndexBuilt();
			if (_availableSfxNames.Count == 0)
			{
				return true;
			}
			return _availableSfxNames.Contains(sfxPrefabName);
		}

		private void Awake()
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Expected O, but got Unknown
			_self = this;
			BindConfig();
			ParanoiaRelics.Init(((BaseUnityPlugin)this).Config, ((BaseUnityPlugin)this).Logger);
			TryExtractEmbeddedResources();
			TryRegisterParanoidinRpc();
			if ((Object)(object)ParanoiaEngine.Instance == (Object)null)
			{
				((Component)this).gameObject.AddComponent<ParanoiaEngine>();
			}
			if ((Object)(object)HallucinationManager.Instance == (Object)null)
			{
				((Component)this).gameObject.AddComponent<HallucinationManager>();
			}
			ParanoiaConsole.TryRegister();
			_harmony = new Harmony("Pix.Paranoia");
			try
			{
				_harmony.PatchAll(typeof(ParanoiaPlugin).Assembly);
			}
			catch (Exception arg)
			{
				Debug.LogError((object)$"[Paranoia] PatchAll failed: {arg}");
			}
			_criticalHarmony = new Harmony("Pix.Paranoia.critical");
			ParanoiaRelics.ApplyPatches(_criticalHarmony);
			ParanoiaSerpent.Init(_criticalHarmony, ((BaseUnityPlugin)this).Logger);
			ParanoiaGreydwarfs.Init(_harmony);
			ParanoiaNausea.Init(_harmony, ((BaseUnityPlugin)this).Config);
			ParanoiaInfection.Init(_criticalHarmony, ((BaseUnityPlugin)this).Logger, ((BaseUnityPlugin)this).Config);
		}

		private void OnDestroy()
		{
			try
			{
				Harmony harmony = _harmony;
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
			}
			catch
			{
			}
			try
			{
				Harmony criticalHarmony = _criticalHarmony;
				if (criticalHarmony != null)
				{
					criticalHarmony.UnpatchSelf();
				}
			}
			catch
			{
			}
		}

		private void BindConfig()
		{
			//IL_0a87: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a91: Expected O, but got Unknown
			//IL_0ac4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ace: Expected O, but got Unknown
			//IL_0b01: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b0b: Expected O, but got Unknown
			//IL_0b3e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b48: Expected O, but got Unknown
			//IL_0be3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bed: Expected O, but got Unknown
			//IL_0c15: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c1f: Expected O, but got Unknown
			//IL_0c52: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c5c: Expected O, but got Unknown
			//IL_0c8f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c99: Expected O, but got Unknown
			//IL_0ccc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cd6: Expected O, but got Unknown
			//IL_0d49: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d53: Expected O, but got Unknown
			//IL_0d7a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d84: Expected O, but got Unknown
			//IL_0dab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0db5: Expected O, but got Unknown
			//IL_0de8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0df2: Expected O, but got Unknown
			//IL_0e25: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e2f: Expected O, but got Unknown
			//IL_0e62: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e6c: Expected O, but got Unknown
			//IL_0e9f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ea9: Expected O, but got Unknown
			//IL_0edc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ee6: Expected O, but got Unknown
			//IL_0f19: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f23: Expected O, but got Unknown
			//IL_0f56: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f60: Expected O, but got Unknown
			//IL_0f93: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f9d: Expected O, but got Unknown
			//IL_0fd0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fda: Expected O, but got Unknown
			//IL_100d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1017: Expected O, but got Unknown
			//IL_104a: Unknown result type (might be due to invalid IL or missing references)
			//IL_1054: Expected O, but got Unknown
			//IL_1087: Unknown result type (might be due to invalid IL or missing references)
			//IL_1091: Expected O, but got Unknown
			//IL_10e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_10ee: Expected O, but got Unknown
			Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable/disable Pix.Paranoia.");
			DebugLogging = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "DebugLogging", false, "Enable debug logs.");
			UseSleepDeprivation = ((BaseUnityPlugin)this).Config.Bind<bool>("Sleep", "UseSleepDeprivation", true, "If true, paranoia ramps based on days without sleep.");
			DaysWithoutSleepThreshold = ((BaseUnityPlugin)this).Config.Bind<int>("Sleep", "DaysWithoutSleepThreshold", 1, "Days without sleep before paranoia begins (Default: 1).");
			TickIntervalSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "TickIntervalSeconds", 1.25f, "How often the engine checks to fire a paranoia event.");
			BaseEventChancePerTick = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "BaseEventChancePerTick", 0.035f, "Base chance per tick to attempt an event (tiers multiply).");
			NightChanceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Bias", "NightChanceMultiplier", 1.6f, "Multiplier to event chance at night.");
			GlobalCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Cooldowns", "GlobalCooldownSeconds", 120f, "Global cooldown after any paranoia event.");
			ForeshadowCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Cooldowns", "ForeshadowCooldownSeconds", 45f, "Cooldown for Foreshadowing events.");
			DisplacementCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Cooldowns", "DisplacementCooldownSeconds", 90f, "Cooldown for Displacement events.");
			ViolationCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Cooldowns", "ViolationCooldownSeconds", 220f, "Cooldown for Violation events.");
			ViolationForeignBiomeChance = ((BaseUnityPlugin)this).Config.Bind<float>("Biome", "ViolationForeignBiomeChance", 0.08f, "When a VIOLATION event fires, chance (0-1) to pick the pool from a DIFFERENT biome (rare cross-biome \"wrong sound\" moments). This does not change how often Violation events occur; it only affects which biome pool is used once a Violation is chosen. Set to 0 for biome-pure.");
			SameSoundRepeatBlockSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Cooldowns", "SameSoundRepeatBlockSeconds", 300f, "Block repeating the exact same sound for this many seconds.");
			EnableEatTrigger = ((BaseUnityPlugin)this).Config.Bind<bool>("Triggers", "EnableEatTrigger", true, "If true, eating can (rarely) trigger a paranoia sound.");
			EatTriggerChance = ((BaseUnityPlugin)this).Config.Bind<float>("Triggers", "EatTriggerChance", 0.06f, "Chance for an eat-triggered paranoia attempt (still respects cooldowns/safety).");
			DisplacementMinDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Spatial", "DisplacementMinDistance", 18f, "Min distance for displacement sounds (distant).");
			DisplacementMaxDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Spatial", "DisplacementMaxDistance", 45f, "Max distance for displacement sounds (distant).");
			ForeshadowDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Spatial", "ForeshadowDistance", 7f, "Distance for foreshadow sounds (near).");
			ViolationDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Spatial", "ViolationDistance", 5f, "Distance for violation sounds (very near).");
			DisableDuringActiveEvent = ((BaseUnityPlugin)this).Config.Bind<bool>("Safety", "DisableDuringActiveEvent", true, "If true, paranoia won't fire during raids/random events.");
			ForcePlayAudioSources = ((BaseUnityPlugin)this).Config.Bind<bool>("Testing", "ForcePlayAudioSources", true, "If true, spawned sfx will force-play any AudioSource components found (helps testing).");
			ForcedNearSpawnDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Testing", "ForcedNearSpawnDistance", 2.5f, "Distance used when pn_fire spawns an explicit prefab name (keeps it close).");
			SleepTest_DaySeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Testing", "SleepTest_DaySeconds", 1800f, "Seconds per 'day' for Paranoia sleep-deprivation.");
			Meadows_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Meadows", "Foreshadow", "AUTO", "CSV list of sfx prefab names.");
			Meadows_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Meadows", "Displacement", "AUTO", "CSV list of sfx prefab names.");
			Meadows_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Meadows", "Violation", "AUTO", "CSV list of sfx prefab names.");
			BlackForest_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - BlackForest", "Foreshadow", "AUTO", "CSV list.");
			BlackForest_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - BlackForest", "Displacement", "AUTO", "CSV list.");
			BlackForest_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - BlackForest", "Violation", "AUTO", "CSV list.");
			Swamp_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Swamp", "Foreshadow", "AUTO", "CSV list.");
			Swamp_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Swamp", "Displacement", "AUTO", "CSV list.");
			Swamp_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Swamp", "Violation", "AUTO", "CSV list.");
			Mountains_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mountains", "Foreshadow", "AUTO", "CSV list.");
			Mountains_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mountains", "Displacement", "AUTO", "CSV list.");
			Mountains_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mountains", "Violation", "AUTO", "CSV list.");
			Plains_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Plains", "Foreshadow", "AUTO", "CSV list.");
			Plains_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Plains", "Displacement", "AUTO", "CSV list.");
			Plains_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Plains", "Violation", "AUTO", "CSV list.");
			Mistlands_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mistlands", "Foreshadow", "AUTO", "CSV list.");
			Mistlands_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mistlands", "Displacement", "AUTO", "CSV list.");
			Mistlands_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Mistlands", "Violation", "AUTO", "CSV list.");
			Ocean_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Ocean", "Foreshadow", "AUTO", "CSV list.");
			Ocean_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Ocean", "Displacement", "AUTO", "CSV list.");
			Ocean_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - Ocean", "Violation", "AUTO", "CSV list.");
			AshLands_Foreshadow = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - AshLands", "Foreshadow", "AUTO", "CSV list.");
			AshLands_Displacement = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - AshLands", "Displacement", "AUTO", "CSV list.");
			AshLands_Violation = ((BaseUnityPlugin)this).Config.Bind<string>("Pools - AshLands", "Violation", "AUTO", "CSV list.");
			EnableParanoidin = ((BaseUnityPlugin)this).Config.Bind<bool>("Paranoidin", "EnableParanoidin", true, "Enable/disable the Paranoidin sequence (Phase 2).");
			ParanoidinChancePerTickSevere = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "ChancePerTickSevere", 0.01f, "Chance per tick (Tier >= MinTier) to start a Paranoidin sequence. This is *in addition* to audio events.");
			ParanoidinChancePerTickModerate = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "ChancePerTickModerate", 0.0045f, "Chance per tick when Tier=Moderate to start a Paranoidin sequence.");
			ParanoidinChancePerTickMild = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "ChancePerTickMild", 0.0015f, "Chance per tick when Tier=Mild to start a Paranoidin sequence.");
			ParanoidinMinTier = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "MinTier", "Moderate", "Minimum paranoia tier required for Paranoidin to naturally start: None, Mild, Moderate, Severe.");
			ParanoidinCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "CooldownSeconds", 180f, "Cooldown after a Paranoidin sequence starts (seconds).");
			ParanoidinEnvironmentEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Paranoidin", "EnvironmentEnabled", true, "If false, Paranoidin will not force any environment/overlay changes.");
			DisableParanoiaTickDuringRespawnLockout = ((BaseUnityPlugin)this).Config.Bind<bool>("Safety", "DisableParanoiaTickDuringRespawnLockout", true, "If true, ParanoiaEngine tick logic is suppressed for a short window during death/respawn transitions to avoid engine edge cases.");
			RespawnLockoutSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Safety", "RespawnLockoutSeconds", 20f, "Seconds to suppress ParanoiaEngine + Paranoidin logic during death/respawn transitions.");
			ParanoidinPrefabNames = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "PrefabNames", "Odin", "CSV list of prefabs to try for Paranoidin visuals (first found is used). Default tries 'Odin'.");
			ParanoidinFarShowDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "FarShowDistance", 35f, "Distance for the initial far Odin sighting (tease).");
			ParanoidinFarShowSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "FarShowSeconds", 2f, "How long the far Odin stays before vanishing.");
			ParanoidinStartDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "StartDistance", 18f, "Initial Paranoidin spawn distance (closer than the far tease).");
			ParanoidinMinDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "MinDistance", 7f, "Minimum distance Paranoidin will teleport to.");
			ParanoidinTeleportStep = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "TeleportStep", 3.5f, "How much closer Paranoidin moves when you break line of sight.");
			ParanoidinTeleportCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "TeleportCooldown", 0.85f, "Minimum seconds between Paranoidin teleports.");
			ParanoidinDespawnDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "DespawnDistance", 60f, "If player gets farther than this, Paranoidin despawns.");
			ParanoidinHoldSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "HoldSeconds", 3f, "Attack only if LOS + proximity is maintained for this many seconds.");
			ParanoidinAttackRange = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "AttackRange", 10f, "Attack range (meters).");
			ParanoidinAttackWindupSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "AttackWindupSeconds", 1.15f, "Wind-up seconds before the hit lands (gives a chance to block).");
			ParanoidinAttackDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Paranoidin", "AttackDamage", 50f, "Damage dealt by Paranoidin hit (blunt).");
			ParanoidinDamageRequiresServer = ((BaseUnityPlugin)this).Config.Bind<bool>("Paranoidin", "DamageRequiresServer", true, "If true, damage only applies when running as server/host (avoids MP client desync).");
			ParanoidinDebugAllowClientDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("Paranoidin", "DebugAllowClientDamage", false, "Testing only. If true, allows damage even when not server/host.");
			ParanoidinWarningSfx = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "WarningSfx", "", "CSV list of sfx_ prefabs to play during warnings (optional).");
			ParanoidinStepSfx = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "StepSfx", "", "CSV list of sfx_ prefabs to play when Paranoidin teleports closer (optional).");
			ParanoidinAttackSfx = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "AttackSfx", "", "CSV list of sfx_ prefabs to play right before the hit (optional).");
			ParanoidinHauntSfx = ((BaseUnityPlugin)this).Config.Bind<string>("Paranoidin", "HauntSfx", "sfx_wraith_idle,sfx_ghost_idle", "CSV list of ambient haunting SFX played when Paranoidin stalking begins.");
			CfgHallucinationEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Hallucination", "Enabled", true, "Enable/disable the Hallucination dungeon feature.");
			CfgHallucinationWarningTimeSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination", "WarningTimeSeconds", 5f, new ConfigDescription("Seconds after entering dungeon before warning message appears.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 60f), Array.Empty<object>()));
			CfgHallucinationTriggerTimeSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination", "TriggerTimeSeconds", 60f, new ConfigDescription("Seconds after entering dungeon before hallucination effect triggers.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
			CfgHallucinationDurationSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination", "DurationSeconds", 300f, new ConfigDescription("How long the hallucination status effect lasts (seconds).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(60f, 600f), Array.Empty<object>()));
			CfgHallucinationGlobalCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination", "GlobalCooldownSeconds", 600f, new ConfigDescription("Global cooldown before hallucination can trigger again (seconds).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(300f, 3600f), Array.Empty<object>()));
			CfgHallucinationWarningMessage = ((BaseUnityPlugin)this).Config.Bind<string>("Hallucination", "WarningMessage", "Be quick, the air is thick.", "Warning message shown when entering dungeon.");
			CfgHallucinationTriggerMessage = ((BaseUnityPlugin)this).Config.Bind<string>("Hallucination", "TriggerMessage", "Your mind begins to warp", "Message shown when hallucination effect is applied.");
			CfgHallucinationRainbowEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Hallucination.Visuals", "RainbowEnabled", true, "Enable rainbow color cycling on objects (acid trip effect).");
			CfgHallucinationRainbowDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Visuals", "RainbowDistance", 30f, new ConfigDescription("Maximum distance for rainbow effect on objects.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 100f), Array.Empty<object>()));
			CfgHallucinationMaxFakeCreatures = ((BaseUnityPlugin)this).Config.Bind<int>("Hallucination.FakeCreatures", "MaxFakeCreatures", 3, new ConfigDescription("Maximum number of fake creatures that can exist at once.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
			CfgHallucinationFakeCreatureSpawnInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.FakeCreatures", "SpawnInterval", 15f, new ConfigDescription("Seconds between fake creature spawns.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(5f, 60f), Array.Empty<object>()));
			CfgHallucinationFakeCreatureMinDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.FakeCreatures", "MinDistance", 10f, new ConfigDescription("Minimum spawn distance from player.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(5f, 50f), Array.Empty<object>()));
			CfgHallucinationFakeCreatureMaxDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.FakeCreatures", "MaxDistance", 25f, new ConfigDescription("Maximum spawn distance from player.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 100f), Array.Empty<object>()));
			CfgHallucinationFakeCreatureBiomeOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("Hallucination.FakeCreatures", "BiomeOnly", true, "If true, fake creatures will only spawn from the player's current biome pool.");
			CfgHallucinationFakeCreatureChaotic = ((BaseUnityPlugin)this).Config.Bind<bool>("Hallucination.FakeCreatures", "Chaotic", false, "Overrides BiomeOnly. Spawns fully random creatures including bosses and rare monsters for maximum chaos.");
			CfgHallucinationBlurStrength = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Blur", "BlurStrength", 0.8f, new ConfigDescription("Overall blur intensity multiplier.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>()));
			CfgHallucinationBlurIterations = ((BaseUnityPlugin)this).Config.Bind<int>("Hallucination.Blur", "BlurIterations", 3, new ConfigDescription("Number of blur downsample passes. Higher = blurrier but costs more.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 6), Array.Empty<object>()));
			CfgHallucinationBlurDownsample = ((BaseUnityPlugin)this).Config.Bind<int>("Hallucination.Blur", "Downsample", 1, new ConfigDescription("Downsample factor per iteration (power of 2). 1 = half res, 2 = quarter res.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 3), Array.Empty<object>()));
			CfgHallucinationEdgeWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Blur", "EdgeWidth", 0.4f, new ConfigDescription("How far the edge vignette extends inward (0 = none, 1 = full screen).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			CfgHallucinationEdgeSoftness = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Blur", "EdgeSoftness", 0.3f, new ConfigDescription("Softness of the vignette edge transition.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 1f), Array.Empty<object>()));
			CfgHallucinationPulseSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Blur", "PulseSpeed", 1.5f, new ConfigDescription("Speed of the pulsing effect (cycles per second).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 5f), Array.Empty<object>()));
			CfgHallucinationPulseAmplitude = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Blur", "PulseAmplitude", 0.3f, new ConfigDescription("Strength of the pulse (0 = no pulse, 1 = double intensity at peak).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			CfgHallucinationOnsetBurialChambers = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "BurialChambersSeconds", 30f, new ConfigDescription("Seconds before hallucination onset in Burial Chambers (DG_ForestCrypt).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
			CfgHallucinationOnsetTrollCave = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "TrollCaveSeconds", 45f, new ConfigDescription("Seconds before hallucination onset in Troll Caves (DG_TrollCave).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
			CfgHallucinationOnsetSunkenCrypt = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "SunkenCryptSeconds", 60f, new ConfigDescription("Seconds before hallucination onset in Sunken Crypts (DG_SunkenCrypt).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
			CfgHallucinationOnsetFrostCave = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "FrostCaveSeconds", 75f, new ConfigDescription("Seconds before hallucination onset in Frost Caves (DG_FrostCave).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
			CfgHallucinationOnsetSealedTower = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "SealedTowerSeconds", 90f, new ConfigDescription("Seconds before hallucination onset in Sealed Towers (DG_SealedTower).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 600f), Array.Empty<object>()));
			CfgHallucinationOnsetInfestedMine = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "InfestedMineSeconds", 105f, new ConfigDescription("Seconds before hallucination onset in Infested Mines (DG_DvergrMine).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 600f), Array.Empty<object>()));
			CfgHallucinationOnsetPutridHole = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "PutridHoleSeconds", 120f, new ConfigDescription("Seconds before hallucination onset in Putrid Holes (DG_PutridHole).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 600f), Array.Empty<object>()));
			CfgHallucinationOnsetSmoulderingTomb = ((BaseUnityPlugin)this).Config.Bind<float>("Hallucination.Onset", "SmoulderingTombSeconds", 150f, new ConfigDescription("Seconds before hallucination onset in Smouldering Tombs (DG_SmoulderingTomb).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 600f), Array.Empty<object>()));
			CfgWhisperingGreydwarfEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("WhisperingGreydwarfs", "Enabled", true, "Enable/disable Whispering Greydwarfs (emit DemonicWhisperLoop instead of normal sounds).");
			CfgWhisperingGreydwarfChance = ((BaseUnityPlugin)this).Config.Bind<float>("WhisperingGreydwarfs", "SpawnChance", 0.15f, new ConfigDescription("Chance (0-1) that a spawned greydwarf becomes a whispering variant.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
		}

		internal static void TryExtractEmbeddedResources()
		{
			try
			{
				string text = null;
				try
				{
					text = Path.GetDirectoryName(typeof(ParanoiaPlugin).Assembly.Location);
				}
				catch
				{
					text = null;
				}
				if (string.IsNullOrEmpty(text))
				{
					try
					{
						text = Paths.PluginPath;
					}
					catch
					{
						text = null;
					}
				}
				if (!string.IsNullOrEmpty(text))
				{
					TryExtractOne("ParanoiaSE.png", Path.Combine(text, "ParanoiaSE.png"));
					TryExtractOne("HallucinateSE.png", Path.Combine(text, "HallucinateSE.png"));
					TryExtractOne("NauseaSE.png", Path.Combine(text, "NauseaSE.png"));
					string path = Path.Combine(text, "Assets");
					TryExtractOne("px_paranoia_haunts", Path.Combine(path, "px_paranoia_haunts"));
					TryExtractOne("px_relics", Path.Combine(path, "px_relics"));
					TryExtractOne("px_paranoia_haunts", Path.Combine(text, "px_paranoia_haunts"));
					TryExtractOne("px_relics", Path.Combine(text, "px_relics"));
				}
			}
			catch
			{
			}
		}

		private static void TryExtractOne(string embeddedSuffix, string outputPath)
		{
			try
			{
				if (string.IsNullOrEmpty(embeddedSuffix) || string.IsNullOrEmpty(outputPath) || File.Exists(outputPath))
				{
					return;
				}
				byte[] array = null;
				try
				{
					array = ResourcesEmbedded.ReadAllBytesBySuffix(embeddedSuffix);
				}
				catch
				{
					array = null;
				}
				if (array != null && array.Length != 0)
				{
					string directoryName = Path.GetDirectoryName(outputPath);
					if (!string.IsNullOrEmpty(directoryName))
					{
						Directory.CreateDirectory(directoryName);
					}
					File.WriteAllBytes(outputPath, array);
				}
			}
			catch
			{
			}
		}

		internal static void LogInfo(string msg)
		{
			ParanoiaPlugin self = _self;
			if (self != null)
			{
				ManualLogSource logger = ((BaseUnityPlugin)self).Logger;
				if (logger != null)
				{
					logger.LogInfo((object)msg);
				}
			}
		}

		internal static void LogWarning(string msg)
		{
			ParanoiaPlugin self = _self;
			if (self != null)
			{
				ManualLogSource logger = ((BaseUnityPlugin)self).Logger;
				if (logger != null)
				{
					logger.LogWarning((object)msg);
				}
			}
		}

		internal static void LogDebug(string msg)
		{
			if (DebugLogging == null || !DebugLogging.Value)
			{
				return;
			}
			ParanoiaPlugin self = _self;
			if (self != null)
			{
				ManualLogSource logger = ((BaseUnityPlugin)self).Logger;
				if (logger != null)
				{
					logger.LogInfo((object)("[DEBUG] " + msg));
				}
			}
		}

		internal static void LogWarn(string msg)
		{
			ParanoiaPlugin self = _self;
			if (self != null)
			{
				ManualLogSource logger = ((BaseUnityPlugin)self).Logger;
				if (logger != null)
				{
					logger.LogWarning((object)msg);
				}
			}
		}

		internal static void TryRegisterParanoidinRpc()
		{
			try
			{
				if (!_paranoidinRpcRegistered && ZRoutedRpc.instance != null)
				{
					_paranoidinRpcRegistered = true;
					ZRoutedRpc.instance.Register<ZPackage>("PX_ParanoidinDamage", (Action<long, ZPackage>)RPC_ParanoidinDamage);
				}
			}
			catch
			{
			}
		}

		private static void RPC_ParanoidinDamage(long sender, ZPackage pkg)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: 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)
			try
			{
				if ((Object)(object)ZNet.instance == (Object)null || !ZNet.instance.IsServer() || (Object)(object)ZNetScene.instance == (Object)null)
				{
					return;
				}
				ZDOID val = pkg.ReadZDOID();
				float bluntDamage = pkg.ReadSingle();
				Vector3 point = pkg.ReadVector3();
				Vector3 dir = pkg.ReadVector3();
				float pushForce = pkg.ReadSingle();
				GameObject val2 = ZNetScene.instance.FindInstance(val);
				if (Object.op_Implicit((Object)(object)val2))
				{
					Player component = val2.GetComponent<Player>();
					if (Object.op_Implicit((Object)(object)component) && !((Character)component).IsDead())
					{
						ApplyParanoidinDamageLocal(component, bluntDamage, point, dir, pushForce);
					}
				}
			}
			catch
			{
			}
		}

		internal static void ApplyParanoidinDamageAuthoritative(Player player, float bluntDamage, Vector3 point, Vector3 dir, float pushForce)
		{
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)player == (Object)null || ((Character)player).IsDead())
				{
					return;
				}
				bool flag = true;
				try
				{
					flag = ParanoidinDamageRequiresServer == null || ParanoidinDamageRequiresServer.Value;
				}
				catch
				{
					flag = true;
				}
				if (flag && (Object)(object)ZNet.instance != (Object)null && !ZNet.instance.IsServer())
				{
					TryRegisterParanoidinRpc();
					if (ZRoutedRpc.instance == null)
					{
						return;
					}
					ZPackage val = new ZPackage();
					val.Write(((Character)player).GetZDOID());
					val.Write(bluntDamage);
					val.Write(point);
					val.Write(dir);
					val.Write(pushForce);
					long num = 0L;
					try
					{
						ZNetPeer val2 = (((Object)(object)ZNet.instance != (Object)null) ? ZNet.instance.GetServerPeer() : null);
						if (val2 != null)
						{
							num = val2.m_uid;
						}
					}
					catch
					{
					}
					ZRoutedRpc.instance.InvokeRoutedRPC(num, "PX_ParanoidinDamage", new object[1] { val });
				}
				else
				{
					ApplyParanoidinDamageLocal(player, bluntDamage, point, dir, pushForce);
				}
			}
			catch
			{
			}
		}

		private static void ApplyParanoidinDamageLocal(Player player, float bluntDamage, Vector3 point, Vector3 dir, float pushForce)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!((Object)(object)player == (Object)null) && !((Character)player).IsDead())
				{
					HitData val = new HitData();
					val.m_damage.m_blunt = bluntDamage;
					val.m_point = point;
					val.m_dir = dir;
					val.m_pushForce = pushForce;
					((Character)player).Damage(val);
				}
			}
			catch
			{
			}
		}
	}
	internal enum ParanoiaCategory
	{
		Foreshadow,
		Displacement,
		Violation
	}
	internal enum ParanoiaTier
	{
		None,
		Mild,
		Moderate,
		Severe
	}
	internal sealed class ParanoiaEngine : MonoBehaviour
	{
		internal enum FireResult
		{
			Fired,
			NotReady,
			NoLocalPlayer,
			PrefabNotFound,
			GateBlocked,
			RepeatBlocked,
			CooldownBlocked,
			SpawnFailed
		}

		private sealed class FalseEventProfile
		{
			public string Id;

			public string DisplayName;

			public int DeckWeight = 1;

			public float DurationSeconds = 60f;

			public float StartDelaySeconds = 0f;

			public float PulseIntervalSeconds = 12f;

			public string StartMessage;

			public string PulseMessage;

			public string EndMessage;

			public bool DoPuke;

			public float StaminaDrainOnStart;

			public bool FakeHitOnStart;

			public bool TimeDistortion;

			public string StartOneShotOgg;

			public float StartOneShotVolume = 1f;

			public string StartAmbienceOgg;

			public float StartAmbienceVolume = 0.7f;

			public string PulseOneShotOgg;

			public float PulseOneShotVolume = 1f;

			public bool PulsePreferVanillaSfx;

			public string[] PulseVanillaSfxPrefabs;

			public bool PulseBehindPlayer = true;

			public float PulseBehindMeters = 3f;

			public float OneShotCooldownSeconds = 6f;
		}

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

			private object <>2__current;

			public ParanoiaEngine <>4__this;

			private Player <lp>5__1;

			private float <idleSeconds>5__2;

			private FalseEventProfile <next>5__3;

			private float <dur>5__4;

			private float <roll>5__5;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0144: Unknown result type (might be due to invalid IL or missing references)
				//IL_014e: Expected O, but got Unknown
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0066: Expected O, but got Unknown
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				case 3:
					<>1__state = -1;
					if (<>4__this._falseEventActive)
					{
						break;
					}
					<next>5__3 = null;
					try
					{
						<next>5__3 = <>4__this.PickNextFalseEventFromDeck();
					}
					catch
					{
						<next>5__3 = null;
					}
					if (<next>5__3 != null && !string.IsNullOrEmpty(<next>5__3.Id))
					{
						try
						{
							<dur>5__4 = Mathf.Max(1f, <next>5__3.DurationSeconds);
						}
						catch
						{
							<dur>5__4 = 8f;
						}
						try
						{
							<>4__this.StartFalseEvent_Local(<next>5__3.Id, <dur>5__4);
						}
						catch
						{
						}
						<lp>5__1 = null;
						<next>5__3 = null;
					}
					break;
				}
				<lp>5__1 = Player.m_localPlayer;
				if ((Object)(object)<lp>5__1 == (Object)null)
				{
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				}
				if (<>4__this._falseEventActive)
				{
					<>2__current = (object)new WaitForSeconds(0.25f);
					<>1__state = 2;
					return true;
				}
				try
				{
					<roll>5__5 = Random.value;
					if (<roll>5__5 < 0.7f)
					{
						<idleSeconds>5__2 = Random.Range(3600f, 7200f);
					}
					else if (<roll>5__5 < 0.9f)
					{
						<idleSeconds>5__2 = Random.Range(7200f, 10800f);
					}
					else
					{
						<idleSeconds>5__2 = Random.Range(10800f, 14400f);
					}
				}
				catch
				{
					<idleSeconds>5__2 = 5400f;
				}
				<>2__current = (object)new WaitForSeconds(<idleSeconds>5__2);
				<>1__state = 3;
				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 <FalseEvent_MainLoop>d__110 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public ParanoiaEngine <>4__this;

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

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

			[DebuggerHidden]
			public <FalseEvent_MainLoop>d__110(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;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<>4__this._falseEventActive && !(Time.time >= <>4__this._falseEventEndsAt))
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				<>4__this.StopFalseEvent_Local();
				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 <FalseEvent_PulseLoop>d__111 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public ParanoiaEngine <>4__this;

			private FalseEventProfile <p>5__1;

			private float <every>5__2;

			private Vector3 <pos>5__3;

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

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

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

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

			private bool MoveNext()
			{
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01af: Expected O, but got Unknown
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0135: Unknown result type (might be due to invalid IL or missing references)
				//IL_0090: 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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					<p>5__1 = null;
					break;
				}
				if (<>4__this._falseEventActive)
				{
					<p>5__1 = <>4__this._activeFalseEvent;
					if (<p>5__1 != null)
					{
						<every>5__2 = Mathf.Max(0.25f, <p>5__1.PulseIntervalSeconds);
						<pos>5__3 = Vector3.zero;
						try
						{
							<pos>5__3 = <>4__this.GetPulsePosition(<p>5__1.PulseBehindPlayer, <p>5__1.PulseBehindMeters);
						}
						catch
						{
							<pos>5__3 = Vector3.zero;
						}
						try
						{
							if (!string.IsNullOrEmpty(<p>5__1.PulseOneShotOgg))
							{
								<>4__this.TryPlayFalseEventOneShot(<p>5__1.PulseOneShotOgg, <p>5__1.PulseOneShotVolume, <p>5__1.PulseBehindPlayer);
							}
						}
						catch
						{
						}
						try
						{
							if (<p>5__1.PulsePreferVanillaSfx && <p>5__1.PulseVanillaSfxPrefabs != null && <p>5__1.PulseVanillaSfxPrefabs.Length != 0)
							{
								<>4__this.TryPlayVanillaSfxAt(<pos>5__3, <p>5__1.PulseVanillaSfxPrefabs);
							}
							else if (!string.IsNullOrEmpty(<p>5__1.PulseOneShotOgg))
							{
								<>4__this.TryPlayFalseEventOneShot(<p>5__1.PulseOneShotOgg, <p>5__1.PulseOneShotVolume, <p>5__1.PulseBehindPlayer);
							}
						}
						catch
						{
						}
						<>2__current = (object)new WaitForSeconds(<every>5__2);
						<>1__state = 1;
						return true;
					}
				}
				return false;
			}

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

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

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

			private object <>2__current;

			public Player player;

			public ParanoiaEngine <>4__this;

			private float <endAt>5__1;

			private Vector3 <p>5__2;

			private Vector3 <dir>5__3;

			private Vector3 <look>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0110: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_0129: Unknown result type (might be due to invalid IL or missing references)
				//IL_012e: 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_016d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_017d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0182: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<endAt>5__1 = Time.time + 2f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<>4__this._paranoidinActive && Time.time < <endAt>5__1 && !((Object)(object)player == (Object)null) && !((Character)player).IsDead())
				{
					try
					{
						if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
						{
							<p>5__2 = ((Component)player).transform.position;
							<dir>5__3 = <>4__this._paranoidinGo.transform.position - <p>5__2;
							<dir>5__3.y = 0f;
							if (((Vector3)(ref <dir>5__3)).sqrMagnitude < 0.001f)
							{
								<dir>5__3 = ((Component)player).transform.forward;
							}
							((Vector3)(ref <dir>5__3)).Normalize();
							<>4__this._paranoidinPos += <dir>5__3 * 11f * Time.deltaTime;
							<>4__this.ClampToGroundStable(ref <>4__this._paranoidinPos);
							<>4__this._paranoidinGo.transform.position = <>4__this._paranoidinPos;
							<look>5__4 = <p>5__2 - <>4__this._paranoidinPos;
							<look>5__4.y = 0f;
							if (((Vector3)(ref <look>5__4)).sqrMagnitude > 0.01f)
							{
								<>4__this._paranoidinGo.transform.rotation = Quaternion.LookRotation(((Vector3)(ref <look>5__4)).normalized);
							}
						}
					}
					catch
					{
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				try
				{
					<>4__this.ForceTerminateParanoidin();
				}
				catch
				{
				}
				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 <Haunt3_PunishToOneHp_ThenEnd>d__198 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public ParanoiaEngine <>4__this;

			private float <snapEndAt>5__1;

			private Vector3 <p>5__2;

			private Vector3 <look>5__3;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0092: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<snapEndAt>5__1 = Time.time + 0.35f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<>4__this._paranoidinActive && Time.time < <snapEndAt>5__1 && !((Object)(object)player == (Object)null) && !((Character)player).IsDead())
				{
					try
					{
						if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
						{
							<p>5__2 = ((Component)player).transform.position;
							<look>5__3 = <p>5__2 - <>4__this._paranoidinGo.transform.position;
							<look>5__3.y = 0f;
							if (((Vector3)(ref <look>5__3)).sqrMagnitude > 0.01f)
							{
								<>4__this._paranoidinGo.transform.rotation = Quaternion.LookRotation(((Vector3)(ref <look>5__3)).normalized);
							}
						}
					}
					catch
					{
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				try
				{
					<>4__this.Haunt3_DropPlayerToOneHpAuthoritative(player);
				}
				catch
				{
				}
				try
				{
					<>4__this.ForceTerminateParanoidin();
				}
				catch
				{
				}
				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 <Haunt3_ShooAway>d__197 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public ParanoiaEngine <>4__this;

			private float <endAt>5__1;

			private Vector3 <p>5__2;

			private Vector3 <dir>5__3;

			private Vector3 <look>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0110: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_0129: Unknown result type (might be due to invalid IL or missing references)
				//IL_012e: 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_016d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_017d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0182: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<endAt>5__1 = Time.time + 1.75f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<>4__this._paranoidinActive && Time.time < <endAt>5__1 && !((Object)(object)player == (Object)null) && !((Character)player).IsDead())
				{
					try
					{
						if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
						{
							<p>5__2 = ((Component)player).transform.position;
							<dir>5__3 = <>4__this._paranoidinGo.transform.position - <p>5__2;
							<dir>5__3.y = 0f;
							if (((Vector3)(ref <dir>5__3)).sqrMagnitude < 0.001f)
							{
								<dir>5__3 = ((Component)player).transform.forward;
							}
							((Vector3)(ref <dir>5__3)).Normalize();
							<>4__this._paranoidinPos += <dir>5__3 * 12.5f * Time.deltaTime;
							<>4__this.ClampToGroundStable(ref <>4__this._paranoidinPos);
							<>4__this._paranoidinGo.transform.position = <>4__this._paranoidinPos;
							<look>5__4 = <p>5__2 - <>4__this._paranoidinPos;
							<look>5__4.y = 0f;
							if (((Vector3)(ref <look>5__4)).sqrMagnitude > 0.01f)
							{
								<>4__this._paranoidinGo.transform.rotation = Quaternion.LookRotation(((Vector3)(ref <look>5__4)).normalized);
							}
						}
					}
					catch
					{
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				try
				{
					<>4__this.ForceTerminateParanoidin();
				}
				catch
				{
				}
				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 <Haunt4_ShooAway>d__203 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public ParanoiaEngine <>4__this;

			private float <endAt>5__1;

			private Vector3 <p>5__2;

			private Vector3 <dir>5__3;

			private Vector3 <look>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0110: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_0129: Unknown result type (might be due to invalid IL or missing references)
				//IL_012e: 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_016d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_017d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0182: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<endAt>5__1 = Time.time + 2.2f;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (<>4__this._paranoidinActive && Time.time < <endAt>5__1 && !((Object)(object)player == (Object)null) && !((Character)player).IsDead())
				{
					try
					{
						if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
						{
							<p>5__2 = ((Component)player).transform.position;
							<dir>5__3 = <>4__this._paranoidinGo.transform.position - <p>5__2;
							<dir>5__3.y = 0f;
							if (((Vector3)(ref <dir>5__3)).sqrMagnitude < 0.001f)
							{
								<dir>5__3 = ((Component)player).transform.forward;
							}
							((Vector3)(ref <dir>5__3)).Normalize();
							<>4__this._paranoidinPos += <dir>5__3 * 12f * Time.deltaTime;
							<>4__this.ClampToGroundStable(ref <>4__this._paranoidinPos);
							<>4__this._paranoidinGo.transform.position = <>4__this._paranoidinPos;
							<look>5__4 = <p>5__2 - <>4__this._paranoidinPos;
							<look>5__4.y = 0f;
							if (((Vector3)(ref <look>5__4)).sqrMagnitude > 0.01f)
							{
								<>4__this._paranoidinGo.transform.rotation = Quaternion.LookRotation(((Vector3)(ref <look>5__4)).normalized);
							}
						}
					}
					catch
					{
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				try
				{
					<>4__this.ForceTerminateParanoidin();
				}
				catch
				{
				}
				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 <ParanoidinRoutineDispatch>d__126 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public bool force;

			public bool ignoreCooldowns;

			public ParanoiaEngine <>4__this;

			private int <idx>5__1;

			private IEnumerator <inner>5__2;

			private int <>s__3;

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

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

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

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

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<idx>5__1 = <>4__this.PickHauntIndex();
					int num = <idx>5__1;
					<>s__3 = num;
					switch (<>s__3)
					{
					case 2:
						<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt2(player, force, ignoreCooldowns);
						break;
					case 3:
						<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt3(player, force, ignoreCooldowns);
						break;
					case 4:
						<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt4(player, force, ignoreCooldowns);
						break;
					case 5:
						<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt5(player, force, ignoreCooldowns);
						break;
					default:
						<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt1(player, force, ignoreCooldowns);
						break;
					}
					<>2__current = <inner>5__2;
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					if (!ignoreCooldowns)
					{
						try
						{
							<>4__this._nextAllowed_Paranoidin = Time.time + Mathf.Max(2f, ParanoiaPlugin.ParanoidinCooldownSeconds.Value);
						}
						catch
						{
							<>4__this._nextAllowed_Paranoidin = Time.time + 60f;
						}
					}
					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 <ParanoidinRoutine_Haunt1>d__185 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public bool force;

			public bool ignoreCooldowns;

			public ParanoiaEngine <>4__this;

			private bool <willAttack>5__1;

			private float <hauntEndAt>5__2;

			private float <attackEarliestAt>5__3;

			private GameObject <farOdin>5__4;

			private Vector3 <farPos>5__5;

			private float <showFor>5__6;

			private float <tShow>5__7;

			private float <beat>5__8;

			private float <tBeat>5__9;

			private Vector3 <startPos>5__10;

			private Vector3 <ppos>5__11;

			private float <dist>5__12;

			private bool <hasLos>5__13;

			private bool <preferFrontAnchor>5__14;

			private float <attackRange>5__15;

			private float <cd>5__16;

			private float <wind>5__17;

			private float <tWind>5__18;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || (uint)(num - 1) <= 3u)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<farOdin>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_05a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_05a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_0538: Unknown result type (might be due to invalid IL or missing references)
				//IL_0564: Unknown result type (might be due to invalid IL or missing references)
				//IL_0224: Unknown result type (might be due to invalid IL or missing references)
				//IL_0229: Unknown result type (might be due to invalid IL or missing references)
				//IL_0236: Unknown result type (might be due to invalid IL or missing references)
				//IL_03f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_040d: Unknown result type (might be due to invalid IL or missing references)
				//IL_044d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0436: Unknown result type (might be due to invalid IL or missing references)
				//IL_0452: Unknown result type (might be due to invalid IL or missing references)
				//IL_04a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_04ae: Unknown result type (might be due to invalid IL or missing references)
				//IL_04f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_068c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0675: Unknown result type (might be due to invalid IL or missing references)
				//IL_0691: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_06ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_077b: Unknown result type (might be due to invalid IL or missing references)
				//IL_079c: Unknown result type (might be due to invalid IL or missing references)
				//IL_07a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_092b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0914: Unknown result type (might be due to invalid IL or missing references)
				//IL_0930: Unknown result type (might be due to invalid IL or missing references)
				//IL_093c: Unknown result type (might be due to invalid IL or missing references)
				bool result;
				try
				{
					switch (<>1__state)
					{
					default:
						result = false;
						goto end_IL_0000;
					case 0:
						<>1__state = -1;
						<>4__this._paranoidinActive = true;
						<>4__this._paranoidinAttacking = false;
						<>4__this._paranoidinLosHold = 0f;
						<>4__this._paranoidinNearHold = 0f;
						<>4__this._paranoidinLastTeleportAt = 0f;
						<>4__this._paranoidinGroundInit = false;
						<>4__this._paranoidinNextGroundSampleAt = 0f;
						<>4__this._paranoidinLastGroundSampleXZ = Vector3.zero;
						<>4__this._paranoidinPlayerInit = false;
						<>4__this._paranoidinNextPlayerSampleAt = 0f;
						<>4__this._paranoidinLastPlayerSpeed = 0f;
						<>4__this._paranoidinHasAnchor = false;
						<>4__this._paranoidinNextRetargetAt = 0f;
						<>4__this.TryApplyParanoidinEnvironment(enable: true);
						if (!ignoreCooldowns)
						{
							try
							{
								<>4__this._nextAllowed_Paranoidin = Time.time + Mathf.Max(2f, ParanoiaPlugin.ParanoidinCooldownSeconds.Value);
							}
							catch
							{
								<>4__this._nextAllowed_Paranoidin = Time.time + 30f;
							}
						}
						<willAttack>5__1 = Random.value < 0.6f;
						<hauntEndAt>5__2 = Time.time + Random.Range(25f, 55f);
						<attackEarliestAt>5__3 = Time.time + Random.Range(6f, 16f);
						<farOdin>5__4 = null;
						<>1__state = -3;
						if (!((Object)(object)player == (Object)null) && !((Character)player).IsDead() && !((Object)(object)Player.m_localPlayer != (Object)(object)player))
						{
							<farPos>5__5 = <>4__this.GetParanoidinSpawnPos(player, Mathf.Max(8f, ParanoiaPlugin.ParanoidinFarShowDistance.Value), preferFront: false);
							<farOdin>5__4 = <>4__this.SpawnGhostOdin(<farPos>5__5);
							<showFor>5__6 = Mathf.Clamp(ParanoiaPlugin.ParanoidinFarShowSeconds.Value, 0.6f, 6f);
							<tShow>5__7 = 0f;
							goto IL_02d8;
						}
						<>4__this.ForceTerminateParanoidin();
						result = false;
						<>m__Finally1();
						goto end_IL_0000;
					case 1:
						<>1__state = -3;
						goto IL_02d8;
					case 2:
						<>1__state = -3;
						goto IL_03ad;
					case 3:
						<>1__state = -3;
						goto IL_0a57;
					case 4:
						{
							<>1__state = -3;
							goto IL_0adb;
						}
						IL_02d8:
						if (!<>4__this._paranoidinActive || !(<tShow>5__7 < <showFor>5__6) || (Object)(object)player == (Object)null || ((Character)player).IsDead() || (Object)(object)Player.m_localPlayer != (Object)(object)player)
						{
							if ((Object)(object)<farOdin>5__4 != (Object)null)
							{
								Object.Destroy((Object)(object)<farOdin>5__4);
							}
							<farOdin>5__4 = null;
							<beat>5__8 = Random.Range(0.7f, 1.5f);
							<tBeat>5__9 = 0f;
							goto IL_03ad;
						}
						<tShow>5__7 += Time.deltaTime;
						<>2__current = null;
						<>1__state = 1;
						result = true;
						goto end_IL_0000;
						IL_03ad:
						if (!<>4__this._paranoidinActive || !(<tBeat>5__9 < <beat>5__8) || (Object)(object)player == (Object)null || ((Character)player).IsDead() || (Object)(object)Player.m_localPlayer != (Object)(object)player)
						{
							<startPos>5__10 = <>4__this.GetParanoidinSpawnPos(player, Mathf.Max(6f, ParanoiaPlugin.ParanoidinStartDistance.Value), preferFront: true);
							<>4__this._paranoidinGo = <>4__this.SpawnGhostOdin(<startPos>5__10);
							<>4__this._paranoidinPos = (((Object)(object)<>4__this._paranoidinGo != (Object)null) ? <>4__this._paranoidinGo.transform.position : <startPos>5__10);
							<>4__this._paranoidinGroundY = <>4__this._paranoidinPos.y;
							<>4__this._paranoidinGroundInit = true;
							<>4__this._paranoidinLastGroundSampleXZ = new Vector3(<>4__this._paranoidinPos.x, 0f, <>4__this._paranoidinPos.z);
							<>4__this._paranoidinNextGroundSampleAt = 0f;
							try
							{
								((Character)player).Message((MessageType)2, "You feel watched...", 0, (Sprite)null);
								if ((Object)(object)GameCamera.instance != (Object)null)
								{
									GameCamera.instance.AddShake(((Component)player).transform.position, 15f, 0.3f, false);
								}
							}
							catch
							{
							}
							if (!_pxSuppressHaunt1Sfx)
							{
								((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<>4__this._paranoidinPos, "HorrerAmbience2.ogg", 0.7f));
								((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<>4__this._paranoidinPos, "Haunt1Voice.ogg", 1f));
							}
							<>4__this.UpdatePlayerSpeedEstimate(player);
							<>4__this._paranoidinStalkAnchor = <>4__this.PickAnchorAroundPlayer(player, preferFront: true);
							<>4__this._paranoidinHasAnchor = true;
							<>4__this._paranoidinNextRetargetAt = Time.time + Random.Range(1f, 1.6f);
							goto IL_0adb;
						}
						<tBeat>5__9 += Time.deltaTime;
						<>2__current = null;
						<>1__state = 2;
						result = true;
						goto end_IL_0000;
						IL_0a57:
						if (!<>4__this._paranoidinActive || !(<tWind>5__18 < <wind>5__17) || (Object)(object)player == (Object)null || ((Character)player).IsDead() || (Object)(object)Player.m_localPlayer != (Object)(object)player)
						{
							<>4__this.TryApplyParanoidinDamage(player);
							if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
							{
								<>4__this.EndOdinClamp(<>4__this._paranoidinGo);
							}
							break;
						}
						<tWind>5__18 += Time.deltaTime;
						if ((Object)(object)<>4__this._paranoidinGo != (Object)null && <>4__this._odinClamped)
						{
							<>4__this.UpdateOdinClampAnchor(player);
						}
						<>2__current = null;
						<>1__state = 3;
						result = true;
						goto end_IL_0000;
						IL_0adb:
						if (!<>4__this._paranoidinActive || !(Time.time < <hauntEndAt>5__2) || (Object)(object)player == (Object)null || ((Character)player).IsDead() || (Object)(object)Player.m_localPlayer != (Object)(object)player || (!force && !<>4__this.IsSafeToFire(player)))
						{
							break;
						}
						<>4__this.UpdatePlayerSpeedEstimate(player);
						<ppos>5__11 = (((Object)(object)<>4__this._paranoidinGo != (Object)null) ? <>4__this._paranoidinGo.transform.position : <>4__this._paranoidinPos);
						<dist>5__12 = Vector3.Distance(((Component)player).transform.position, <ppos>5__11);
						if (<dist>5__12 > Mathf.Max(18f, ParanoiaPlugin.ParanoidinDespawnDistance.Value))
						{
							break;
						}
						<hasLos>5__13 = <>4__this.HasLineOfSightSimple(player, <ppos>5__11);
						if (!<hasLos>5__13)
						{
							<cd>5__16 = Mathf.Max(0.1f, ParanoiaPlugin.ParanoidinTeleportCooldown.Value);
							if (Time.time - <>4__this._paranoidinLastTeleportAt >= <cd>5__16)
							{
								<>4__this._paranoidinLastTeleportAt = Time.time;
								<>4__this.TeleBlink(player, ref <ppos>5__11, preferFront: false);
								<>4__this.TryPlayConfiguredSfxAt(<ppos>5__11, ParanoiaPlugin.ParanoidinStepSfx.Value);
								<dist>5__12 = Vector3.Distance(((Component)player).transform.position, <ppos>5__11);
							}
						}
						<preferFrontAnchor>5__14 = Time.time < <attackEarliestAt>5__3;
						<>4__this.DriveChase(player, ref <ppos>5__11, <dist>5__12, <hasLos>5__13, Time.deltaTime, <preferFrontAnchor>5__14);
						if (<hasLos>5__13)
						{
							<>4__this._paranoidinLosHold += Time.deltaTime;
						}
						else
						{
							<>4__this._paranoidinLosHold = 0f;
						}
						<attackRange>5__15 = Mathf.Max(1f, ParanoiaPlugin.ParanoidinAttackRange.Value);
						if (<dist>5__12 <= <attackRange>5__15)
						{
							<>4__this._paranoidinNearHold += Time.deltaTime;
						}
						else
						{
							<>4__this._paranoidinNearHold = 0f;
						}
						if (<willAttack>5__1 && !<>4__this._paranoidinAttacking && Time.time >= <attackEarliestAt>5__3 && (force || <>4__this.GetCurrentTier(player) == ParanoiaTier.Severe))
						{
							<>4__this._paranoidinAttacking = true;
							<>4__this.ForceCloseForAttack(player);
							<ppos>5__11 = (((Object)(object)<>4__this._paranoidinGo != (Object)null) ? <>4__this._paranoidinGo.transform.position : <>4__this._paranoidinPos);
							<>4__this.TryPlayConfiguredSfxAt(<ppos>5__11, ParanoiaPlugin.ParanoidinAttackSfx.Value);
							if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
							{
								<>4__this.BeginOdinClamp(<>4__this._paranoidinGo, player);
							}
							<wind>5__17 = Mathf.Clamp(ParanoiaPlugin.ParanoidinAttackWindupSeconds.Value, 0.35f, 3f);
							<tWind>5__18 = 0f;
							goto IL_0a57;
						}
						<>2__current = null;
						<>1__state = 4;
						result = true;
						goto end_IL_0000;
					}
					<>m__Finally1();
					result = false;
					end_IL_0000:;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
				return result;
			}

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

			private void <>m__Finally1()
			{
				<>1__state = -1;
				try
				{
					PxStopAllHauntSfx();
				}
				catch
				{
				}
				try
				{
					if ((Object)(object)<>4__this._paranoidinGo != (Object)null)
					{
						<>4__this.EndOdinClamp(<>4__this._paranoidinGo);
						Object.Destroy((Object)(object)<>4__this._paranoidinGo);
					}
				}
				catch
				{
				}
				try
				{
					if ((Object)(object)<farOdin>5__4 != (Object)null)
					{
						Object.Destroy((Object)(object)<farOdin>5__4);
					}
				}
				catch
				{
				}
				<>4__this.TryApplyParanoidinEnvironment(enable: false);
				<>4__this._paranoidinGo = null;
				<>4__this._paranoidinActive = false;
				<>4__this._paranoidinAttacking = false;
				<>4__this._paranoidinLosHold = 0f;
				<>4__this._paranoidinNearHold = 0f;
				<>4__this._odinPrevParent = null;
				<>4__this._odinClamped = false;
				<>4__this.DestroyOdinClampAnchor();
				try
				{
					<>4__this.SoftReboot_PreserveSleepState("paranoidin_end");
				}
				catch
				{
				}
			}

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

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

			private object <>2__current;

			public Player player;

			public bool force;

			public bool ignoreCooldowns;

			public ParanoiaEngine <>4__this;

			private GameObject <prevPxPrefab>5__1;

			private IEnumerator <inner>5__2;

			private float <nextCheckAt>5__3;

			private GameObject <h2>5__4;

			private Player <lp0>5__5;

			private Player <p0>5__6;

			private Vector3 <pos0>5__7;

			private object <cur>5__8;

			private Player <lp>5__9;

			private Player <p>5__10;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || (uint)(num - 1) <= 1u)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<prevPxPrefab>5__1 = null;
				<inner>5__2 = null;
				<h2>5__4 = null;
				<lp0>5__5 = null;
				<p0>5__6 = null;
				<cur>5__8 = null;
				<lp>5__9 = null;
				<p>5__10 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_00de: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0103: Unknown result type (might be due to invalid IL or missing references)
				//IL_013a: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<prevPxPrefab>5__1 = <>4__this._pxHaunt1Prefab;
						try
						{
							<h2>5__4 = <>4__this.TryGetPxHauntPrefabByName("PX_Haunt_Haunt2");
							if ((Object)(object)<h2>5__4 != (Object)null)
							{
								<>4__this._pxHaunt1Prefab = <h2>5__4;
							}
							<h2>5__4 = null;
						}
						catch
						{
						}
						try
						{
							<lp0>5__5 = Player.m_localPlayer;
							<p0>5__6 = (((Object)(object)player != (Object)null) ? player : <lp0>5__5);
							<pos0>5__7 = (((Object)(object)<p0>5__6 != (Object)null) ? ((Component)<p0>5__6).transform.position : Vector3.zero);
							if ((Object)(object)Game.instance != (Object)null)
							{
								((MonoBehaviour)Game.instance).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<pos0>5__7, "HorrorAmbience1.ogg", 0.7f));
							}
							if ((Object)(object)Game.instance != (Object)null)
							{
								((MonoBehaviour)Game.instance).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<pos0>5__7, "WhisperBehindYou.ogg", 1f));
							}
							<lp0>5__5 = null;
							<p0>5__6 = null;
						}
						catch
						{
						}
						<inner>5__2 = null;
						_pxSuppressHaunt1Sfx = true;
						try
						{
							<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt1(player, force, ignoreCooldowns);
						}
						catch
						{
							try
							{
								<>4__this.ForceTerminateParanoidin();
							}
							catch
							{
							}
							<inner>5__2 = null;
						}
						<nextCheckAt>5__3 = Time.time;
						<>1__state = -3;
						if (<inner>5__2 == null)
						{
							break;
						}
						goto IL_0327;
					case 1:
						<>1__state = -3;
						break;
					case 2:
						{
							<>1__state = -3;
							<cur>5__8 = null;
							goto IL_0327;
						}
						IL_0327:
						try
						{
							if (!<inner>5__2.MoveNext())
							{
								break;
							}
							<cur>5__8 = <inner>5__2.Current;
							goto IL_0221;
						}
						catch
						{
						}
						break;
						IL_0221:
						if (<>4__this._paranoidinActive && (Object)(object)<>4__this._paranoidinGo != (Object)null && Time.time >= <nextCheckAt>5__3)
						{
							<nextCheckAt>5__3 = Time.time + 0.15f;
							<lp>5__9 = Player.m_localPlayer;
							<p>5__10 = (((Object)(object)player != (Object)null) ? player : <lp>5__9);
							if ((Object)(object)<p>5__10 != (Object)null && <>4__this.Haunt2_IsRepelledByWater(<p>5__10))
							{
								<>2__current = <>4__this.Haunt2_ShooAway(<p>5__10);
								<>1__state = 1;
								return true;
							}
							<lp>5__9 = null;
							<p>5__10 = null;
						}
						<>2__current = <cur>5__8;
						<>1__state = 2;
						return true;
					}
					<>m__Finally1();
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

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

			private void <>m__Finally1()
			{
				<>1__state = -1;
				try
				{
					PxStopAllHauntSfx();
				}
				catch
				{
				}
				try
				{
					_pxSuppressHaunt1Sfx = false;
				}
				catch
				{
				}
				try
				{
					<>4__this.ForceTerminateParanoidin();
				}
				catch
				{
				}
				try
				{
					<>4__this._pxHaunt1Prefab = <prevPxPrefab>5__1;
				}
				catch
				{
				}
			}

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

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

			private object <>2__current;

			public Player player;

			public bool force;

			public bool ignoreCooldowns;

			public ParanoiaEngine <>4__this;

			private GameObject <prevPxPrefab>5__1;

			private IEnumerator <inner>5__2;

			private float <nextCheckAt>5__3;

			private Vector3 <lastPos>5__4;

			private float <lastPosAt>5__5;

			private float <quietHeld>5__6;

			private float <noisyHeld>5__7;

			private GameObject <h3>5__8;

			private Player <lp0>5__9;

			private Vector3 <pos0>5__10;

			private Player <lp>5__11;

			private Player <pInit>5__12;

			private object <cur>5__13;

			private float <now>5__14;

			private Player <lp>5__15;

			private Player <p>5__16;

			private float <speed>5__17;

			private float <dtHeld>5__18;

			private Vector3 <pos>5__19;

			private float <dt>5__20;

			private float <dx>5__21;

			private float <dz>5__22;

			private float <distXZ>5__23;

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

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

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

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || (uint)(num - 1) <= 2u)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<prevPxPrefab>5__1 = null;
				<inner>5__2 = null;
				<h3>5__8 = null;
				<lp0>5__9 = null;
				<lp>5__11 = null;
				<pInit>5__12 = null;
				<cur>5__13 = null;
				<lp>5__15 = null;
				<p>5__16 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e1: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0249: Unknown result type (might be due to invalid IL or missing references)
				//IL_024e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0106: 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_0394: Unknown result type (might be due to invalid IL or missing references)
				//IL_0399: Unknown result type (might be due to invalid IL or missing references)
				//IL_0448: Unknown result type (might be due to invalid IL or missing references)
				//IL_044d: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<prevPxPrefab>5__1 = <>4__this._pxHaunt1Prefab;
						try
						{
							<h3>5__8 = <>4__this.TryGetPxHauntPrefabByName("PX_Haunt_Haunt3");
							if ((Object)(object)<h3>5__8 != (Object)null)
							{
								<>4__this._pxHaunt1Prefab = <h3>5__8;
							}
							<h3>5__8 = null;
						}
						catch
						{
						}
						<inner>5__2 = null;
						try
						{
							<lp0>5__9 = (((Object)(object)player != (Object)null) ? player : Player.m_localPlayer);
							<pos0>5__10 = (((Object)(object)<lp0>5__9 != (Object)null) ? ((Component)<lp0>5__9).transform.position : Vector3.zero);
							if ((Object)(object)Game.instance != (Object)null)
							{
								((MonoBehaviour)Game.instance).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<pos0>5__10, "HorrorAmbience1.ogg", 0.7f));
							}
							if ((Object)(object)Game.instance != (Object)null)
							{
								((MonoBehaviour)Game.instance).StartCoroutine(<>4__this.PxPlayEmbeddedOggAt(<pos0>5__10, "HorrorRiser3.ogg", 1f));
							}
							<lp0>5__9 = null;
						}
						catch
						{
						}
						try
						{
							_pxSuppressHaunt1Sfx = true;
							<inner>5__2 = <>4__this.ParanoidinRoutine_Haunt1(player, force, ignoreCooldowns);
						}
						catch
						{
							try
							{
								_pxSuppressHaunt1Sfx = false;
							}
							catch
							{
							}
							try
							{
								<>4__this.ForceTerminateParanoidin();
							}
							catch
							{
							}
							<inner>5__2 = null;
						}
						<nextCheckAt>5__3 = Time.time;
						<lastPos>5__4 = Vector3.zero;
						<lastPosAt>5__5 = -1f;
						<quietHeld>5__6 = 0f;
						<noisyHeld>5__7 = 0f;
						try
						{
							<lp>5__11 = Player.m_localPlayer;
							<pInit>5__12 = (((Object)(object)player != (Object)null) ? player : <lp>5__11);
							if ((Object)(object)<pInit>5__12 != (Object)null)
							{
								<lastPos>5__4 = ((Component)<pInit>5__12).transform.position;
								<lastPosAt>5__5 = Time.time;
							}
							<lp>5__11 = null;
							<pInit>5__12 = null;
						}
						catch
						{
						}
						<>1__state = -3;
						if (<inner>5__2 == null)
						{
							break;
						}
						goto IL_0636;
					case 1:
						<>1__state = -3;
						break;
					case 2:
						<>1__state = -3;
						break;
					case 3:
						{
							<>1__state = -3;
							<cur>5__13 = null;
							goto IL_0636;
						}
						IL_0636:
						try
						{
							if (!<inner>5__2.MoveNext())
							{
								break;
							}
							<cur>5__13 = <inner>5__2.Current;
							goto IL_02cc;
						}
						catch
						{
						}
						break;
						IL_02cc:
						if (<>4__this._paranoidinActive && (Object)(object)<>4__this._paranoidinGo != (Object)null && Time.time >= <nextCheckAt>5__3)
						{
							<now>5__14 = Time.time;
							<nextCheckAt>5__3 = <now>5__14 + 0.12f;
							<lp>5__15 = Player.m_localPlayer;
							<p>5__16 = (((Object)(object)player != (Object)null) ? player :