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.3.1.0")] [assembly: AssemblyInformationalVersion("3.3.1+705ad6dc7e73fb403fbbfa4260b19044999c57dd")] [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.3.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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")] [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")] [Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace 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.3.1")] 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.3.1"; 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(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 xpRequirement; public static ConfigEntry xpMultiplier; public static ConfigEntry maxLevel; public static void Initialize(ConfigFile config) { xpRequirement = config.Bind("Modifier", "XP Requirement", 20, "XP required to reach level 1"); xpMultiplier = config.Bind("Modifier", "XP Multiplier", 1.8f, "How much to increase XP requirement per level"); maxLevel = config.Bind("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 enemyData = new Dictionary { { "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 questData = new Dictionary { { "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)(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(); } } } } }