using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates.ScavBackpack;
using HarmonyLib;
using IL.RoR2;
using IL.RoR2.Achievements;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using ProperSave;
using RoR2;
using TPDespair.ZetArtifacts;
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.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProperLoop")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+07e12796bcb1655fb334f8463580325dc5e91a85")]
[assembly: AssemblyProduct("ProperLoop")]
[assembly: AssemblyTitle("ProperLoop")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[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 ProperLoop
{
internal class J
{
public static void load()
{
Loading.OnLoadingEnded += delegate
{
load(Main.savePath);
};
static void load(string path)
{
string[][] source = File.ReadAllLines(path).ToList().ConvertAll((string x) => x.Split(','))
.ToArray();
Main.loops = int.Parse(source.FirstOrDefault((string[] x) => x[0] == "loops")[1]);
Main.stage = int.Parse(source.FirstOrDefault((string[] x) => x[0] == "stage")[1]);
if (Main.ScavItemCountScale.Value)
{
Opening.maxItemDropCount = Main.loops * Run.stagesPerLoop + Main.stage + 1;
}
}
}
}
[BepInPlugin("prodzpod.ProperLoop", "ProperLoop", "1.0.12")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Main : BaseUnityPlugin
{
[HarmonyPatch]
public class PatchLoopGetter
{
public static bool Prefix(ref int __result)
{
__result = loops;
return false;
}
public static MethodBase TargetMethod()
{
return typeof(Run).GetProperty("loopClearCount").GetGetMethod();
}
}
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static hook_Start <>9__30_0;
public static Func<Instruction, bool> <>9__30_9;
public static Func<int> <>9__30_10;
public static Manipulator <>9__30_1;
public static Func<GameObject, bool> <>9__30_11;
public static Action<Stage> <>9__30_2;
public static hook_PlaceTeleporter <>9__30_3;
public static Func<Instruction, bool> <>9__30_12;
public static Func<int> <>9__30_13;
public static Manipulator <>9__30_4;
public static Func<Instruction, bool> <>9__30_14;
public static Func<DirectorCard, string> <>9__30_17;
public static Func<Category, string> <>9__30_16;
public static Func<Instruction, bool> <>9__30_18;
public static Func<Instruction, bool> <>9__30_19;
public static Func<DirectorCard, int> <>9__30_20;
public static Manipulator <>9__30_6;
public static Func<Instruction, bool> <>9__30_21;
public static Func<Instruction, bool> <>9__30_22;
public static Func<FamilyDirectorCardCategorySelection, int> <>9__30_23;
public static Func<Instruction, bool> <>9__30_24;
public static Func<Instruction, bool> <>9__30_25;
public static Func<FamilyDirectorCardCategorySelection, int> <>9__30_26;
public static Manipulator <>9__30_7;
public static hook_SetEquipmentIndex <>9__30_8;
public static Action<Dictionary<string, object>> <>9__36_0;
internal void <Awake>b__30_0(orig_Start orig, Run self)
{
loops = 0;
stage = 0;
if (ScavItemCountScale.Value)
{
Opening.maxItemDropCount = 1;
}
orig.Invoke(self);
}
internal void <Awake>b__30_1(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
val.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<Run>(x, "stageClearCount")
});
val.Emit(OpCodes.Pop);
val.EmitDelegate<Func<int>>((Func<int>)(() => loops * Run.stagesPerLoop + stage));
}
internal bool <Awake>b__30_9(Instruction x)
{
return ILPatternMatchingExt.MatchLdfld<Run>(x, "stageClearCount");
}
internal int <Awake>b__30_10()
{
return loops * Run.stagesPerLoop + stage;
}
internal void <Awake>b__30_2(Stage _)
{
GameObject? obj = ((IEnumerable<GameObject>)Object.FindObjectsOfType<GameObject>()).FirstOrDefault((Func<GameObject, bool>)((GameObject x) => (Object)(object)x.GetComponent<TeleporterInteraction>() != (Object)null));
TeleporterInteraction val = ((obj != null) ? obj.GetComponent<TeleporterInteraction>() : null);
if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)null))
{
stage++;
if (((Object)((Component)val).gameObject).name.Contains("LunarTeleporter"))
{
stage = 0;
loops++;
}
if (ScavItemCountScale.Value)
{
Opening.maxItemDropCount = loops * Run.stagesPerLoop + stage + 1;
}
}
}
internal bool <Awake>b__30_11(GameObject x)
{
return (Object)(object)x.GetComponent<TeleporterInteraction>() != (Object)null;
}
internal void <Awake>b__30_3(orig_PlaceTeleporter orig, SceneDirector self)
{
if ((Object)(object)self.teleporterSpawnCard != (Object)null)
{
self.teleporterSpawnCard = (SpawnCard)(object)((stage == Run.stagesPerLoop - 1) ? lunarTP : TP);
}
orig.Invoke(self);
}
internal void <Awake>b__30_4(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 0)
});
val.Emit(OpCodes.Pop);
val.EmitDelegate<Func<int>>((Func<int>)(() => loops));
}
internal bool <Awake>b__30_12(Instruction x)
{
return ILPatternMatchingExt.MatchLdcI4(x, 0);
}
internal int <Awake>b__30_13()
{
return loops;
}
internal bool <Awake>b__30_14(Instruction x)
{
return ILPatternMatchingExt.MatchStfld<ClassicStageInfo>(x, "modifiableMonsterCategories");
}
internal string <Awake>b__30_16(Category x)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
return GeneralExtensions.Join<DirectorCard>((IEnumerable<DirectorCard>)x.cards, (Func<DirectorCard, string>)delegate(DirectorCard y)
{
SpawnCard spawnCard = y.spawnCard;
return (((spawnCard != null) ? ((Object)spawnCard).name : null) ?? "Null") + $" ({y.minimumStageCompletions})";
}, ", ");
}
internal string <Awake>b__30_17(DirectorCard y)
{
SpawnCard spawnCard = y.spawnCard;
return (((spawnCard != null) ? ((Object)spawnCard).name : null) ?? "Null") + $" ({y.minimumStageCompletions})";
}
internal void <Awake>b__30_6(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<DirectorCard>(x, "minimumStageCompletions")
});
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchClt(x)
});
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Ldarg_0);
val.EmitDelegate<Func<DirectorCard, int>>((Func<DirectorCard, int>)((DirectorCard self) => StageCheck(self.minimumStageCompletions + 1) ? 1 : 0));
val.Emit(OpCodes.Ldc_I4_1);
}
internal bool <Awake>b__30_18(Instruction x)
{
return ILPatternMatchingExt.MatchLdfld<DirectorCard>(x, "minimumStageCompletions");
}
internal bool <Awake>b__30_19(Instruction x)
{
return ILPatternMatchingExt.MatchClt(x);
}
internal int <Awake>b__30_20(DirectorCard self)
{
return StageCheck(self.minimumStageCompletions + 1) ? 1 : 0;
}
internal void <Awake>b__30_7(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "minimumStageCompletion")
});
ILLabel val2 = default(ILLabel);
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchBgt(x, ref val2)
});
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Ldarg_0);
val.EmitDelegate<Func<FamilyDirectorCardCategorySelection, int>>((Func<FamilyDirectorCardCategorySelection, int>)((FamilyDirectorCardCategorySelection self) => (!StageCheck(self.minimumStageCompletion + 1)) ? 2 : 0));
val.Emit(OpCodes.Ldc_I4_1);
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "maximumStageCompletion")
});
val.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchCgt(x)
});
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Pop);
val.Emit(OpCodes.Ldarg_0);
val.EmitDelegate<Func<FamilyDirectorCardCategorySelection, int>>((Func<FamilyDirectorCardCategorySelection, int>)((FamilyDirectorCardCategorySelection self) => (!StageCheckMax(self.maximumStageCompletion + 1)) ? 2 : 0));
val.Emit(OpCodes.Ldc_I4_1);
}
internal bool <Awake>b__30_21(Instruction x)
{
return ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "minimumStageCompletion");
}
internal bool <Awake>b__30_22(Instruction x)
{
ILLabel val = default(ILLabel);
return ILPatternMatchingExt.MatchBgt(x, ref val);
}
internal int <Awake>b__30_23(FamilyDirectorCardCategorySelection self)
{
return (!StageCheck(self.minimumStageCompletion + 1)) ? 2 : 0;
}
internal bool <Awake>b__30_24(Instruction x)
{
return ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "maximumStageCompletion");
}
internal bool <Awake>b__30_25(Instruction x)
{
return ILPatternMatchingExt.MatchCgt(x);
}
internal int <Awake>b__30_26(FamilyDirectorCardCategorySelection self)
{
return (!StageCheckMax(self.maximumStageCompletion + 1)) ? 2 : 0;
}
internal void <Awake>b__30_8(orig_SetEquipmentIndex orig, Inventory self, EquipmentIndex equipmentIndex)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
CharacterMaster component = ((Component)self).gameObject.GetComponent<CharacterMaster>();
Log.LogDebug((object)("setting equipment for:" + ((Object)component).name));
if (!(((Object)component).name == "ArtifactShellMaster") || equipmentIndex != Equipment.AffixLunar.equipmentIndex)
{
orig.Invoke(self, equipmentIndex);
}
}
internal void <ProperlySave>b__36_0(Dictionary<string, object> _)
{
<ProperlySave>g__save|36_1(savePath);
}
}
public const string PluginGUID = "prodzpod.ProperLoop";
public const string PluginAuthor = "prodzpod";
public const string PluginName = "ProperLoop";
public const string PluginVersion = "1.0.12";
public static ManualLogSource Log;
public static PluginInfo pluginInfo;
public static Harmony Harmony;
public static ConfigFile Config;
public static ConfigEntry<int> ScavCost;
public static ConfigEntry<int> ScavOnLevel;
public static ConfigEntry<bool> ScavItemCountScale;
public static ConfigEntry<string> EliteDisables;
public static ConfigEntry<float> T1Cost;
public static ConfigEntry<int> T1OnLevel;
public static ConfigEntry<float> T2Cost;
public static ConfigEntry<int> T2OnLevel;
public static ConfigEntry<bool> T2OnHonor;
public static ConfigEntry<int> LoopBossesOnLevel;
public static ConfigEntry<int> LoopEnemiesOnLevel;
public static ConfigEntry<int> PerfectedOnLevel;
public static ConfigEntry<bool> PerfectedOnHonor;
public static ConfigEntry<float> PerfectedCost;
public static ConfigEntry<float> HonorMultiplier;
public static ConfigEntry<float> SanctionMultiplier;
public static InteractableSpawnCard TP;
public static InteractableSpawnCard lunarTP;
private static bool _thisInitialized = false;
private static WeightedSelection<EliteTierDef> EliteSelection = new WeightedSelection<EliteTierDef>(8);
public static int loops = 0;
public static int stage = 0;
public static string savePath = Path.Combine(Application.persistentDataPath, "ProperSave", "Saves") + "\\ProperLoop.csv";
public void Awake()
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Expected O, but got Unknown
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Expected O, but got Unknown
//IL_0266: Unknown result type (might be due to invalid IL or missing references)
//IL_026b: Unknown result type (might be due to invalid IL or missing references)
//IL_0271: Expected O, but got Unknown
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
//IL_02af: Expected O, but got Unknown
//IL_030c: Unknown result type (might be due to invalid IL or missing references)
//IL_0311: Unknown result type (might be due to invalid IL or missing references)
//IL_0317: Expected O, but got Unknown
//IL_0359: Unknown result type (might be due to invalid IL or missing references)
//IL_0363: Expected O, but got Unknown
//IL_0331: Unknown result type (might be due to invalid IL or missing references)
//IL_0336: Unknown result type (might be due to invalid IL or missing references)
//IL_033c: Expected O, but got Unknown
//IL_0378: Unknown result type (might be due to invalid IL or missing references)
//IL_037d: Unknown result type (might be due to invalid IL or missing references)
//IL_0383: Expected O, but got Unknown
//IL_039d: Unknown result type (might be due to invalid IL or missing references)
//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
//IL_03a8: Expected O, but got Unknown
//IL_03d7: Unknown result type (might be due to invalid IL or missing references)
//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
//IL_03e2: Expected O, but got Unknown
pluginInfo = ((BaseUnityPlugin)this).Info;
Log = ((BaseUnityPlugin)this).Logger;
Harmony = new Harmony("prodzpod.ProperLoop");
Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.ProperLoop.cfg"), true);
ScavCost = Config.Bind<int>("General", "Scavenger Cost", 2000, "Lower if you want scavs to spawn early. Vanilla by default.");
ScavOnLevel = Config.Bind<int>("General", "Scavenger Stage", 6, "5 per Proper Loop. 0 to disable.");
ScavItemCountScale = Config.Bind<bool>("General", "Scavenger Item Count Scale", true, "Make scavenger sacks drop items proportional to current stage number.");
T1Cost = Config.Bind<float>("General", "Tier 1 Director Cost Multiplier", 1f, "Perfected on Moon also uses this.");
T1OnLevel = Config.Bind<int>("General", "Tier 1 Elites Stage", 1, "5 per Proper Loop. 0 to disable. May break modded artifacts if changed.");
T2Cost = Config.Bind<float>("General", "Tier 2 Director Cost Multiplier", 6f, "Vanilla value: 6.");
T2OnLevel = Config.Bind<int>("General", "Tier 2 Elites Stage", 6, "5 per Proper Loop. 0 to disable. May break modded artifacts if changed.");
T2OnHonor = Config.Bind<bool>("General", "Tier 2 on Honor", true, "add T2 Elites to Honor. extra chaos!");
LoopBossesOnLevel = Config.Bind<int>("General", "Loop Bosses Stage", 6, "5 per Proper Loop. 0 to disable.");
LoopEnemiesOnLevel = Config.Bind<int>("General", "Loop Enemies Stage", 6, "5 per Proper Loop. 0 to disable.");
PerfectedOnLevel = Config.Bind<int>("General", "Perfected Elite Stage", 6, "5 per Proper Loop. 0 to disable. Enables perfected loop by default.");
PerfectedOnHonor = Config.Bind<bool>("General", "Perfected on Honor", true, "add Perfected Elites to Honor. extra chaos!");
PerfectedCost = Config.Bind<float>("General", "Perfected Director Cost Multiplier", 6f, "By default, equal to T2.");
HonorMultiplier = Config.Bind<float>("General", "Artifact of Honor Stage Multiplier", 1f, "Rounded up.");
SanctionMultiplier = Config.Bind<float>("General", "Artifact of Sanction Stage Multiplier", 0.5f, "Epic zetartifacts compat");
EliteDisables = Config.Bind<string>("General", "Elite Disables", "", "List of EliteDef names to blacklist, separated by comma. Check log for names.");
object obj = <>c.<>9__30_0;
if (obj == null)
{
hook_Start val = delegate(orig_Start orig, Run self)
{
loops = 0;
stage = 0;
if (ScavItemCountScale.Value)
{
Opening.maxItemDropCount = 1;
}
orig.Invoke(self);
};
<>c.<>9__30_0 = val;
obj = (object)val;
}
Run.Start += (hook_Start)obj;
if (Chainloader.PluginInfos.ContainsKey("com.KingEnderBrine.ProperSave"))
{
ProperlySave();
}
object obj2 = <>c.<>9__30_1;
if (obj2 == null)
{
Manipulator val2 = delegate(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
ILCursor val16 = new ILCursor(il);
val16.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<Run>(x, "stageClearCount")
});
val16.Emit(OpCodes.Pop);
val16.EmitDelegate<Func<int>>((Func<int>)(() => loops * Run.stagesPerLoop + stage));
};
<>c.<>9__30_1 = val2;
obj2 = (object)val2;
}
TeleporterInteraction.Start += (Manipulator)obj2;
TP = LegacyResourcesAPI.Load<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard/iscTeleporter");
lunarTP = LegacyResourcesAPI.Load<InteractableSpawnCard>("SpawnCards/InteractableSpawnCard/iscLunarTeleporter");
Stage.onServerStageComplete += delegate
{
GameObject? obj8 = ((IEnumerable<GameObject>)Object.FindObjectsOfType<GameObject>()).FirstOrDefault((Func<GameObject, bool>)((GameObject x) => (Object)(object)x.GetComponent<TeleporterInteraction>() != (Object)null));
TeleporterInteraction val15 = ((obj8 != null) ? obj8.GetComponent<TeleporterInteraction>() : null);
if (!((Object)(object)val15 == (Object)null) && !((Object)(object)val15 == (Object)null))
{
stage++;
if (((Object)((Component)val15).gameObject).name.Contains("LunarTeleporter"))
{
stage = 0;
loops++;
}
if (ScavItemCountScale.Value)
{
Opening.maxItemDropCount = loops * Run.stagesPerLoop + stage + 1;
}
}
};
object obj3 = <>c.<>9__30_3;
if (obj3 == null)
{
hook_PlaceTeleporter val3 = delegate(orig_PlaceTeleporter orig, SceneDirector self)
{
if ((Object)(object)self.teleporterSpawnCard != (Object)null)
{
self.teleporterSpawnCard = (SpawnCard)(object)((stage == Run.stagesPerLoop - 1) ? lunarTP : TP);
}
orig.Invoke(self);
};
<>c.<>9__30_3 = val3;
obj3 = (object)val3;
}
SceneDirector.PlaceTeleporter += (hook_PlaceTeleporter)obj3;
object obj4 = <>c.<>9__30_4;
if (obj4 == null)
{
Manipulator val4 = delegate(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
ILCursor val14 = new ILCursor(il);
val14.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 0)
});
val14.Emit(OpCodes.Pop);
val14.EmitDelegate<Func<int>>((Func<int>)(() => loops));
};
<>c.<>9__30_4 = val4;
obj4 = (object)val4;
}
LoopOnceAchievement.Check += (Manipulator)obj4;
CharacterSpawnCard scav = LegacyResourcesAPI.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscScav");
ClassicStageInfo.RebuildCards += (Manipulator)delegate(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
ILCursor val11 = new ILCursor(il);
val11.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchStfld<ClassicStageInfo>(x, "modifiableMonsterCategories")
});
val11.EmitDelegate<Func<DirectorCardCategorySelection, DirectorCardCategorySelection>>((Func<DirectorCardCategorySelection, DirectorCardCategorySelection>)delegate(DirectorCardCategorySelection orig)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
for (int i = 0; i < orig.categories.Length; i++)
{
Category val12 = orig.categories[i];
for (int j = 0; j < val12.cards.Length; j++)
{
DirectorCard val13 = val12.cards[j];
if (val13.spawnCard is CharacterSpawnCard)
{
if ((Object)(object)val13.spawnCard == (Object)(object)scav)
{
val13.minimumStageCompletions = ScavOnLevel.Value - 1;
val13.spawnCard.directorCreditCost = ScavCost.Value;
}
else if (val13.minimumStageCompletions > stage)
{
val13.minimumStageCompletions = Mathf.Max(0, val13.minimumStageCompletions + ((val12.name == "Champions") ? LoopBossesOnLevel.Value : LoopEnemiesOnLevel.Value) - 6);
}
val12.cards[j] = val13;
}
}
orig.categories[i] = val12;
}
Log.LogDebug((object)("Enemy Stage Completion\n" + GeneralExtensions.Join<Category>((IEnumerable<Category>)orig.categories, (Func<Category, string>)((Category x) => GeneralExtensions.Join<DirectorCard>((IEnumerable<DirectorCard>)x.cards, (Func<DirectorCard, string>)delegate(DirectorCard y)
{
SpawnCard spawnCard = y.spawnCard;
return (((spawnCard != null) ? ((Object)spawnCard).name : null) ?? "Null") + $" ({y.minimumStageCompletions})";
}, ", ")), "\n")));
return orig;
});
};
object obj5 = <>c.<>9__30_6;
if (obj5 == null)
{
Manipulator val5 = delegate(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
ILCursor val10 = new ILCursor(il);
val10.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<DirectorCard>(x, "minimumStageCompletions")
});
val10.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchClt(x)
});
val10.Emit(OpCodes.Pop);
val10.Emit(OpCodes.Pop);
val10.Emit(OpCodes.Ldarg_0);
val10.EmitDelegate<Func<DirectorCard, int>>((Func<DirectorCard, int>)((DirectorCard self) => StageCheck(self.minimumStageCompletions + 1) ? 1 : 0));
val10.Emit(OpCodes.Ldc_I4_1);
};
<>c.<>9__30_6 = val5;
obj5 = (object)val5;
}
DirectorCard.IsAvailable += (Manipulator)obj5;
object obj6 = <>c.<>9__30_7;
if (obj6 == null)
{
Manipulator val6 = delegate(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
ILCursor val8 = new ILCursor(il);
val8.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "minimumStageCompletion")
});
ILLabel val9 = default(ILLabel);
val8.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchBgt(x, ref val9)
});
val8.Emit(OpCodes.Pop);
val8.Emit(OpCodes.Pop);
val8.Emit(OpCodes.Ldarg_0);
val8.EmitDelegate<Func<FamilyDirectorCardCategorySelection, int>>((Func<FamilyDirectorCardCategorySelection, int>)((FamilyDirectorCardCategorySelection self) => (!StageCheck(self.minimumStageCompletion + 1)) ? 2 : 0));
val8.Emit(OpCodes.Ldc_I4_1);
val8.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdfld<FamilyDirectorCardCategorySelection>(x, "maximumStageCompletion")
});
val8.GotoNext(new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchCgt(x)
});
val8.Emit(OpCodes.Pop);
val8.Emit(OpCodes.Pop);
val8.Emit(OpCodes.Ldarg_0);
val8.EmitDelegate<Func<FamilyDirectorCardCategorySelection, int>>((Func<FamilyDirectorCardCategorySelection, int>)((FamilyDirectorCardCategorySelection self) => (!StageCheckMax(self.maximumStageCompletion + 1)) ? 2 : 0));
val8.Emit(OpCodes.Ldc_I4_1);
};
<>c.<>9__30_7 = val6;
obj6 = (object)val6;
}
FamilyDirectorCardCategorySelection.IsAvailable += (Manipulator)obj6;
Harmony.PatchAll(typeof(PatchLoopGetter));
object obj7 = <>c.<>9__30_8;
if (obj7 == null)
{
hook_SetEquipmentIndex val7 = delegate(orig_SetEquipmentIndex orig, Inventory self, EquipmentIndex equipmentIndex)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
CharacterMaster component = ((Component)self).gameObject.GetComponent<CharacterMaster>();
Log.LogDebug((object)("setting equipment for:" + ((Object)component).name));
if (!(((Object)component).name == "ArtifactShellMaster") || equipmentIndex != Equipment.AffixLunar.equipmentIndex)
{
orig.Invoke(self, equipmentIndex);
}
};
<>c.<>9__30_8 = val7;
obj7 = (object)val7;
}
Inventory.SetEquipmentIndex += (hook_SetEquipmentIndex)obj7;
}
public static bool StageCheck(int onLevel, float multiplier = 1f)
{
if (onLevel == 0)
{
return false;
}
if (Chainloader.PluginInfos.ContainsKey("com.TPDespair.ZetArtifacts") && EarlifactActive())
{
multiplier *= SanctionMultiplier.Value;
}
onLevel = Mathf.CeilToInt((float)onLevel * multiplier) - 1;
return loops > onLevel / Run.stagesPerLoop || (loops == onLevel / Run.stagesPerLoop && stage >= onLevel % Run.stagesPerLoop);
}
public static bool StageCheckMax(int onLevel, float multiplier = 1f)
{
if (onLevel == 0)
{
return false;
}
if (Chainloader.PluginInfos.ContainsKey("com.TPDespair.ZetArtifacts") && EarlifactActive())
{
multiplier *= SanctionMultiplier.Value;
}
onLevel = Mathf.CeilToInt((float)onLevel * multiplier) - 1;
return loops < onLevel / Run.stagesPerLoop || (loops == onLevel / Run.stagesPerLoop && stage < onLevel % Run.stagesPerLoop);
}
public static bool EarlifactActive()
{
return RunArtifactManager.instance.IsArtifactEnabled(ZetEarlifact.ArtifactDef);
}
public static void ProperlySave()
{
SaveFile.OnGatherSaveData += delegate
{
save(savePath);
};
if (File.Exists(savePath))
{
J.load();
}
static void save(string path)
{
File.WriteAllText(path, $"loops,{loops}\nstage,{stage}");
}
}
[CompilerGenerated]
internal static void <ProperlySave>g__save|36_1(string path)
{
File.WriteAllText(path, $"loops,{loops}\nstage,{stage}");
}
}
}