Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SilkAndSong v3.2.2
SilkAndSong.dll
Decompiled 5 months agousing 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.2.2.0")] [assembly: AssemblyInformationalVersion("3.2.2+98c5a75e00ab83abd4dfc1274b09b23786d49a77")] [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.2.2.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.2.2")] 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.2.2"; 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(); } } } } }