Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of R2API Director v2.3.9
plugins/R2API.Director/R2API.Director.dll
Decompiled 2 months 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.9.0")] [assembly: AssemblyInformationalVersion("2.3.9+ec63ab6469c09e6a2600dbeb080f80e45851c79f")] [assembly: AssemblyProduct("R2API.Director")] [assembly: AssemblyTitle("R2API.Director")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.3.9.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)) { 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.9"; [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.alwaysIncluded); PoolEntry[] includedIfConditionsMet = (PoolEntry[])(object)val.includedIfConditionsMet;