using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CustomDifficulty.Challenges; using DiskCardGame; using HarmonyLib; using InscryptionAPI.Ascension; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("Arina Orlova (StillRinny)")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("Arina Orlova (StillRinny)")] [assembly: AssemblyDescription("A Custom Difficulty Inscryption mod")] [assembly: AssemblyFileVersion("1.2")] [assembly: AssemblyInformationalVersion("1.0+63215799dfcd5672cc7110ba52fabf92930dd74d")] [assembly: AssemblyProduct("Custom Difficulty Inscryption Mod")] [assembly: AssemblyTitle("CustomDifficulty")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace CustomDifficulty { internal static class Config { internal enum Difficulty { Custom, Random, Easy, Normal, Hard, Annoying } private static ConfigEntry _shouldAddChallenges; private static ConfigEntry _currentDifficulty; private static Difficulty _currentDifficultyValue; private static ConfigEntry _minDifficulty; private static ConfigEntry _maxDifficulty; private static ConfigEntry _difficultyModifier; private static ConfigEntry _randomState; internal static bool ShouldAddChallenges => _shouldAddChallenges.Value; internal static Difficulty CurrentDifficulty { get { return _currentDifficultyValue; } set { _currentDifficultyValue = value; SetupBlueprint(); } } internal static int MinDifficulty { get; private set; } internal static int MaxDifficulty { get; private set; } internal static int DifficultyModifier { get; private set; } internal static void Initialize(Plugin plugin) { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) _shouldAddChallenges = ((BaseUnityPlugin)plugin).Config.Bind("Сhallenges", "Add Challenges", true, "Should add custom KCM challenges?"); _currentDifficulty = ((BaseUnityPlugin)plugin).Config.Bind("Base Presets", "Difficulty", Difficulty.Normal, ""); _minDifficulty = ((BaseUnityPlugin)plugin).Config.Bind("Manual Setting", "Min difficulty value", (byte)0, "Difficulty will be not less than this value. \nTip: Parameter \"Difficulty\" must be \"Custom\"\nTip: Value greater than 20 will make opponent don't place cards."); _maxDifficulty = ((BaseUnityPlugin)plugin).Config.Bind("Manual Setting", "Max difficulty value", (byte)20, "Difficulty will be not less than this value. \nTip: Parameter \"Difficulty\" must be \"Custom\"!\nTip: Value greater than 20 will make opponent don't place cards."); _difficultyModifier = ((BaseUnityPlugin)plugin).Config.Bind("Manual Setting", "Difficulty Modifier", (sbyte)0, "Adder to the current difficulty value. \nTip: Parameter \"Difficulty\" must be \"Custom\"!"); _randomState = ((BaseUnityPlugin)plugin).Config.Bind("Тechnical", "Random State", new Vector3(0f, 0f, 0f), "Technical Stuff. Do not change!"); RefreshDifficulty(); if (CurrentDifficulty != 0) { SetupBlueprint(); } if (MinDifficulty > MaxDifficulty) { MaxDifficulty = MinDifficulty; } } internal static void RefreshDifficulty() { _currentDifficultyValue = _currentDifficulty.Value; MinDifficulty = _minDifficulty.Value; MaxDifficulty = _maxDifficulty.Value; DifficultyModifier = _difficultyModifier.Value; } private static void SetupBlueprint() { byte minDifficulty = 0; byte maxDifficulty = 20; sbyte difficultyModifier = 0; switch (CurrentDifficulty) { case Difficulty.Easy: minDifficulty = 0; maxDifficulty = 10; difficultyModifier = -2; break; case Difficulty.Hard: minDifficulty = 10; maxDifficulty = 20; difficultyModifier = 1; break; case Difficulty.Annoying: minDifficulty = 20; maxDifficulty = 20; difficultyModifier = 0; break; case Difficulty.Random: LoadRandomState(); return; } MinDifficulty = minDifficulty; MaxDifficulty = maxDifficulty; DifficultyModifier = difficultyModifier; } internal static int ChangeDifficulty(int difficulty) { if (!SaveFile.IsAscension) { return difficulty; } if (CurrentDifficulty == Difficulty.Annoying) { return MaxDifficulty; } difficulty += DifficultyModifier; difficulty = ((difficulty >= 0) ? difficulty : 0); difficulty += MinDifficulty; return Mathf.Min(difficulty, MaxDifficulty); } internal static void RandomizeDifficulty() { //IL_0079: Unknown result type (might be due to invalid IL or missing references) if (SaveFile.IsAscension && CurrentDifficulty == Difficulty.Random) { int currentRandomSeed = SaveManager.SaveFile.GetCurrentRandomSeed(); MinDifficulty = SeededRandom.Range(0, 20, currentRandomSeed); MaxDifficulty = SeededRandom.Range(MinDifficulty, 20, currentRandomSeed * 10 + 10); DifficultyModifier = SeededRandom.Range(-3, 3, currentRandomSeed); _randomState.Value = new Vector3((float)MinDifficulty, (float)MaxDifficulty, (float)DifficultyModifier); } } internal static void LoadRandomState() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) Vector3 value = _randomState.Value; MinDifficulty = (int)value.x; MaxDifficulty = (int)value.y; DifficultyModifier = (int)value.z; } } [HarmonyPatch] public class Patches { [HarmonyPatch(typeof(GameFlowManager), "Start")] [HarmonyPrefix] private static void StartPrefix() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) if (SaveFile.IsAscension) { if (AscensionSaveData.Data.ChallengeIsActive(Challenge.AnnoyingDifficulty)) { Config.CurrentDifficulty = Config.Difficulty.Annoying; Plugin.CurrentChallenge = Challenge.AnnoyingDifficulty; } else if (AscensionSaveData.Data.ChallengeIsActive(Challenge.RandomDifficulty)) { Config.CurrentDifficulty = Config.Difficulty.Random; Config.LoadRandomState(); Plugin.CurrentChallenge = Challenge.RandomDifficulty; } else { Config.RefreshDifficulty(); } } } [HarmonyPatch(typeof(EncounterBuilder), "BuildOpponentTurnPlan")] [HarmonyPrefix] public static void BuildOpponentTurnPlanPrefix(ref int difficulty) { difficulty = Config.ChangeDifficulty(difficulty); } [HarmonyPatch(typeof(EncounterBuilder), "BuildOpponentTotem")] [HarmonyPrefix] public static void BuildOpponentTotemPrefix(ref int difficulty) { difficulty = Config.ChangeDifficulty(difficulty); } [HarmonyTranspiler] [HarmonyPatch(typeof(Opponent), "SpawnOpponent")] public static IEnumerable Opponent_SpawnOpponent(IEnumerable instructions) { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown List list = new List(instructions); int i; for (i = 166; !(list[i].opcode == OpCodes.Callvirt) || !(list[i + 1].opcode == OpCodes.Callvirt) || !(list[i + 1].operand.ToString() == "Void set_Difficulty(Int32)"); i++) { } MethodInfo methodInfo = AccessTools.Method(typeof(Config), "ChangeDifficulty", new Type[1] { typeof(int) }, (Type[])null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)methodInfo)); return list; } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] public static IEnumerable TurnManager_SetupPhase(IEnumerable instructions) { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown List list = new List(instructions); int i; for (i = 102; !(list[i].opcode == OpCodes.Stfld) || !(list[i].operand.ToString() == "System.Int32 <>1__state") || !(list[i + 1].opcode == OpCodes.Ldarg_0); i++) { } MethodInfo methodInfo = AccessTools.Method(typeof(Plugin), "ShowChallengeActivation", (Type[])null, (Type[])null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)methodInfo)); return list; } [HarmonyPatch(typeof(TurnManager), "CleanupPhase")] [HarmonyPostfix] public static void CleanupPhasePostfix() { Config.RandomizeDifficulty(); } } [BepInPlugin("N0.1DEA.CustomDifficulty", "Custom Difficulty", "1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private static class PluginInfo { public const string PLUGIN_GUID = "N0.1DEA.CustomDifficulty"; public const string PLUGIN_NAME = "Custom Difficulty"; public const string PLUGIN_VERSION = "1.0"; } private readonly Harmony harmony = new Harmony("Custom Difficulty"); internal static ManualLogSource Log { get; set; } internal static AscensionChallenge CurrentChallenge { get; set; } private void Awake() { Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"Coded with <3 | by StillRinny"); Log.LogInfo((object)"Tip: Config filename is: \"N0.1DEA.CustomDifficulty.cfg\""); harmony.PatchAll(); Config.Initialize(this); Log.LogInfo((object)$"Difficulty: \"{Config.CurrentDifficulty}\"; Min: {Config.MinDifficulty}; Max: {Config.MaxDifficulty}; Mod: {Config.DifficultyModifier}"); if (Config.ShouldAddChallenges) { AnnoyingDifficultyChallenge.Add(); RandomDifficultyChallenge.Add(); } Log.LogInfo((object)"Loading finished!"); } internal static void ShowChallengeActivation() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) if ((int)CurrentChallenge > 0) { Singleton.Instance.ShowActivation(CurrentChallenge); } } internal static Texture2D LoadTex(string path) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown byte[] array = ExtractEmbeddedResource(path); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); ((Texture)val).filterMode = (FilterMode)0; return val; } private static byte[] ExtractEmbeddedResource(string filePath) { filePath = filePath.Replace("/", "."); filePath = filePath.Replace("\\", "."); Assembly callingAssembly = Assembly.GetCallingAssembly(); using Stream stream = callingAssembly.GetManifestResourceStream(filePath); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); return array; } } public abstract class Challenge { public static readonly AscensionChallenge AnnoyingDifficulty = AnnoyingDifficultyChallenge.ID; public static readonly AscensionChallenge RandomDifficulty = RandomDifficultyChallenge.ID; } } namespace CustomDifficulty.Challenges { public static class AnnoyingDifficultyChallenge { internal static AscensionChallenge ID; internal static void Add() { //IL_0032: 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) ID = ChallengeManager.Add("N0:1DEA", "Annoying Difficulty", "Sets the maximum in-game difficulty for all Card Battles", 20, Plugin.LoadTex("CustomDifficulty.Resources.AnnoyingChallenge_Icon.png"), Plugin.LoadTex("CustomDifficulty.Resources.AnnoyingChallenge_SelectedIcon.png"), 0, false).Challenge.challengeType; } } public static class RandomDifficultyChallenge { internal static AscensionChallenge ID; internal static void Add() { //IL_0032: 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) ID = ChallengeManager.Add("N0:1DEA", "Random Difficulty", "Changes the in-game difficulty randomly for every single Card Battles", 10, Plugin.LoadTex("CustomDifficulty.Resources.RandomChallenge_Icon.png"), Plugin.LoadTex("CustomDifficulty.Resources.RandomChallenge_SelectedIcon.png"), 0, false).Challenge.challengeType; } } }