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();
}
}
}
}
}