Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of R2API Director v2.3.8
plugins/R2API.Director/R2API.Director.dll
Decompiled 3 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; 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.Logging; using HG; using HG.Reflection; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API.AddressReferencedAssets; using R2API.AutoVersionGen; using R2API.Utils; using RoR2; using RoR2.ExpansionManagement; using UnityEngine; using UnityEngine.ResourceManagement.AsyncOperations; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("R2API.Director")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.3.8.0")] [assembly: AssemblyInformationalVersion("2.3.8+2598e052d6bdcbb09d1c362d7c32ff182e556924")] [assembly: AssemblyProduct("R2API.Director")] [assembly: AssemblyTitle("R2API.Director")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.3.8.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.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 System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace R2API { [CreateAssetMenu(fileName = "New AddressableDCCSPool", menuName = "R2API/DirectorAPI/AddressableDCCSPool")] public class AddressableDCCSPool : ScriptableObject { [Serializable] public class PoolEntry { [Tooltip("The DCCS for this pool entry")] public AddressableDirectorCardCategorySelection dccs; [Tooltip("An address or a Direct reference to an existing Family Director Card Category Selection")] public AddressReferencedFamilyDirectorCardCategorySelection familyDccs; [Tooltip("The weight of this pool entry relative to the others")] public float weight; internal virtual PoolEntry Upgrade() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown return new PoolEntry { dccs = GetDirectorCardCategorySelection(), weight = weight }; } protected DirectorCardCategorySelection GetDirectorCardCategorySelection() { FamilyDirectorCardCategorySelection asset = ((AddressReferencedAsset<FamilyDirectorCardCategorySelection>)(object)familyDccs).Asset; if (Object.op_Implicit((Object)(object)asset)) { return (DirectorCardCategorySelection)(object)asset; } return dccs.targetCardCategorySelection; } } [Serializable] public class ConditionalPoolEntry : PoolEntry { [Tooltip("ALL expansions in this list must be enabled for this run for this entry to be considered")] public AddressReferencedExpansionDef[] requiredExpansions = Array.Empty<AddressReferencedExpansionDef>(); internal override PoolEntry Upgrade() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown ConditionalPoolEntry val = new ConditionalPoolEntry { dccs = GetDirectorCardCategorySelection(), weight = weight }; List<ExpansionDef> list = new List<ExpansionDef>(); AddressReferencedExpansionDef[] array = requiredExpansions; for (int i = 0; i < array.Length; i++) { ExpansionDef asset = ((AddressReferencedAsset<ExpansionDef>)(object)array[i]).Asset; if (Object.op_Implicit((Object)(object)asset)) { list.Add(asset); } } val.requiredExpansions = list.ToArray(); return (PoolEntry)(object)val; } } [Serializable] public class Category { [Tooltip("A name to help identify this category")] public string name; [Tooltip("The weight of all entries in this category relative to the sibling categories")] public float categoryWeight; [Tooltip("These entries are always considered")] public PoolEntry[] alwaysIncluded = Array.Empty<PoolEntry>(); [Tooltip("These entries are only considered if their individual conditions are met")] public ConditionalPoolEntry[] includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(); [Tooltip("These entries are considered only if no entries from 'includedIfConditionsMet' have been includedd")] public PoolEntry[] includedIfNoConditionsMet = Array.Empty<PoolEntry>(); internal Category Upgrade() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown Category val = new Category { name = name, categoryWeight = categoryWeight }; List<PoolEntry> list = new List<PoolEntry>(); List<ConditionalPoolEntry> list2 = new List<ConditionalPoolEntry>(); PoolEntry[] array = alwaysIncluded; for (int i = 0; i < array.Length; i++) { PoolEntry val2 = array[i].Upgrade(); if (val2 != null && Object.op_Implicit((Object)(object)val2.dccs)) { list.Add(val2); } } val.alwaysIncluded = list.ToArray(); ConditionalPoolEntry[] array2 = includedIfConditionsMet; for (int i = 0; i < array2.Length; i++) { PoolEntry val3 = array2[i].Upgrade(); if (val3 != null) { ConditionalPoolEntry val4 = (ConditionalPoolEntry)(object)((val3 is ConditionalPoolEntry) ? val3 : null); if (val4 != null && Object.op_Implicit((Object)(object)((PoolEntry)val4).dccs) && val4.requiredExpansions != null && val4.requiredExpansions.Length != 0 && val4.requiredExpansions.Any()) { list2.Add(val4); } } } val.includedIfConditionsMet = list2.ToArray(); list.Clear(); array = includedIfNoConditionsMet; for (int i = 0; i < array.Length; i++) { PoolEntry val5 = array[i].Upgrade(); if (val5 != null && Object.op_Implicit((Object)(object)val5.dccs)) { list.Add(val5); } } val.includedIfNoConditionsMet = list.ToArray(); return val; } } private static HashSet<AddressableDCCSPool> instances = new HashSet<AddressableDCCSPool>(); [Tooltip("The DccsPool that will be overwritten with the values stored in this AddressableDCCSPool")] public DccsPool targetPool; [Tooltip("The categories for this pool")] public Category[] poolCategories = Array.Empty<Category>(); [SystemInitializer(new Type[] { })] private static void SystemInitializer() { AddressReferencedAsset.OnAddressReferencedAssetsLoaded += delegate { foreach (AddressableDCCSPool instance in instances) { try { instance.Upgrade(); } catch (Exception arg) { DirectorPlugin.Logger.LogError((object)$"{instance} failed to upgrade.\n{arg}"); } } }; } private void Upgrade() { List<Category> list = new List<Category>(); for (int i = 0; i < poolCategories.Length; i++) { Category val = poolCategories[i]?.Upgrade(); if (val == null) { DirectorPlugin.Logger.LogWarning((object)$"{this}'s {i}th index of categories failed to upgrade."); } else { list.Add(val); } } targetPool.poolCategories = list.ToArray(); poolCategories = null; } private void Awake() { instances.Add(this); } private void OnDestroy() { instances.Remove(this); } } [Serializable] public class AddressableDirectorCard { [Tooltip("The spawn card for this DirectorCard")] public AddressReferencedSpawnCard spawnCard; [Tooltip("The weight of this director card relative to other cards")] public int selectionWeight; [Tooltip("The distance used for spawning this card, used for monsters")] public MonsterSpawnDistance spawnDistance; public bool preventOverhead; [Tooltip("The minimum amount of stages that need to be completed before this Card can be spawned")] public int minimumStageCompletions; [Tooltip("This unlockableDef must be unlocked for this Card to spawn")] public AddressReferencedUnlockableDef requiredUnlockableDef; [Tooltip("This unlockableDef cannot be unlocked for this Card to spawn")] public AddressReferencedUnlockableDef forbiddenUnlockableDef; internal DirectorCard Upgrade() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown return new DirectorCard { spawnCard = AddressReferencedSpawnCard.op_Implicit(spawnCard), selectionWeight = selectionWeight, spawnDistance = spawnDistance, preventOverhead = preventOverhead, minimumStageCompletions = minimumStageCompletions, requiredUnlockableDef = AddressReferencedUnlockableDef.op_Implicit(requiredUnlockableDef), forbiddenUnlockableDef = AddressReferencedUnlockableDef.op_Implicit(forbiddenUnlockableDef) }; } } [CreateAssetMenu(fileName = "New AddressableDirectorCardCategorySelection", menuName = "R2API/DirectorAPI/AddressableDirectorCardCategorySelection")] public class AddressableDirectorCardCategorySelection : ScriptableObject { [Serializable] public struct Category { [Tooltip("The name of this category")] public string name; [Tooltip("The DirectorCards for this category")] public AddressableDirectorCard[] cards; [Tooltip("The weight of this category relative to the other categories")] public float selectionWeight; internal Category? Upgrade() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) Category val = default(Category); val.name = name; val.selectionWeight = selectionWeight; Category value = val; List<DirectorCard> list = new List<DirectorCard>(); if (cards == null || cards.Length == 0) { DirectorPlugin.Logger.LogWarning((object)("Director card category " + name + " cannot upgrade as there are no AddressableDirectorCards. See below for more information.")); return null; } for (int i = 0; i < cards.Length; i++) { DirectorCard val2 = cards[i]?.Upgrade(); if (val2 != null) { if (!Object.op_Implicit((Object)(object)val2.spawnCard)) { DirectorPlugin.Logger.LogWarning((object)$"AddressableDCCS.Category with name {name} has an invalid spawn card at index {i}"); } else { list.Add(val2); } } } value.cards = list.ToArray(); return value; } } private static HashSet<AddressableDirectorCardCategorySelection> instances = new HashSet<AddressableDirectorCardCategorySelection>(); [Tooltip("The DirectorCardCategorySelection that will be overridedn with the values stored in this AddressableDirectorCardCategorySelection")] public DirectorCardCategorySelection targetCardCategorySelection; [Tooltip("The categories for this AddressableDirectorCardCategorySelection")] public Category[] categories = Array.Empty<Category>(); private void Upgrade() { //IL_004a: 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) ManualLogSource logger = DirectorPlugin.Logger; List<Category> list = new List<Category>(); for (int i = 0; i < categories.Length; i++) { Category category = categories[i]; Category? val = category.Upgrade(); if (!val.HasValue) { logger.LogWarning((object)$"{this}'s {i}th category failed to upgrade."); } else if (val.Value.cards.Length == 0) { logger.LogWarning((object)$"{this}'s {i}th category failed to upgrade, no cards where computed."); } else { list.Add(val.Value); } } targetCardCategorySelection.categories = list.ToArray(); categories = null; } private void Awake() { instances.Add(this); } private void OnDestroy() { instances.Remove(this); } [SystemInitializer(new Type[] { })] private static void SystemInitializer() { AddressReferencedAsset.OnAddressReferencedAssetsLoaded += delegate { foreach (AddressableDirectorCardCategorySelection instance in instances) { try { instance.Upgrade(); } catch (Exception arg) { DirectorPlugin.Logger.LogError((object)$"{instance} failed to upgrade.\n{arg}"); } } }; } } [AutoVersion] public static class DirectorAPI { public enum MonsterCategory { Invalid, Custom, BasicMonsters, Minibosses, Champions, Special } public enum InteractableCategory { Invalid, Custom, Chests, Barrels, Shrines, Drones, Misc, Rare, Duplicator, VoidStuff, StormStuff } [Flags] public enum Stage : long { Custom = 1L, TitanicPlains = 2L, DistantRoost = 4L, WetlandAspect = 8L, AbandonedAqueduct = 0x10L, RallypointDelta = 0x20L, ScorchedAcres = 0x40L, AbyssalDepths = 0x80L, SirensCall = 0x100L, GildedCoast = 0x200L, MomentFractured = 0x400L, Bazaar = 0x800L, VoidCell = 0x1000L, MomentWhole = 0x2000L, SkyMeadow = 0x4000L, ArtifactReliquary = 0x8000L, Commencement = 0x10000L, SunderedGrove = 0x20000L, AphelianSanctuary = 0x40000L, AphelianSanctuarySimulacrum = 0x80000L, AbyssalDepthsSimulacrum = 0x100000L, RallypointDeltaSimulacrum = 0x200000L, TitanicPlainsSimulacrum = 0x400000L, AbandonedAqueductSimulacrum = 0x800000L, CommencementSimulacrum = 0x1000000L, SkyMeadowSimulacrum = 0x2000000L, SiphonedForest = 0x4000000L, SulfurPools = 0x8000000L, VoidLocus = 0x10000000L, ThePlanetarium = 0x20000000L, VerdantFalls = 0x40000000L, ViscousFalls = 0x80000000L, ArtifactReliquary_AphelianSanctuary_Theme = 0x100000000L, ArtifactReliquary_AbandonedAqueduct_Theme = 0x200000000L, ArtifactReliquary_ScorchedAcres_Theme = 0x400000000L, ShatteredAbodes = 0x800000000L, DisturbedImpact = 0x1000000000L, ReformedAltar = 0x2000000000L, TreebornColony = 0x4000000000L, GoldenDieback = 0x8000000000L, HelminthHatchery = 0x10000000000L, PrimeMeridian = 0x20000000000L, ComputationalExchange = 0x40000000000L, ConduitCanyon = 0x80000000000L, IronAlluvium = 0x100000000000L, IronAuroras = 0x200000000000L, PretendersPrecipice = 0x400000000000L, RepurposedCrater = 0x800000000000L, NeuralSanctum = 0x1000000000000L, SolutionalHaunt = 0x2000000000000L } [Serializable] public struct StageSerde { public long Value; public StageSerde(long value) { Value = value; } public static implicit operator StageSerde(Stage enumValue) { return new StageSerde((long)enumValue); } public static implicit operator Stage(StageSerde stageSerde) { return (Stage)stageSerde.Value; } } public struct StageInfo { public Stage stage; public string CustomStageName; public static StageInfo ParseInternalStageName(string internalStageName) { SetHooks(); StageInfo result = default(StageInfo); result.stage = DirectorAPI.ParseInternalStageName(internalStageName); result.CustomStageName = ((result.stage == Stage.Custom) ? "" : internalStageName); return result; } public string ToInternalStageName() { SetHooks(); string text = DirectorAPI.ToInternalStageName(stage); if (!(text == "")) { return text; } return CustomStageName; } public bool CheckStage(Stage stage, params string[] customStageNames) { SetHooks(); if (!stage.HasFlag(this.stage)) { return false; } if (this.stage == Stage.Custom && customStageNames.Length != 0) { return customStageNames.Contains(CustomStageName); } return true; } } public class StageSettings { public int SceneDirectorMonsterCredits; public int SceneDirectorInteractableCredits; public Dictionary<GameObject, int>? BonusCreditObjects; public Dictionary<DirectorCardCategorySelection, Dictionary<string, float>> MonsterCategoryWeightsPerDccs; public Dictionary<DirectorCardCategorySelection, Dictionary<string, float>> InteractableCategoryWeightsPerDccs; } public class DirectorCardHolder { public DirectorCard? Card; public MonsterCategory MonsterCategory; public string CustomMonsterCategory; public float MonsterCategorySelectionWeight = 1f; public InteractableCategory InteractableCategory; public string CustomInteractableCategory; public float InteractableCategorySelectionWeight = 1f; public bool IsMonster => MonsterCategory != MonsterCategory.Invalid; public bool IsInteractable => InteractableCategory != InteractableCategory.Invalid; public bool IsValid() { SetHooks(); if (InteractableCategory == InteractableCategory.Invalid && MonsterCategory == MonsterCategory.Invalid) { return false; } return true; } public void ThrowIfInvalid() { SetHooks(); if (!IsValid()) { throw new Exception("Both DirectorCardHolder.InteractableCategory and DirectorCardHolder.MonsterCategory are invalid"); } } public string GetCategoryName() { SetHooks(); ThrowIfInvalid(); if (InteractableCategory == InteractableCategory.Invalid) { if (MonsterCategory == MonsterCategory.Custom) { return CustomMonsterCategory; } return Helpers.GetVanillaMonsterCategoryName(MonsterCategory); } if (InteractableCategory == InteractableCategory.Custom) { return CustomInteractableCategory; } return Helpers.GetVanillaInteractableCategoryName(InteractableCategory); } } public class MonsterFamilyHolder { public Dictionary<string, List<DirectorCard>> MonsterCategoryToMonsterCards; public Dictionary<string, float> MonsterCategoryToSelectionWeights; public int MinStageCompletion; public int MaxStageCompletion; public float FamilySelectionWeight; public string? SelectionChatString; } public static class Helpers { public static class MonsterNames { public static readonly string Beetle = "cscbeetle"; public static readonly string BeetleGuard = "cscbeetleguard"; public static readonly string BeetleQueen = "cscbeetlequeen"; public static readonly string BrassContraption = "cscbell"; public static readonly string BighornBison = "cscbison"; public static readonly string Mithrix = "cscbrother"; public static readonly string MithrixHurt = "cscbrotherhurt"; public static readonly string ClayDunestrider = "cscclayboss"; public static readonly string ClayTemplar = "cscclaybruiser"; public static readonly string StrikeDrone = "cscbackupdrone"; public static readonly string GunnerDrone = "cscdrone1"; public static readonly string HealingDrone = "cscdrone2"; public static readonly string TC280Prototype = "cscmegadrone"; public static readonly string OverloadingWorm = "cscelectricworm"; public static readonly string StoneGolem = "cscgolem"; public static readonly string Grandparent = "cscgrandparent"; public static readonly string Grovetender = "cscgravekeeper"; public static readonly string GreaterWisp = "cscgreaterwisp"; public static readonly string HermitCrab = "cschermitcrab"; public static readonly string Imp = "cscimp"; public static readonly string ImpOverlord = "cscimpboss"; public static readonly string Jellyfish = "cscjellyfish"; public static readonly string Lemurian = "csclemurian"; public static readonly string ElderLemurian = "csclemurianbruiser"; public static readonly string LunarChimeraExploder = "csclunarexploder"; public static readonly string LunarChimeraGolem = "csclunargolem"; public static readonly string LunarChimeraWisp = "csclunarwisp"; public static readonly string MagmaWorm = "cscmagmaworm"; public static readonly string MiniMushrum = "cscminimushroom"; public static readonly string VoidReaver = "cscnullifier"; public static readonly string VoidReaverAlly = "cscnullifierally"; public static readonly string Parent = "cscparent"; public static readonly string SolusControlUnit = "cscroboballboss"; public static readonly string SolusProbe = "cscroboballmini"; public static readonly string AlloyWorshipUnit = "cscsuperroboballboss"; public static readonly string Scavenger = "cscscav"; public static readonly string ScavengerBoss = "cscscavboss"; public static readonly string TwiptwiptheDevotee = "cscscavlunar"; public static readonly string StoneTitan = "csctitanblackbeach"; public static readonly string StoneTitanAbyssalDepths = "csctitandampcave"; public static readonly string StoneTitanGolemPlains = "csctitangolemplains"; public static readonly string StoneTitanAbandonedAqueduct = "csctitangoolake"; public static readonly string Aurelionite = "csctitangold"; public static readonly string WanderingVagrant = "cscvagrant"; public static readonly string AlloyVulture = "cscvulture"; public static readonly string LesserWisp = "csclesserwisp"; public static readonly string BeetleGuardAlly = "cscbeetleguardally"; public static readonly string DelightedProbe = "cscroboballgreenbuddy"; public static readonly string QuietProbe = "cscroboballredbuddy"; public static readonly string SquidTurret = "cscsquidturret"; public static readonly string AurelioniteAlly = "csctitangoldally"; public static readonly string Larva = "cscacidlarva"; public static readonly string Assassin = "cscassassin2"; public static readonly string ClayApothecary = "cscclaygrenadier"; public static readonly string ColDroneman = "cscdronecommander"; public static readonly string BlindPest = "cscflyingvermin"; public static readonly string BlindPestSnowy = "cscflyingverminsnowy"; public static readonly string Geep = "cscgeepbody"; public static readonly string Gip = "cscgipbody"; public static readonly string Gup = "cscgupbody"; public static readonly string MAJORCONSTRUCT_BODY_NAME = "cscmajorconstruct"; public static readonly string XiConstruct = "cscmegaconstruct"; public static readonly string AlphaConstruct = "cscminorconstruct"; public static readonly string AlphaConstructAttachable = "cscminorconstructattachable"; public static readonly string AlphaConstructOnKill = "cscminorconstructonkill"; public static readonly string BlindVermin = "cscvermin"; public static readonly string BlindVerminSnowy = "cscverminsnowy"; public static readonly string VoidBarnacle = "cscvoidbarnacle"; public static readonly string VoidBarnacleAlly = "cscvoidbarnacleally"; public static readonly string VoidBarnacleNoCast = "cscvoidbarnaclenocast"; public static readonly string VoidJailer = "cscvoidjailer"; public static readonly string VoidJailerAlly = "cscvoidjailerally"; public static readonly string VoidDevastator = "cscvoidmegacrab"; public static readonly string Voidling = "cscvoidraidcrab"; public static readonly string VoidlingJoint = "cscvoidraidcrabjoint"; public static readonly string VoidlingBase = "cscminivoidraidcrabbase"; public static readonly string VoidlingPhase1 = "cscminivoidraidcrabphase1"; public static readonly string VoidlingPhase2 = "cscminivoidraidcrabphase2"; public static readonly string VoidlingPhase3 = "cscminivoidraidcrabphase3"; public static readonly string VoidInfestor = "cscvoidinfestor"; public static readonly string MithrixInfiniteTower = "cscbrotherit"; public static readonly string ArchWisp = "cscarchwisp"; public static readonly string BeetleCrystal = "cscbeetlecrystal"; public static readonly string BeetleGuardCrystal = "cscbeetleguardcrystal"; public static readonly string MithrixGlass = "cscbrotherglass"; public static readonly string AncestralPod = "cscparentpod"; public static readonly string Child = "cscchild"; public static readonly string LunarRain = "csccorruptionspike"; public static readonly string FalseSonBossPhase1 = "cscfalsesonboss"; public static readonly string FalseSonBossPhase2 = "cscfalsesonbosslunarshard"; public static readonly string FalseSonBossPhase3 = "cscfalsesonbossbrokenlunarshard"; public static readonly string Halcyonite = "cschalcyonite"; public static readonly string Scorchling = "cscscorchling"; public static readonly string SolusInvalidator = "cscdefectiveunit"; public static readonly string LtDroneboy = "cscdronebomber"; public static readonly string CROSSHAIRS = "cscgunnerdrone"; public static readonly string CHIRP = "cscdthaulerdrone"; public static readonly string DOC = "cschealingdrone"; public static readonly string SolusExtractor = "cscextractorunit"; public static readonly string BestBuddy = "cscfriendunit"; public static readonly string BestBuddyQuestUnlock = "cscfriendunitquestunlock"; public static readonly string SolusTransporter = "cscironhauler"; public static readonly string SolusDistributor = "cscminepod"; public static readonly string SeveredScorcher = "cscsolusamalgamatorflamethrowercannon"; public static readonly string SeveredBreaker = "cscsolusamalgamatormissilepod"; public static readonly string SeveredProbe = "cscsolusamalgamatorthruster"; public static readonly string SolusAmalgamator = "cscsolusamalgamator"; public static readonly string SolusHeart = "cscsolusheart"; public static readonly string SolusMine = "cscsolusmine"; public static readonly string SolusWing = "cscsoluswing"; public static readonly string VultureHuntressInvader = "cscvulturehuntressinvader"; public static readonly string VultureMulTInvader = "cscvulturemultinvader"; public static readonly string SolusScorcher = "csctanker"; public static readonly string AlloyHunter = "cscvulturehunter"; public static readonly string SolusProspector = "cscworkerunit"; } public static class MonsterPoolCategories { public static readonly string Standard = "Standard"; public static readonly float StandardWeight = 0.98f; public static readonly string Family = "Family"; public static readonly float FamilyWeight = 0.02f; public static readonly string VoidInvasion = "VoidInvasion"; public static readonly float VoidInvasionWeight = 0.02f; } public static class InteractablePoolCategories { public static readonly string Standard = "Standard"; public static readonly float StandardWeight = 1f; } public static class InteractableNames { public static readonly string BrokenGunnerDrone = "iscbrokendrone1"; public static readonly string BrokenHealingDrone = "iscbrokendrone2"; public static readonly string BrokenEmergencyDrone = "iscbrokenemergencydrone"; public static readonly string BrokenEquipmentDrone = "iscbrokenequipmentdrone"; public static readonly string BrokenIncineratorDrone = "iscbrokenflamedrone"; public static readonly string BrokenTC280 = "iscbrokenmegadrone"; public static readonly string BrokenMissileDrone = "iscbrokenmissiledrone"; public static readonly string BrokenGunnerTurret = "iscbrokenturret1"; public static readonly string ScavengersSack = "iscscavbackpack"; public static readonly string ScavengersLunarSack = "iscscavlunarbackpack"; public static readonly string Barrel = "iscbarrel1"; public static readonly string AdaptiveChest = "isccasinochest"; public static readonly string ChestDamage = "isccategorychestdamage"; public static readonly string ChestHealing = "isccategorychesthealing"; public static readonly string ChestUtility = "isccategorychestutility"; public static readonly string Chest = "iscchest1"; public static readonly string CloakedChest = "iscchest1stealthed"; public static readonly string LargeChest = "iscchest2"; public static readonly string Printer3D = "iscduplicator"; public static readonly string Printer3DLarge = "iscduplicatorlarge"; public static readonly string PrinterMiliTech = "iscduplicatormilitary"; public static readonly string PrinterOvergrown3D = "iscduplicatorwild"; public static readonly string EquipmentBarrel = "iscequipmentbarrel"; public static readonly string LegendaryChest = "iscgoldchest"; public static readonly string LunarPod = "isclunarchest"; public static readonly string GoldPortal = "iscgoldshoresportal"; public static readonly string CelestialPortal = "iscmsportal"; public static readonly string BluePortal = "iscshopportal"; public static readonly string RadioScanner = "iscradartower"; public static readonly string Scrapper = "iscscrapper"; public static readonly string ShrineOfBlood = "iscshrineblood"; public static readonly string ShrineOfBloodSandy = "iscshrinebloodsandy"; public static readonly string ShrineOfBloodSnowy = "iscshrinebloodsnowy"; public static readonly string ShrineOftheMountain = "iscshrineboss"; public static readonly string ShrineOftheMountainSandy = "iscshrinebosssandy"; public static readonly string ShrineOftheMountainSnowy = "iscshrinebosssnowy"; public static readonly string ShrineOfChance = "iscshrinechance"; public static readonly string ShrineOfChanceSandy = "iscshrinechancesandy"; public static readonly string ShrineOfChanceSnowy = "iscshrinechancesnowy"; public static readonly string CleansingPool = "iscshrinecleanse"; public static readonly string CleansingPoolSandy = "iscshrinecleansesandy"; public static readonly string CleansingPoolSnowy = "iscshrinecleansesnowy"; public static readonly string ShrineOfCombat = "iscshrinecombat"; public static readonly string ShrineOfCombatSandy = "iscshrinecombatsandy"; public static readonly string ShrineOfCombatSnowy = "iscshrinecombatsnowy"; public static readonly string AltarOfGold = "iscshrinegoldshoresaccess"; public static readonly string ShrineOftheWoods = "iscshrinehealing"; public static readonly string ShrineOfOrder = "iscshrinerestack"; public static readonly string ShrineOfOrderSandy = "iscshrinerestacksandy"; public static readonly string ShrineOfOrderSnowy = "iscshrinerestacksnowy"; public static readonly string PrimordialTeleporter = "isclunarteleporter"; public static readonly string Teleporter = "iscteleporter"; public static readonly string TripleShop = "isctripleshop"; public static readonly string TripleShopEquipment = "isctripleshopequipment"; public static readonly string TripleShopLarge = "isctripleshoplarge"; public static readonly string HalcyonBeacon = "iscgoldshoresbeacon"; public static readonly string VoidRaidSafeWard = "iscvoidraidsafeward"; public static readonly string InfinitePortal = "iscinfinitetowerportal"; public static readonly string AssessmentFocus = "iscinfinitetowersafeward"; public static readonly string AssessmentFocusAwaitingInteraction = "iscinfinitetowersafewardawaitinginteraction"; public static readonly string LargeChestDamage = "isccategorychest2damage"; public static readonly string LargeChestHealing = "isccategorychest2healing"; public static readonly string LargeChestUtility = "isccategorychest2utility"; public static readonly string DeepVoidPortal = "iscdeepvoidportal"; public static readonly string DeepVoidSignal = "iscdeepvoidportalbattery"; public static readonly string VoidPortal = "iscvoidportal"; public static readonly string VoidSeed = "iscvoidcamp"; public static readonly string VoidCradle = "iscvoidchest"; public static readonly string Stalk = "iscvoidcoinbarrel"; public static readonly string VoidOutroPortal = "iscvoidoutroportal"; public static readonly string NewtAltar = "iscvoidsuppressor"; public static readonly string VoidPotential = "iscvoidtriple"; public static readonly string FreeChestMultiShop = "iscfreechest"; public static readonly string EncrustedLockbox = "isclockboxvoid"; public static readonly string GauntletEntranceOrb = "iscgauntletentrance"; public static readonly string SquidTurretMaster = "iscsquidturret"; public static readonly string RustyLockbox = "isclockbox"; public static readonly string AurelioniteGeode = "iscgeode"; public static readonly string DestinationPortal = "iscdestinationportal"; public static readonly string GreenPortal = "isccolossusportal"; public static readonly string HalcyonShrine = "iscshrinehalcyonite"; public static readonly string HalcyonShrineTier1 = "iscshrinehalcyonitetier1"; public static readonly string ShrineOfShaping = "iscshrinecolossusaccess"; public static readonly string DroneUpgradeStation = "iscdroneassemblystation"; public static readonly string DroneCombinerStation = "iscdronecombinerstation"; public static readonly string BrokenBombardmentDrone = "iscbrokenbombardmentdrone"; public static readonly string BrokenCleanupDrone = "iscbrokencleanupdrone"; public static readonly string BrokenFreezeDrone = "iscbrokencopycatdrone"; public static readonly string BrokenTransportDrone = "iscbrokenhaulerdrone"; public static readonly string BrokenJailerDrone = "iscbrokenjailerdrone"; public static readonly string BrokenJunkDrone = "iscbrokenjunkdrone"; public static readonly string BrokenBarrierDrone = "iscbrokenrechargedrone"; public static readonly string DroneScrapper = "iscdronescrapper"; public static readonly string MainlinePortal = "isceyeportal"; public static readonly string DefunctUnit = "iscfriendunitunlock"; public static readonly string VirtualPortal = "iscsolusshopportal"; public static readonly string CollectiveShrineOfCombat = "iscshrinecombatcollective"; public static readonly string EncryptedPortal = "ischardwareprogportal"; public static readonly string EncryptedPortalHaunt = "ischardwareprogportal_haunt"; public static readonly string VirtualPortalBackout = "iscsolusportalbackout"; public static readonly string TemporaryItemDistributor = "isctemporaryitemsshop"; public static readonly string TrippleDroneShop = "isctripledroneshop"; } public static void TryApplyChangesNow() { SetHooks(); ClassicStageInfo.instance.ApplyChanges(); ClassicStageInfo.instance.RebuildCards((DirectorCardCategorySelection)null, (DirectorCardCategorySelection)null); } public static void PreventElites(string? monsterName, bool elitesAllowed) { string monsterName2 = monsterName; SetHooks(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { if (Object.op_Implicit((Object)(object)dccsPool)) { ForEachPoolEntryInDccsPool(dccsPool, delegate(PoolEntry poolEntry) { PreventElitesForPoolEntry(monsterName2, elitesAllowed, poolEntry); }); } foreach (DirectorCardHolder mixEnemyArtifactMonster in mixEnemyArtifactMonsters) { PreventElite(monsterName2, elitesAllowed, mixEnemyArtifactMonster.Card); } }; static void PreventElite(string? monsterName, bool elitesAllowed, DirectorCard card) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (card != null && !((Object)(object)card.spawnCard == (Object)null) && string.Equals(((Object)card.spawnCard).name, monsterName, StringComparison.InvariantCultureIgnoreCase)) { ((CharacterSpawnCard)card.spawnCard).noElites = elitesAllowed; } } static void PreventElitesForPoolEntry(string? monsterName, bool elitesAllowed, PoolEntry poolEntry) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) Category[] categories = poolEntry.dccs.categories; for (int i = 0; i < categories.Length; i++) { DirectorCard[] cards = categories[i].cards; foreach (DirectorCard card2 in cards) { PreventElite(monsterName, elitesAllowed, card2); } } } } [Obsolete("Use the overload with the DirectorCardHolder instead")] public static void AddNewMonster(DirectorCard? monsterCard, MonsterCategory monsterCategory) { SetHooks(); AddNewMonster(new DirectorCardHolder { Card = monsterCard, MonsterCategory = monsterCategory }, addToFamilies: false); } public static void AddNewMonster(DirectorCardHolder? monsterCard, bool addToFamilies) { SetHooks(); AddNewMonster(monsterCard, addToFamilies, null); } public static void AddNewMonster(DirectorCardHolder? monsterCard, bool addToFamilies, Predicate<DirectorCardCategorySelection> predicate) { DirectorCardHolder monsterCard2 = monsterCard; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { AddNewMonster(dccsPool, mixEnemyArtifactMonsters, monsterCard2, addToFamilies, predicate2); }; } public static void AddNewMonster(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, DirectorCardHolder monsterCardHolder, bool addToFamilies) { SetHooks(); AddNewMonster(dccsPool, mixEnemyArtifactMonsters, monsterCardHolder, addToFamilies, null); } public static void AddNewMonster(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, DirectorCardHolder monsterCardHolder, bool addToFamilies, Predicate<DirectorCardCategorySelection> predicate) { DccsPool dccsPool2 = dccsPool; DirectorCardHolder monsterCardHolder2 = monsterCardHolder; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); if (Object.op_Implicit((Object)(object)dccsPool2)) { ForEachPoolCategoryInDccsPool(dccsPool2, delegate(Category poolCategory) { bool num = IsNotAFamilyCategory(poolCategory, dccsPool2.poolCategories.Length); bool flag = !num; bool flag2 = addToFamilies && flag; if (num || flag2) { ForEachElementInPoolEntryArray(SelectPoolEntryArrayGearboxStyle(poolCategory), delegate(PoolEntry poolEntry) { AddMonsterToPoolEntry(monsterCardHolder2, poolEntry, predicate2); }); } }); } mixEnemyArtifactMonsters?.Add(monsterCardHolder2); } private static bool IsNotAFamilyCategory(Category poolCategory, int poolCategoryCount) { if (poolCategoryCount > 1 && !string.IsNullOrWhiteSpace(poolCategory.name)) { return poolCategory.name == MonsterPoolCategories.Standard; } return true; } private static PoolEntry[] SelectPoolEntryArrayGearboxStyle(Category poolCategory) { if (poolCategory.alwaysIncluded.Length != 0) { return poolCategory.alwaysIncluded; } if (poolCategory.includedIfNoConditionsMet.Length != 0) { return poolCategory.includedIfNoConditionsMet; } return (PoolEntry[])(object)poolCategory.includedIfConditionsMet; } private static void AddMonsterToPoolEntry(DirectorCardHolder monsterCardHolder, PoolEntry poolEntry, Predicate<DirectorCardCategorySelection> predicate) { if ((predicate != null && predicate(poolEntry.dccs)) || predicate == null) { poolEntry.dccs.AddCard(monsterCardHolder); } } [Obsolete("Use the overload with the DirectorCardHolder instead")] public static void AddNewMonsterToStage(DirectorCard? monsterCard, MonsterCategory monsterCategory, Stage stage, string? customStageName = "") { SetHooks(); AddNewMonsterToStage(new DirectorCardHolder { Card = monsterCard, MonsterCategory = monsterCategory }, addToFamilies: false, stage, customStageName); } public static void AddNewMonsterToStage(DirectorCardHolder monsterCard, bool addToFamilies, Stage stage, string? customStageName = "") { SetHooks(); AddNewMonsterToStage(monsterCard, addToFamilies, null, stage, customStageName); } public static void AddNewMonsterToStage(DirectorCardHolder monsterCard, bool addToFamilies, Predicate<DirectorCardCategorySelection> predicate, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; DirectorCardHolder monsterCard2 = monsterCard; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { AddNewMonster(dccsPool, mixEnemyArtifactMonsters, monsterCard2, addToFamilies, predicate2); } }; } public static void AddNewMonsterToStagesWhere(DirectorCardHolder monsterCard, bool addToFamilies, Predicate<StageInfo> matchStage) { SetHooks(); AddNewMonsterToStagesWhere(monsterCard, addToFamilies, matchStage, null); } public static void AddNewMonsterToStagesWhere(DirectorCardHolder monsterCard, bool addToFamilies, Predicate<StageInfo> matchStage, Predicate<DirectorCardCategorySelection> predicate) { Predicate<StageInfo> matchStage2 = matchStage; DirectorCardHolder monsterCard2 = monsterCard; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { if (matchStage2(currentStage)) { AddNewMonster(dccsPool, mixEnemyArtifactMonsters, monsterCard2, addToFamilies, predicate2); } }; } [Obsolete("Use the overload with the DirectorCardHolder instead")] public static void AddNewInteractable(DirectorCard? interactableCard, InteractableCategory interactableCategory) { SetHooks(); AddNewInteractable(new DirectorCardHolder { Card = interactableCard, InteractableCategory = interactableCategory }); } public static void AddNewInteractable(DirectorCardHolder? interactableCardHolder) { SetHooks(); AddNewInteractable(interactableCardHolder, null); } public static void AddNewInteractable(DirectorCardHolder? interactableCardHolder, Predicate<DirectorCardCategorySelection> predicate) { DirectorCardHolder interactableCardHolder2 = interactableCardHolder; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); InteractableActions += delegate(DccsPool interactablesDccsPool, StageInfo currentStage) { AddNewInteractableToStage(interactablesDccsPool, interactableCardHolder2, predicate2); }; } [Obsolete("Use the overload with the DirectorCardHolder instead")] public static void AddNewInteractableToStage(DirectorCard? interactableCard, InteractableCategory interactableCategory, Stage stage, string? customStageName = "") { SetHooks(); AddNewInteractableToStage(new DirectorCardHolder { Card = interactableCard, InteractableCategory = interactableCategory }, stage, customStageName); } public static void AddNewInteractableToStage(DirectorCardHolder interactableCardHolder, Stage stage, string customStageName = "") { SetHooks(); AddNewInteractableToStage(interactableCardHolder, null, stage, customStageName); } public static void AddNewInteractableToStage(DirectorCardHolder interactableCardHolder, Predicate<DirectorCardCategorySelection> predicate, Stage stage, string customStageName = "") { string customStageName2 = customStageName; DirectorCardHolder interactableCardHolder2 = interactableCardHolder; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); InteractableActions += delegate(DccsPool interactablesDccsPool, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { AddNewInteractableToStage(interactablesDccsPool, interactableCardHolder2, predicate2); } }; } private static void AddNewInteractableToStage(DccsPool interactablesDccsPool, DirectorCardHolder interactableCardHolder, Predicate<DirectorCardCategorySelection> predicate) { DirectorCardHolder interactableCardHolder2 = interactableCardHolder; Predicate<DirectorCardCategorySelection> predicate2 = predicate; if (!Object.op_Implicit((Object)(object)interactablesDccsPool)) { return; } ForEachPoolCategoryInDccsPool(interactablesDccsPool, delegate(Category poolCategory) { ForEachElementInPoolEntryArray(SelectPoolEntryArrayGearboxStyle(poolCategory), delegate(PoolEntry poolEntry) { AddInteractableToPoolEntry(interactableCardHolder2, poolEntry, predicate2); }); }); } private static void AddInteractableToPoolEntry(DirectorCardHolder interactableCardHolder, PoolEntry poolEntry, Predicate<DirectorCardCategorySelection> predicate) { if ((predicate != null && predicate(poolEntry.dccs)) || predicate == null) { poolEntry.dccs.AddCard(interactableCardHolder); } } public static void RemoveExistingMonster(string? monsterName) { SetHooks(); RemoveExistingMonster(monsterName, removeFromFamilies: true, null); } public static void RemoveExistingMonster(string? monsterName, bool removeFromFamilies, Predicate<DirectorCardCategorySelection> predicate) { Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); StringUtils.ThrowIfStringIsNullOrWhiteSpace(monsterName, "monsterName"); string monsterNameLowered = monsterName.ToLowerInvariant(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { RemoveExistingMonster(dccsPool, mixEnemyArtifactMonsters, monsterNameLowered, removeFromFamilies, predicate2); }; } private static void RemoveExistingMonster(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, string monsterNameLowered, bool removeFromFamilies, Predicate<DirectorCardCategorySelection> predicate) { DccsPool dccsPool2 = dccsPool; string monsterNameLowered2 = monsterNameLowered; Predicate<DirectorCardCategorySelection> predicate2 = predicate; if (Object.op_Implicit((Object)(object)dccsPool2)) { ForEachPoolCategoryInDccsPool(dccsPool2, delegate(Category poolCategory) { bool num = IsNotAFamilyCategory(poolCategory, dccsPool2.poolCategories.Length); bool flag = !num; bool flag2 = removeFromFamilies && flag; if (num || flag2) { ForEachPoolEntryInDccsPoolCategory(poolCategory, delegate(PoolEntry poolEntry) { RemoveMonsterFromPoolEntry(monsterNameLowered2, poolEntry, predicate2); }); } }); } mixEnemyArtifactMonsters.RemoveAll((DirectorCardHolder card) => card != null && card.Card != null && Object.op_Implicit((Object)(object)card.Card.spawnCard) && ((Object)card.Card.spawnCard).name.ToLowerInvariant() == monsterNameLowered2); } private static void RemoveMonsterFromPoolEntry(string monsterNameLowered, PoolEntry poolEntry, Predicate<DirectorCardCategorySelection> predicate) { string monsterNameLowered2 = monsterNameLowered; if ((predicate == null || !predicate(poolEntry.dccs)) && predicate != null) { return; } for (int i = 0; i < poolEntry.dccs.categories.Length; i++) { List<DirectorCard> list = poolEntry.dccs.categories[i].cards.ToList(); list.RemoveAll((DirectorCard card) => card != null && Object.op_Implicit((Object)(object)card.spawnCard) && ((Object)card.spawnCard).name?.ToLowerInvariant() == monsterNameLowered2); poolEntry.dccs.categories[i].cards = list.ToArray(); } } public static void RemoveExistingMonsterFromStage(string? monsterName, Stage stage, string? customStageName = "") { SetHooks(); RemoveExistingMonsterFromStage(monsterName, removeFromFamilies: false, null, stage, customStageName); } public static void RemoveExistingMonsterFromStage(string? monsterName, bool removeFromFamilies, Predicate<DirectorCardCategorySelection> predicate, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); StringUtils.ThrowIfStringIsNullOrWhiteSpace(monsterName, "monsterName"); string monsterNameLowered = monsterName.ToLowerInvariant(); MonsterActions += delegate(DccsPool dccsPool, List<DirectorCardHolder> mixEnemyArtifactMonsters, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { RemoveExistingMonster(dccsPool, mixEnemyArtifactMonsters, monsterNameLowered, removeFromFamilies, predicate2); } }; } public static void RemoveExistingInteractable(string? interactableName) { SetHooks(); RemoveExistingInteractable(interactableName, null); } public static void RemoveExistingInteractable(string? interactableName, Predicate<DirectorCardCategorySelection> predicate) { Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); StringUtils.ThrowIfStringIsNullOrWhiteSpace(interactableName, "interactableName"); string interactableNameLowered = interactableName.ToLowerInvariant(); InteractableActions += delegate(DccsPool interactablesDccsPool, StageInfo currentStage) { RemoveExistingInteractable(interactablesDccsPool, interactableNameLowered, predicate2); }; } public static void RemoveExistingInteractableFromStage(string? interactableName, Stage stage, string? customStageName = "") { SetHooks(); RemoveExistingInteractableFromStage(interactableName, null, stage, customStageName); } public static void RemoveExistingInteractableFromStage(string? interactableName, Predicate<DirectorCardCategorySelection> predicate, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; Predicate<DirectorCardCategorySelection> predicate2 = predicate; SetHooks(); StringUtils.ThrowIfStringIsNullOrWhiteSpace(interactableName, "interactableName"); string interactableNameLowered = interactableName.ToLowerInvariant(); InteractableActions += delegate(DccsPool interactablesDccsPool, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { RemoveExistingInteractable(interactablesDccsPool, interactableNameLowered, predicate2); } }; } private static void RemoveExistingInteractable(DccsPool interactablesDccsPool, string interactableNameLowered, Predicate<DirectorCardCategorySelection> predicate) { string interactableNameLowered2 = interactableNameLowered; Predicate<DirectorCardCategorySelection> predicate2 = predicate; if (Object.op_Implicit((Object)(object)interactablesDccsPool)) { ForEachPoolEntryInDccsPool(interactablesDccsPool, delegate(PoolEntry poolEntry) { RemoveInteractableFromPoolEntry(interactableNameLowered2, poolEntry, predicate2); }); } } private static void RemoveInteractableFromPoolEntry(string interactableNameLowered, PoolEntry poolEntry, Predicate<DirectorCardCategorySelection> predicate) { string interactableNameLowered2 = interactableNameLowered; if ((predicate == null || !predicate(poolEntry.dccs)) && predicate != null) { return; } for (int i = 0; i < poolEntry.dccs.categories.Length; i++) { List<DirectorCard> list = poolEntry.dccs.categories[i].cards.ToList(); list.RemoveAll((DirectorCard card) => card != null && Object.op_Implicit((Object)(object)card.spawnCard) && ((Object)card.spawnCard).name?.ToLowerInvariant() == interactableNameLowered2); poolEntry.dccs.categories[i].cards = list.ToArray(); } } public static void AddSceneMonsterCredits(int increase, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorMonsterCredits += increase; } }; } public static void AddSceneInteractableCredits(int increase, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorInteractableCredits += increase; } }; } public static void MultiplySceneMonsterCredits(int multiplier, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorMonsterCredits *= multiplier; } }; } public static void MultiplySceneInteractableCredits(int multiplier, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorInteractableCredits *= multiplier; } }; } public static void ReduceSceneMonsterCredits(int divisor, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorMonsterCredits /= divisor; } }; } public static void ReduceSceneInteractableCredits(int divisor, Stage stage, string? customStageName = "") { string customStageName2 = customStageName; SetHooks(); StageSettingsActions += delegate(StageSettings settings, StageInfo currentStage) { if (currentStage.stage == stage && currentStage.CheckStage(stage, customStageName2)) { settings.SceneDirectorInteractableCredits /= divisor; } }; } public static void ForEachPoolEntryInDccsPool(DccsPool dccsPool, Action<PoolEntry> action) { Action<PoolEntry> action2 = action; SetHooks(); ForEachPoolCategoryInDccsPool(dccsPool, delegate(Category poolCategory) { ForEachPoolEntryInDccsPoolCategory(poolCategory, action2); }); } public static void ForEachPoolCategoryInDccsPool(DccsPool dccsPool, Action<Category> action) { SetHooks(); Category[] poolCategories = dccsPool.poolCategories; foreach (Category obj in poolCategories) { try { action(obj); } catch (Exception ex) { DirectorPlugin.Logger.LogError((object)ex); } } } public static void ForEachPoolEntryInDccsPoolCategory(Category dccsPoolCategory, Action<PoolEntry> action) { SetHooks(); ForEachElementInPoolEntryArray(dccsPoolCategory.alwaysIncluded, action); ForEachElementInPoolEntryArray(dccsPoolCategory.includedIfNoConditionsMet, action); PoolEntry[] includedIfConditionsMet = (PoolEntry[])(object)dccsPoolCategory.includedIfConditionsMet; ForEachElementInPoolEntryArray(includedIfConditionsMet, action); } private static void ForEachElementInPoolEntryArray(PoolEntry[] poolEntries, Action<PoolEntry> action) { foreach (PoolEntry obj in poolEntries) { try { action(obj); } catch (Exception ex) { DirectorPlugin.Logger.LogError((object)ex); } } } public static bool IsSameMonsterCategory(ref Category category, MonsterCategory monsterCategory) { SetHooks(); return GetMonsterCategory(category.name) == monsterCategory; } public static MonsterCategory GetMonsterCategory(string categoryString) { SetHooks(); if (string.IsNullOrWhiteSpace(categoryString)) { throw new ArgumentException("categoryString"); } return categoryString switch { "Champions" => MonsterCategory.Champions, "Minibosses" => MonsterCategory.Minibosses, "Basic Monsters" => MonsterCategory.BasicMonsters, "Special" => MonsterCategory.Special, _ => MonsterCategory.Custom, }; } public static string GetVanillaMonsterCategoryName(MonsterCategory monsterCategory) { SetHooks(); switch (monsterCategory) { case MonsterCategory.BasicMonsters: return "Basic Monsters"; case MonsterCategory.Champions: return "Champions"; case MonsterCategory.Minibosses: return "Minibosses"; case MonsterCategory.Special: return "Special"; default: { int num = (int)monsterCategory; throw new ArgumentException(num.ToString()); } } } public static InteractableCategory GetInteractableCategory(string categoryString) { SetHooks(); if (string.IsNullOrWhiteSpace(categoryString)) { throw new ArgumentException("categoryString"); } if (categoryString.Contains("Storm Stuff")) { return InteractableCategory.StormStuff; } return categoryString switch { "Chests" => InteractableCategory.Chests, "Barrels" => InteractableCategory.Barrels, "Shrines" => InteractableCategory.Shrines, "Drones" => InteractableCategory.Drones, "Misc" => InteractableCategory.Misc, "Rare" => InteractableCategory.Rare, "Duplicator" => InteractableCategory.Duplicator, "Void Stuff" => InteractableCategory.VoidStuff, _ => InteractableCategory.Custom, }; } public static string GetVanillaInteractableCategoryName(InteractableCategory interactableCategory) { SetHooks(); switch (interactableCategory) { case InteractableCategory.Chests: return "Chests"; case InteractableCategory.Barrels: return "Barrels"; case InteractableCategory.Shrines: return "Shrines"; case InteractableCategory.Drones: return "Drones"; case InteractableCategory.Misc: return "Misc"; case InteractableCategory.Rare: return "Rare"; case InteractableCategory.Duplicator: return "Duplicator"; case InteractableCategory.VoidStuff: return "Void Stuff"; case InteractableCategory.StormStuff: return "Storm Stuff"; default: { int num = (int)interactableCategory; throw new ArgumentException(num.ToString()); } } } public static bool IsSameInteractableCategory(ref Category category, InteractableCategory interactableCategory) { SetHooks(); return GetInteractableCategory(category.name) == interactableCategory; } } public class OriginalClassicStageInfo { public List<Category> monsterDccsPoolCategories; public DirectorCardCategorySelection monsterCategories; public List<MonsterFamily> possibleMonsterFamilies; public List<Category> interactableDccsPoolCategories; public DirectorCardCategorySelection interactableCategories; } [CompilerGenerated] private static class <>O { public static hook_Start <0>__ApplyChangesOnStart; public static Manipulator <1>__SwapVanillaDccsWithOurs; public static hook_Init <2>__InitStageEnumToSceneDefs; public static Func<DirectorCardCategorySelection, DirectorCardCategorySelection> <3>__SwapDccs; } [CompilerGenerated] private sealed class <InitStageEnumToSceneDefs>d__39 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public orig_Init orig; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InitStageEnumToSceneDefs>d__39(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = orig.Invoke(); <>1__state = 1; return true; case 1: <>1__state = -1; foreach (IGrouping<Stage, SceneDef> item in from sceneDef in (IEnumerable<SceneDef>)(object)SceneCatalog.allStageSceneDefs group sceneDef by GetStageEnumFromSceneDef(sceneDef)) { VanillaStageToSceneDefs[item.Key] = item.ToArray(); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string PluginGUID = "com.bepis.r2api.director"; public const string PluginName = "R2API.Director"; private static DirectorCardCategorySelection _dccsMixEnemyArtifact; private static bool _hooksEnabled = false; private static readonly Dictionary<string, OriginalClassicStageInfo> _classicStageInfoNameToOriginalClassicStageInfos = new Dictionary<string, OriginalClassicStageInfo>(); public const string PluginVersion = "2.3.8"; [Obsolete("All submodules are automatically loaded and this property is now unused")] public static bool Loaded => true; public static Dictionary<Stage, SceneDef[]> VanillaStageToSceneDefs { get; private set; } = new Dictionary<Stage, SceneDef[]>(); public static event Action<StageSettings, StageInfo>? StageSettingsActions; public static event Action<DccsPool, List<DirectorCardHolder>, StageInfo>? MonsterActions; public static event Action<DirectorCardCategorySelection>? MixEnemiesDccsActions; public static event Action<DccsPool, StageInfo>? InteractableActions; public static Stage ParseInternalStageName(string internalStageName) { return internalStageName switch { "golemplains" => Stage.TitanicPlains, "blackbeach" => Stage.DistantRoost, "foggyswamp" => Stage.WetlandAspect, "goolake" => Stage.AbandonedAqueduct, "frozenwall" => Stage.RallypointDelta, "wispgraveyard" => Stage.ScorchedAcres, "dampcavesimple" => Stage.AbyssalDepths, "shipgraveyard" => Stage.SirensCall, "goldshores" => Stage.GildedCoast, "mysteryspace" => Stage.MomentFractured, "bazaar" => Stage.Bazaar, "arena" => Stage.VoidCell, "limbo" => Stage.MomentWhole, "skymeadow" => Stage.SkyMeadow, "artifactworld" => Stage.ArtifactReliquary, "moon2" => Stage.Commencement, "rootjungle" => Stage.SunderedGrove, "ancientloft" => Stage.AphelianSanctuary, "itancientloft" => Stage.AphelianSanctuarySimulacrum, "itdampcave" => Stage.AbyssalDepthsSimulacrum, "itfrozenwall" => Stage.RallypointDeltaSimulacrum, "itgolemplains" => Stage.TitanicPlainsSimulacrum, "itgoolake" => Stage.AbandonedAqueductSimulacrum, "itmoon" => Stage.CommencementSimulacrum, "itskymeadow" => Stage.SkyMeadowSimulacrum, "snowyforest" => Stage.SiphonedForest, "sulfurpools" => Stage.SulfurPools, "voidraid" => Stage.ThePlanetarium, "voidstage" => Stage.VoidLocus, "lakes" => Stage.VerdantFalls, "lakesnight" => Stage.ViscousFalls, "artifactworld01" => Stage.ArtifactReliquary_AphelianSanctuary_Theme, "artifactworld02" => Stage.ArtifactReliquary_AbandonedAqueduct_Theme, "artifactworld03" => Stage.ArtifactReliquary_ScorchedAcres_Theme, "village" => Stage.ShatteredAbodes, "villagenight" => Stage.DisturbedImpact, "lemuriantemple" => Stage.ReformedAltar, "habitat" => Stage.TreebornColony, "habitatfall" => Stage.GoldenDieback, "helminthroost" => Stage.HelminthHatchery, "meridian" => Stage.PrimeMeridian, "computationalexchange" => Stage.ComputationalExchange, "conduitcanyon" => Stage.ConduitCanyon, "ironalluvium" => Stage.IronAlluvium, "ironalluvium2" => Stage.IronAuroras, "nest" => Stage.PretendersPrecipice, "repurposedcrater" => Stage.RepurposedCrater, "solusweb" => Stage.NeuralSanctum, "solutionalhaunt" => Stage.SolutionalHaunt, _ => Stage.Custom, }; } public static Stage GetStageEnumFromSceneDef(SceneDef sceneDef) { return ParseInternalStageName(sceneDef.baseSceneName); } public static string ToInternalStageName(Stage stage) { return stage switch { Stage.TitanicPlains => "golemplains", Stage.DistantRoost => "blackbeach", Stage.WetlandAspect => "foggyswamp", Stage.AbandonedAqueduct => "goolake", Stage.RallypointDelta => "frozenwall", Stage.ScorchedAcres => "wispgraveyard", Stage.AbyssalDepths => "dampcavesimple", Stage.SirensCall => "shipgraveyard", Stage.GildedCoast => "goldshores", Stage.MomentFractured => "mysteryspace", Stage.Bazaar => "bazaar", Stage.VoidCell => "arena", Stage.MomentWhole => "limbo", Stage.SkyMeadow => "skymeadow", Stage.ArtifactReliquary => "artifactworld", Stage.Commencement => "moon2", Stage.SunderedGrove => "rootjungle", Stage.AphelianSanctuary => "ancientloft", Stage.AphelianSanctuarySimulacrum => "itancientloft", Stage.AbyssalDepthsSimulacrum => "itdampcave", Stage.RallypointDeltaSimulacrum => "itfrozenwall", Stage.TitanicPlainsSimulacrum => "itgolemplains", Stage.AbandonedAqueductSimulacrum => "itgoolake", Stage.CommencementSimulacrum => "itmoon", Stage.SkyMeadowSimulacrum => "itskymeadow", Stage.SiphonedForest => "snowyforest", Stage.SulfurPools => "sulfurpools", Stage.VoidLocus => "voidstage", Stage.ThePlanetarium => "voidraid", Stage.VerdantFalls => "lakes", Stage.ViscousFalls => "lakesnight", Stage.ArtifactReliquary_AphelianSanctuary_Theme => "artifactworld01", Stage.ArtifactReliquary_AbandonedAqueduct_Theme => "artifactworld02", Stage.ArtifactReliquary_ScorchedAcres_Theme => "artifactworld03", Stage.ShatteredAbodes => "village", Stage.DisturbedImpact => "villagenight", Stage.ReformedAltar => "lemuriantemple", Stage.TreebornColony => "habitat", Stage.GoldenDieback => "habitatfall", Stage.HelminthHatchery => "helminthroost", Stage.PrimeMeridian => "meridian", Stage.ComputationalExchange => "computationalexchange", Stage.ConduitCanyon => "conduitcanyon", Stage.IronAlluvium => "ironalluvium", Stage.IronAuroras => "ironalluvium2", Stage.PretendersPrecipice => "nest", Stage.RepurposedCrater => "repurposedcrater", Stage.NeuralSanctum => "solusweb", Stage.SolutionalHaunt => "solutionalhaunt", _ => "", }; } public static int AddCard(this DirectorCardCategorySelection dccs, DirectorCardHolder cardHolder) { SetHooks(); string categoryName = cardHolder.GetCategoryName(); for (int i = 0; i < dccs.categories.Length; i++) { if (dccs.categories[i].name.Contains(categoryName, StringComparison.InvariantCultureIgnoreCase)) { ArrayUtils.ArrayAppend<DirectorCard>(ref dccs.categories[i].cards, ref cardHolder.Card); return dccs.categories[i].cards.Length - 1; } } float num = (cardHolder.IsMonster ? cardHolder.MonsterCategorySelectionWeight : cardHolder.InteractableCategorySelectionWeight); int num2 = dccs.AddCategory(categoryName, num); return dccs.AddCard(num2, cardHolder.Card); } internal static void SetHooks() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0049: 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_0054: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown if (!_hooksEnabled) { AsyncOperationHandle<DirectorCardCategorySelection> val = LegacyResourcesAPI.LoadAsync<DirectorCardCategorySelection>("DirectorCardCategorySelections/dccsMixEnemy"); val.Completed += delegate(AsyncOperationHandle<DirectorCardCategorySelection> x) { RoR2Content.mixEnemyMonsterCards = x.Result; }; object obj = <>O.<0>__ApplyChangesOnStart; if (obj == null) { hook_Start val2 = ApplyChangesOnStart; <>O.<0>__ApplyChangesOnStart = val2; obj = (object)val2; } ClassicStageInfo.Start += (hook_Start)obj; object obj2 = <>O.<1>__SwapVanillaDccsWithOurs; if (obj2 == null) { Manipulator val3 = SwapVanillaDccsWithOurs; <>O.<1>__SwapVanillaDccsWithOurs = val3; obj2 = (object)val3; } ClassicStageInfo.HandleMixEnemyArtifact += (Manipulator)obj2; object obj3 = <>O.<2>__InitStageEnumToSceneDefs; if (obj3 == null) { hook_Init val4 = InitStageEnumToSceneDefs; <>O.<2>__InitStageEnumToSceneDefs = val4; obj3 = (object)val4; } SceneCatalog.Init += (hook_Init)obj3; _hooksEnabled = true; } } internal static void UnsetHooks() { //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_001b: Expected O, but got Unknown //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_003b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown object obj = <>O.<0>__ApplyChangesOnStart; if (obj == null) { hook_Start val = ApplyChangesOnStart; <>O.<0>__ApplyChangesOnStart = val; obj = (object)val; } ClassicStageInfo.Start -= (hook_Start)obj; object obj2 = <>O.<1>__SwapVanillaDccsWithOurs; if (obj2 == null) { Manipulator val2 = SwapVanillaDccsWithOurs; <>O.<1>__SwapVanillaDccsWithOurs = val2; obj2 = (object)val2; } ClassicStageInfo.HandleMixEnemyArtifact -= (Manipulator)obj2; object obj3 = <>O.<2>__InitStageEnumToSceneDefs; if (obj3 == null) { hook_Init val3 = InitStageEnumToSceneDefs; <>O.<2>__InitStageEnumToSceneDefs = val3; obj3 = (object)val3; } SceneCatalog.Init -= (hook_Init)obj3; _hooksEnabled = false; } private static void ApplyChangesOnStart(orig_Start orig, ClassicStageInfo classicStageInfo) { classicStageInfo.PortToNewSystem(); classicStageInfo.ApplyChanges(); orig.Invoke(classicStageInfo); } private static void SwapVanillaDccsWithOurs(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt<DirectorCardCategorySelection>(i, "CopyFrom") })) { val.EmitDelegate<Func<DirectorCardCategorySelection, DirectorCardCategorySelection>>((Func<DirectorCardCategorySelection, DirectorCardCategorySelection>)SwapDccs); } static DirectorCardCategorySelection SwapDccs(DirectorCardCategorySelection vanillaDccs) { return _dccsMixEnemyArtifact; } } [IteratorStateMachine(typeof(<InitStageEnumToSceneDefs>d__39))] private static IEnumerator InitStageEnumToSceneDefs(orig_Init orig) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InitStageEnumToSceneDefs>d__39(0) { orig = orig }; } private static void PortToNewSystem(this ClassicStageInfo classicStageInfo) { PortToNewMonsterSystem(classicStageInfo); PortToNewInteractableSystem(classicStageInfo); } internal static void ApplyChanges(this ClassicStageInfo classicStageInfo) { StageInfo stageInfo = GetStageInfo(classicStageInfo); BackupOrRestoreClassicStageInfoToOriginalState(classicStageInfo, stageInfo); ApplyMonsterChanges(classicStageInfo, stageInfo); ApplyInteractableChanges(classicStageInfo, stageInfo); ApplySettingsChanges(classicStageInfo, stageInfo); } private static StageInfo GetStageInfo(ClassicStageInfo classicStageInfo) { StageInfo stageInfo = default(StageInfo); stageInfo.stage = Stage.Custom; stageInfo.CustomStageName = ""; StageInfo result = stageInfo; SceneInfo component = ((Component)classicStageInfo).GetComponent<SceneInfo>(); if (!Object.op_Implicit((Object)(object)component)) { return result; } SceneDef sceneDef = component.sceneDef; if (!Object.op_Implicit((Object)(object)sceneDef)) { return result; } result.stage = GetStageEnumFromSceneDef(sceneDef); if (result.stage == Stage.Custom) { result.CustomStageName = sceneDef.baseSceneName; } return result; } private static void ApplySettingsChanges(ClassicStageInfo classicStageInfo, StageInfo stageInfo) { StageSettings stageSettings = GetStageSettings(classicStageInfo); if (DirectorAPI.StageSettingsActions != null) { Delegate[] invocationList = DirectorAPI.StageSettingsActions.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { Action<StageSettings, StageInfo> action = (Action<StageSettings, StageInfo>)invocationList[i]; try { action(stageSettings, stageInfo); } catch (Exception ex) { DirectorPlugin.Logger.LogError((object)ex); } } } SetStageSettings(classicStageInfo, stageSettings); } private static void PortToNewMonsterSystem(ClassicStageInfo classicStageInfo) { if (!Object.op_Implicit((Object)(object)classicStageInfo.monsterDccsPool) && Object.op_Implicit((Object)(object)classicStageInfo.monsterCategories)) { DirectorPlugin.Logger.LogInfo((object)"Current scene is using old monster dccs system, porting to new one"); DccsPool val = ScriptableObject.CreateInstance<DccsPool>(); ((Object)val).name = "R2API_dp" + ((Object)classicStageInfo).name + "Monsters"; List<Category> list = new List<Category>(); PortOldStandardMonsterCategoriesToNewDccsPoolSystem(classicStageInfo.monsterCategories, list); if (classicStageInfo.possibleMonsterFamilies != null) { PortOldMonsterFamiliesToNewDccsPoolSystem(classicStageInfo.possibleMonsterFamilies, list); } val.poolCategories = list.ToArray(); classicStageInfo.monsterDccsPool = val; } } private static void PortOldStandardMonsterCategoriesToNewDccsPoolSystem(DirectorCardCategorySelection monsterCategories, List<Category> dccsPoolCategories) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_003b: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown Category val = new Category(); val.name = Helpers.MonsterPoolCategories.Standard; val.categoryWeight = Helpers.MonsterPoolCategories.StandardWeight; val.alwaysIncluded = Array.Empty<PoolEntry>(); val.includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(); val.includedIfNoConditionsMet = (PoolEntry[])(object)new PoolEntry[1] { new PoolEntry { dccs = monsterCategories, weight = 1f } }; dccsPoolCategories.Add(val); } private static void PortOldMonsterFamiliesToNewDccsPoolSystem(MonsterFamily[] possibleMonsterFamilies, List<Category> dccsPoolCategories) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown Category val = new Category(); val.name = Helpers.MonsterPoolCategories.Family; val.categoryWeight = ClassicStageInfo.monsterFamilyChance; val.alwaysIncluded = Array.Empty<PoolEntry>(); List<ConditionalPoolEntry> list = new List<ConditionalPoolEntry>(); foreach (MonsterFamily val2 in possibleMonsterFamilies) { DirectorCardCategorySelection monsterFamilyCategories = val2.monsterFamilyCategories; FamilyDirectorCardCategorySelection val3 = (FamilyDirectorCardCategorySelection)(object)((monsterFamilyCategories is FamilyDirectorCardCategorySelection) ? monsterFamilyCategories : null); if (val3 != null) { list.Add(new ConditionalPoolEntry { dccs = (DirectorCardCategorySelection)(object)val3, weight = val2.selectionWeight, requiredExpansions = Array.Empty<ExpansionDef>() }); } else { DirectorPlugin.Logger.LogError((object)("classicStageInfo.possibleMonsterFamilies " + ((Object)val2.monsterFamilyCategories).name + " not setup correctly")); } } val.includedIfConditionsMet = list.ToArray(); val.includedIfNoConditionsMet = Array.Empty<PoolEntry>(); dccsPoolCategories.Add(val); } private static void PortToNewInteractableSystem(ClassicStageInfo classicStageInfo) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)classicStageInfo.interactableDccsPool) && Object.op_Implicit((Object)(object)classicStageInfo.interactableCategories)) { DirectorPlugin.Logger.LogInfo((object)"Current scene is using old interactable dccs system, porting to new one"); DccsPool val = ScriptableObject.CreateInstance<DccsPool>(); ((Object)val).name = "R2API_dp" + ((Object)classicStageInfo).name + "Interactables"; List<Category> list = new List<Category>(); Category val2 = new Category(); val2.name = Helpers.InteractablePoolCategories.Standard; val2.categoryWeight = Helpers.InteractablePoolCategories.StandardWeight; val2.alwaysIncluded = Array.Empty<PoolEntry>(); val2.includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(); val2.includedIfNoConditionsMet = (PoolEntry[])(object)new PoolEntry[1] { new PoolEntry { dccs = classicStageInfo.interactableCategories, weight = 1f } }; list.Add(val2); val.poolCategories = list.ToArray(); classicStageInfo.interactableDccsPool = val; } } private static void ApplyMonsterChanges(ClassicStageInfo classicStageInfo, StageInfo stageInfo) { InitCustomMixEnemyArtifactDccs(); List<DirectorCardHolder> directorCardHoldersFromDCCS = GetDirectorCardHoldersFromDCCS(_dccsMixEnemyArtifact); Delegate[] invocationList; if (DirectorAPI.MonsterActions != null) { invocationList = DirectorAPI.MonsterActions.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { Action<DccsPool, List<DirectorCardHolder>, StageInfo> action = (Action<DccsPool, List<DirectorCardHolder>, StageInfo>)invocationList[i]; try { action(classicStageInfo.monsterDccsPool, directorCardHoldersFromDCCS, stageInfo); } catch (Exception ex) { DirectorPlugin.Logger.LogError((object)ex); } } } ApplyNewCardHoldersToDCCS(_dccsMixEnemyArtifact, directorCardHoldersFromDCCS); if (DirectorAPI.MixEnemiesDccsActions == null) { return; } invocationList = DirectorAPI.MixEnemiesDccsActions.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { Action<DirectorCardCategorySelection> action2 = (Action<DirectorCardCategorySelection>)invocationList[i]; try { action2(_dccsMixEnemyArtifact); } catch (Exception ex2) { DirectorPlugin.Logger.LogError((object)ex2); } } } private static void BackupOrRestoreClassicStageInfoToOriginalState(ClassicStageInfo classicStageInfo, StageInfo stageInfo) { string key = ((stageInfo.stage == Stage.Custom) ? stageInfo.CustomStageName : stageInfo.stage.ToString()); if (!_classicStageInfoNameToOriginalClassicStageInfos.TryGetValue(key, out OriginalClassicStageInfo value)) { BackupClassicStageInfoToOriginalState(classicStageInfo, key); } else { RestoreClassicStageInfoToOriginalState(classicStageInfo, value); } } private static void BackupClassicStageInfoToOriginalState(ClassicStageInfo classicStageInfo, string key) { OriginalClassicStageInfo originalClassicStageInfo = new OriginalClassicStageInfo(); if (Object.op_Implicit((Object)(object)classicStageInfo.monsterDccsPool)) { originalClassicStageInfo.monsterDccsPoolCategories = CopyDccsPoolCategories(classicStageInfo.monsterDccsPool.poolCategories); } if (Object.op_Implicit((Object)(object)classicStageInfo.monsterCategories)) { originalClassicStageInfo.monsterCategories = Object.Instantiate<DirectorCardCategorySelection>(classicStageInfo.monsterCategories); ((Object)originalClassicStageInfo.monsterCategories).name = ((Object)classicStageInfo.monsterCategories).name; } if (classicStageInfo.possibleMonsterFamilies != null) { originalClassicStageInfo.possibleMonsterFamilies = classicStageInfo.possibleMonsterFamilies.ToList(); } if (Object.op_Implicit((Object)(object)classicStageInfo.interactableDccsPool)) { originalClassicStageInfo.interactableDccsPoolCategories = CopyDccsPoolCategories(classicStageInfo.interactableDccsPool.poolCategories); } if (Object.op_Implicit((Object)(object)classicStageInfo.interactableCategories)) { originalClassicStageInfo.interactableCategories = Object.Instantiate<DirectorCardCategorySelection>(classicStageInfo.interactableCategories); ((Object)originalClassicStageInfo.interactableCategories).name = ((Object)classicStageInfo.interactableCategories).name; } _classicStageInfoNameToOriginalClassicStageInfos[key] = originalClassicStageInfo; } private static void RestoreClassicStageInfoToOriginalState(ClassicStageInfo classicStageInfo, OriginalClassicStageInfo originalClassicStageInfo) { if (originalClassicStageInfo.monsterDccsPoolCategories != null) { classicStageInfo.monsterDccsPool.poolCategories = CopyDccsPoolCategories(originalClassicStageInfo.monsterDccsPoolCategories).ToArray(); } if (Object.op_Implicit((Object)(object)originalClassicStageInfo.monsterCategories)) { classicStageInfo.monsterCategories = Object.Instantiate<DirectorCardCategorySelection>(originalClassicStageInfo.monsterCategories); ((Object)classicStageInfo.monsterCategories).name = ((Object)originalClassicStageInfo.monsterCategories).name; } if (originalClassicStageInfo.possibleMonsterFamilies != null) { classicStageInfo.possibleMonsterFamilies = originalClassicStageInfo.possibleMonsterFamilies.ToArray(); } if (originalClassicStageInfo.interactableDccsPoolCategories != null) { classicStageInfo.interactableDccsPool.poolCategories = CopyDccsPoolCategories(originalClassicStageInfo.interactableDccsPoolCategories).ToArray(); } if (Object.op_Implicit((Object)(object)originalClassicStageInfo.interactableCategories)) { classicStageInfo.interactableCategories = Object.Instantiate<DirectorCardCategorySelection>(originalClassicStageInfo.interactableCategories); ((Object)classicStageInfo.interactableCategories).name = ((Object)originalClassicStageInfo.interactableCategories).name; } } private static List<Category> CopyDccsPoolCategories(IEnumerable<Category> dccsPoolCategories) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown List<Category> list = new List<Category>(); foreach (Category dccsPoolCategory in dccsPoolCategories) { Category val = new Category(); val.name = dccsPoolCategory.name; val.categoryWeight = dccsPoolCategory.categoryWeight; val.alwaysIncluded = CopyPoolEntries(dccsPoolCategory.alwaysIncluded).ToArray(); val.includedIfConditionsMet = CopyConditionalPoolEntries(dccsPoolCategory.includedIfConditionsMet).ToArray(); val.includedIfNoConditionsMet = CopyPoolEntries(dccsPoolCategory.includedIfNoConditionsMet).ToArray(); list.Add(val); } return list; } private static List<ConditionalPoolEntry> CopyConditionalPoolEntries(IEnumerable<ConditionalPoolEntry> poolEntries) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown List<ConditionalPoolEntry> list = new List<ConditionalPoolEntry>(); foreach (ConditionalPoolEntry poolEntry in poolEntries) { ConditionalPoolEntry val = new ConditionalPoolEntry(); val.requiredExpansions = ArrayUtils.Clone<ExpansionDef>(poolEntry.requiredExpansions); ((PoolEntry)val).weight = ((PoolEntry)poolEntry).weight; ((PoolEntry)val).dccs = Object.Instantiate<DirectorCardCategorySelection>(((PoolEntry)poolEntry).dccs); ((Object)((PoolEntry)val).dccs).name = ((Object)((PoolEntry)poolEntry).dccs).name; list.Add(val); } return list; } private static List<PoolEntry> CopyPoolEntries(IEnumerable<PoolEntry> poolEntries) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown List<PoolEntry> list = new List<PoolEntry>(); foreach (PoolEntry poolEntry in poolEntries) { PoolEntry val = new PoolEntry(); val.weight = poolEntry.weight; val.dccs = Object.Instantiate<DirectorCardCategorySelection>(poolEntry.dccs); ((Object)val.dccs).name = ((Object)poolEntry.dccs).name; list.Add(val); } return list; } private static List<DirectorCardHolder> GetDirectorCardHoldersFromDCCS(DirectorCardCategorySelection dccs) { //IL_0021: 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) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) List<DirectorCardHolder> list = new List<DirectorCardHolder>(); if (Object.op_Implicit((Object)(object)dccs)) { Category[] categories = dccs.categories; foreach (Category val in categories) { if (val.cards.Length == 0) { continue; } bool flag = false; flag = IsInteractableDccsCategory(val); DirectorCard[] cards = val.cards; foreach (DirectorCard card in cards) { DirectorCardHolder directorCardHolder = new DirectorCardHolder(); directorCardHolder.Card = card; if (flag) { if ((directorCardHolder.InteractableCategory = Helpers.GetInteractableCategory(val.name)) == InteractableCategory.Custom) { directorCardHolder.CustomInteractableCategory = val.name; } } else if ((directorCardHolder.MonsterCategory = Helpers.GetMonsterCategory(val.name)) == MonsterCategory.Custom) { directorCardHolder.CustomMonsterCategory = val.name; } list.Add(directorCardHolder); } } } return list; } private static bool IsInteractableDccsCategory(Category dccsCategory) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) bool result = false; DirectorCard[] cards = dccsCategory.cards; foreach (DirectorCard val in cards) { if (Object.op_Implicit((Object)(object)val.spawnCard) && Reflection.IsSameOrSubclassOf<InteractableSpawnCard>(((object)val.spawnCard).GetType())) { result = true; break; } } return result; } private static void ApplyNewCardHoldersToDCCS(DirectorCardCategorySelection dccs, List<DirectorCardHolder> directorCardHolders) { dccs.Clear(); foreach (DirectorCardHolder directorCardHolder in directorCardHolders) { dccs.AddCard(directorCardHolder); } } private static void ApplyInteractableChanges(ClassicStageInfo classicStageInfo, StageInfo stageInfo) { if (DirectorAPI.InteractableActions == null) { return; } Delegate[] invocationList = DirectorAPI.InteractableActions.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { Action<DccsPool, StageInfo> action = (Action<DccsPool, StageInfo>)invocationList[i]; try { action(classicStageInfo.interactableDccsPool, stageInfo); } catch (Exception ex) { DirectorPlugin.Logger.LogError((object)ex); } } } private static StageSettings GetStageSettings(ClassicStageInfo classicStageInfo) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) StageSettings stageSettings = new StageSettings { SceneDirectorInteractableCredits = classicStageInfo.sceneDirectorInteractibleCredits, SceneDirectorMonsterCredits = classicStageInfo.sceneDirectorMonsterCredits, BonusCreditObjects = new Dictionary<GameObject, int>() }; BonusInteractibleCreditObject[] bonusInteractibleCreditObjects = classicStageInfo.bonusInteractibleCreditObjects; foreach (BonusInteractibleCreditObject val in bonusInteractibleCreditObjects) { if (Object.op_Implicit((Object)(object)val.objectThatGrantsPointsIfEnabled)) { stageSettings.BonusCreditObjects[val.objectThatGrantsPointsIfEnabled] = val.points; } } GetMonsterCategoryWeightsPerDccs(classicStageInfo, stageSettings); GetInteractableCategoryWeightsPerDccs(classicStageInfo, stageSettings); return stageSettings; } private static void InitCustomMixEnemyArtifactDccs() { _dccsMixEnemyArtifact = Object.Instantiate<DirectorCardCategorySelection>(RoR2Content.mixEnemyMonsterCards); ((Object)_dccsMixEnemyArtifact).name = "dccsR2APIMixEnemyArtifact"; } private static void GetMonsterCategoryWeightsPerDccs(ClassicStageInfo classicStageInfo, StageSettings stageSettings) { stageSettings.MonsterCategoryWeightsPerDccs = new Dictionary<DirectorCardCategorySelection, Dictionary<string, float>>(); GetMonsterCategoryWeights(stageSettings, _dccsMixEnemyArtifact); if (Object.op_Implicit((Object)(object)classicStageInfo.monsterDccsPool)) { Category[] poolCategories = classicStageInfo.monsterDccsPool.poolCategories; foreach (Category val in poolCategories) { GetMonsterCategoryWeights(stageSettings, val.alwaysIncluded); PoolEntry[] includedIfConditionsMet = (PoolEntry[])(object)val.includedIfConditionsMet; GetMonsterCategoryWeights(stageSettings, includedIfConditionsMet); GetMonsterCategoryWeights(stageSettings, val.includedIfNoConditionsMet); } } } private static void GetMonsterCategoryWeights(StageSettings stageSettings, DirectorCardCategorySelection dccs) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) stageSettings.MonsterCategoryWeightsPerDccs[dccs] = new Dictionary<string, float>(); Category[] categories = dccs.categories; foreach (Category val in categories) { stageSettings.MonsterCategoryWeightsPerDccs[dccs][val.name] = val.selectionWeight; } } private static void GetMonsterCategoryWeights(StageSettings stageSettings, PoolEntry[] poolCategories) { foreach (PoolEntry val in poolCategories) { GetMonsterCategoryWeights(stageSettings, val.dccs); } } private static void GetInteractableCategoryWeightsPerDccs(ClassicStageInfo classicStageInfo, StageSettings stageSettings) { stageSettings.InteractableCategoryWeightsPerDccs = new Dictionary<DirectorCardCategorySelection, Dictionary<string, float>>(); if (Object.op_Implicit((Object)(object)classicStageInfo.interactableDccsPool)) { Category[] poolCategories = classicStageInfo.interactableDccsPool.poolCategories; foreach (Category val in poolCategories) { GetInteractableCategoryWeights(stageSettings, val.alwaysIncluded); PoolEntry[] includedIfConditionsMet = (PoolEntry[])(object)val.includedIfConditionsMet; GetInteractableCategoryWeights(stageSettings, includedIfConditionsMet); GetInteractableCategoryWeights(stageSettings, val.includedIfNoConditionsMet); } } } private static void GetInteractableCategoryWeights(StageSettings stageSettings, PoolEntry[] poolCategories) { foreach (PoolEntry val in poolCategories) { GetInteractableCategoryWeights(stageSettings, val.dccs); } } private static void GetInteractableCategoryWeights(StageSettings stageSettings, DirectorCardCategorySelection dccs) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) stageSettings.InteractableCategoryWeightsPerDccs[dccs] = new Dictionary<string, float>(); Category[] categories = dccs.categories; foreach (Category val in categories) { stageSettings.InteractableCategoryWeightsPerDccs[dccs][val.name] = val.selectionWeight; } } private static void SetStageSettings(ClassicStageInfo classicStageInfo, StageSettings stageSettings) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) classicStageInfo.sceneDirectorInteractibleCredits = stageSettings.SceneDirectorInteractableCredits; classicStageInfo.sceneDirectorMonsterCredits = stageSettings.SceneDirectorMonsterCredits; GameObject[] array = stageSettings.BonusCreditObjects.Keys.ToArray(); BonusInteractibleCreditObject[] array2 = (BonusInteractibleCreditObject[])(object)new BonusInteractibleCreditObject[array.Length]; for (int i = 0; i < array.Length; i++) { array2[i] = new BonusInteractibleCreditObject { objectThatGrantsPointsIfEnabled = array[i], points = stageSettings.BonusCreditObjects[array[i]] }; } classicStageInfo.bonusInteractibleCreditObjects = array2; SetMonsterCategoryWeightsPerDccs(classicStageInfo, stageSettings); SetInteractableCategoryWeightsPerDccs(classicStageInfo, stageSettings); } private static void SetMonsterCategoryWeightsPerDccs(ClassicStageInfo classicStageInfo, StageSettings stageSettings) { SetMonsterCategoryWeights(_dccsMixEnemyArtifact, stageSettings.MonsterCategoryWeightsPerDccs[_dccsMixEnemyArtifact]); if (Object.op_Implicit((Object)(object)classicStageInfo.monsterDccsPool)) { Category[] poolCategories = classicStageInfo.monsterDccsPool.poolCategories; foreach (Category val in poolCategories) { SetMonsterCategoryWeights(stageSettings, val.alway