Decompiled source of FarewellSteelSoul v1.0.0

FarewellSteelSoul.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 HarmonyLib;
using Microsoft.CodeAnalysis;
using TeamCherry.Localization;
using UnityEngine;
using UnityEngine.SceneManagement;

[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("FarewellSteelSoul")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+735ed23a98a8a9a7fcde182164e502d9de8f87e8")]
[assembly: AssemblyProduct("FarewellSteelSoul")]
[assembly: AssemblyTitle("FarewellSteelSoul")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/EchoLinger/Farewell-Steel-Soul")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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 FarewellSteelSoul
{
	[HarmonyPatch]
	[BepInPlugin("io.github.EchoLinger.FarewellSteelSoul", "FarewellSteelSoul", "1.0.0")]
	public class FarewellSteelSoul : BaseUnityPlugin
	{
		[Serializable]
		public class I18n
		{
			public string QuestName = "钢魂碎档";

			public string CrestName = "碎档者";

			public string CrestDesc = "在尝试完成这项壮举的过程中,你证明了自己的勇气";

			public string CrestEquip = "愿你的灵魂最终得以安息";

			public static string ModName => "Farewell Steel Soul";

			public static string Author => "HuangYunOCN\nEchoLinger";
		}

		public static class I18nKeys
		{
			public const string QuestName = "QuestName";

			public const string CrestName = "CrestName";

			public const string CrestDesc = "CrestDesc";

			public const string CrestEquip = "CrestEquip";

			public const string ModName = "ModName";

			public const string Author = "Author";
		}

		[HarmonyPatch(typeof(GameManager), "PlayerDead")]
		public static class PatchPlayerDead
		{
			[CompilerGenerated]
			private sealed class <Postfix>d__1 : IEnumerator<object>, IEnumerator, IDisposable
			{
				private int <>1__state;

				private object <>2__current;

				public IEnumerator __result;

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

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

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

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

				private bool MoveNext()
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>2__current = __result;
						<>1__state = 1;
						return true;
					case 1:
						<>1__state = -1;
						if (IsPermaDeath)
						{
							((MonoBehaviour)Instance).StartCoroutine(Chain());
						}
						return false;
					}
				}

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

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

			[HarmonyPrefix]
			public static void Prefix(GameManager __instance)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Invalid comparison between Unknown and I4
				IsPermaDeath = (int)__instance.playerData.permadeathMode == 2;
				if (IsPermaDeath)
				{
					ShowJournalMsg();
				}
			}

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

		[CompilerGenerated]
		private sealed class <>c__DisplayClass20_0
		{
			public bool completed;

			internal void <ShowCrestMsg>b__1()
			{
				completed = true;
			}

			internal bool <ShowCrestMsg>b__2()
			{
				return completed;
			}
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass38_0
		{
			public PlayMakerFSM fsm;

			internal bool <Chain>b__0()
			{
				bool flag = (Object)(object)fsm == (Object)null;
				bool flag2;
				if (!flag)
				{
					if (fsm != null)
					{
						string activeStateName = fsm.ActiveStateName;
						if (activeStateName == "End" || activeStateName == "Ended")
						{
							flag2 = true;
							goto IL_0044;
						}
					}
					flag2 = false;
					goto IL_0044;
				}
				goto IL_0046;
				IL_0046:
				return flag;
				IL_0044:
				flag = flag2;
				goto IL_0046;
			}
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass42_0
		{
			public bool completed;

			internal void <ShowQuestMsg>b__0()
			{
				completed = true;
			}

			internal bool <ShowQuestMsg>b__1()
			{
				return completed;
			}
		}

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

			private object <>2__current;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0061: Unknown result type (might be due to invalid IL or missing references)
				//IL_006b: Expected O, but got Unknown
				//IL_0102: 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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<>c__DisplayClass38_0 CS$<>8__locals0 = new <>c__DisplayClass38_0();
					GameObject journalUpdateMessage = EnemyJournalManager._instance.journalUpdateMessage;
					CS$<>8__locals0.fsm = PlayMakerFSM.FindFsmOnGameObject(journalUpdateMessage, "Journal Msg");
					<>2__current = (object)new WaitUntil((Func<bool>)delegate
					{
						bool flag = (Object)(object)CS$<>8__locals0.fsm == (Object)null;
						bool flag2;
						if (!flag)
						{
							if (CS$<>8__locals0.fsm != null)
							{
								string activeStateName = CS$<>8__locals0.fsm.ActiveStateName;
								if (activeStateName == "End" || activeStateName == "Ended")
								{
									flag2 = true;
									goto IL_0044;
								}
							}
							flag2 = false;
							goto IL_0044;
						}
						goto IL_0046;
						IL_0046:
						return flag;
						IL_0044:
						flag = flag2;
						goto IL_0046;
					});
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					<>2__current = _waitForSeconds1;
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					<>2__current = ShowQuestMsg();
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -1;
					<>2__current = _waitForSeconds2;
					<>1__state = 4;
					return true;
				case 4:
					<>1__state = -1;
					<>2__current = ShowCrestMsg();
					<>1__state = 5;
					return true;
				case 5:
					<>1__state = -1;
					<>2__current = _waitForSeconds2;
					<>1__state = 6;
					return true;
				case 6:
				{
					<>1__state = -1;
					Scene activeScene = SceneManager.GetActiveScene();
					GameManager.ReportUnload(((Scene)(ref activeScene)).name);
					GameManager.instance.LoadScene("End_Credits");
					return false;
				}
				}
			}

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

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

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

			private object <>2__current;

			public CreditsHelper creditsHelper;

			private int <i>5__2;

			private CreditsSectionBase <creditsSection>5__3;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0207: Unknown result type (might be due to invalid IL or missing references)
				//IL_0211: Expected O, but got Unknown
				//IL_027a: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01da: Expected O, but got Unknown
				//IL_011d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0127: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					creditsHelper.screenFader.AlphaSelf = 1f;
					if ((Object)(object)creditsHelper.silentSnapshot != (Object)null)
					{
						creditsHelper.silentSnapshot.TransitionTo(0f);
					}
					creditsHelper.musicSource.Play();
					InsertSection(creditsHelper);
					<i>5__2 = 0;
					goto IL_0238;
				case 1:
					<>1__state = -1;
					<>2__current = <creditsSection>5__3.Show();
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					if (<i>5__2 >= creditsHelper.creditsSections.Count - 1 && (Object)(object)creditsHelper.silentSnapshot != (Object)null)
					{
						creditsHelper.silentSnapshot.TransitionTo(<creditsSection>5__3.FadeDownDuration + creditsHelper.timeBetweenScreens);
					}
					<>2__current = (object)new WaitForSeconds(creditsHelper.screenFader.FadeTo(1f, <creditsSection>5__3.FadeDownDuration, (AnimationCurve)null, false, (Action<bool>)null));
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -1;
					((Component)<creditsSection>5__3).gameObject.SetActive(false);
					<>2__current = (object)new WaitForSeconds(creditsHelper.timeBetweenScreens);
					<>1__state = 4;
					return true;
				case 4:
				{
					<>1__state = -1;
					<creditsSection>5__3 = null;
					int num = <i>5__2 + 1;
					<i>5__2 = num;
					goto IL_0238;
				}
				case 5:
					<>1__state = -1;
					creditsHelper.cutSceneHelper.nextSceneType = (NextScene)0;
					creditsHelper.cutSceneHelper.nextScene = "PermaDeath";
					<>2__current = creditsHelper.cutSceneHelper.Skip();
					<>1__state = 6;
					return true;
				case 6:
					{
						<>1__state = -1;
						GameCameras.instance.cameraController.IsBloomForced = false;
						return false;
					}
					IL_0238:
					if (<i>5__2 < creditsHelper.creditsSections.Count)
					{
						<creditsSection>5__3 = creditsHelper.creditsSections[<i>5__2];
						((Component)<creditsSection>5__3).gameObject.SetActive(true);
						if (<i>5__2 == 0 && (Object)(object)creditsHelper.musicSnapshot != (Object)null)
						{
							creditsHelper.musicSnapshot.TransitionTo(<creditsSection>5__3.FadeUpDuration);
						}
						<>2__current = (object)new WaitForSeconds(creditsHelper.screenFader.FadeTo(0f, <creditsSection>5__3.FadeUpDuration, (AnimationCurve)null, false, (Action<bool>)null));
						<>1__state = 1;
						return true;
					}
					<>2__current = _waitForSeconds1;
					<>1__state = 5;
					return true;
				}
			}

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

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

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

			private object <>2__current;

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

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

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

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

			private bool MoveNext()
			{
				//IL_007f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0089: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<>c__DisplayClass20_0 CS$<>8__locals0 = new <>c__DisplayClass20_0
					{
						completed = false
					};
					GameObject val = AssetBundle.GetAllLoadedAssetBundles().First((AssetBundle b) => b.GetAllAssetNames().Contains("Assets/Prefabs/UI/Messages/Tool Crest UI Msg.prefab")).LoadAsset<GameObject>("Assets/Prefabs/UI/Messages/Tool Crest UI Msg.prefab");
					ToolCrestUIMsg.Spawn(Crest, val, (Action)delegate
					{
						CS$<>8__locals0.completed = true;
					});
					<>2__current = (object)new WaitUntil((Func<bool>)(() => CS$<>8__locals0.completed));
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					return false;
				}
			}

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

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

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

			private object <>2__current;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				//IL_0051: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<>c__DisplayClass42_0 CS$<>8__locals0 = new <>c__DisplayClass42_0
					{
						completed = false
					};
					QuestManager.ShowQuestCompleted((FullQuestBase)(object)Quest, (Action)delegate
					{
						CS$<>8__locals0.completed = true;
					});
					<>2__current = (object)new WaitUntil((Func<bool>)(() => CS$<>8__locals0.completed));
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					return false;
				}
			}

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

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

		private static readonly WaitForSeconds StageGap = new WaitForSeconds(2f);

		private static ToolCrest? _crest;

		private static Quest? _quest;

		private static Texture[]? _animations;

		private static Sprite? _credits;

		private static ManualLogSource Log;

		private static FarewellSteelSoul Instance;

		private static LanguageCode _currentLanguage = (LanguageCode)199;

		private static I18n _i18n = new I18n();

		private static readonly (int oldId, int newId)?[] DefIds = new(int, int)?[24];

		private static readonly WaitForSeconds _waitForSeconds1 = new WaitForSeconds(1f);

		private static readonly WaitForSeconds _waitForSeconds2 = new WaitForSeconds(2f);

		private static bool IsPermaDeath;

		public const string Id = "io.github.EchoLinger.FarewellSteelSoul";

		private static ToolCrest Crest
		{
			get
			{
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_crest != (Object)null)
				{
					return _crest;
				}
				ToolCrest obj = Object.Instantiate<ToolCrest>(ToolItemManager.GetCrestByName("Warrior"));
				obj.crestSprite = LoadSprite("crest.png");
				obj.displayName = I18nString("CrestName");
				obj.getPromptDesc = I18nString("CrestDesc");
				obj.equipText = I18nString("CrestEquip");
				_crest = obj;
				return _crest;
			}
		}

		private static Quest Quest
		{
			get
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002e: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)_quest != (Object)null)
				{
					return _quest;
				}
				Quest obj = ScriptableObject.CreateInstance<Quest>();
				obj.questType = ScriptableObject.CreateInstance<QuestType>();
				((BasicQuestBase)obj).displayName = I18nString("QuestName");
				Sprite largeIcon = LoadSprite("quest.png");
				obj.questType.largeIcon = largeIcon;
				_quest = obj;
				return _quest;
			}
		}

		private static Texture[] Animations
		{
			get
			{
				if (_animations != null)
				{
					return _animations;
				}
				_animations = (Texture[]?)(object)new Texture[24];
				for (int i = 1; i <= 17; i++)
				{
					Texture2D val = LoadTexture($"animation/journal_{i:D2}.png");
					_animations[i - 1] = (Texture)(object)val;
				}
				for (int j = 1; j <= 7; j++)
				{
					Texture2D val2 = LoadTexture($"animation/journal_down_{j:D2}.png");
					_animations[j + 16] = (Texture)(object)val2;
				}
				return _animations;
			}
		}

		private static Sprite Credits
		{
			get
			{
				if ((Object)(object)_credits != (Object)null)
				{
					return _credits;
				}
				_credits = LoadSprite("credits.png");
				return _credits;
			}
		}

		private static string Location => Path.GetDirectoryName(((BaseUnityPlugin)Instance).Info.Location);

		public static string Name => "FarewellSteelSoul";

		public static string Version => "1.0.0";

		private static Texture2D LoadTexture(string spritePath)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			byte[] array = File.ReadAllBytes(Path.Combine(Location, "media", spritePath));
			Texture2D val = new Texture2D(2, 2);
			ImageConversion.LoadImage(val, array);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			return val;
		}

		private static Sprite LoadSprite(string spritePath, Vector2? pivot = null, float? ppu = null)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = LoadTexture(spritePath);
			return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), (Vector2)(((??)pivot) ?? new Vector2(0.5f, 0.5f)), ppu.GetValueOrDefault(100f));
		}

		private static GameObject? FindDeepChildRecursive(GameObject parent, string name)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			foreach (Transform item in parent.transform)
			{
				Transform val = item;
				if (((Object)val).name == name)
				{
					return ((Component)val).gameObject;
				}
				GameObject val2 = FindDeepChildRecursive(((Component)val).gameObject, name);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return null;
		}

		private static GameObject FindDeepChild(GameObject parent, string name)
		{
			GameObject val = FindDeepChildRecursive(parent, name);
			if (!((Object)(object)val != (Object)null))
			{
				throw new Exception($"GameObject {name} not found among {parent}");
			}
			return val;
		}

		private static void InsertSection(CreditsHelper creditsHelper)
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			List<CreditsSectionBase> creditsSections = creditsHelper.creditsSections;
			GameObject val = Object.Instantiate<GameObject>(((Component)creditsSections[10]).gameObject, ((Component)creditsHelper).gameObject.transform);
			((Object)val).name = "SaveFileBreak";
			Object.Destroy((Object)(object)FindDeepChild(val, "Unity Technical Support"));
			Object.Destroy((Object)(object)FindDeepChild(val, "Knights of U"));
			Object.Destroy((Object)(object)FindDeepChild(val, "credits_plates__0002_THANKS"));
			Object.Destroy((Object)(object)FindDeepChild(val, "Thanks"));
			GameObject val2 = Object.Instantiate<GameObject>(FindDeepChild(((Component)creditsSections[5]).gameObject, "Dressing"), val.transform);
			((Object)val2).name = "Author";
			val2.transform.localPosition = new Vector3(0f - val2.transform.localPosition.x + 1f, val2.transform.localPosition.y - 1f, val2.transform.localPosition.z);
			val2.GetComponent<SetTextMeshProGameText>().Text = I18nString("ModName");
			GameObject obj = FindDeepChild(val2, "NathAndJames");
			((Object)obj).name = "Authors";
			obj.GetComponent<SetTextMeshProGameText>().Text = I18nString("Author");
			GameObject obj2 = Object.Instantiate<GameObject>(FindDeepChild(((Component)creditsSections[2]).gameObject, "credits_plates_LACE"), FindDeepChild(val, "bg").transform);
			((Object)obj2).name = "Icon";
			obj2.GetComponent<SpriteRenderer>().sprite = Credits;
			creditsSections.Insert(0, val.GetComponent<CreditsSectionBase>());
		}

		[IteratorStateMachine(typeof(<ModSequence>d__18))]
		private static IEnumerator ModSequence(CreditsHelper creditsHelper)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ModSequence>d__18(0)
			{
				creditsHelper = creditsHelper
			};
		}

		[HarmonyPatch(typeof(CreditsHelper), "Sequence")]
		[HarmonyPostfix]
		public static IEnumerator ShowModCredits(IEnumerator __result, CreditsHelper __instance)
		{
			if (!IsPermaDeath)
			{
				return __result;
			}
			IsPermaDeath = false;
			return ModSequence(__instance);
		}

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

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			Harmony.CreateAndPatchAll(typeof(FarewellSteelSoul).Assembly, (string)null);
			Log.LogInfo((object)("Plugin " + Name + " (io.github.EchoLinger.FarewellSteelSoul) has loaded!"));
		}

		[HarmonyPatch(typeof(LocalizationProjectSettings), "OnSwitchedLanguage")]
		[HarmonyPostfix]
		public static void LoadI18n(LanguageCode newLang)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			if (newLang == _currentLanguage)
			{
				return;
			}
			try
			{
				_i18n = JsonUtility.FromJson<I18n>(File.ReadAllText(Path.Combine(Location, "i18n", $"{newLang}.json"), Encoding.UTF8));
				_currentLanguage = newLang;
			}
			catch (Exception ex)
			{
				Log.LogError((object)ex);
			}
		}

		[HarmonyPatch(typeof(LocalisedString), "ToString", new Type[] { typeof(bool) })]
		[HarmonyPostfix]
		public static void PatchLocalisedString(ref LocalisedString __instance, ref string __result)
		{
			if (__instance.Sheet == "io.github.EchoLinger.FarewellSteelSoul")
			{
				__result = __instance.Key switch
				{
					"QuestName" => _i18n.QuestName, 
					"CrestName" => _i18n.CrestName, 
					"CrestDesc" => _i18n.CrestDesc, 
					"CrestEquip" => _i18n.CrestEquip, 
					"ModName" => I18n.ModName, 
					"Author" => I18n.Author, 
					_ => __result, 
				};
			}
		}

		private static LocalisedString I18nString(string key)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return new LocalisedString("io.github.EchoLinger.FarewellSteelSoul", key);
		}

		private static void ShowJournalMsg()
		{
			GameObject journalUpdateMessage = EnemyJournalManager._instance.journalUpdateMessage;
			journalUpdateMessage.SetActive(true);
			PlayMakerFSM obj = PlayMakerFSM.FindFsmOnGameObject(journalUpdateMessage, "Journal Msg");
			FSMUtility.SetBool(obj, "Full", true);
			FSMUtility.SetBool(obj, "Should Recycle", true);
		}

		[HarmonyPatch(typeof(tk2dSpriteAnimator), "Play", new Type[] { typeof(tk2dSpriteAnimationClip) })]
		[HarmonyPrefix]
		public static void ReplaceAnimation(tk2dSpriteAnimationClip clip)
		{
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: 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_0123: 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_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Expected O, but got Unknown
			bool flag;
			if (clip != null)
			{
				string name = clip.name;
				if (name == "Journal Full" || name == "Journal Full Down")
				{
					flag = true;
					goto IL_002c;
				}
			}
			flag = false;
			goto IL_002c;
			IL_002c:
			if (!flag)
			{
				return;
			}
			bool flag2 = clip.name == "Journal Full Down";
			tk2dSpriteAnimationFrame val = (flag2 ? clip.frames.First() : clip.frames.Last());
			Vector3[] positions = val.spriteCollection.spriteDefinitions[val.spriteId].positions;
			for (int i = 0; i < clip.frames.Length; i++)
			{
				tk2dSpriteAnimationFrame val2 = clip.frames[i];
				tk2dSpriteDefinition val3 = val2.spriteCollection.spriteDefinitions[val2.spriteId];
				int num = (flag2 ? (i + 17) : i);
				if (IsPermaDeath)
				{
					if (!DefIds[num].HasValue)
					{
						tk2dSpriteDefinition val4 = JsonUtility.FromJson<tk2dSpriteDefinition>(JsonUtility.ToJson((object)val3));
						val4.positions = positions;
						val4.uvs = (Vector2[])(object)new Vector2[4]
						{
							new Vector2(0f, 0f),
							new Vector2(1f, 0f),
							new Vector2(0f, 1f),
							new Vector2(1f, 1f)
						};
						val4.materialInst = new Material(val3.materialInst)
						{
							mainTexture = Animations[num]
						};
						val2.spriteCollection.spriteDefinitions = CollectionExtensions.AddToArray<tk2dSpriteDefinition>(val2.spriteCollection.spriteDefinitions, val4);
						int spriteId = val2.spriteId;
						int item = val2.spriteCollection.spriteDefinitions.Length - 1;
						DefIds[num] = (spriteId, item);
					}
					val2.spriteId = DefIds[num].Value.newId;
				}
				else if (DefIds[num].HasValue)
				{
					val2.spriteId = DefIds[num].Value.oldId;
				}
			}
		}

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

		[HarmonyPatch(typeof(GameManager), "LoadScene")]
		[HarmonyPrefix]
		public static bool PatchLoadScene(GameManager __instance, ref string destScene)
		{
			if (destScene == "PermaDeath")
			{
				return !IsPermaDeath;
			}
			return true;
		}

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