Decompiled source of SilksongPrepatcher v1.2.0

patchers/SilksongPrepatcher.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
using Mono.Collections.Generic;
using MonoMod.Cil;
using MonoMod.Utils;
using SilksongPrepatcher.Patchers;
using SilksongPrepatcher.Patchers.PlayerDataPatcher;
using SilksongPrepatcher.Utils;

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

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SilksongPrepatcher
{
	public static class AssemblyNames
	{
		public const string Assembly_CSharp = "Assembly-CSharp.dll";

		public const string PlayMaker = "PlayMaker.dll";

		public const string TeamCherry_NestedFadeGroup = "TeamCherry.NestedFadeGroup.dll";

		public const string TeamCherry_SharedUtils = "TeamCherry.SharedUtils.dll";

		public const string Newtonsoft_Json_UnityConverters = "Newtonsoft.Json.UnityConverters.dll";
	}
	public abstract class BasePrepatcher
	{
		protected ManualLogSource Log { get; private set; }

		public string Name { get; private set; }

		public BasePrepatcher()
			: this(null)
		{
		}

		public BasePrepatcher(string? name)
		{
			if (name == null)
			{
				name = GetType().Name;
			}
			Name = name;
			Log = Logger.CreateLogSource(name);
		}

		public abstract void PatchAssembly(AssemblyDefinition asm);
	}
	public static class SilksongPrepatcher
	{
		private static readonly List<(string assemblyName, BasePrepatcher patcher)> patcherData = GetPatcherData();

		private static ManualLogSource Log { get; } = Logger.CreateLogSource("SilksongPrepatcher");


		internal static string PatchCacheDir
		{
			get
			{
				string text = Path.Combine(Paths.CachePath, "SilksongPrepatcher");
				Directory.CreateDirectory(text);
				return text;
			}
		}

		public static IEnumerable<string> TargetDLLs => patcherData.Select<(string, BasePrepatcher), string>(((string assemblyName, BasePrepatcher patcher) pair) => pair.assemblyName).Distinct();

		private static List<(string assemblyName, BasePrepatcher patcher)> GetPatcherData()
		{
			BasePrepatcher item = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Assembly" && ((MemberReference)mr).Name == "GetTypes", typeof(AssemblyExtensions).GetMethod("GetTypesSafelyIgnoreMMHOOK", new Type[1] { typeof(Assembly) }));
			BasePrepatcher item2 = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Assembly" && ((MemberReference)mr).Name == "GetTypes", typeof(AssemblyExtensions).GetMethod("GetTypesSafelyIgnoreModded", new Type[1] { typeof(Assembly) }));
			BasePrepatcher item3 = new MethodReplacer((MethodReference mr) => ((MemberReference)((MemberReference)mr).DeclaringType).Name == "Type" && ((MemberReference)mr).Name == "IsAssignableFrom", typeof(AssemblyExtensions).GetMethod("TypeAssignableFromSafe", new Type[2]
			{
				typeof(Type),
				typeof(Type)
			}));
			return new List<(string, BasePrepatcher)>
			{
				("TeamCherry.NestedFadeGroup.dll", item2),
				("PlayMaker.dll", item),
				("PlayMaker.dll", new ReflectionUtilsPatcher()),
				("Assembly-CSharp.dll", new PlayerDataPatcher()),
				("TeamCherry.SharedUtils.dll", new VariableExtensionsPatcher()),
				("Newtonsoft.Json.UnityConverters.dll", item3)
			};
		}

		public static void Patch(AssemblyDefinition assembly)
		{
			string assemblyName = ((AssemblyNameReference)assembly.Name).Name + ".dll";
			List<BasePrepatcher> list = (from pair in patcherData
				where pair.assemblyName == assemblyName
				select pair.patcher).ToList();
			Log.LogInfo((object)("Patching " + assemblyName + ": " + string.Join(", ", list.Select((BasePrepatcher x) => x.Name))));
			foreach (BasePrepatcher item in list)
			{
				item.PatchAssembly(assembly);
			}
		}
	}
}
namespace SilksongPrepatcher.Utils
{
	public static class AssemblyExtensions
	{
		public static Type[] GetTypesSafely(this Assembly asm)
		{
			try
			{
				return asm.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type x) => (object)x != null).ToArray();
			}
		}

		public static Type[] GetTypesSafelyIgnoreModded(Assembly asm)
		{
			if (ShouldSkip(asm, skipModdedAssemblies: true))
			{
				return Array.Empty<Type>();
			}
			return asm.GetTypesSafely();
		}

		public static Type[] GetTypesSafelyIgnoreMMHOOK(Assembly asm)
		{
			if (ShouldSkip(asm, skipModdedAssemblies: false))
			{
				return Array.Empty<Type>();
			}
			return asm.GetTypesSafely();
		}

		private static bool ShouldSkip(Assembly asm, bool skipModdedAssemblies)
		{
			string name = asm.GetName().Name;
			if (name.StartsWith("TeamCherry") || name == "PlayMaker" || name.StartsWith("Assembly-CSharp"))
			{
				return false;
			}
			if (name.StartsWith("System.") || name == "mscorlib")
			{
				return true;
			}
			if (name.StartsWith("MMHOOK"))
			{
				return true;
			}
			if (asm.GetType("MonoDetour.HookGen.MonoDetourTargetsAttribute") != null)
			{
				return true;
			}
			if (skipModdedAssemblies)
			{
				string text;
				try
				{
					text = asm.Location;
				}
				catch (NotSupportedException)
				{
					text = string.Empty;
				}
				if (text.Contains("BepInEx"))
				{
					return true;
				}
			}
			return false;
		}

		public static bool TypeAssignableFromSafe(Type self, Type other)
		{
			try
			{
				return self.IsAssignableFrom(other);
			}
			catch
			{
				return false;
			}
		}
	}
	public static class CecilUtils
	{
		[CompilerGenerated]
		private sealed class <GetMethodDefinitions>d__2 : IEnumerable<MethodDefinition>, IEnumerable, IEnumerator<MethodDefinition>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private MethodDefinition <>2__current;

			private int <>l__initialThreadId;

			private ModuleDefinition mod;

			public ModuleDefinition <>3__mod;

			private IEnumerator<TypeDefinition> <>7__wrap1;

			private Enumerator<MethodDefinition> <>7__wrap2;

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

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

			[DebuggerHidden]
			public <GetMethodDefinitions>d__2(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				if ((uint)(num - -4) <= 1u || num == 1)
				{
					try
					{
						if (num == -4 || num == 1)
						{
							try
							{
							}
							finally
							{
								<>m__Finally2();
							}
						}
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>7__wrap1 = null;
				<>7__wrap2 = default(Enumerator<MethodDefinition>);
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -4;
						goto IL_0089;
					}
					<>1__state = -1;
					<>7__wrap1 = GetTypeDefinitions(mod).GetEnumerator();
					<>1__state = -3;
					goto IL_00a8;
					IL_0089:
					if (<>7__wrap2.MoveNext())
					{
						MethodDefinition current = <>7__wrap2.Current;
						<>2__current = current;
						<>1__state = 1;
						return true;
					}
					<>m__Finally2();
					<>7__wrap2 = default(Enumerator<MethodDefinition>);
					goto IL_00a8;
					IL_00a8:
					if (<>7__wrap1.MoveNext())
					{
						TypeDefinition current2 = <>7__wrap1.Current;
						<>7__wrap2 = current2.Methods.GetEnumerator();
						<>1__state = -4;
						goto IL_0089;
					}
					<>m__Finally1();
					<>7__wrap1 = null;
					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;
				if (<>7__wrap1 != null)
				{
					<>7__wrap1.Dispose();
				}
			}

			private void <>m__Finally2()
			{
				<>1__state = -3;
				((IDisposable)<>7__wrap2).Dispose();
			}

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

			[DebuggerHidden]
			IEnumerator<MethodDefinition> IEnumerable<MethodDefinition>.GetEnumerator()
			{
				<GetMethodDefinitions>d__2 <GetMethodDefinitions>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetMethodDefinitions>d__ = this;
				}
				else
				{
					<GetMethodDefinitions>d__ = new <GetMethodDefinitions>d__2(0);
				}
				<GetMethodDefinitions>d__.mod = <>3__mod;
				return <GetMethodDefinitions>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<MethodDefinition>)this).GetEnumerator();
			}
		}

		[CompilerGenerated]
		private sealed class <GetTypeDefinitions>d__1 : IEnumerable<TypeDefinition>, IEnumerable, IEnumerator<TypeDefinition>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private TypeDefinition <>2__current;

			private int <>l__initialThreadId;

			private ModuleDefinition mod;

			public ModuleDefinition <>3__mod;

			private Enumerator<TypeDefinition> <>7__wrap1;

			private IEnumerator<TypeDefinition> <>7__wrap2;

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

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

			[DebuggerHidden]
			public <GetTypeDefinitions>d__1(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				if ((uint)(num - -4) <= 1u || num == 1)
				{
					try
					{
						if (num == -4 || num == 1)
						{
							try
							{
							}
							finally
							{
								<>m__Finally2();
							}
						}
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>7__wrap1 = default(Enumerator<TypeDefinition>);
				<>7__wrap2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -4;
						goto IL_008a;
					}
					<>1__state = -1;
					<>7__wrap1 = mod.Types.GetEnumerator();
					<>1__state = -3;
					goto IL_00a4;
					IL_008a:
					if (<>7__wrap2.MoveNext())
					{
						TypeDefinition current = <>7__wrap2.Current;
						<>2__current = current;
						<>1__state = 1;
						return true;
					}
					<>m__Finally2();
					<>7__wrap2 = null;
					goto IL_00a4;
					IL_00a4:
					if (<>7__wrap1.MoveNext())
					{
						TypeDefinition current2 = <>7__wrap1.Current;
						<>7__wrap2 = GetTypesRecursive(current2).GetEnumerator();
						<>1__state = -4;
						goto IL_008a;
					}
					<>m__Finally1();
					<>7__wrap1 = default(Enumerator<TypeDefinition>);
					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;
				((IDisposable)<>7__wrap1).Dispose();
			}

			private void <>m__Finally2()
			{
				<>1__state = -3;
				if (<>7__wrap2 != null)
				{
					<>7__wrap2.Dispose();
				}
			}

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

			[DebuggerHidden]
			IEnumerator<TypeDefinition> IEnumerable<TypeDefinition>.GetEnumerator()
			{
				<GetTypeDefinitions>d__1 <GetTypeDefinitions>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetTypeDefinitions>d__ = this;
				}
				else
				{
					<GetTypeDefinitions>d__ = new <GetTypeDefinitions>d__1(0);
				}
				<GetTypeDefinitions>d__.mod = <>3__mod;
				return <GetTypeDefinitions>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<TypeDefinition>)this).GetEnumerator();
			}
		}

		[CompilerGenerated]
		private sealed class <GetTypesRecursive>d__0 : IEnumerable<TypeDefinition>, IEnumerable, IEnumerator<TypeDefinition>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private TypeDefinition <>2__current;

			private int <>l__initialThreadId;

			private bool includeSelf;

			public bool <>3__includeSelf;

			private TypeDefinition type;

			public TypeDefinition <>3__type;

			private Enumerator<TypeDefinition> <>7__wrap1;

			private IEnumerator<TypeDefinition> <>7__wrap2;

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

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

			[DebuggerHidden]
			public <GetTypesRecursive>d__0(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				int num = <>1__state;
				if ((uint)(num - -4) <= 1u || num == 2)
				{
					try
					{
						if (num == -4 || num == 2)
						{
							try
							{
							}
							finally
							{
								<>m__Finally2();
							}
						}
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>7__wrap1 = default(Enumerator<TypeDefinition>);
				<>7__wrap2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						if (includeSelf)
						{
							<>2__current = type;
							<>1__state = 1;
							return true;
						}
						goto IL_0050;
					case 1:
						<>1__state = -1;
						goto IL_0050;
					case 2:
						{
							<>1__state = -4;
							goto IL_00be;
						}
						IL_0050:
						<>7__wrap1 = type.NestedTypes.GetEnumerator();
						<>1__state = -3;
						goto IL_00d8;
						IL_00d8:
						if (<>7__wrap1.MoveNext())
						{
							TypeDefinition current = <>7__wrap1.Current;
							<>7__wrap2 = GetTypesRecursive(current).GetEnumerator();
							<>1__state = -4;
							goto IL_00be;
						}
						<>m__Finally1();
						<>7__wrap1 = default(Enumerator<TypeDefinition>);
						return false;
						IL_00be:
						if (<>7__wrap2.MoveNext())
						{
							TypeDefinition current2 = <>7__wrap2.Current;
							<>2__current = current2;
							<>1__state = 2;
							return true;
						}
						<>m__Finally2();
						<>7__wrap2 = null;
						goto IL_00d8;
					}
				}
				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;
				((IDisposable)<>7__wrap1).Dispose();
			}

			private void <>m__Finally2()
			{
				<>1__state = -3;
				if (<>7__wrap2 != null)
				{
					<>7__wrap2.Dispose();
				}
			}

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

			[DebuggerHidden]
			IEnumerator<TypeDefinition> IEnumerable<TypeDefinition>.GetEnumerator()
			{
				<GetTypesRecursive>d__0 <GetTypesRecursive>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetTypesRecursive>d__ = this;
				}
				else
				{
					<GetTypesRecursive>d__ = new <GetTypesRecursive>d__0(0);
				}
				<GetTypesRecursive>d__.type = <>3__type;
				<GetTypesRecursive>d__.includeSelf = <>3__includeSelf;
				return <GetTypesRecursive>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<TypeDefinition>)this).GetEnumerator();
			}
		}

		[IteratorStateMachine(typeof(<GetTypesRecursive>d__0))]
		public static IEnumerable<TypeDefinition> GetTypesRecursive(TypeDefinition type, bool includeSelf = true)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetTypesRecursive>d__0(-2)
			{
				<>3__type = type,
				<>3__includeSelf = includeSelf
			};
		}

		[IteratorStateMachine(typeof(<GetTypeDefinitions>d__1))]
		public static IEnumerable<TypeDefinition> GetTypeDefinitions(ModuleDefinition mod)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetTypeDefinitions>d__1(-2)
			{
				<>3__mod = mod
			};
		}

		[IteratorStateMachine(typeof(<GetMethodDefinitions>d__2))]
		public static IEnumerable<MethodDefinition> GetMethodDefinitions(ModuleDefinition mod)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetMethodDefinitions>d__2(-2)
			{
				<>3__mod = mod
			};
		}
	}
}
namespace SilksongPrepatcher.Patchers
{
	public class MethodReplacer : BasePrepatcher
	{
		[CompilerGenerated]
		private Func<MethodReference, bool> <predicate>P;

		[CompilerGenerated]
		private MethodInfo <newMethodInfo>P;

		public MethodReplacer(Func<MethodReference, bool> predicate, MethodInfo newMethodInfo)
		{
			<predicate>P = predicate;
			<newMethodInfo>P = newMethodInfo;
			base..ctor("MethodReplacer -> " + <newMethodInfo>P.Name);
		}

		public override void PatchAssembly(AssemblyDefinition asm)
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			MethodReference operand = asm.MainModule.ImportReference((MethodBase)<newMethodInfo>P);
			foreach (TypeDefinition typeDefinition in CecilUtils.GetTypeDefinitions(asm.MainModule))
			{
				foreach (MethodDefinition item in ((IEnumerable<MethodDefinition>)typeDefinition.Methods).Where((MethodDefinition m) => m.HasBody))
				{
					ILContext val = new ILContext(item);
					try
					{
						ILCursor val2 = new ILCursor(val);
						while (val2.TryGotoNext(new Func<Instruction, bool>[1]
						{
							delegate(Instruction i)
							{
								//IL_0001: Unknown result type (might be due to invalid IL or missing references)
								//IL_0006: Unknown result type (might be due to invalid IL or missing references)
								//IL_0013: Unknown result type (might be due to invalid IL or missing references)
								//IL_0018: Unknown result type (might be due to invalid IL or missing references)
								if (i.OpCode == OpCodes.Call || i.OpCode == OpCodes.Callvirt)
								{
									object operand2 = i.Operand;
									MethodReference val3 = (MethodReference)((operand2 is MethodReference) ? operand2 : null);
									if (val3 != null)
									{
										return <predicate>P(val3);
									}
								}
								return false;
							}
						}))
						{
							base.Log.LogInfo((object)("Patching " + ((MemberReference)typeDefinition).FullName + " : " + ((MemberReference)item).FullName));
							val2.Next.OpCode = OpCodes.Call;
							val2.Next.Operand = operand;
						}
					}
					finally
					{
						((IDisposable)val)?.Dispose();
					}
				}
			}
		}
	}
	public class ReflectionUtilsPatcher : BasePrepatcher
	{
		public override void PatchAssembly(AssemblyDefinition assembly)
		{
			TypeDefinition val = ((IEnumerable<TypeDefinition>)assembly.MainModule.Types).FirstOrDefault((Func<TypeDefinition, bool>)((TypeDefinition t) => ((MemberReference)t).Name == "ReflectionUtils"));
			if (val == null)
			{
				base.Log.LogInfo((object)("Could not find type ReflectionUtils in " + ((AssemblyNameReference)assembly.Name).Name));
				return;
			}
			MethodDefinition val2 = ((IEnumerable<MethodDefinition>)val.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition m) => m.IsStatic && m.IsConstructor && m.IsSpecialName));
			if (val2 == null)
			{
				base.Log.LogInfo((object)"Could not find static constructor");
				return;
			}
			InjectTypeLookup(assembly.MainModule, val, val2);
			MethodDefinition val3 = ((IEnumerable<MethodDefinition>)val.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition m) => ((MemberReference)m).Name == "GetGlobalType"));
			if (val3 == null)
			{
				base.Log.LogInfo((object)"Could not find GetGlobalType");
			}
			else
			{
				PatchGetGlobalType(assembly.MainModule, val, val3);
			}
		}

		private void PatchGetGlobalType(ModuleDefinition mainModule, TypeDefinition typeDef, MethodDefinition getGlobalType)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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)
			ILProcessor iLProcessor = getGlobalType.Body.GetILProcessor();
			Instruction val = ((IEnumerable<Instruction>)getGlobalType.Body.Instructions).First();
			Instruction val2 = iLProcessor.Create(OpCodes.Ldarg_0);
			Instruction val3 = iLProcessor.Create(OpCodes.Ldstr, "HutongGames.PlayMaker.Actions.");
			MethodReference val4 = mainModule.ImportReference((MethodBase)typeof(string).GetMethod("op_Equality", new Type[2]
			{
				typeof(string),
				typeof(string)
			}));
			Instruction val5 = iLProcessor.Create(OpCodes.Call, val4);
			Instruction val6 = iLProcessor.Create(OpCodes.Brfalse, val);
			Instruction val7 = iLProcessor.Create(OpCodes.Ldnull);
			Instruction val8 = iLProcessor.Create(OpCodes.Ret);
			iLProcessor.InsertBefore(val, val2);
			iLProcessor.InsertBefore(val, val3);
			iLProcessor.InsertBefore(val, val5);
			iLProcessor.InsertBefore(val, val6);
			iLProcessor.InsertBefore(val, val7);
			iLProcessor.InsertBefore(val, val8);
			MethodBodyRocks.OptimizeMacros(getGlobalType.Body);
		}

		private void InjectTypeLookup(ModuleDefinition module, TypeDefinition typeDef, MethodDefinition cctor)
		{
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			FieldDefinition val = ((IEnumerable<FieldDefinition>)typeDef.Fields).FirstOrDefault((Func<FieldDefinition, bool>)((FieldDefinition f) => ((MemberReference)f).Name == "typeLookup" && f.IsStatic));
			if (val == null)
			{
				return;
			}
			MethodReference val2 = module.ImportReference((MethodBase)typeof(Type).GetMethod("GetType", new Type[1] { typeof(string) }));
			MethodInfo method = typeof(Dictionary<, >).MakeGenericType(typeof(string), typeof(Type)).GetMethod("set_Item");
			MethodReference val3 = module.ImportReference((MethodBase)method);
			ILProcessor iLProcessor = cctor.Body.GetILProcessor();
			Instruction val4 = ((IEnumerable<Instruction>)cctor.Body.Instructions).Last();
			if (val4.OpCode != OpCodes.Ret)
			{
				val4 = ((IEnumerable<Instruction>)cctor.Body.Instructions).Reverse().FirstOrDefault((Func<Instruction, bool>)((Instruction i) => i.OpCode == OpCodes.Ret));
				if (val4 == null)
				{
					return;
				}
			}
			iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldsfld, (FieldReference)(object)val));
			iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldstr, "TMProOldOld.TextAlignmentOptions"));
			iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Ldstr, "TMProOld.TextAlignmentOptions, Assembly-CSharp"));
			iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Call, val2));
			iLProcessor.InsertBefore(val4, iLProcessor.Create(OpCodes.Callvirt, val3));
			MethodBodyRocks.OptimizeMacros(cctor.Body);
			base.Log.LogInfo((object)"Patch successfully applied");
		}
	}
}
namespace SilksongPrepatcher.Patchers.PlayerDataPatcher
{
	public class PatchedMethodCache
	{
		private static readonly ManualLogSource Log = Logger.CreateLogSource("PatchedMethodCache");

		public Dictionary<string, List<string>> PatchedMethods { get; set; } = new Dictionary<string, List<string>>();


		public void Add(string typeName, string methodName)
		{
			if (!PatchedMethods.TryGetValue(typeName, out List<string> value))
			{
				List<string> list2 = (PatchedMethods[typeName] = new List<string>());
				value = list2;
			}
			value.Add(methodName);
		}

		public static string GetMetadataString()
		{
			string arg = typeof(PatchedMethodCache).Assembly.GetName().Version.ToString();
			DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(Path.Combine(Paths.ManagedPath, "Assembly-CSharp.dll"));
			return $"{arg} // {lastWriteTimeUtc}";
		}

		public void Serialize(string filePath)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.AppendLine("X " + GetMetadataString());
			foreach (var (text2, list2) in PatchedMethods)
			{
				stringBuilder.AppendLine("T " + text2);
				foreach (string item in list2)
				{
					stringBuilder.AppendLine("M " + item);
				}
				stringBuilder.AppendLine("E ");
			}
			File.WriteAllText(filePath, stringBuilder.ToString());
		}

		public static PatchedMethodCache? Deserialize(string filePath)
		{
			if (!File.Exists(filePath))
			{
				Log.LogDebug((object)"Failed to deserialize: no method cache found in cache dir.");
				return null;
			}
			bool flag = false;
			PatchedMethodCache patchedMethodCache = new PatchedMethodCache();
			try
			{
				string[] array = File.ReadAllLines(filePath);
				string text = null;
				List<string> list = new List<string>();
				string[] array2 = array;
				foreach (string text2 in array2)
				{
					if (text2.StartsWith("X "))
					{
						if (!(text2.Substring(2) == GetMetadataString()))
						{
							Log.LogDebug((object)"Failed to deserialize: metadata mismatch.");
							return null;
						}
						flag = true;
					}
					else if (text2.StartsWith("T "))
					{
						text = text2.Substring(2);
					}
					else if (text2.StartsWith("M "))
					{
						list.Add(text2.Substring(2));
					}
					else if (text2.StartsWith("E "))
					{
						if (text == null)
						{
							throw new Exception("Key null on write");
						}
						patchedMethodCache.PatchedMethods[text] = list;
						text = null;
						list = new List<string>();
					}
				}
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Failed to deserialize:\n" + ex));
				return null;
			}
			if (!flag)
			{
				Log.LogInfo((object)"Failed to deserialize: no metadata found.");
				return null;
			}
			return patchedMethodCache;
		}
	}
	internal class PatchingContext
	{
		public enum AccessMethodType
		{
			Default,
			Generic
		}

		public static readonly HashSet<string> DefaultAccessMethods = new HashSet<string> { "Bool", "String", "Float", "Int", "Vector3" };

		public ModuleDefinition MainModule { get; }

		public TypeDefinition PDType { get; }

		public MethodDefinition GenericGetMethod { get; }

		public MethodDefinition GenericSetMethod { get; }

		public Dictionary<TypeReference, MethodDefinition> DefaultGetMethods { get; }

		public Dictionary<TypeReference, MethodDefinition> DefaultSetMethods { get; }

		public PatchingContext(AssemblyDefinition asm)
		{
			MainModule = asm.MainModule;
			PDType = ((IEnumerable<TypeDefinition>)MainModule.Types).First((TypeDefinition t) => ((MemberReference)t).Name == "PlayerData");
			DefaultGetMethods = ((IEnumerable<MethodDefinition>)PDType.Methods).Where((MethodDefinition m) => ((MemberReference)m).Name.StartsWith("Get") && DefaultAccessMethods.Contains(((MemberReference)m).Name.Substring(3))).ToDictionary((MethodDefinition m) => ((MethodReference)m).ReturnType);
			DefaultSetMethods = ((IEnumerable<MethodDefinition>)PDType.Methods).Where((MethodDefinition m) => ((MemberReference)m).Name.StartsWith("Set") && DefaultAccessMethods.Contains(((MemberReference)m).Name.Substring(3)) && ((MethodReference)m).Parameters.Count == 2).ToDictionary((MethodDefinition m) => ((ParameterReference)((MethodReference)m).Parameters[1]).ParameterType);
			TypeDefinition type = AssemblyDefinition.ReadAssembly(Path.Combine(Paths.ManagedPath, "TeamCherry.SharedUtils.dll")).MainModule.GetType("TeamCherry.SharedUtils.VariableExtensions");
			GenericGetMethod = TypeDefinitionRocks.GetMethods(type).First((MethodDefinition x) => ((MemberReference)x).Name == "GetVariable" && ((MemberReference)x).ContainsGenericParameter && ((MethodReference)x).Parameters.Count == 2);
			GenericSetMethod = TypeDefinitionRocks.GetMethods(type).First((MethodDefinition x) => ((MemberReference)x).Name == "SetVariable" && ((MemberReference)x).ContainsGenericParameter && ((MethodReference)x).Parameters.Count == 3);
		}

		public MethodReference CreateGenericGetMethod(TypeReference fieldType)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			GenericInstanceMethod val = new GenericInstanceMethod(MainModule.ImportReference((MethodReference)(object)GenericGetMethod));
			val.GenericArguments.Add(fieldType);
			return (MethodReference)val;
		}

		public void GetGetMethod(TypeReference fieldType, out MethodReference accessMethod, out AccessMethodType accessType)
		{
			if (DefaultGetMethods.TryGetValue(fieldType, out MethodDefinition value))
			{
				accessMethod = MainModule.ImportReference((MethodReference)(object)value);
				accessType = AccessMethodType.Default;
			}
			else
			{
				accessMethod = CreateGenericGetMethod(fieldType);
				accessType = AccessMethodType.Generic;
			}
		}

		public MethodReference CreateGenericSetMethod(TypeReference fieldType)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			GenericInstanceMethod val = new GenericInstanceMethod(MainModule.ImportReference((MethodReference)(object)GenericSetMethod));
			val.GenericArguments.Add(fieldType);
			return (MethodReference)val;
		}

		public void GetSetMethod(TypeReference fieldType, out MethodReference accessMethod, out AccessMethodType accessType)
		{
			if (DefaultSetMethods.TryGetValue(fieldType, out MethodDefinition value))
			{
				accessMethod = MainModule.ImportReference((MethodReference)(object)value);
				accessType = AccessMethodType.Default;
			}
			else
			{
				accessMethod = CreateGenericSetMethod(fieldType);
				accessType = AccessMethodType.Generic;
			}
		}
	}
	public class PlayerDataPatcher : BasePrepatcher
	{
		private static readonly List<(string methodName, int numArgs)> methodsToReplace = new List<(string, int)>(3)
		{
			("IntAdd", 3),
			("IncrementInt", 2),
			("DecrementInt", 2)
		};

		private static string CacheFilePath => Path.Combine(SilksongPrepatcher.PatchCacheDir, "PlayerDataPatcher_cache.txt");

		public override void PatchAssembly(AssemblyDefinition asm)
		{
			PatchingContext ctx = new PatchingContext(asm);
			ReplaceMethods(ctx);
			PatchedMethodCache patchedMethodCache = PatchedMethodCache.Deserialize(CacheFilePath);
			if (patchedMethodCache == null)
			{
				ReplaceFieldAccesses(ctx);
			}
			else
			{
				ReplaceFieldAccessesFromCache(ctx, patchedMethodCache);
			}
		}

		private static string? GetPrepatcherPluginAssembly()
		{
			string text = Path.Combine(Paths.PluginPath, "silksong_modding-SilksongPrepatcher", "PrepatcherPlugin.dll");
			if (File.Exists(text))
			{
				return text;
			}
			string[] files = Directory.GetFiles(Paths.PluginPath, "PrepatcherPlugin.dll", SearchOption.AllDirectories);
			if (files.Length != 0)
			{
				return files[0];
			}
			return null;
		}

		private void ReplaceMethods(PatchingContext ctx)
		{
			string prepatcherPluginAssembly = GetPrepatcherPluginAssembly();
			if (string.IsNullOrEmpty(prepatcherPluginAssembly))
			{
				base.Log.LogWarning((object)"Not replacing access methods: No plugin found");
				return;
			}
			AssemblyDefinition val = AssemblyDefinition.ReadAssembly(prepatcherPluginAssembly);
			try
			{
				TypeDefinition replacerType = ((IEnumerable<TypeDefinition>)val.MainModule.Types).First((TypeDefinition x) => ((MemberReference)x).Name == "PlayerDataInternal");
				foreach (var (methodName, numArgs) in methodsToReplace)
				{
					ReplaceMethod(ctx, replacerType, methodName, numArgs);
				}
			}
			finally
			{
				((IDisposable)val)?.Dispose();
			}
		}

		private void ReplaceMethod(PatchingContext ctx, TypeDefinition replacerType, string methodName, int numArgs)
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			string methodName2 = methodName;
			MethodDefinition val = ((IEnumerable<MethodDefinition>)ctx.PDType.Methods).First((MethodDefinition m) => ((MemberReference)m).Name == methodName2);
			MethodDefinition val2 = ((IEnumerable<MethodDefinition>)replacerType.Methods).First((MethodDefinition m) => ((MemberReference)m).Name == methodName2);
			val.Body.ExceptionHandlers.Clear();
			val.Body.Variables.Clear();
			ILProcessor iLProcessor = val.Body.GetILProcessor();
			foreach (Instruction item in ((IEnumerable<Instruction>)val.Body.Instructions).ToList())
			{
				iLProcessor.Remove(item);
			}
			for (int i = 0; i < numArgs; i++)
			{
				iLProcessor.Append(iLProcessor.Create(OpCodes.Ldarg, i));
			}
			iLProcessor.Append(iLProcessor.Create(OpCodes.Call, ctx.MainModule.ImportReference((MethodReference)(object)val2)));
			iLProcessor.Append(iLProcessor.Create(OpCodes.Ret));
			MethodBodyRocks.OptimizeMacros(val.Body);
		}

		private void ReplaceFieldAccessesFromCache(PatchingContext ctx, PatchedMethodCache cache)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			Stopwatch stopwatch = new Stopwatch();
			stopwatch.Start();
			foreach (KeyValuePair<string, List<string>> patchedMethod in cache.PatchedMethods)
			{
				patchedMethod.Deconstruct(out var key, out var value);
				string text = key;
				List<string> list = value;
				TypeDefinition type = ctx.MainModule.GetType(text);
				new HashSet<string>(list);
				Enumerator<MethodDefinition> enumerator2 = type.Methods.GetEnumerator();
				try
				{
					while (enumerator2.MoveNext())
					{
						MethodDefinition current = enumerator2.Current;
						if (list.Contains(((MemberReference)current).FullName))
						{
							if (!PatchMethod(current, ctx, out var replaced, out var missed))
							{
								throw new Exception("Failed to patch " + text + " " + ((MemberReference)current).FullName);
							}
							num += replaced;
							num2 += missed;
						}
					}
				}
				finally
				{
					((IDisposable)enumerator2).Dispose();
				}
			}
			stopwatch.Stop();
			base.Log.LogInfo((object)$"Patched {num} accesses from cache in {stopwatch.ElapsedMilliseconds} ms");
		}

		private void ReplaceFieldAccesses(PatchingContext ctx)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			PatchedMethodCache patchedMethodCache = new PatchedMethodCache();
			Stopwatch stopwatch = new Stopwatch();
			stopwatch.Start();
			foreach (TypeDefinition typeDefinition in CecilUtils.GetTypeDefinitions(ctx.MainModule))
			{
				Enumerator<MethodDefinition> enumerator2 = typeDefinition.Methods.GetEnumerator();
				try
				{
					while (enumerator2.MoveNext())
					{
						MethodDefinition current2 = enumerator2.Current;
						if (current2.HasBody && (current2.DeclaringType != ctx.PDType || (!(((MemberReference)current2).Name == "SetupNewPlayerData") && !(((MemberReference)current2).Name == "SetupExistingPlayerData") && !(((MemberReference)current2).Name == "OnUpdatedVariable") && !((MemberReference)current2).Name.Contains(".ctor"))))
						{
							if (PatchMethod(current2, ctx, out var replaced, out var missed))
							{
								patchedMethodCache.Add(((MemberReference)typeDefinition).FullName, ((MemberReference)current2).FullName);
							}
							num += replaced;
							num2 += missed;
						}
					}
				}
				finally
				{
					((IDisposable)enumerator2).Dispose();
				}
			}
			stopwatch.Stop();
			base.Log.LogInfo((object)$"Patched {num} accesses in {stopwatch.ElapsedMilliseconds} ms");
			base.Log.LogInfo((object)$"Missed {num2} accesses");
			patchedMethodCache.Serialize(CacheFilePath);
		}

		private bool PatchMethod(MethodDefinition method, PatchingContext ctx, out int replaced, out int missed)
		{
			//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)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			PatchingContext ctx2 = ctx;
			MethodDefinition method2 = method;
			Dictionary<TypeReference, VariableReference> addedVariables = new Dictionary<TypeReference, VariableReference>();
			replaced = 0;
			missed = 0;
			MethodBodyRocks.SimplifyMacros(method2.Body);
			ILProcessor iLProcessor = method2.Body.GetILProcessor();
			for (int num = iLProcessor.Body.Instructions.Count - 1; num >= 0; num--)
			{
				Instruction val = iLProcessor.Body.Instructions[num];
				object operand = val.Operand;
				FieldReference val2 = (FieldReference)((operand is FieldReference) ? operand : null);
				if (val2 != null && !(((MemberReference)((MemberReference)val2).DeclaringType).FullName != ((MemberReference)ctx2.PDType).FullName) && !val2.Resolve().IsPrivate && !((IEnumerable<CustomAttribute>)val2.Resolve().CustomAttributes).Any((CustomAttribute ca) => ((MemberReference)ca.AttributeType).FullName == "System.NonSerializedAttribute"))
				{
					if (val.OpCode == OpCodes.Ldfld)
					{
						ctx2.GetGetMethod(val2.FieldType, out MethodReference accessMethod, out PatchingContext.AccessMethodType accessType);
						OpCode val3 = ((accessType == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call);
						Instruction[] array = (Instruction[])(object)new Instruction[2]
						{
							iLProcessor.Create(OpCodes.Ldstr, ((MemberReference)val2).Name),
							iLProcessor.Create(val3, accessMethod)
						};
						val.OpCode = array[0].OpCode;
						val.Operand = array[0].Operand;
						iLProcessor.InsertAfter(val, array[1]);
						replaced++;
					}
					else if (val.OpCode == OpCodes.Stfld)
					{
						ctx2.GetSetMethod(val2.FieldType, out MethodReference accessMethod2, out PatchingContext.AccessMethodType accessType2);
						OpCode val4 = ((accessType2 == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call);
						VariableReference val5 = GetOrAddLocal(val2.FieldType);
						Instruction[] array2 = (Instruction[])(object)new Instruction[4]
						{
							Extensions.Create(iLProcessor, OpCodes.Stloc, (object)val5),
							iLProcessor.Create(OpCodes.Ldstr, ((MemberReference)val2).Name),
							Extensions.Create(iLProcessor, OpCodes.Ldloc, (object)val5),
							iLProcessor.Create(val4, accessMethod2)
						};
						val.OpCode = array2[0].OpCode;
						val.Operand = array2[0].Operand;
						iLProcessor.InsertAfter(val, array2[1]);
						iLProcessor.InsertAfter(array2[1], array2[2]);
						iLProcessor.InsertAfter(array2[2], array2[3]);
						replaced++;
					}
					else if (val.OpCode == OpCodes.Ldflda)
					{
						if (TryPatchRefAccess(iLProcessor, val, method2, ctx2, GetOrAddLocal))
						{
							replaced++;
						}
						else
						{
							missed++;
						}
					}
				}
			}
			MethodBodyRocks.OptimizeMacros(method2.Body);
			return replaced > 0;
			VariableReference GetOrAddLocal(TypeReference td)
			{
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				TypeReference val6 = ctx2.MainModule.ImportReference(td);
				if (!addedVariables.ContainsKey(val6))
				{
					VariableDefinition val7 = new VariableDefinition(val6);
					method2.Body.Variables.Add(val7);
					addedVariables.Add(val6, (VariableReference)(object)val7);
				}
				return addedVariables[val6];
			}
		}

		private bool TryPatchRefAccess(ILProcessor il, Instruction instr, MethodDefinition method, PatchingContext ctx, Func<TypeReference, VariableReference> getOrAddLocal)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: 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_012e: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			Instruction next = instr.Next;
			if (next.OpCode == OpCodes.Call)
			{
				object operand = next.Operand;
				MethodReference val = (MethodReference)((operand is MethodReference) ? operand : null);
				if (val != null && ((MemberReference)val.ReturnType).FullName == "System.Void" && val.Parameters.Count == 1)
				{
					object operand2 = instr.Operand;
					FieldReference val2 = (FieldReference)((operand2 is FieldReference) ? operand2 : null);
					if (val2 != null)
					{
						VariableReference val3 = getOrAddLocal(val2.FieldType);
						ctx.GetGetMethod(val2.FieldType, out MethodReference accessMethod, out PatchingContext.AccessMethodType accessType);
						OpCode val4 = ((accessType == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call);
						ctx.GetSetMethod(val2.FieldType, out MethodReference accessMethod2, out PatchingContext.AccessMethodType accessType2);
						OpCode val5 = ((accessType2 == PatchingContext.AccessMethodType.Default) ? OpCodes.Callvirt : OpCodes.Call);
						Instruction[] array = (Instruction[])(object)new Instruction[9]
						{
							il.Create(OpCodes.Dup),
							il.Create(OpCodes.Ldstr, ((MemberReference)val2).Name),
							il.Create(val4, accessMethod),
							Extensions.Create(il, OpCodes.Stloc, (object)val3),
							Extensions.Create(il, OpCodes.Ldloca, (object)val3),
							next,
							il.Create(OpCodes.Ldstr, ((MemberReference)val2).Name),
							Extensions.Create(il, OpCodes.Ldloc, (object)val3),
							il.Create(val5, accessMethod2)
						};
						il.InsertBefore(instr, array[0]);
						instr.OpCode = array[1].OpCode;
						instr.Operand = array[1].Operand;
						il.InsertAfter(instr, array[2]);
						il.InsertAfter(array[2], array[3]);
						il.InsertAfter(array[3], array[4]);
						il.InsertAfter(next, array[6]);
						il.InsertAfter(array[6], array[7]);
						il.InsertAfter(array[7], array[8]);
						return true;
					}
				}
			}
			return false;
		}
	}
	public class VariableExtensionsPatcher : BasePrepatcher
	{
		public override void PatchAssembly(AssemblyDefinition asm)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			ModuleDefinition mainModule = asm.MainModule;
			string text = "TeamCherry.SharedUtils.VariableExtensions";
			TypeDefinition type = mainModule.GetType(text);
			MethodDefinition val = null;
			Enumerator<MethodDefinition> enumerator = type.Methods.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					MethodDefinition current = enumerator.Current;
					if (!(((MemberReference)current).Name != "GetVariables"))
					{
						TypeReference parameterType = ((ParameterReference)((MethodReference)current).Parameters[1]).ParameterType;
						GenericInstanceType val2 = (GenericInstanceType)(object)((parameterType is GenericInstanceType) ? parameterType : null);
						if (val2 != null && !(((MemberReference)val2).Name != "Func`2") && !(((MemberReference)((TypeReference)val2).Resolve()).FullName != "System.Func`2"))
						{
							val = current;
							break;
						}
					}
				}
			}
			finally
			{
				((IDisposable)enumerator).Dispose();
			}
			MethodDefinition val3 = null;
			enumerator = type.Methods.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					MethodDefinition current2 = enumerator.Current;
					if (!(((MemberReference)current2).Name != "GetVariable") && ((MethodReference)current2).Parameters.Count == 2 && ((MemberReference)current2).ContainsGenericParameter)
					{
						val3 = current2;
						break;
					}
				}
			}
			finally
			{
				((IDisposable)enumerator).Dispose();
			}
			if (val != null && val3 != null)
			{
				PatchGetVariablesMethod(val, val3, mainModule);
			}
		}

		private void PatchGetVariablesMethod(MethodDefinition method, MethodDefinition getVariableMethod, ModuleDefinition mod)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: 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_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			base.Log.LogInfo((object)("Found method " + ((MemberReference)method).FullName));
			GenericParameter val = ((MethodReference)method).GenericParameters[0];
			GenericInstanceMethod val2 = new GenericInstanceMethod((MethodReference)(object)getVariableMethod);
			val2.GenericArguments.Add((TypeReference)(object)val);
			MethodBodyRocks.SimplifyMacros(method.Body);
			method.Body.GetILProcessor();
			Instruction val3 = null;
			Enumerator<Instruction> enumerator = method.Body.Instructions.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					Instruction current = enumerator.Current;
					if (current.OpCode == OpCodes.Callvirt)
					{
						object operand = current.Operand;
						MethodReference val4 = (MethodReference)((operand is MethodReference) ? operand : null);
						if (val4 != null && ((MemberReference)val4).Name == "GetValue" && ((MemberReference)((MemberReference)val4).DeclaringType).FullName == "System.Reflection.FieldInfo")
						{
							val3 = current;
							break;
						}
					}
				}
			}
			finally
			{
				((IDisposable)enumerator).Dispose();
			}
			if (val3 == null)
			{
				throw new Exception("Could not find call to FieldInfo::GetValue.");
			}
			Instruction[] array = (Instruction[])(object)new Instruction[4]
			{
				val3.Previous.Previous,
				val3.Previous,
				val3,
				val3.Next
			};
			OpCode opCode = array[0].OpCode;
			if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("ldloc"))
			{
				throw new Exception("First instruction not Ldloc");
			}
			opCode = array[1].OpCode;
			if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("ldarg"))
			{
				throw new Exception("Second instruction not Ldarg");
			}
			opCode = array[3].OpCode;
			if (!((OpCode)(ref opCode)).Name.ToLower().StartsWith("unbox"))
			{
				throw new Exception("Fourth instruction not unbox");
			}
			OpCode opCode2 = array[1].OpCode;
			object operand2 = array[1].Operand;
			array[1].OpCode = array[0].OpCode;
			array[1].Operand = array[0].Operand;
			array[0].OpCode = opCode2;
			array[0].Operand = operand2;
			MethodInfo getMethod = typeof(FieldInfo).GetProperty("Name").GetGetMethod();
			MethodReference operand3 = mod.ImportReference((MethodBase)getMethod);
			array[2].OpCode = OpCodes.Callvirt;
			array[2].Operand = operand3;
			array[3].OpCode = OpCodes.Call;
			array[3].Operand = val2;
			MethodBodyRocks.OptimizeMacros(method.Body);
		}
	}
}

plugins/PrepatcherPlugin.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using GlobalEnums;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using TeamCherry.SharedUtils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("PrepatcherPlugin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+0efb6ea7b664d77239a108824e9677bf4c291a99")]
[assembly: AssemblyProduct("PrepatcherPlugin")]
[assembly: AssemblyTitle("PrepatcherPlugin")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/silksong-modding/Silksong.Prepatcher")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace PrepatcherPlugin
{
	internal static class Extensions
	{
		public static MethodInfo GetMethodOrThrow(this Type type, string name)
		{
			MethodInfo? method = type.GetMethod(name);
			if (method == null)
			{
				throw new MissingMemberException(type.FullName, name);
			}
			return method;
		}
	}
	internal static class Hooks
	{
		private static List<Hook>? hooks = null;

		private static readonly Dictionary<Type, Func<PlayerData, string, object, object>> GenericGetMethodCache = new Dictionary<Type, Func<PlayerData, string, object, object>>();

		private static readonly Dictionary<Type, Func<PlayerData, string, object, object>> GenericSetMethodCache = new Dictionary<Type, Func<PlayerData, string, object, object>>();

		internal static void EnsureHooked()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Expected O, but got Unknown
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Expected O, but got Unknown
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Expected O, but got Unknown
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Expected O, but got Unknown
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Expected O, but got Unknown
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Expected O, but got Unknown
			//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0305: Expected O, but got Unknown
			if (hooks == null)
			{
				hooks = new List<Hook>(12)
				{
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetBool"), (Delegate)new Func<Func<PlayerData, string, bool>, PlayerData, string, bool>(ModifyGetBool)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetBool"), (Delegate)new Action<Action<PlayerData, string, bool>, PlayerData, string, bool>(ModifySetBool)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetInt"), (Delegate)new Func<Func<PlayerData, string, int>, PlayerData, string, int>(ModifyGetInt)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetInt"), (Delegate)new Action<Action<PlayerData, string, int>, PlayerData, string, int>(ModifySetInt)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetString"), (Delegate)new Func<Func<PlayerData, string, string>, PlayerData, string, string>(ModifyGetString)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetString"), (Delegate)new Action<Action<PlayerData, string, string>, PlayerData, string, string>(ModifySetString)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetFloat"), (Delegate)new Func<Func<PlayerData, string, float>, PlayerData, string, float>(ModifyGetFloat)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetFloat"), (Delegate)new Action<Action<PlayerData, string, float>, PlayerData, string, float>(ModifySetFloat)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("GetVector3"), (Delegate)new Func<Func<PlayerData, string, Vector3>, PlayerData, string, Vector3>(ModifyGetVector3)),
					new Hook((MethodBase)typeof(PlayerData).GetMethodOrThrow("SetVector3"), (Delegate)new Action<Action<PlayerData, string, Vector3>, PlayerData, string, Vector3>(ModifySetVector3)),
					new Hook((MethodBase)typeof(VariableExtensions).GetMethods().First((MethodInfo m) => m.Name == "GetVariable" && !m.IsGenericMethod), (Delegate)new Func<Func<IIncludeVariableExtensions, string, Type, object>, IIncludeVariableExtensions, string, Type, object>(ModifyGetVariable)),
					new Hook((MethodBase)typeof(VariableExtensions).GetMethods().First((MethodInfo m) => m.Name == "SetVariable" && !m.IsGenericMethod), (Delegate)new Action<Action<IIncludeVariableExtensions, string, object, Type>, IIncludeVariableExtensions, string, object, Type>(ModifySetVariable))
				};
			}
		}

		private static bool ModifyGetBool(Func<PlayerData, string, bool> orig, PlayerData self, string boolName)
		{
			bool current = orig(self, boolName);
			return PlayerDataVariableEvents<bool>.ModifyGetVariable(self, boolName, current);
		}

		private static void ModifySetBool(Action<PlayerData, string, bool> orig, PlayerData self, string boolName, bool value)
		{
			bool arg = PlayerDataVariableEvents<bool>.ModifySetVariable(self, boolName, value);
			orig(self, boolName, arg);
		}

		private static int ModifyGetInt(Func<PlayerData, string, int> orig, PlayerData self, string intName)
		{
			int current = orig(self, intName);
			return PlayerDataVariableEvents<int>.ModifyGetVariable(self, intName, current);
		}

		private static void ModifySetInt(Action<PlayerData, string, int> orig, PlayerData self, string intName, int value)
		{
			int arg = PlayerDataVariableEvents<int>.ModifySetVariable(self, intName, value);
			orig(self, intName, arg);
		}

		private static string ModifyGetString(Func<PlayerData, string, string> orig, PlayerData self, string stringName)
		{
			string current = orig(self, stringName);
			return PlayerDataVariableEvents<string>.ModifyGetVariable(self, stringName, current);
		}

		private static void ModifySetString(Action<PlayerData, string, string> orig, PlayerData self, string stringName, string value)
		{
			string arg = PlayerDataVariableEvents<string>.ModifySetVariable(self, stringName, value);
			orig(self, stringName, arg);
		}

		private static float ModifyGetFloat(Func<PlayerData, string, float> orig, PlayerData self, string floatName)
		{
			float current = orig(self, floatName);
			return PlayerDataVariableEvents<float>.ModifyGetVariable(self, floatName, current);
		}

		private static void ModifySetFloat(Action<PlayerData, string, float> orig, PlayerData self, string floatName, float value)
		{
			float arg = PlayerDataVariableEvents<float>.ModifySetVariable(self, floatName, value);
			orig(self, floatName, arg);
		}

		private static Vector3 ModifyGetVector3(Func<PlayerData, string, Vector3> orig, PlayerData self, string vector3Name)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 current = orig(self, vector3Name);
			return PlayerDataVariableEvents<Vector3>.ModifyGetVariable(self, vector3Name, current);
		}

		private static void ModifySetVector3(Action<PlayerData, string, Vector3> orig, PlayerData self, string vector3Name, Vector3 value)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 arg = PlayerDataVariableEvents<Vector3>.ModifySetVariable(self, vector3Name, value);
			orig(self, vector3Name, arg);
		}

		private static object ModifyGetVariable(Func<IIncludeVariableExtensions, string, Type, object> orig, IIncludeVariableExtensions obj, string fieldName, Type type)
		{
			object obj2 = orig(obj, fieldName, type);
			PlayerData val = (PlayerData)(object)((obj is PlayerData) ? obj : null);
			if (val == null)
			{
				return obj2;
			}
			if (!GenericGetMethodCache.TryGetValue(type, out Func<PlayerData, string, object, object> value))
			{
				MethodInfo method = typeof(PlayerDataVariableEvents<>).MakeGenericType(type).GetMethod("ModifyGetVariableNonGeneric", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				value = (Func<PlayerData, string, object, object>)Delegate.CreateDelegate(typeof(Func<PlayerData, string, object, object>), method);
				GenericGetMethodCache[type] = value;
			}
			return value(val, fieldName, obj2);
		}

		private static void ModifySetVariable(Action<IIncludeVariableExtensions, string, object, Type> orig, IIncludeVariableExtensions obj, string fieldName, object value, Type type)
		{
			PlayerData val = (PlayerData)(object)((obj is PlayerData) ? obj : null);
			if (val == null)
			{
				orig(obj, fieldName, value, type);
				return;
			}
			if (!GenericSetMethodCache.TryGetValue(type, out Func<PlayerData, string, object, object> value2))
			{
				MethodInfo method = typeof(PlayerDataVariableEvents<>).MakeGenericType(type).GetMethod("ModifySetVariableNonGeneric", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				value2 = (Func<PlayerData, string, object, object>)Delegate.CreateDelegate(typeof(Func<PlayerData, string, object, object>), method);
				GenericSetMethodCache[type] = value2;
			}
			object arg = value2(val, fieldName, value);
			orig(obj, fieldName, arg, type);
		}
	}
	public static class PlayerDataAccess
	{
		public static string LastSetFieldName
		{
			get
			{
				return PlayerData.instance.GetString("LastSetFieldName");
			}
			set
			{
				PlayerData.instance.SetString("LastSetFieldName", value);
			}
		}

		public static string version
		{
			get
			{
				return PlayerData.instance.GetString("version");
			}
			set
			{
				PlayerData.instance.SetString("version", value);
			}
		}

		public static int RevisionBreak
		{
			get
			{
				return PlayerData.instance.GetInt("RevisionBreak");
			}
			set
			{
				PlayerData.instance.SetInt("RevisionBreak", value);
			}
		}

		public static string date
		{
			get
			{
				return PlayerData.instance.GetString("date");
			}
			set
			{
				PlayerData.instance.SetString("date", value);
			}
		}

		public static int profileID
		{
			get
			{
				return PlayerData.instance.GetInt("profileID");
			}
			set
			{
				PlayerData.instance.SetInt("profileID", value);
			}
		}

		public static float playTime
		{
			get
			{
				return PlayerData.instance.GetFloat("playTime");
			}
			set
			{
				PlayerData.instance.SetFloat("playTime", value);
			}
		}

		public static bool openingCreditsPlayed
		{
			get
			{
				return PlayerData.instance.GetBool("openingCreditsPlayed");
			}
			set
			{
				PlayerData.instance.SetBool("openingCreditsPlayed", value);
			}
		}

		public static PermadeathModes permadeathMode
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<PermadeathModes>((IIncludeVariableExtensions)(object)PlayerData.instance, "permadeathMode");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<PermadeathModes>((IIncludeVariableExtensions)(object)PlayerData.instance, "permadeathMode", value);
			}
		}

		public static bool CollectedDockDemoKey
		{
			get
			{
				return PlayerData.instance.GetBool("CollectedDockDemoKey");
			}
			set
			{
				PlayerData.instance.SetBool("CollectedDockDemoKey", value);
			}
		}

		public static HeroItemsState PreMemoryState
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<HeroItemsState>((IIncludeVariableExtensions)(object)PlayerData.instance, "PreMemoryState");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<HeroItemsState>((IIncludeVariableExtensions)(object)PlayerData.instance, "PreMemoryState", value);
			}
		}

		public static bool HasStoredMemoryState
		{
			get
			{
				return PlayerData.instance.GetBool("HasStoredMemoryState");
			}
			set
			{
				PlayerData.instance.SetBool("HasStoredMemoryState", value);
			}
		}

		public static int health
		{
			get
			{
				return PlayerData.instance.GetInt("health");
			}
			set
			{
				PlayerData.instance.SetInt("health", value);
			}
		}

		public static int maxHealth
		{
			get
			{
				return PlayerData.instance.GetInt("maxHealth");
			}
			set
			{
				PlayerData.instance.SetInt("maxHealth", value);
			}
		}

		public static int maxHealthBase
		{
			get
			{
				return PlayerData.instance.GetInt("maxHealthBase");
			}
			set
			{
				PlayerData.instance.SetInt("maxHealthBase", value);
			}
		}

		public static int healthBlue
		{
			get
			{
				return PlayerData.instance.GetInt("healthBlue");
			}
			set
			{
				PlayerData.instance.SetInt("healthBlue", value);
			}
		}

		public static bool damagedBlue
		{
			get
			{
				return PlayerData.instance.GetBool("damagedBlue");
			}
			set
			{
				PlayerData.instance.SetBool("damagedBlue", value);
			}
		}

		public static bool damagedPurple
		{
			get
			{
				return PlayerData.instance.GetBool("damagedPurple");
			}
			set
			{
				PlayerData.instance.SetBool("damagedPurple", value);
			}
		}

		public static int prevHealth
		{
			get
			{
				return PlayerData.instance.GetInt("prevHealth");
			}
			set
			{
				PlayerData.instance.SetInt("prevHealth", value);
			}
		}

		public static int heartPieces
		{
			get
			{
				return PlayerData.instance.GetInt("heartPieces");
			}
			set
			{
				PlayerData.instance.SetInt("heartPieces", value);
			}
		}

		public static bool SeenBindPrompt
		{
			get
			{
				return PlayerData.instance.GetBool("SeenBindPrompt");
			}
			set
			{
				PlayerData.instance.SetBool("SeenBindPrompt", value);
			}
		}

		public static int geo
		{
			get
			{
				return PlayerData.instance.GetInt("geo");
			}
			set
			{
				PlayerData.instance.SetInt("geo", value);
			}
		}

		public static int silk
		{
			get
			{
				return PlayerData.instance.GetInt("silk");
			}
			set
			{
				PlayerData.instance.SetInt("silk", value);
			}
		}

		public static int silkMax
		{
			get
			{
				return PlayerData.instance.GetInt("silkMax");
			}
			set
			{
				PlayerData.instance.SetInt("silkMax", value);
			}
		}

		public static int silkRegenMax
		{
			get
			{
				return PlayerData.instance.GetInt("silkRegenMax");
			}
			set
			{
				PlayerData.instance.SetInt("silkRegenMax", value);
			}
		}

		public static int silkParts
		{
			get
			{
				return PlayerData.instance.GetInt("silkParts");
			}
			set
			{
				PlayerData.instance.SetInt("silkParts", value);
			}
		}

		public static bool IsSilkSpoolBroken
		{
			get
			{
				return PlayerData.instance.GetBool("IsSilkSpoolBroken");
			}
			set
			{
				PlayerData.instance.SetBool("IsSilkSpoolBroken", value);
			}
		}

		public static bool UnlockSilkFinalCutscene
		{
			get
			{
				return PlayerData.instance.GetBool("UnlockSilkFinalCutscene");
			}
			set
			{
				PlayerData.instance.SetBool("UnlockSilkFinalCutscene", value);
			}
		}

		public static int silkSpoolParts
		{
			get
			{
				return PlayerData.instance.GetInt("silkSpoolParts");
			}
			set
			{
				PlayerData.instance.SetInt("silkSpoolParts", value);
			}
		}

		public static bool atBench
		{
			get
			{
				return PlayerData.instance.GetBool("atBench");
			}
			set
			{
				PlayerData.instance.SetBool("atBench", value);
			}
		}

		public static string respawnScene
		{
			get
			{
				return PlayerData.instance.GetString("respawnScene");
			}
			set
			{
				PlayerData.instance.SetString("respawnScene", value);
			}
		}

		public static MapZone mapZone
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<MapZone>((IIncludeVariableExtensions)(object)PlayerData.instance, "mapZone");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<MapZone>((IIncludeVariableExtensions)(object)PlayerData.instance, "mapZone", value);
			}
		}

		public static ExtraRestZones extraRestZone
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<ExtraRestZones>((IIncludeVariableExtensions)(object)PlayerData.instance, "extraRestZone");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<ExtraRestZones>((IIncludeVariableExtensions)(object)PlayerData.instance, "extraRestZone", value);
			}
		}

		public static string respawnMarkerName
		{
			get
			{
				return PlayerData.instance.GetString("respawnMarkerName");
			}
			set
			{
				PlayerData.instance.SetString("respawnMarkerName", value);
			}
		}

		public static int respawnType
		{
			get
			{
				return PlayerData.instance.GetInt("respawnType");
			}
			set
			{
				PlayerData.instance.SetInt("respawnType", value);
			}
		}

		public static string tempRespawnScene
		{
			get
			{
				return PlayerData.instance.GetString("tempRespawnScene");
			}
			set
			{
				PlayerData.instance.SetString("tempRespawnScene", value);
			}
		}

		public static string tempRespawnMarker
		{
			get
			{
				return PlayerData.instance.GetString("tempRespawnMarker");
			}
			set
			{
				PlayerData.instance.SetString("tempRespawnMarker", value);
			}
		}

		public static int tempRespawnType
		{
			get
			{
				return PlayerData.instance.GetInt("tempRespawnType");
			}
			set
			{
				PlayerData.instance.SetInt("tempRespawnType", value);
			}
		}

		public static string nonLethalRespawnScene
		{
			get
			{
				return PlayerData.instance.GetString("nonLethalRespawnScene");
			}
			set
			{
				PlayerData.instance.SetString("nonLethalRespawnScene", value);
			}
		}

		public static string nonLethalRespawnMarker
		{
			get
			{
				return PlayerData.instance.GetString("nonLethalRespawnMarker");
			}
			set
			{
				PlayerData.instance.SetString("nonLethalRespawnMarker", value);
			}
		}

		public static int nonLethalRespawnType
		{
			get
			{
				return PlayerData.instance.GetInt("nonLethalRespawnType");
			}
			set
			{
				PlayerData.instance.SetInt("nonLethalRespawnType", value);
			}
		}

		public static Vector3 hazardRespawnLocation
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return PlayerData.instance.GetVector3("hazardRespawnLocation");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				PlayerData.instance.SetVector3("hazardRespawnLocation", value);
			}
		}

		public static FacingDirection hazardRespawnFacing
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<FacingDirection>((IIncludeVariableExtensions)(object)PlayerData.instance, "hazardRespawnFacing");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<FacingDirection>((IIncludeVariableExtensions)(object)PlayerData.instance, "hazardRespawnFacing", value);
			}
		}

		public static string HeroCorpseScene
		{
			get
			{
				return PlayerData.instance.GetString("HeroCorpseScene");
			}
			set
			{
				PlayerData.instance.SetString("HeroCorpseScene", value);
			}
		}

		public static Vector2 HeroDeathScenePos
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathScenePos");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathScenePos", value);
			}
		}

		public static Vector2 HeroDeathSceneSize
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathSceneSize");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<Vector2>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroDeathSceneSize", value);
			}
		}

		public static byte[] HeroCorpseMarkerGuid
		{
			get
			{
				return VariableExtensions.GetVariable<byte[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseMarkerGuid");
			}
			set
			{
				VariableExtensions.SetVariable<byte[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseMarkerGuid", value);
			}
		}

		public static HeroDeathCocoonTypes HeroCorpseType
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<HeroDeathCocoonTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseType");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<HeroDeathCocoonTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "HeroCorpseType", value);
			}
		}

		public static int HeroCorpseMoneyPool
		{
			get
			{
				return PlayerData.instance.GetInt("HeroCorpseMoneyPool");
			}
			set
			{
				PlayerData.instance.SetInt("HeroCorpseMoneyPool", value);
			}
		}

		public static int nailRange
		{
			get
			{
				return PlayerData.instance.GetInt("nailRange");
			}
			set
			{
				PlayerData.instance.SetInt("nailRange", value);
			}
		}

		public static int beamDamage
		{
			get
			{
				return PlayerData.instance.GetInt("beamDamage");
			}
			set
			{
				PlayerData.instance.SetInt("beamDamage", value);
			}
		}

		public static int nailUpgrades
		{
			get
			{
				return PlayerData.instance.GetInt("nailUpgrades");
			}
			set
			{
				PlayerData.instance.SetInt("nailUpgrades", value);
			}
		}

		public static bool InvNailHasNew
		{
			get
			{
				return PlayerData.instance.GetBool("InvNailHasNew");
			}
			set
			{
				PlayerData.instance.SetBool("InvNailHasNew", value);
			}
		}

		public static bool hasSilkSpecial
		{
			get
			{
				return PlayerData.instance.GetBool("hasSilkSpecial");
			}
			set
			{
				PlayerData.instance.SetBool("hasSilkSpecial", value);
			}
		}

		public static int silkSpecialLevel
		{
			get
			{
				return PlayerData.instance.GetInt("silkSpecialLevel");
			}
			set
			{
				PlayerData.instance.SetInt("silkSpecialLevel", value);
			}
		}

		public static bool hasNeedleThrow
		{
			get
			{
				return PlayerData.instance.GetBool("hasNeedleThrow");
			}
			set
			{
				PlayerData.instance.SetBool("hasNeedleThrow", value);
			}
		}

		public static bool hasThreadSphere
		{
			get
			{
				return PlayerData.instance.GetBool("hasThreadSphere");
			}
			set
			{
				PlayerData.instance.SetBool("hasThreadSphere", value);
			}
		}

		public static bool hasParry
		{
			get
			{
				return PlayerData.instance.GetBool("hasParry");
			}
			set
			{
				PlayerData.instance.SetBool("hasParry", value);
			}
		}

		public static bool hasHarpoonDash
		{
			get
			{
				return PlayerData.instance.GetBool("hasHarpoonDash");
			}
			set
			{
				PlayerData.instance.SetBool("hasHarpoonDash", value);
			}
		}

		public static bool hasSilkCharge
		{
			get
			{
				return PlayerData.instance.GetBool("hasSilkCharge");
			}
			set
			{
				PlayerData.instance.SetBool("hasSilkCharge", value);
			}
		}

		public static bool hasSilkBomb
		{
			get
			{
				return PlayerData.instance.GetBool("hasSilkBomb");
			}
			set
			{
				PlayerData.instance.SetBool("hasSilkBomb", value);
			}
		}

		public static bool hasSilkBossNeedle
		{
			get
			{
				return PlayerData.instance.GetBool("hasSilkBossNeedle");
			}
			set
			{
				PlayerData.instance.SetBool("hasSilkBossNeedle", value);
			}
		}

		public static bool hasNeedolin
		{
			get
			{
				return PlayerData.instance.GetBool("hasNeedolin");
			}
			set
			{
				PlayerData.instance.SetBool("hasNeedolin", value);
			}
		}

		public static int attunement
		{
			get
			{
				return PlayerData.instance.GetInt("attunement");
			}
			set
			{
				PlayerData.instance.SetInt("attunement", value);
			}
		}

		public static int attunementLevel
		{
			get
			{
				return PlayerData.instance.GetInt("attunementLevel");
			}
			set
			{
				PlayerData.instance.SetInt("attunementLevel", value);
			}
		}

		public static bool hasNeedolinMemoryPowerup
		{
			get
			{
				return PlayerData.instance.GetBool("hasNeedolinMemoryPowerup");
			}
			set
			{
				PlayerData.instance.SetBool("hasNeedolinMemoryPowerup", value);
			}
		}

		public static bool hasDash
		{
			get
			{
				return PlayerData.instance.GetBool("hasDash");
			}
			set
			{
				PlayerData.instance.SetBool("hasDash", value);
			}
		}

		public static bool hasBrolly
		{
			get
			{
				return PlayerData.instance.GetBool("hasBrolly");
			}
			set
			{
				PlayerData.instance.SetBool("hasBrolly", value);
			}
		}

		public static bool hasWalljump
		{
			get
			{
				return PlayerData.instance.GetBool("hasWalljump");
			}
			set
			{
				PlayerData.instance.SetBool("hasWalljump", value);
			}
		}

		public static bool hasDoubleJump
		{
			get
			{
				return PlayerData.instance.GetBool("hasDoubleJump");
			}
			set
			{
				PlayerData.instance.SetBool("hasDoubleJump", value);
			}
		}

		public static bool hasQuill
		{
			get
			{
				return PlayerData.instance.GetBool("hasQuill");
			}
			set
			{
				PlayerData.instance.SetBool("hasQuill", value);
			}
		}

		public static bool hasChargeSlash
		{
			get
			{
				return PlayerData.instance.GetBool("hasChargeSlash");
			}
			set
			{
				PlayerData.instance.SetBool("hasChargeSlash", value);
			}
		}

		public static bool hasSuperJump
		{
			get
			{
				return PlayerData.instance.GetBool("hasSuperJump");
			}
			set
			{
				PlayerData.instance.SetBool("hasSuperJump", value);
			}
		}

		public static int QuillState
		{
			get
			{
				return PlayerData.instance.GetInt("QuillState");
			}
			set
			{
				PlayerData.instance.SetInt("QuillState", value);
			}
		}

		public static bool HasSeenDash
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenDash");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenDash", value);
			}
		}

		public static bool HasSeenWalljump
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenWalljump");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenWalljump", value);
			}
		}

		public static bool HasSeenSuperJump
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenSuperJump");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenSuperJump", value);
			}
		}

		public static bool HasSeenNeedolin
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenNeedolin");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenNeedolin", value);
			}
		}

		public static bool HasSeenNeedolinUp
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenNeedolinUp");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenNeedolinUp", value);
			}
		}

		public static bool HasSeenNeedolinDown
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenNeedolinDown");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenNeedolinDown", value);
			}
		}

		public static bool HasSeenHarpoon
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenHarpoon");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenHarpoon", value);
			}
		}

		public static bool HasSeenEvaHeal
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenEvaHeal");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenEvaHeal", value);
			}
		}

		public static int cloakOdour_slabFly
		{
			get
			{
				return PlayerData.instance.GetInt("cloakOdour_slabFly");
			}
			set
			{
				PlayerData.instance.SetInt("cloakOdour_slabFly", value);
			}
		}

		public static bool HasSeenSilkHearts
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenSilkHearts");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenSilkHearts", value);
			}
		}

		public static bool hasKilled
		{
			get
			{
				return PlayerData.instance.GetBool("hasKilled");
			}
			set
			{
				PlayerData.instance.SetBool("hasKilled", value);
			}
		}

		public static CompletionState CompletedEndings
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "CompletedEndings");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "CompletedEndings", value);
			}
		}

		public static CompletionState LastCompletedEnding
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "LastCompletedEnding");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<CompletionState>((IIncludeVariableExtensions)(object)PlayerData.instance, "LastCompletedEnding", value);
			}
		}

		public static bool fixerQuestBoardConvo
		{
			get
			{
				return PlayerData.instance.GetBool("fixerQuestBoardConvo");
			}
			set
			{
				PlayerData.instance.SetBool("fixerQuestBoardConvo", value);
			}
		}

		public static bool fixerAcceptedQuestConvo
		{
			get
			{
				return PlayerData.instance.GetBool("fixerAcceptedQuestConvo");
			}
			set
			{
				PlayerData.instance.SetBool("fixerAcceptedQuestConvo", value);
			}
		}

		public static bool fixerBridgeConstructed
		{
			get
			{
				return PlayerData.instance.GetBool("fixerBridgeConstructed");
			}
			set
			{
				PlayerData.instance.SetBool("fixerBridgeConstructed", value);
			}
		}

		public static bool fixerBridgeBreaking
		{
			get
			{
				return PlayerData.instance.GetBool("fixerBridgeBreaking");
			}
			set
			{
				PlayerData.instance.SetBool("fixerBridgeBreaking", value);
			}
		}

		public static bool fixerBridgeBroken
		{
			get
			{
				return PlayerData.instance.GetBool("fixerBridgeBroken");
			}
			set
			{
				PlayerData.instance.SetBool("fixerBridgeBroken", value);
			}
		}

		public static bool fixerStatueConstructed
		{
			get
			{
				return PlayerData.instance.GetBool("fixerStatueConstructed");
			}
			set
			{
				PlayerData.instance.SetBool("fixerStatueConstructed", value);
			}
		}

		public static bool fixerStatueConvo
		{
			get
			{
				return PlayerData.instance.GetBool("fixerStatueConvo");
			}
			set
			{
				PlayerData.instance.SetBool("fixerStatueConvo", value);
			}
		}

		public static bool metSherma
		{
			get
			{
				return PlayerData.instance.GetBool("metSherma");
			}
			set
			{
				PlayerData.instance.SetBool("metSherma", value);
			}
		}

		public static bool seenBellBeast
		{
			get
			{
				return PlayerData.instance.GetBool("seenBellBeast");
			}
			set
			{
				PlayerData.instance.SetBool("seenBellBeast", value);
			}
		}

		public static int shermaPos
		{
			get
			{
				return PlayerData.instance.GetInt("shermaPos");
			}
			set
			{
				PlayerData.instance.SetInt("shermaPos", value);
			}
		}

		public static bool shermaConvoBellBeast
		{
			get
			{
				return PlayerData.instance.GetBool("shermaConvoBellBeast");
			}
			set
			{
				PlayerData.instance.SetBool("shermaConvoBellBeast", value);
			}
		}

		public static bool metShermaPilgrimsRest
		{
			get
			{
				return PlayerData.instance.GetBool("metShermaPilgrimsRest");
			}
			set
			{
				PlayerData.instance.SetBool("metShermaPilgrimsRest", value);
			}
		}

		public static bool shermaInBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("shermaInBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("shermaInBellhart", value);
			}
		}

		public static bool shermaSeenInBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("shermaSeenInBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("shermaSeenInBellhart", value);
			}
		}

		public static bool shermaSeenInSteps
		{
			get
			{
				return PlayerData.instance.GetBool("shermaSeenInSteps");
			}
			set
			{
				PlayerData.instance.SetBool("shermaSeenInSteps", value);
			}
		}

		public static bool shermaAtSteps
		{
			get
			{
				return PlayerData.instance.GetBool("shermaAtSteps");
			}
			set
			{
				PlayerData.instance.SetBool("shermaAtSteps", value);
			}
		}

		public static bool shermaConvoCoralBench
		{
			get
			{
				return PlayerData.instance.GetBool("shermaConvoCoralBench");
			}
			set
			{
				PlayerData.instance.SetBool("shermaConvoCoralBench", value);
			}
		}

		public static bool shermaConvoCoralJudges
		{
			get
			{
				return PlayerData.instance.GetBool("shermaConvoCoralJudges");
			}
			set
			{
				PlayerData.instance.SetBool("shermaConvoCoralJudges", value);
			}
		}

		public static bool hasActivatedBellBench
		{
			get
			{
				return PlayerData.instance.GetBool("hasActivatedBellBench");
			}
			set
			{
				PlayerData.instance.SetBool("hasActivatedBellBench", value);
			}
		}

		public static bool shermaWokeInSteps
		{
			get
			{
				return PlayerData.instance.GetBool("shermaWokeInSteps");
			}
			set
			{
				PlayerData.instance.SetBool("shermaWokeInSteps", value);
			}
		}

		public static bool enteredCoral_10
		{
			get
			{
				return PlayerData.instance.GetBool("enteredCoral_10");
			}
			set
			{
				PlayerData.instance.SetBool("enteredCoral_10", value);
			}
		}

		public static bool shermaCitadelEntrance_Visiting
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelEntrance_Visiting");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelEntrance_Visiting", value);
			}
		}

		public static bool shermaCitadelEntrance_Seen
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelEntrance_Seen");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelEntrance_Seen", value);
			}
		}

		public static bool shermaCitadelEntrance_Left
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelEntrance_Left");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelEntrance_Left", value);
			}
		}

		public static bool openedCitadelSpaLeft
		{
			get
			{
				return PlayerData.instance.GetBool("openedCitadelSpaLeft");
			}
			set
			{
				PlayerData.instance.SetBool("openedCitadelSpaLeft", value);
			}
		}

		public static bool openedCitadelSpaRight
		{
			get
			{
				return PlayerData.instance.GetBool("openedCitadelSpaRight");
			}
			set
			{
				PlayerData.instance.SetBool("openedCitadelSpaRight", value);
			}
		}

		public static bool shermaCitadelSpa_Visiting
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelSpa_Visiting");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelSpa_Visiting", value);
			}
		}

		public static bool shermaCitadelSpa_Seen
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelSpa_Seen");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelSpa_Seen", value);
			}
		}

		public static bool shermaCitadelSpa_Left
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelSpa_Left");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelSpa_Left", value);
			}
		}

		public static bool shermaCitadelSpa_ExtraConvo
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelSpa_ExtraConvo");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelSpa_ExtraConvo", value);
			}
		}

		public static bool shermaInEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("shermaInEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("shermaInEnclave", value);
			}
		}

		public static bool shermaCitadelEnclave_Seen
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCitadelEnclave_Seen");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCitadelEnclave_Seen", value);
			}
		}

		public static bool metShermaEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("metShermaEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("metShermaEnclave", value);
			}
		}

		public static bool shermaEnclaveHealingConvo
		{
			get
			{
				return PlayerData.instance.GetBool("shermaEnclaveHealingConvo");
			}
			set
			{
				PlayerData.instance.SetBool("shermaEnclaveHealingConvo", value);
			}
		}

		public static bool shermaQuestActive
		{
			get
			{
				return PlayerData.instance.GetBool("shermaQuestActive");
			}
			set
			{
				PlayerData.instance.SetBool("shermaQuestActive", value);
			}
		}

		public static bool shermaHealerActive
		{
			get
			{
				return PlayerData.instance.GetBool("shermaHealerActive");
			}
			set
			{
				PlayerData.instance.SetBool("shermaHealerActive", value);
			}
		}

		public static int shermaWoundedPilgrim
		{
			get
			{
				return PlayerData.instance.GetInt("shermaWoundedPilgrim");
			}
			set
			{
				PlayerData.instance.SetInt("shermaWoundedPilgrim", value);
			}
		}

		public static bool shermaCaretakerConvo1
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCaretakerConvo1");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCaretakerConvo1", value);
			}
		}

		public static bool shermaCaretakerConvoFinal
		{
			get
			{
				return PlayerData.instance.GetBool("shermaCaretakerConvoFinal");
			}
			set
			{
				PlayerData.instance.SetBool("shermaCaretakerConvoFinal", value);
			}
		}

		public static bool metMapper
		{
			get
			{
				return PlayerData.instance.GetBool("metMapper");
			}
			set
			{
				PlayerData.instance.SetBool("metMapper", value);
			}
		}

		public static bool mapperRosaryConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperRosaryConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperRosaryConvo", value);
			}
		}

		public static bool mapperMentorConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperMentorConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperMentorConvo", value);
			}
		}

		public static bool mapperQuillConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperQuillConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperQuillConvo", value);
			}
		}

		public static bool mapperMappingConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperMappingConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperMappingConvo", value);
			}
		}

		public static bool mapperCalledConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperCalledConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperCalledConvo", value);
			}
		}

		public static bool mapperHauntedBellhartConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperHauntedBellhartConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperHauntedBellhartConvo", value);
			}
		}

		public static bool mapperBellhartConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperBellhartConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperBellhartConvo", value);
			}
		}

		public static bool mapperBellhartConvoTimePassed
		{
			get
			{
				return PlayerData.instance.GetBool("mapperBellhartConvoTimePassed");
			}
			set
			{
				PlayerData.instance.SetBool("mapperBellhartConvoTimePassed", value);
			}
		}

		public static bool mapperBellhartConvo2
		{
			get
			{
				return PlayerData.instance.GetBool("mapperBellhartConvo2");
			}
			set
			{
				PlayerData.instance.SetBool("mapperBellhartConvo2", value);
			}
		}

		public static bool mapperAway
		{
			get
			{
				return PlayerData.instance.GetBool("mapperAway");
			}
			set
			{
				PlayerData.instance.SetBool("mapperAway", value);
			}
		}

		public static bool mapperMetInAnt04
		{
			get
			{
				return PlayerData.instance.GetBool("mapperMetInAnt04");
			}
			set
			{
				PlayerData.instance.SetBool("mapperMetInAnt04", value);
			}
		}

		public static bool mapperTubeConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperTubeConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperTubeConvo", value);
			}
		}

		public static bool mapperBrokenBenchConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperBrokenBenchConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperBrokenBenchConvo", value);
			}
		}

		public static bool mapperCursedConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperCursedConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperCursedConvo", value);
			}
		}

		public static bool mapperMaggottedConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperMaggottedConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperMaggottedConvo", value);
			}
		}

		public static bool mapperSellingTubePins
		{
			get
			{
				return PlayerData.instance.GetBool("mapperSellingTubePins");
			}
			set
			{
				PlayerData.instance.SetBool("mapperSellingTubePins", value);
			}
		}

		public static bool mapperMasterAfterConvo
		{
			get
			{
				return PlayerData.instance.GetBool("mapperMasterAfterConvo");
			}
			set
			{
				PlayerData.instance.SetBool("mapperMasterAfterConvo", value);
			}
		}

		public static bool mapperReactedToBrokenBellBench
		{
			get
			{
				return PlayerData.instance.GetBool("mapperReactedToBrokenBellBench");
			}
			set
			{
				PlayerData.instance.SetBool("mapperReactedToBrokenBellBench", value);
			}
		}

		public static bool SeenMapperBonetown
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperBonetown");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperBonetown", value);
			}
		}

		public static bool MapperLeftBonetown
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftBonetown");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftBonetown", value);
			}
		}

		public static bool MapperAppearInBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("MapperAppearInBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("MapperAppearInBellhart", value);
			}
		}

		public static bool SeenMapperBoneForest
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperBoneForest");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperBoneForest", value);
			}
		}

		public static bool MapperLeftBoneForest
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftBoneForest");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftBoneForest", value);
			}
		}

		public static bool SeenMapperDocks
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperDocks");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperDocks", value);
			}
		}

		public static bool MapperLeftDocks
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftDocks");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftDocks", value);
			}
		}

		public static bool SeenMapperWilds
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperWilds");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperWilds", value);
			}
		}

		public static bool MapperLeftWilds
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftWilds");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftWilds", value);
			}
		}

		public static bool SeenMapperCrawl
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperCrawl");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperCrawl", value);
			}
		}

		public static bool MapperLeftCrawl
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftCrawl");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftCrawl", value);
			}
		}

		public static bool SeenMapperGreymoor
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperGreymoor");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperGreymoor", value);
			}
		}

		public static bool MapperLeftGreymoor
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftGreymoor");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftGreymoor", value);
			}
		}

		public static bool SeenMapperBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperBellhart", value);
			}
		}

		public static bool MapperLeftBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftBellhart", value);
			}
		}

		public static bool SeenMapperShellwood
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperShellwood");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperShellwood", value);
			}
		}

		public static bool MapperLeftShellwood
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftShellwood");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftShellwood", value);
			}
		}

		public static bool SeenMapperHuntersNest
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperHuntersNest");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperHuntersNest", value);
			}
		}

		public static bool MapperLeftHuntersNest
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftHuntersNest");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftHuntersNest", value);
			}
		}

		public static bool SeenMapperJudgeSteps
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperJudgeSteps");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperJudgeSteps", value);
			}
		}

		public static bool MapperLeftJudgeSteps
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftJudgeSteps");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftJudgeSteps", value);
			}
		}

		public static bool SeenMapperDustpens
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperDustpens");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperDustpens", value);
			}
		}

		public static bool MapperLeftDustpens
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftDustpens");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftDustpens", value);
			}
		}

		public static bool SeenMapperPeak
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperPeak");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperPeak", value);
			}
		}

		public static bool MapperLeftPeak
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftPeak");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftPeak", value);
			}
		}

		public static bool SeenMapperShadow
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperShadow");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperShadow", value);
			}
		}

		public static bool MapperLeftShadow
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftShadow");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftShadow", value);
			}
		}

		public static bool SeenMapperCoralCaverns
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMapperCoralCaverns");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMapperCoralCaverns", value);
			}
		}

		public static bool MapperLeftCoralCaverns
		{
			get
			{
				return PlayerData.instance.GetBool("MapperLeftCoralCaverns");
			}
			set
			{
				PlayerData.instance.SetBool("MapperLeftCoralCaverns", value);
			}
		}

		public static bool mapperSparIntro
		{
			get
			{
				return PlayerData.instance.GetBool("mapperSparIntro");
			}
			set
			{
				PlayerData.instance.SetBool("mapperSparIntro", value);
			}
		}

		public static int mapperLocationAct3
		{
			get
			{
				return PlayerData.instance.GetInt("mapperLocationAct3");
			}
			set
			{
				PlayerData.instance.SetInt("mapperLocationAct3", value);
			}
		}

		public static bool seenMapperAct3
		{
			get
			{
				return PlayerData.instance.GetBool("seenMapperAct3");
			}
			set
			{
				PlayerData.instance.SetBool("seenMapperAct3", value);
			}
		}

		public static bool mapperIsFightingAct3
		{
			get
			{
				return PlayerData.instance.GetBool("mapperIsFightingAct3");
			}
			set
			{
				PlayerData.instance.SetBool("mapperIsFightingAct3", value);
			}
		}

		public static int mapperFightGroup
		{
			get
			{
				return PlayerData.instance.GetInt("mapperFightGroup");
			}
			set
			{
				PlayerData.instance.SetInt("mapperFightGroup", value);
			}
		}

		public static bool mapperConvo_Act3Intro
		{
			get
			{
				return PlayerData.instance.GetBool("mapperConvo_Act3Intro");
			}
			set
			{
				PlayerData.instance.SetBool("mapperConvo_Act3Intro", value);
			}
		}

		public static bool mapperConvo_Act3IntroTimePassed
		{
			get
			{
				return PlayerData.instance.GetBool("mapperConvo_Act3IntroTimePassed");
			}
			set
			{
				PlayerData.instance.SetBool("mapperConvo_Act3IntroTimePassed", value);
			}
		}

		public static bool mapperConvo_Act3NoStock
		{
			get
			{
				return PlayerData.instance.GetBool("mapperConvo_Act3NoStock");
			}
			set
			{
				PlayerData.instance.SetBool("mapperConvo_Act3NoStock", value);
			}
		}

		public static bool mapperConvo_WhiteFlower
		{
			get
			{
				return PlayerData.instance.GetBool("mapperConvo_WhiteFlower");
			}
			set
			{
				PlayerData.instance.SetBool("mapperConvo_WhiteFlower", value);
			}
		}

		public static bool metDruid
		{
			get
			{
				return PlayerData.instance.GetBool("metDruid");
			}
			set
			{
				PlayerData.instance.SetBool("metDruid", value);
			}
		}

		public static bool druidTradeIntro
		{
			get
			{
				return PlayerData.instance.GetBool("druidTradeIntro");
			}
			set
			{
				PlayerData.instance.SetBool("druidTradeIntro", value);
			}
		}

		public static int druidMossBerriesSold
		{
			get
			{
				return PlayerData.instance.GetInt("druidMossBerriesSold");
			}
			set
			{
				PlayerData.instance.SetInt("druidMossBerriesSold", value);
			}
		}

		public static int[] mossBerryValueList
		{
			get
			{
				return VariableExtensions.GetVariable<int[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "mossBerryValueList");
			}
			set
			{
				VariableExtensions.SetVariable<int[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "mossBerryValueList", value);
			}
		}

		public static bool druidAct3Intro
		{
			get
			{
				return PlayerData.instance.GetBool("druidAct3Intro");
			}
			set
			{
				PlayerData.instance.SetBool("druidAct3Intro", value);
			}
		}

		public static bool metLearnedPilgrim
		{
			get
			{
				return PlayerData.instance.GetBool("metLearnedPilgrim");
			}
			set
			{
				PlayerData.instance.SetBool("metLearnedPilgrim", value);
			}
		}

		public static bool metLearnedPilgrimAct3
		{
			get
			{
				return PlayerData.instance.GetBool("metLearnedPilgrimAct3");
			}
			set
			{
				PlayerData.instance.SetBool("metLearnedPilgrimAct3", value);
			}
		}

		public static bool metDicePilgrim
		{
			get
			{
				return PlayerData.instance.GetBool("metDicePilgrim");
			}
			set
			{
				PlayerData.instance.SetBool("metDicePilgrim", value);
			}
		}

		public static bool dicePilgrimDefeated
		{
			get
			{
				return PlayerData.instance.GetBool("dicePilgrimDefeated");
			}
			set
			{
				PlayerData.instance.SetBool("dicePilgrimDefeated", value);
			}
		}

		public static int dicePilgrimState
		{
			get
			{
				return PlayerData.instance.GetInt("dicePilgrimState");
			}
			set
			{
				PlayerData.instance.SetInt("dicePilgrimState", value);
			}
		}

		public static bool dicePilgrimGameExplained
		{
			get
			{
				return PlayerData.instance.GetBool("dicePilgrimGameExplained");
			}
			set
			{
				PlayerData.instance.SetBool("dicePilgrimGameExplained", value);
			}
		}

		public static int dicePilgrimBank
		{
			get
			{
				return PlayerData.instance.GetInt("dicePilgrimBank");
			}
			set
			{
				PlayerData.instance.SetInt("dicePilgrimBank", value);
			}
		}

		public static bool metGarmond
		{
			get
			{
				return PlayerData.instance.GetBool("metGarmond");
			}
			set
			{
				PlayerData.instance.SetBool("metGarmond", value);
			}
		}

		public static bool garmondMoorwingConvo
		{
			get
			{
				return PlayerData.instance.GetBool("garmondMoorwingConvo");
			}
			set
			{
				PlayerData.instance.SetBool("garmondMoorwingConvo", value);
			}
		}

		public static bool garmondMoorwingConvoReady
		{
			get
			{
				return PlayerData.instance.GetBool("garmondMoorwingConvoReady");
			}
			set
			{
				PlayerData.instance.SetBool("garmondMoorwingConvoReady", value);
			}
		}

		public static bool garmondPurposeConvo
		{
			get
			{
				return PlayerData.instance.GetBool("garmondPurposeConvo");
			}
			set
			{
				PlayerData.instance.SetBool("garmondPurposeConvo", value);
			}
		}

		public static bool garmondSeenInGreymoor10
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInGreymoor10");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInGreymoor10", value);
			}
		}

		public static bool garmondInDust05
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInDust05");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInDust05", value);
			}
		}

		public static bool garmondSeenInDust05
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInDust05");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInDust05", value);
			}
		}

		public static bool garmondEncounterCooldown
		{
			get
			{
				return PlayerData.instance.GetBool("garmondEncounterCooldown");
			}
			set
			{
				PlayerData.instance.SetBool("garmondEncounterCooldown", value);
			}
		}

		public static bool enteredSong_19
		{
			get
			{
				return PlayerData.instance.GetBool("enteredSong_19");
			}
			set
			{
				PlayerData.instance.SetBool("enteredSong_19", value);
			}
		}

		public static bool enteredSong_01
		{
			get
			{
				return PlayerData.instance.GetBool("enteredSong_01");
			}
			set
			{
				PlayerData.instance.SetBool("enteredSong_01", value);
			}
		}

		public static bool enteredSong_02
		{
			get
			{
				return PlayerData.instance.GetBool("enteredSong_02");
			}
			set
			{
				PlayerData.instance.SetBool("enteredSong_02", value);
			}
		}

		public static bool garmondInSong01
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInSong01");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInSong01", value);
			}
		}

		public static bool garmondSeenInSong01
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInSong01");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInSong01", value);
			}
		}

		public static bool garmondInSong02
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInSong02");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInSong02", value);
			}
		}

		public static bool garmondSeenInSong02
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInSong02");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInSong02", value);
			}
		}

		public static bool enteredSong_13
		{
			get
			{
				return PlayerData.instance.GetBool("enteredSong_13");
			}
			set
			{
				PlayerData.instance.SetBool("enteredSong_13", value);
			}
		}

		public static bool garmondInSong13
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInSong13");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInSong13", value);
			}
		}

		public static bool garmondSeenInSong13
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInSong13");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInSong13", value);
			}
		}

		public static bool enteredSong_17
		{
			get
			{
				return PlayerData.instance.GetBool("enteredSong_17");
			}
			set
			{
				PlayerData.instance.SetBool("enteredSong_17", value);
			}
		}

		public static bool garmondInSong17
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInSong17");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInSong17", value);
			}
		}

		public static bool garmondSeenInSong17
		{
			get
			{
				return PlayerData.instance.GetBool("garmondSeenInSong17");
			}
			set
			{
				PlayerData.instance.SetBool("garmondSeenInSong17", value);
			}
		}

		public static bool garmondInLibrary
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInLibrary");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInLibrary", value);
			}
		}

		public static bool garmondLibrarySeen
		{
			get
			{
				return PlayerData.instance.GetBool("garmondLibrarySeen");
			}
			set
			{
				PlayerData.instance.SetBool("garmondLibrarySeen", value);
			}
		}

		public static bool garmondLibraryMet
		{
			get
			{
				return PlayerData.instance.GetBool("garmondLibraryMet");
			}
			set
			{
				PlayerData.instance.SetBool("garmondLibraryMet", value);
			}
		}

		public static bool garmondLibraryOffered
		{
			get
			{
				return PlayerData.instance.GetBool("garmondLibraryOffered");
			}
			set
			{
				PlayerData.instance.SetBool("garmondLibraryOffered", value);
			}
		}

		public static bool garmondLibraryDefeatedHornet
		{
			get
			{
				return PlayerData.instance.GetBool("garmondLibraryDefeatedHornet");
			}
			set
			{
				PlayerData.instance.SetBool("garmondLibraryDefeatedHornet", value);
			}
		}

		public static bool garmondWillAidInForumBattle
		{
			get
			{
				return PlayerData.instance.GetBool("garmondWillAidInForumBattle");
			}
			set
			{
				PlayerData.instance.SetBool("garmondWillAidInForumBattle", value);
			}
		}

		public static bool garmondInEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("garmondInEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("garmondInEnclave", value);
			}
		}

		public static bool garmondMetEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("garmondMetEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("garmondMetEnclave", value);
			}
		}

		public static int garmondEncounters_act3
		{
			get
			{
				return PlayerData.instance.GetInt("garmondEncounters_act3");
			}
			set
			{
				PlayerData.instance.SetInt("garmondEncounters_act3", value);
			}
		}

		public static bool metGarmondAct3
		{
			get
			{
				return PlayerData.instance.GetBool("metGarmondAct3");
			}
			set
			{
				PlayerData.instance.SetBool("metGarmondAct3", value);
			}
		}

		public static bool garmondFinalQuestReady
		{
			get
			{
				return PlayerData.instance.GetBool("garmondFinalQuestReady");
			}
			set
			{
				PlayerData.instance.SetBool("garmondFinalQuestReady", value);
			}
		}

		public static bool garmondBlackThreadDefeated
		{
			get
			{
				return PlayerData.instance.GetBool("garmondBlackThreadDefeated");
			}
			set
			{
				PlayerData.instance.SetBool("garmondBlackThreadDefeated", value);
			}
		}

		public static bool pilgrimRestMerchant_SingConvo
		{
			get
			{
				return PlayerData.instance.GetBool("pilgrimRestMerchant_SingConvo");
			}
			set
			{
				PlayerData.instance.SetBool("pilgrimRestMerchant_SingConvo", value);
			}
		}

		public static bool pilgrimRestMerchant_RhinoRuckusConvo
		{
			get
			{
				return PlayerData.instance.GetBool("pilgrimRestMerchant_RhinoRuckusConvo");
			}
			set
			{
				PlayerData.instance.SetBool("pilgrimRestMerchant_RhinoRuckusConvo", value);
			}
		}

		public static int pilgrimRestCrowd
		{
			get
			{
				return PlayerData.instance.GetInt("pilgrimRestCrowd");
			}
			set
			{
				PlayerData.instance.SetInt("pilgrimRestCrowd", value);
			}
		}

		public static bool nuuIsHome
		{
			get
			{
				return PlayerData.instance.GetBool("nuuIsHome");
			}
			set
			{
				PlayerData.instance.SetBool("nuuIsHome", value);
			}
		}

		public static bool MetHalfwayHunterFan
		{
			get
			{
				return PlayerData.instance.GetBool("MetHalfwayHunterFan");
			}
			set
			{
				PlayerData.instance.SetBool("MetHalfwayHunterFan", value);
			}
		}

		public static bool MetHunterFanOutside
		{
			get
			{
				return PlayerData.instance.GetBool("MetHunterFanOutside");
			}
			set
			{
				PlayerData.instance.SetBool("MetHunterFanOutside", value);
			}
		}

		public static bool nuuVisiting_splinterQueen
		{
			get
			{
				return PlayerData.instance.GetBool("nuuVisiting_splinterQueen");
			}
			set
			{
				PlayerData.instance.SetBool("nuuVisiting_splinterQueen", value);
			}
		}

		public static bool nuuEncountered_splinterQueen
		{
			get
			{
				return PlayerData.instance.GetBool("nuuEncountered_splinterQueen");
			}
			set
			{
				PlayerData.instance.SetBool("nuuEncountered_splinterQueen", value);
			}
		}

		public static bool nuuVisiting_coralDrillers
		{
			get
			{
				return PlayerData.instance.GetBool("nuuVisiting_coralDrillers");
			}
			set
			{
				PlayerData.instance.SetBool("nuuVisiting_coralDrillers", value);
			}
		}

		public static bool nuuEncountered_coralDrillers
		{
			get
			{
				return PlayerData.instance.GetBool("nuuEncountered_coralDrillers");
			}
			set
			{
				PlayerData.instance.SetBool("nuuEncountered_coralDrillers", value);
			}
		}

		public static bool nuuVisiting_skullKing
		{
			get
			{
				return PlayerData.instance.GetBool("nuuVisiting_skullKing");
			}
			set
			{
				PlayerData.instance.SetBool("nuuVisiting_skullKing", value);
			}
		}

		public static bool nuuEncountered_skullKing
		{
			get
			{
				return PlayerData.instance.GetBool("nuuEncountered_skullKing");
			}
			set
			{
				PlayerData.instance.SetBool("nuuEncountered_skullKing", value);
			}
		}

		public static bool nuuVisiting_zapNest
		{
			get
			{
				return PlayerData.instance.GetBool("nuuVisiting_zapNest");
			}
			set
			{
				PlayerData.instance.SetBool("nuuVisiting_zapNest", value);
			}
		}

		public static bool nuuEncountered_zapNest
		{
			get
			{
				return PlayerData.instance.GetBool("nuuEncountered_zapNest");
			}
			set
			{
				PlayerData.instance.SetBool("nuuEncountered_zapNest", value);
			}
		}

		public static bool nuuSlappedOutside
		{
			get
			{
				return PlayerData.instance.GetBool("nuuSlappedOutside");
			}
			set
			{
				PlayerData.instance.SetBool("nuuSlappedOutside", value);
			}
		}

		public static bool nuuIntroAct3
		{
			get
			{
				return PlayerData.instance.GetBool("nuuIntroAct3");
			}
			set
			{
				PlayerData.instance.SetBool("nuuIntroAct3", value);
			}
		}

		public static bool nuuMementoAwarded
		{
			get
			{
				return PlayerData.instance.GetBool("nuuMementoAwarded");
			}
			set
			{
				PlayerData.instance.SetBool("nuuMementoAwarded", value);
			}
		}

		public static bool gillyMet
		{
			get
			{
				return PlayerData.instance.GetBool("gillyMet");
			}
			set
			{
				PlayerData.instance.SetBool("gillyMet", value);
			}
		}

		public static bool gillyIntroduced
		{
			get
			{
				return PlayerData.instance.GetBool("gillyIntroduced");
			}
			set
			{
				PlayerData.instance.SetBool("gillyIntroduced", value);
			}
		}

		public static bool gillyStatueConvo
		{
			get
			{
				return PlayerData.instance.GetBool("gillyStatueConvo");
			}
			set
			{
				PlayerData.instance.SetBool("gillyStatueConvo", value);
			}
		}

		public static bool gillyTrapConvo
		{
			get
			{
				return PlayerData.instance.GetBool("gillyTrapConvo");
			}
			set
			{
				PlayerData.instance.SetBool("gillyTrapConvo", value);
			}
		}

		public static bool gillyHunterCampConvo
		{
			get
			{
				return PlayerData.instance.GetBool("gillyHunterCampConvo");
			}
			set
			{
				PlayerData.instance.SetBool("gillyHunterCampConvo", value);
			}
		}

		public static bool gillyAct3Convo
		{
			get
			{
				return PlayerData.instance.GetBool("gillyAct3Convo");
			}
			set
			{
				PlayerData.instance.SetBool("gillyAct3Convo", value);
			}
		}

		public static int gillyLocation
		{
			get
			{
				return PlayerData.instance.GetInt("gillyLocation");
			}
			set
			{
				PlayerData.instance.SetInt("gillyLocation", value);
			}
		}

		public static int gillyLocationAct3
		{
			get
			{
				return PlayerData.instance.GetInt("gillyLocationAct3");
			}
			set
			{
				PlayerData.instance.SetInt("gillyLocationAct3", value);
			}
		}

		public static bool gillyQueueMovingOn
		{
			get
			{
				return PlayerData.instance.GetBool("gillyQueueMovingOn");
			}
			set
			{
				PlayerData.instance.SetBool("gillyQueueMovingOn", value);
			}
		}

		public static string dreamReturnScene
		{
			get
			{
				return PlayerData.instance.GetString("dreamReturnScene");
			}
			set
			{
				PlayerData.instance.SetString("dreamReturnScene", value);
			}
		}

		public static bool hasJournal
		{
			get
			{
				return PlayerData.instance.GetBool("hasJournal");
			}
			set
			{
				PlayerData.instance.SetBool("hasJournal", value);
			}
		}

		public static bool seenJournalMsg
		{
			get
			{
				return PlayerData.instance.GetBool("seenJournalMsg");
			}
			set
			{
				PlayerData.instance.SetBool("seenJournalMsg", value);
			}
		}

		public static bool seenMateriumMsg
		{
			get
			{
				return PlayerData.instance.GetBool("seenMateriumMsg");
			}
			set
			{
				PlayerData.instance.SetBool("seenMateriumMsg", value);
			}
		}

		public static bool seenJournalQuestUpdateMsg
		{
			get
			{
				return PlayerData.instance.GetBool("seenJournalQuestUpdateMsg");
			}
			set
			{
				PlayerData.instance.SetBool("seenJournalQuestUpdateMsg", value);
			}
		}

		public static EnemyJournalKillData EnemyJournalKillData
		{
			get
			{
				return VariableExtensions.GetVariable<EnemyJournalKillData>((IIncludeVariableExtensions)(object)PlayerData.instance, "EnemyJournalKillData");
			}
			set
			{
				VariableExtensions.SetVariable<EnemyJournalKillData>((IIncludeVariableExtensions)(object)PlayerData.instance, "EnemyJournalKillData", value);
			}
		}

		public static int currentInvPane
		{
			get
			{
				return PlayerData.instance.GetInt("currentInvPane");
			}
			set
			{
				PlayerData.instance.SetInt("currentInvPane", value);
			}
		}

		public static bool showGeoUI
		{
			get
			{
				return PlayerData.instance.GetBool("showGeoUI");
			}
			set
			{
				PlayerData.instance.SetBool("showGeoUI", value);
			}
		}

		public static bool showHealthUI
		{
			get
			{
				return PlayerData.instance.GetBool("showHealthUI");
			}
			set
			{
				PlayerData.instance.SetBool("showHealthUI", value);
			}
		}

		public static bool promptFocus
		{
			get
			{
				return PlayerData.instance.GetBool("promptFocus");
			}
			set
			{
				PlayerData.instance.SetBool("promptFocus", value);
			}
		}

		public static bool seenFocusTablet
		{
			get
			{
				return PlayerData.instance.GetBool("seenFocusTablet");
			}
			set
			{
				PlayerData.instance.SetBool("seenFocusTablet", value);
			}
		}

		public static bool seenDreamNailPrompt
		{
			get
			{
				return PlayerData.instance.GetBool("seenDreamNailPrompt");
			}
			set
			{
				PlayerData.instance.SetBool("seenDreamNailPrompt", value);
			}
		}

		public static bool isFirstGame
		{
			get
			{
				return PlayerData.instance.GetBool("isFirstGame");
			}
			set
			{
				PlayerData.instance.SetBool("isFirstGame", value);
			}
		}

		public static bool enteredTutorialFirstTime
		{
			get
			{
				return PlayerData.instance.GetBool("enteredTutorialFirstTime");
			}
			set
			{
				PlayerData.instance.SetBool("enteredTutorialFirstTime", value);
			}
		}

		public static bool isInvincible
		{
			get
			{
				return PlayerData.instance.GetBool("isInvincible");
			}
			set
			{
				PlayerData.instance.SetBool("isInvincible", value);
			}
		}

		public static bool infiniteAirJump
		{
			get
			{
				return PlayerData.instance.GetBool("infiniteAirJump");
			}
			set
			{
				PlayerData.instance.SetBool("infiniteAirJump", value);
			}
		}

		public static string currentArea
		{
			get
			{
				return PlayerData.instance.GetString("currentArea");
			}
			set
			{
				PlayerData.instance.SetString("currentArea", value);
			}
		}

		public static bool visitedMossCave
		{
			get
			{
				return PlayerData.instance.GetBool("visitedMossCave");
			}
			set
			{
				PlayerData.instance.SetBool("visitedMossCave", value);
			}
		}

		public static bool visitedBoneBottom
		{
			get
			{
				return PlayerData.instance.GetBool("visitedBoneBottom");
			}
			set
			{
				PlayerData.instance.SetBool("visitedBoneBottom", value);
			}
		}

		public static bool visitedBoneForest
		{
			get
			{
				return PlayerData.instance.GetBool("visitedBoneForest");
			}
			set
			{
				PlayerData.instance.SetBool("visitedBoneForest", value);
			}
		}

		public static bool visitedMosstown
		{
			get
			{
				return PlayerData.instance.GetBool("visitedMosstown");
			}
			set
			{
				PlayerData.instance.SetBool("visitedMosstown", value);
			}
		}

		public static bool visitedHuntersTrail
		{
			get
			{
				return PlayerData.instance.GetBool("visitedHuntersTrail");
			}
			set
			{
				PlayerData.instance.SetBool("visitedHuntersTrail", value);
			}
		}

		public static bool visitedDeepDocks
		{
			get
			{
				return PlayerData.instance.GetBool("visitedDeepDocks");
			}
			set
			{
				PlayerData.instance.SetBool("visitedDeepDocks", value);
			}
		}

		public static bool visitedWilds
		{
			get
			{
				return PlayerData.instance.GetBool("visitedWilds");
			}
			set
			{
				PlayerData.instance.SetBool("visitedWilds", value);
			}
		}

		public static bool visitedGrove
		{
			get
			{
				return PlayerData.instance.GetBool("visitedGrove");
			}
			set
			{
				PlayerData.instance.SetBool("visitedGrove", value);
			}
		}

		public static bool visitedGreymoor
		{
			get
			{
				return PlayerData.instance.GetBool("visitedGreymoor");
			}
			set
			{
				PlayerData.instance.SetBool("visitedGreymoor", value);
			}
		}

		public static bool visitedWisp
		{
			get
			{
				return PlayerData.instance.GetBool("visitedWisp");
			}
			set
			{
				PlayerData.instance.SetBool("visitedWisp", value);
			}
		}

		public static bool visitedBellhartHaunted
		{
			get
			{
				return PlayerData.instance.GetBool("visitedBellhartHaunted");
			}
			set
			{
				PlayerData.instance.SetBool("visitedBellhartHaunted", value);
			}
		}

		public static bool visitedBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("visitedBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("visitedBellhart", value);
			}
		}

		public static bool visitedBellhartSaved
		{
			get
			{
				return PlayerData.instance.GetBool("visitedBellhartSaved");
			}
			set
			{
				PlayerData.instance.SetBool("visitedBellhartSaved", value);
			}
		}

		public static bool visitedShellwood
		{
			get
			{
				return PlayerData.instance.GetBool("visitedShellwood");
			}
			set
			{
				PlayerData.instance.SetBool("visitedShellwood", value);
			}
		}

		public static bool visitedCrawl
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCrawl");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCrawl", value);
			}
		}

		public static bool visitedDustpens
		{
			get
			{
				return PlayerData.instance.GetBool("visitedDustpens");
			}
			set
			{
				PlayerData.instance.SetBool("visitedDustpens", value);
			}
		}

		public static bool visitedShadow
		{
			get
			{
				return PlayerData.instance.GetBool("visitedShadow");
			}
			set
			{
				PlayerData.instance.SetBool("visitedShadow", value);
			}
		}

		public static bool visitedAqueducts
		{
			get
			{
				return PlayerData.instance.GetBool("visitedAqueducts");
			}
			set
			{
				PlayerData.instance.SetBool("visitedAqueducts", value);
			}
		}

		public static bool visitedMistmaze
		{
			get
			{
				return PlayerData.instance.GetBool("visitedMistmaze");
			}
			set
			{
				PlayerData.instance.SetBool("visitedMistmaze", value);
			}
		}

		public static bool visitedCoral
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCoral");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCoral", value);
			}
		}

		public static bool visitedCoralRiver
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCoralRiver");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCoralRiver", value);
			}
		}

		public static bool visitedCoralRiverInner
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCoralRiverInner");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCoralRiverInner", value);
			}
		}

		public static bool visitedCoralTower
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCoralTower");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCoralTower", value);
			}
		}

		public static bool visitedSlab
		{
			get
			{
				return PlayerData.instance.GetBool("visitedSlab");
			}
			set
			{
				PlayerData.instance.SetBool("visitedSlab", value);
			}
		}

		public static bool visitedGrandGate
		{
			get
			{
				return PlayerData.instance.GetBool("visitedGrandGate");
			}
			set
			{
				PlayerData.instance.SetBool("visitedGrandGate", value);
			}
		}

		public static bool visitedCitadel
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCitadel");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCitadel", value);
			}
		}

		public static bool visitedUnderstore
		{
			get
			{
				return PlayerData.instance.GetBool("visitedUnderstore");
			}
			set
			{
				PlayerData.instance.SetBool("visitedUnderstore", value);
			}
		}

		public static bool visitedWard
		{
			get
			{
				return PlayerData.instance.GetBool("visitedWard");
			}
			set
			{
				PlayerData.instance.SetBool("visitedWard", value);
			}
		}

		public static bool visitedHalls
		{
			get
			{
				return PlayerData.instance.GetBool("visitedHalls");
			}
			set
			{
				PlayerData.instance.SetBool("visitedHalls", value);
			}
		}

		public static bool visitedLibrary
		{
			get
			{
				return PlayerData.instance.GetBool("visitedLibrary");
			}
			set
			{
				PlayerData.instance.SetBool("visitedLibrary", value);
			}
		}

		public static bool visitedStage
		{
			get
			{
				return PlayerData.instance.GetBool("visitedStage");
			}
			set
			{
				PlayerData.instance.SetBool("visitedStage", value);
			}
		}

		public static bool visitedGloom
		{
			get
			{
				return PlayerData.instance.GetBool("visitedGloom");
			}
			set
			{
				PlayerData.instance.SetBool("visitedGloom", value);
			}
		}

		public static bool visitedWeave
		{
			get
			{
				return PlayerData.instance.GetBool("visitedWeave");
			}
			set
			{
				PlayerData.instance.SetBool("visitedWeave", value);
			}
		}

		public static bool visitedMountain
		{
			get
			{
				return PlayerData.instance.GetBool("visitedMountain");
			}
			set
			{
				PlayerData.instance.SetBool("visitedMountain", value);
			}
		}

		public static bool visitedIceCore
		{
			get
			{
				return PlayerData.instance.GetBool("visitedIceCore");
			}
			set
			{
				PlayerData.instance.SetBool("visitedIceCore", value);
			}
		}

		public static bool visitedHang
		{
			get
			{
				return PlayerData.instance.GetBool("visitedHang");
			}
			set
			{
				PlayerData.instance.SetBool("visitedHang", value);
			}
		}

		public static bool visitedHangAtrium
		{
			get
			{
				return PlayerData.instance.GetBool("visitedHangAtrium");
			}
			set
			{
				PlayerData.instance.SetBool("visitedHangAtrium", value);
			}
		}

		public static bool visitedEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("visitedEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("visitedEnclave", value);
			}
		}

		public static bool visitedArborium
		{
			get
			{
				return PlayerData.instance.GetBool("visitedArborium");
			}
			set
			{
				PlayerData.instance.SetBool("visitedArborium", value);
			}
		}

		public static bool visitedCogwork
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCogwork");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCogwork", value);
			}
		}

		public static bool visitedCradle
		{
			get
			{
				return PlayerData.instance.GetBool("visitedCradle");
			}
			set
			{
				PlayerData.instance.SetBool("visitedCradle", value);
			}
		}

		public static bool visitedRuinedCradle
		{
			get
			{
				return PlayerData.instance.GetBool("visitedRuinedCradle");
			}
			set
			{
				PlayerData.instance.SetBool("visitedRuinedCradle", value);
			}
		}

		public static bool visitedFleatopia
		{
			get
			{
				return PlayerData.instance.GetBool("visitedFleatopia");
			}
			set
			{
				PlayerData.instance.SetBool("visitedFleatopia", value);
			}
		}

		public static bool visitedFleaFestival
		{
			get
			{
				return PlayerData.instance.GetBool("visitedFleaFestival");
			}
			set
			{
				PlayerData.instance.SetBool("visitedFleaFestival", value);
			}
		}

		public static bool visitedAbyss
		{
			get
			{
				return PlayerData.instance.GetBool("visitedAbyss");
			}
			set
			{
				PlayerData.instance.SetBool("visitedAbyss", value);
			}
		}

		public static bool citadelHalfwayComplete
		{
			get
			{
				return PlayerData.instance.GetBool("citadelHalfwayComplete");
			}
			set
			{
				PlayerData.instance.SetBool("citadelHalfwayComplete", value);
			}
		}

		public static HashSet<string> scenesVisited
		{
			get
			{
				return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesVisited");
			}
			set
			{
				VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesVisited", value);
			}
		}

		public static HashSet<string> scenesMapped
		{
			get
			{
				return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesMapped");
			}
			set
			{
				VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesMapped", value);
			}
		}

		public static HashSet<string> scenesEncounteredBench
		{
			get
			{
				return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredBench");
			}
			set
			{
				VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredBench", value);
			}
		}

		public static HashSet<string> scenesEncounteredCocoon
		{
			get
			{
				return VariableExtensions.GetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredCocoon");
			}
			set
			{
				VariableExtensions.SetVariable<HashSet<string>>((IIncludeVariableExtensions)(object)PlayerData.instance, "scenesEncounteredCocoon", value);
			}
		}

		public static bool mapUpdateQueued
		{
			get
			{
				return PlayerData.instance.GetBool("mapUpdateQueued");
			}
			set
			{
				PlayerData.instance.SetBool("mapUpdateQueued", value);
			}
		}

		public static bool mapAllRooms
		{
			get
			{
				return PlayerData.instance.GetBool("mapAllRooms");
			}
			set
			{
				PlayerData.instance.SetBool("mapAllRooms", value);
			}
		}

		public static bool HasSeenMapUpdated
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenMapUpdated");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenMapUpdated", value);
			}
		}

		public static bool HasSeenMapMarkerUpdated
		{
			get
			{
				return PlayerData.instance.GetBool("HasSeenMapMarkerUpdated");
			}
			set
			{
				PlayerData.instance.SetBool("HasSeenMapMarkerUpdated", value);
			}
		}

		public static bool HasMossGrottoMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasMossGrottoMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasMossGrottoMap", value);
			}
		}

		public static bool HasWildsMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasWildsMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasWildsMap", value);
			}
		}

		public static bool HasBoneforestMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasBoneforestMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasBoneforestMap", value);
			}
		}

		public static bool HasDocksMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasDocksMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasDocksMap", value);
			}
		}

		public static bool HasGreymoorMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasGreymoorMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasGreymoorMap", value);
			}
		}

		public static bool HasBellhartMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasBellhartMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasBellhartMap", value);
			}
		}

		public static bool HasShellwoodMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasShellwoodMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasShellwoodMap", value);
			}
		}

		public static bool HasCrawlMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCrawlMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCrawlMap", value);
			}
		}

		public static bool HasHuntersNestMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasHuntersNestMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasHuntersNestMap", value);
			}
		}

		public static bool HasJudgeStepsMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasJudgeStepsMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasJudgeStepsMap", value);
			}
		}

		public static bool HasDustpensMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasDustpensMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasDustpensMap", value);
			}
		}

		public static bool HasSlabMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasSlabMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasSlabMap", value);
			}
		}

		public static bool HasPeakMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasPeakMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasPeakMap", value);
			}
		}

		public static bool HasCitadelUnderstoreMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCitadelUnderstoreMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCitadelUnderstoreMap", value);
			}
		}

		public static bool HasCoralMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCoralMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCoralMap", value);
			}
		}

		public static bool HasSwampMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasSwampMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasSwampMap", value);
			}
		}

		public static bool HasCloverMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCloverMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCloverMap", value);
			}
		}

		public static bool HasAbyssMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasAbyssMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasAbyssMap", value);
			}
		}

		public static bool HasHangMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasHangMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasHangMap", value);
			}
		}

		public static bool HasSongGateMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasSongGateMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasSongGateMap", value);
			}
		}

		public static bool HasHallsMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasHallsMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasHallsMap", value);
			}
		}

		public static bool HasWardMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasWardMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasWardMap", value);
			}
		}

		public static bool HasCogMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCogMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCogMap", value);
			}
		}

		public static bool HasLibraryMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasLibraryMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasLibraryMap", value);
			}
		}

		public static bool HasCradleMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasCradleMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasCradleMap", value);
			}
		}

		public static bool HasArboriumMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasArboriumMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasArboriumMap", value);
			}
		}

		public static bool HasAqueductMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasAqueductMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasAqueductMap", value);
			}
		}

		public static bool HasWeavehomeMap
		{
			get
			{
				return PlayerData.instance.GetBool("HasWeavehomeMap");
			}
			set
			{
				PlayerData.instance.SetBool("HasWeavehomeMap", value);
			}
		}

		public static bool act3MapUpdated
		{
			get
			{
				return PlayerData.instance.GetBool("act3MapUpdated");
			}
			set
			{
				PlayerData.instance.SetBool("act3MapUpdated", value);
			}
		}

		public static bool ShakraFinalQuestAppear
		{
			get
			{
				return PlayerData.instance.GetBool("ShakraFinalQuestAppear");
			}
			set
			{
				PlayerData.instance.SetBool("ShakraFinalQuestAppear", value);
			}
		}

		public static bool hasPinBench
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinBench");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinBench", value);
			}
		}

		public static bool hasPinCocoon
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinCocoon");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinCocoon", value);
			}
		}

		public static bool hasPinShop
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinShop");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinShop", value);
			}
		}

		public static bool hasPinSpa
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinSpa");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinSpa", value);
			}
		}

		public static bool hasPinStag
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinStag");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinStag", value);
			}
		}

		public static bool hasPinTube
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinTube");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinTube", value);
			}
		}

		public static bool hasPinFleaMarrowlands
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaMarrowlands");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaMarrowlands", value);
			}
		}

		public static bool hasPinFleaMidlands
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaMidlands");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaMidlands", value);
			}
		}

		public static bool hasPinFleaBlastedlands
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaBlastedlands");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaBlastedlands", value);
			}
		}

		public static bool hasPinFleaCitadel
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaCitadel");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaCitadel", value);
			}
		}

		public static bool hasPinFleaPeaklands
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaPeaklands");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaPeaklands", value);
			}
		}

		public static bool hasPinFleaMucklands
		{
			get
			{
				return PlayerData.instance.GetBool("hasPinFleaMucklands");
			}
			set
			{
				PlayerData.instance.SetBool("hasPinFleaMucklands", value);
			}
		}

		public static bool hasMarker
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker", value);
			}
		}

		public static bool hasMarker_a
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker_a");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker_a", value);
			}
		}

		public static bool hasMarker_b
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker_b");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker_b", value);
			}
		}

		public static bool hasMarker_c
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker_c");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker_c", value);
			}
		}

		public static bool hasMarker_d
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker_d");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker_d", value);
			}
		}

		public static bool hasMarker_e
		{
			get
			{
				return PlayerData.instance.GetBool("hasMarker_e");
			}
			set
			{
				PlayerData.instance.SetBool("hasMarker_e", value);
			}
		}

		public static WrappedVector2List[] placedMarkers
		{
			get
			{
				return VariableExtensions.GetVariable<WrappedVector2List[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "placedMarkers");
			}
			set
			{
				VariableExtensions.SetVariable<WrappedVector2List[]>((IIncludeVariableExtensions)(object)PlayerData.instance, "placedMarkers", value);
			}
		}

		public static EnvironmentTypes environmentType
		{
			get
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				return VariableExtensions.GetVariable<EnvironmentTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "environmentType");
			}
			set
			{
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				VariableExtensions.SetVariable<EnvironmentTypes>((IIncludeVariableExtensions)(object)PlayerData.instance, "environmentType", value);
			}
		}

		public static int previousDarkness
		{
			get
			{
				return PlayerData.instance.GetInt("previousDarkness");
			}
			set
			{
				PlayerData.instance.SetInt("previousDarkness", value);
			}
		}

		public static bool HasMelodyArchitect
		{
			get
			{
				return PlayerData.instance.GetBool("HasMelodyArchitect");
			}
			set
			{
				PlayerData.instance.SetBool("HasMelodyArchitect", value);
			}
		}

		public static bool HasMelodyLibrarian
		{
			get
			{
				return PlayerData.instance.GetBool("HasMelodyLibrarian");
			}
			set
			{
				PlayerData.instance.SetBool("HasMelodyLibrarian", value);
			}
		}

		public static bool SeenMelodyLibrarianReturn
		{
			get
			{
				return PlayerData.instance.GetBool("SeenMelodyLibrarianReturn");
			}
			set
			{
				PlayerData.instance.SetBool("SeenMelodyLibrarianReturn", value);
			}
		}

		public static bool HasMelodyConductor
		{
			get
			{
				return PlayerData.instance.GetBool("HasMelodyConductor");
			}
			set
			{
				PlayerData.instance.SetBool("HasMelodyConductor", value);
			}
		}

		public static bool UnlockedMelodyLift
		{
			get
			{
				return PlayerData.instance.GetBool("UnlockedMelodyLift");
			}
			set
			{
				PlayerData.instance.SetBool("UnlockedMelodyLift", value);
			}
		}

		public static bool MelodyLiftCanReturn
		{
			get
			{
				return PlayerData.instance.GetBool("MelodyLiftCanReturn");
			}
			set
			{
				PlayerData.instance.SetBool("MelodyLiftCanReturn", value);
			}
		}

		public static bool HeardMelodyConductorNoQuest
		{
			get
			{
				return PlayerData.instance.GetBool("HeardMelodyConductorNoQuest");
			}
			set
			{
				PlayerData.instance.SetBool("HeardMelodyConductorNoQuest", value);
			}
		}

		public static bool ConductorWeaverDlgQueued
		{
			get
			{
				return PlayerData.instance.GetBool("ConductorWeaverDlgQueued");
			}
			set
			{
				PlayerData.instance.SetBool("ConductorWeaverDlgQueued", value);
			}
		}

		public static bool ConductorWeaverDlgHeard
		{
			get
			{
				return PlayerData.instance.GetBool("ConductorWeaverDlgHeard");
			}
			set
			{
				PlayerData.instance.SetBool("ConductorWeaverDlgHeard", value);
			}
		}

		public static bool muchTimePassed
		{
			get
			{
				return PlayerData.instance.GetBool("muchTimePassed");
			}
			set
			{
				PlayerData.instance.SetBool("muchTimePassed", value);
			}
		}

		public static int pilgrimGroupBonegrave
		{
			get
			{
				return PlayerData.instance.GetInt("pilgrimGroupBonegrave");
			}
			set
			{
				PlayerData.instance.SetInt("pilgrimGroupBonegrave", value);
			}
		}

		public static int pilgrimGroupShellgrave
		{
			get
			{
				return PlayerData.instance.GetInt("pilgrimGroupShellgrave");
			}
			set
			{
				PlayerData.instance.SetInt("pilgrimGroupShellgrave", value);
			}
		}

		public static int pilgrimGroupGreymoorField
		{
			get
			{
				return PlayerData.instance.GetInt("pilgrimGroupGreymoorField");
			}
			set
			{
				PlayerData.instance.SetInt("pilgrimGroupGreymoorField", value);
			}
		}

		public static bool shellGravePopulated
		{
			get
			{
				return PlayerData.instance.GetBool("shellGravePopulated");
			}
			set
			{
				PlayerData.instance.SetBool("shellGravePopulated", value);
			}
		}

		public static bool bellShrineBoneForest
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineBoneForest");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineBoneForest", value);
			}
		}

		public static bool bellShrineWilds
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineWilds");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineWilds", value);
			}
		}

		public static bool bellShrineGreymoor
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineGreymoor");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineGreymoor", value);
			}
		}

		public static bool bellShrineShellwood
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineShellwood");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineShellwood", value);
			}
		}

		public static bool bellShrineBellhart
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineBellhart");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineBellhart", value);
			}
		}

		public static bool bellShrineEnclave
		{
			get
			{
				return PlayerData.instance.GetBool("bellShrineEnclave");
			}
			set
			{
				PlayerData.instance.SetBool("bellShrineEnclave", value);
			}
		}

		public static bool completedMemory_reaper
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_reaper");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_reaper", value);
			}
		}

		public static bool completedMemory_wanderer
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_wanderer");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_wanderer", value);
			}
		}

		public static bool completedMemory_beast
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_beast");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_beast", value);
			}
		}

		public static bool completedMemory_witch
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_witch");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_witch", value);
			}
		}

		public static bool completedMemory_toolmaster
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_toolmaster");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_toolmaster", value);
			}
		}

		public static bool completedMemory_shaman
		{
			get
			{
				return PlayerData.instance.GetBool("completedMemory_shaman");
			}
			set
			{
				PlayerData.instance.SetBool("completedMemory_shaman", value);
			}
		}

		public static bool chapelClosed_reaper
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_reaper");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_reaper", value);
			}
		}

		public static bool chapelClosed_wanderer
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_wanderer");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_wanderer", value);
			}
		}

		public static bool chapelClosed_beast
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_beast");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_beast", value);
			}
		}

		public static bool chapelClosed_witch
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_witch");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_witch", value);
			}
		}

		public static bool chapelClosed_toolmaster
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_toolmaster");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_toolmaster", value);
			}
		}

		public static bool chapelClosed_shaman
		{
			get
			{
				return PlayerData.instance.GetBool("chapelClosed_shaman");
			}
			set
			{
				PlayerData.instance.SetBool("chapelClosed_shaman", value);
			}
		}

		public static bool bindCutscenePlayed
		{
			get
			{
				return PlayerData.instance.GetBool("bindCutscenePlayed");
			}
			set
			{
				PlayerData.instance.SetBool("bindCutscenePlayed", value);
			}
		}

		public static bool encounteredMossMother
		{
			get
			{
				return PlayerData.instance.GetBool("encounteredMossMother");
			}
			set
			{
				PlayerData.instance.SetBool("encounteredMossMother", value);
			}
		}

		public static bool defeatedMossMother
		{
			get
			{
				return PlayerData.instance.GetBool("defeatedMossMother");
			}
			set
			{
				PlayerData.instance.SetBool("defeatedMossMother", value);
			}
		}

		public static bool entered_Tut01b
		{
			get
			{
				return PlayerData.instance.GetBool("entered_Tut01b");
			}
			set
			{
				PlayerData.instance.SetBool("entered_Tut01b", value);
			}
		}

		public static bool completedTutorial
		{
			get
			{
				return PlayerData.instance.GetBool("completedTutorial");
			}
			set
			{
				PlayerData.instance.SetBool("completedTutorial", value);
			}
		}

		public static bool BonePlazaOpened
		{
			get
			{
				return PlayerData.instance.GetBool("BonePlazaOpened");
			}
			set
			{
				PlayerData.instance.SetBool("BonePlazaOpened", value);
			}
		}

		public static bool sawPlinneyLeft
		{
			get
			{
				return PlayerData.instance.GetBool("sawPlinneyLeft");
			}
			set
			{
				PlayerData.instance.SetBool("sawPlinneyLeft", value);
			}
		}

		public static bool savedPlinney
		{
			get
			{
				return PlayerData.instance.GetBool("savedPlinney");
			}
			set
			{
				PlayerData.instance.SetBool("savedPlinney", value);
			}
		}

		public static bool savedPlinneyConvo
		{
			get
			{
				return PlayerData.instance.GetBool("savedPlinneyConvo");