Decompiled source of SilkAndSong v3.0.0

SilkAndSong.dll

Decompiled 3 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using DanielSteginkUtils.ExternalFiles;
using DanielSteginkUtils.Utilities;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using SilkAndSong.Helpers;
using SilkAndSong.Helpers.GetLevel;
using TeamCherry.Localization;
using UnityEngine;
using WishUtil;

[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("SilkAndSong")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("3.0.0.0")]
[assembly: AssemblyInformationalVersion("3.0.0+40247a796a05b3ea0bc341dd8591e33957fe6df1")]
[assembly: AssemblyProduct("SilkAndSong")]
[assembly: AssemblyTitle("SilkAndSong")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/danielstegink/Silksong.SilkAndSong")]
[assembly: NeutralResourcesLanguage("EN")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("3.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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")]
	[Microsoft.CodeAnalysis.Embedded]
	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")]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace Microsoft.CodeAnalysis
{
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace SilkAndSong
{
	public static class SharedData
	{
		internal static SnsQuest? quest;

		public static int Level { get; set; } = 0;


		public static int XpToNextLevel { get; set; } = 0;


		public static Stopwatch healthTimer { get; set; } = new Stopwatch();


		public static Stopwatch silkTimer { get; set; } = new Stopwatch();


		public static void UpdateLevel(bool triggerFlair = true)
		{
			if ((Object)(object)quest == (Object)null)
			{
				return;
			}
			bool isAccepted = ((BasicQuestBase)quest).IsAccepted;
			int level = LevelCalculator.GetLevel();
			if (CanAccept(level))
			{
				try
				{
					((CustomQuest)quest).Accept();
					SilkAndSong.instance.Log("Quest accepted");
				}
				catch (Exception ex)
				{
					SilkAndSong.instance.Log("Error accepting quest: " + ex.Message + "\n" + ex.StackTrace);
				}
			}
			if (level == Level)
			{
				return;
			}
			SilkAndSong.instance.Log($"Level increased from {Level} to {level}");
			Level = level;
			if (!(triggerFlair && isAccepted))
			{
				return;
			}
			try
			{
				((CustomQuest)quest).Update();
				SilkAndSong.instance.Log("Quest updated");
			}
			catch (Exception ex2)
			{
				SilkAndSong.instance.Log("Error updating quest: " + ex2.Message + "\n" + ex2.StackTrace);
			}
		}

		private static bool CanAccept(int newLevel)
		{
			if ((Object)(object)quest == (Object)null)
			{
				return false;
			}
			if (((BasicQuestBase)quest).IsAccepted)
			{
				return false;
			}
			if (newLevel <= 0 && LevelCalculator.GetXp() == 0)
			{
				return false;
			}
			return true;
		}

		internal static float GetNailBonus(int level)
		{
			return (float)Level * NotchCosts.NailDamagePerNotch() / 4f;
		}

		internal static float GetSpellBonus(int level)
		{
			return (float)Level * NotchCosts.SpellDamagePerNotch() / 4f;
		}

		internal static float GetMaskSeconds(int level)
		{
			return 4f * NotchCosts.PassiveHealTime() / (float)Level;
		}

		internal static float GetSilkSeconds(int level)
		{
			return 4f * NotchCosts.PassiveSilkTime() / (float)Level;
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("io.github.danielstegink.silkandsong", "SilkAndSong", "3.0.0")]
	public class SilkAndSong : BaseUnityPlugin
	{
		internal static SilkAndSong instance;

		public const string Id = "io.github.danielstegink.silkandsong";

		public static string Name => "SilkAndSong";

		public static string Version => "3.0.0";

		private void Awake()
		{
			instance = this;
			Log("Plugin " + Name + " (io.github.danielstegink.silkandsong) has loaded!");
		}

		private void Start()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			new Harmony("io.github.danielstegink.silkandsong").PatchAll();
			SharedData.quest = new SnsQuest();
			QuestData.AddQuest<SnsQuest>(SharedData.quest);
			ConfigSettings.Initialize(((BaseUnityPlugin)this).Config);
		}

		internal void Log(string message)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)message);
		}
	}
}
namespace SilkAndSong.Helpers
{
	public static class ConfigSettings
	{
		public static ConfigEntry<int> xpRequirement;

		public static ConfigEntry<float> xpMultiplier;

		public static ConfigEntry<int> maxLevel;

		public static void Initialize(ConfigFile config)
		{
			xpRequirement = config.Bind<int>("Modifier", "XP Requirement", 20, "XP required to reach level 1");
			xpMultiplier = config.Bind<float>("Modifier", "XP Multiplier", 1.8f, "How much to increase XP requirement per level");
			maxLevel = config.Bind<int>("Modifier", "Max Level", 100, "The maximum value for the level");
		}
	}
	internal class SnsQuest : CustomQuest
	{
		public override bool GiveAtStart => false;

		public override QuestType QuestType => GetSnsQuestType();

		public SnsQuest()
			: base("SilkAndSong", new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_NAME"), new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_LOC"))
		{
		}//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)


		public override string GetDescription()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			string text = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_1"));
			string text2 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_2"));
			text2 = text2.Replace("CURRENT_LEVEL", SharedData.Level.ToString());
			string text3 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_3"));
			text3 = text3.Replace("XP_TO_NEXT_LEVEL", SharedData.XpToNextLevel.ToString());
			string text4 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_4"));
			string text5 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_5"));
			text5 = text5.Replace("NAIL_BONUS", (100f * SharedData.GetNailBonus(SharedData.Level)).ToString("0.0"));
			string text6 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_6"));
			text6 = text6.Replace("SPELL_BONUS", (100f * SharedData.GetSpellBonus(SharedData.Level)).ToString("0.0"));
			string text7 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_7"));
			text7 = text7.Replace("MASK_SECONDS", SharedData.GetMaskSeconds(SharedData.Level).ToString("0"));
			string text8 = LocalisedString.op_Implicit(new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_DESC_8"));
			text8 = text8.Replace("SILK_SECONDS", SharedData.GetSilkSeconds(SharedData.Level).ToString("0"));
			return text + "\n\n" + text2 + "\n" + text3 + "\n\n" + text4 + "\n" + text5 + "\n" + text6 + "\n" + text7 + "\n" + text8;
		}

		private static QuestType GetSnsQuestType()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			LocalisedString val = new LocalisedString("Mods.io.github.danielstegink.silkandsong", "QUEST_TYPE_NAME");
			Color value = default(Color);
			((Color)(ref value))..ctor(0.928f, 0.311f, 0.311f);
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			Sprite localSprite = GetSprite.GetLocalSprite("SilkAndSong.Resources.Icon.png", executingAssembly, false);
			Sprite localSprite2 = GetSprite.GetLocalSprite("SilkAndSong.Resources.Glow.png", executingAssembly, false);
			Sprite localSprite3 = GetSprite.GetLocalSprite("SilkAndSong.Resources.Large.png", executingAssembly, false);
			Sprite localSprite4 = GetSprite.GetLocalSprite("SilkAndSong.Resources.Large_Glow.png", executingAssembly, false);
			if ((Object)(object)localSprite == (Object)null)
			{
				throw new NullReferenceException("Icon sprite not found");
			}
			return GetQuestType.BuildCustomType(val, localSprite, (Color?)value, localSprite2, localSprite3, localSprite4);
		}
	}
}
namespace SilkAndSong.Helpers.GetLevel
{
	public class EnemyData
	{
		public enum EnemyType
		{
			None,
			Enemy,
			Miniboss,
			Boss
		}

		public enum EnemyLevel
		{
			Act1,
			Act2,
			Act3
		}

		public EnemyType type { get; set; }

		public EnemyLevel level { get; set; }

		public EnemyData(EnemyType type, EnemyLevel level)
		{
			this.type = type;
			this.level = level;
		}
	}
	public static class LevelCalculator
	{
		internal static Dictionary<string, EnemyData> enemyData = new Dictionary<string, EnemyData>
		{
			{
				"MossBone Crawler",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"MossBone Crawler Fat",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"MossBone Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Mossbone Mother",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Aspid Collector",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Goomba Bounce Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Goomba Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Skull King",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Crawler",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Flyer Giant",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Bone Circler",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Circler Vicious",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hopper",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hopper Giant",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Bone Spitter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Bone Roller",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Thumper",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Spine Floater",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Rock Roller",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Rhino",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Crypt Worm",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Worm",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Beast",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim 03",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim 01",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim 04",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim 02",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Bell Thrower",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim 05",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Bellthrower Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Hiker",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim StaffWielder",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Moss Spitter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Rosary Pilgrim",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Rosary Thief",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Tar Slug",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Tar Slug Huge",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Dock Worker",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Dock Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Dock Bomber",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Shield Dock Worker",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Dock Charger",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Dock Guard Thrower",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Small Crab",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Roof Crab",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Fields Flock Flyers",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act1)
			},
			{
				"Fields Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Fields Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Song Golem",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Tiny",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Buzzer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Child",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Throw",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bone Hunter Trapper",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Bone Hunter Chief",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Hunter Queen",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Mite",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Mitefly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Gnat Giant",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Farmer Catcher",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Farmer Scissors",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Farmer Centipede",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Vampire Gnat",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Wisp",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Farmer Wisp",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Wisp Pyre Effigy",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Crow",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Crowman",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Crowman Dagger",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Crowman Juror Tiny",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Crowman Juror",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Crowman Dagger Juror",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Crawfather",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Maggots",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act1)
			},
			{
				"Dustroach Pollywog",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Dustroach",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bloat Roach",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Roachfeeder Short",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Roachfeeder Tall",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Roachkeeper",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Roachkeeper Chef Tiny",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Roachkeeper Chef",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Wraith",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Swamp Drifter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Swamp Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Swamp Mosquito",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Swamp Mosquito Skinny",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Swamp Muckman",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Swamp Muckman Tall",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Swamp Shaman",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Swamp Barnacle",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Swamp Ductsucker",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pond Skater",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Pilgrim Fisher",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Shellwood Gnat",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Shellwood Wasp",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Stick Insect",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Stick Insect Charger",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Stick Insect Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Splinter Queen",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Flower Drifter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bloom Shooter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bloom Puncher",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Seth",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Flower Queen",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Bell Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Bell Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Blade Spider",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Blade Spider Hang",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Shell Fossil Mimic",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Sand Centipede",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act1)
			},
			{
				"Coral Judge Child",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Coral Judge",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Last Judge",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Coral Spike Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Conch Shooter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act1)
			},
			{
				"Coral Conch Stabber",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Coral Conch Driller",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Coral Conch Driller Giant",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Coral Goombas",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Coral Goomba Large",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Coral Swimmer Fat",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Poke Swimmer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Spike Swimmer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Swimmer Small",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Big Jellyfish",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Warrior",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Coral Flyer Throw",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Brawler",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Hunter",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Bubble Brute",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral King",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Coral Warrior Grey",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Zap Core Enemy",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Citadel Bat",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Citadel Bat Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Mite Heavy",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Mite Giant",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Small",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim 03 Understore",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim Staff Understore",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Poker",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Thrower",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Heavy",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Pilgrim 01",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim 01 Song",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim 02 Song",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim 03 Song",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim 04 Song",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Pilgrim Stomper Song",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Pilgrim 03",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Reed",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Reed Grand",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Heavy Sentry",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Handmaiden",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Arborium Keeper",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Administrator",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Pilgrim Maestro",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Knight",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Threaded Husk",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Threaded Husk Spin",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Pilgrim 02",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Creeper",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Conductor Boss",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Automaton",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Understore Automaton EX",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton Fly Spike",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton 01",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton 02",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton Shield",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Automaton Ball",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Clockwork Dancer",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Song Scholar Acolyte",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Lightbearer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Scrollkeeper",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Scholar",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Trobbio",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Tormented Trobbio",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Slab Prisoner Leaper New",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Prisoner Fly New",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Fly Small Fresh",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Fly Small",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Fly Mid",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Fly Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Slab Fly Broodmother",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Peaks Drifter",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act2)
			},
			{
				"Crystal Drifter",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act2)
			},
			{
				"Crystal Drifter Giant",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Weaver Servitor",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act1)
			},
			{
				"Weaver Servitor Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act2)
			},
			{
				"Lifeblood Fly",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act2)
			},
			{
				"Bone Worm BlueBlood",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Bone Worm BlueTurret",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Blue Assistant",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Lilypad Fly",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Grass Goomba",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Hornet Dragonfly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Dragonfly Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Lilypad Trap",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Cloverstag",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Cloverstag White",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Grasshopper Child",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Grasshopper Slasher",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Grasshopper Fly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Clover Dancer",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Abyss Crawler",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Abyss Crawler Large",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Gloomfly",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Gloom Beast",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Void Tendrils",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Black Thread Core",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Abyss Mass",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"White Palace Fly",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Centipede Trap",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Spike Lazy Flyer",
				new EnemyData(EnemyData.EnemyType.Enemy, EnemyData.EnemyLevel.Act3)
			},
			{
				"Surface Scuttler",
				new EnemyData(EnemyData.EnemyType.None, EnemyData.EnemyLevel.Act3)
			},
			{
				"Giant Centipede",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Giant Flea",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Shakra",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Garmond_Zaza",
				new EnemyData(EnemyData.EnemyType.Miniboss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Garmond",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Pinstress Boss",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			},
			{
				"Spinner Boss",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"First Weaver",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Phantom",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Lace",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act1)
			},
			{
				"Silk Boss",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act2)
			},
			{
				"Lost Lace",
				new EnemyData(EnemyData.EnemyType.Boss, EnemyData.EnemyLevel.Act3)
			}
		};

		private static Dictionary<string, QuestData> questData = new Dictionary<string, QuestData>
		{
			{
				"Citadel Seeker",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act1)
			},
			{
				"The Threadspun Town",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act1)
			},
			{
				"Grand Gate Bellshrines",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Citadel Investigate",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Citadel Ascent Lift",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Citadel Ascent Silk Defeat",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Silk Defeat Snare",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Black Thread Pt0",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act3)
			},
			{
				"Black Thread Pt1 Shamans",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Bellbeast Rescue",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Diving Bell Pt3 Descend",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Black Thread Pt3 Escape",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Black Thread Pt4 Return",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act3)
			},
			{
				"Black Thread Pt5 Heart",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Black Thread Pt6 Flower",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Building Materials",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Building Materials (Bridge)",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Building Materials (Statue)",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Pilgrim Rags",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Mossberry Collection 1",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Save the Fleas",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Rock Rollers",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Skull King",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act1)
			},
			{
				"Brolly Get",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Journal",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Belltown House Start",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Belltown House Mid",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"A Pinsmiths Tools",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Shiny Bell Goomba",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Save Courier Short",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Save Courier Tall",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Bonebottom",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Pilgrims Rest",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Songclave",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Fleatopia",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Mask Maker",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Dustpens Slave",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Courier Delivery Fixer",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act3)
			},
			{
				"Crow Feathers",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Beastfly Hunt",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Shell Flowers",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Wood Witch Curse",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Doctor Curse Cure",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Extractor Blue",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Extractor Blue Worms",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Roach Killing",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act1)
			},
			{
				"Songclave Donation 1",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Songclave Donation 2",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Fine Pins",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Save City Merchant",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Save City Merchant Bridge",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Song Pilgrim Cloaks",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Broodmother Hunt",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Great Gourmand",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act2)
			},
			{
				"Save Sherma",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Song Knight",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Huntress Quest",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Huntress Quest Runt",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Shakra Final Quest",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Soul Snare",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act2)
			},
			{
				"Pinstress Battle",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Sprintmaster Race",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Garmond Black Threaded",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Anguish and Misery",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act3)
			},
			{
				"Ant Trapper",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Flea Games",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Steel Sentinel Pt2",
				new QuestData(QuestData.Difficulty.Medium, QuestData.QuestLevel.Act2)
			},
			{
				"Mr Mushroom",
				new QuestData(QuestData.Difficulty.Hard, QuestData.QuestLevel.Act3)
			},
			{
				"Destroy Thread Cores",
				new QuestData(QuestData.Difficulty.Easy, QuestData.QuestLevel.Act3)
			}
		};

		public static int GetLevel()
		{
			float num = GetXp();
			int num2 = 0;
			float num3 = ConfigSettings.xpRequirement.Value;
			while (num >= num3)
			{
				num2++;
				num -= num3;
				num3 *= ConfigSettings.xpMultiplier.Value;
			}
			SharedData.XpToNextLevel = (int)(num3 - num);
			if (num2 >= ConfigSettings.maxLevel.Value)
			{
				num2 = ConfigSettings.maxLevel.Value;
				SharedData.XpToNextLevel = 0;
			}
			return num2;
		}

		internal static int GetXp()
		{
			return GetHuntingXp() + GetWishXp();
		}

		public static int GetHuntingXp()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			int num4 = 0;
			int num5 = 0;
			int num6 = 0;
			foreach (string key in enemyData.Keys)
			{
				int num7 = PlayerData.instance.EnemyJournalKillData.GetKillData(key).Kills * GetXp(enemyData[key]);
				switch (enemyData[key].type)
				{
				case EnemyData.EnemyType.Enemy:
					num += num7;
					num2++;
					break;
				case EnemyData.EnemyType.Miniboss:
					num3 += num7;
					num4++;
					break;
				case EnemyData.EnemyType.Boss:
					num5 += num7;
					num6++;
					break;
				}
			}
			return num + num3 + num5;
		}

		private static int GetXp(EnemyData enemyData)
		{
			return enemyData.type switch
			{
				EnemyData.EnemyType.Enemy => 1, 
				EnemyData.EnemyType.Miniboss => 5, 
				EnemyData.EnemyType.Boss => 10, 
				_ => 0, 
			} * enemyData.level switch
			{
				EnemyData.EnemyLevel.Act1 => 1, 
				EnemyData.EnemyLevel.Act2 => 2, 
				EnemyData.EnemyLevel.Act3 => 3, 
				_ => 0, 
			};
		}

		public static int GetWishXp()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			QuestCompletionData questCompletionData = PlayerData.instance.QuestCompletionData;
			foreach (string key in questData.Keys)
			{
				int num3 = 0;
				try
				{
					Completion data = ((SerializableNamedList<Completion, NamedCompletion>)(object)questCompletionData).GetData(key);
					if (data.IsCompleted)
					{
						num3 = 1;
						if (key.Contains("Delivery"))
						{
							num3 = data.CompletedCount;
						}
					}
				}
				catch
				{
				}
				num += num3 * GetXp(questData[key]);
				num2++;
			}
			return num;
		}

		private static int GetXp(QuestData questData)
		{
			return questData.difficulty switch
			{
				QuestData.Difficulty.Easy => 25, 
				QuestData.Difficulty.Medium => 50, 
				QuestData.Difficulty.Hard => 100, 
				_ => 0, 
			} * questData.level switch
			{
				QuestData.QuestLevel.Act1 => 1, 
				QuestData.QuestLevel.Act2 => 2, 
				QuestData.QuestLevel.Act3 => 3, 
				_ => 0, 
			};
		}
	}
	public class QuestData
	{
		public enum Difficulty
		{
			None,
			Easy,
			Medium,
			Hard
		}

		public enum QuestLevel
		{
			Act1,
			Act2,
			Act3
		}

		public Difficulty difficulty { get; set; }

		public QuestLevel level { get; set; }

		public QuestData(Difficulty difficulty, QuestLevel level)
		{
			this.difficulty = difficulty;
			this.level = level;
		}
	}
}
namespace SilkAndSong.HarmonyPatches
{
	[HarmonyPatch(typeof(EnemyJournalManager), "RecordKillToJournalData")]
	public static class EnemyJournalManager_RecordKillToJournalData
	{
		[HarmonyPostfix]
		public static void Postfix()
		{
			SharedData.UpdateLevel();
		}
	}
	[HarmonyPatch(typeof(FullQuestBase), "TryEndQuest")]
	public static class FullQuestBase_TryEndQuest
	{
		[HarmonyPostfix]
		public static void Postfix(FullQuestBase __instance)
		{
			if (__instance.IsCompleted)
			{
				SharedData.UpdateLevel();
			}
		}
	}
	[HarmonyPatch(typeof(HealthManager), "TakeDamage")]
	public static class HealthManager_TakeDamage
	{
		[HarmonyPrefix]
		public static void Prefix(ref HitInstance hitInstance)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Invalid comparison between Unknown and I4
			if ((int)hitInstance.AttackType == 0 || (int)hitInstance.AttackType == 7)
			{
				int num = (int)(SharedData.GetNailBonus(SharedData.Level) * (float)hitInstance.DamageDealt);
				hitInstance.DamageDealt += num;
			}
			else
			{
				int num2 = (int)(SharedData.GetSpellBonus(SharedData.Level) * (float)hitInstance.DamageDealt);
				hitInstance.DamageDealt += num2;
			}
		}
	}
	[HarmonyPatch(typeof(HeroController), "Start")]
	public static class HeroController_Start
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance)
		{
			SharedData.UpdateLevel(triggerFlair: false);
			SharedData.healthTimer = Stopwatch.StartNew();
			SharedData.silkTimer = Stopwatch.StartNew();
		}
	}
	[HarmonyPatch(typeof(HeroController), "Update")]
	public static class HeroController_Update
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance)
		{
			if (SharedData.Level > 0)
			{
				if (GameManager.instance.isPaused)
				{
					SharedData.healthTimer.Stop();
					SharedData.silkTimer.Stop();
				}
				else
				{
					SharedData.healthTimer.Start();
					SharedData.silkTimer.Start();
				}
				if (SharedData.GetMaskSeconds(SharedData.Level) <= (float)(SharedData.healthTimer.ElapsedMilliseconds / 1000))
				{
					__instance.AddHealth(1);
					SharedData.healthTimer.Restart();
				}
				if (SharedData.GetSilkSeconds(SharedData.Level) <= (float)(SharedData.silkTimer.ElapsedMilliseconds / 1000))
				{
					__instance.SilkGain();
					SharedData.silkTimer.Restart();
				}
			}
		}
	}
}