Decompiled source of SuperCyanTweaks v1.0.6

SuperCyanTweaks/SuperCyanTweaks.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
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.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.GrandParentBoss;
using EntityStates.RoboBallMini.Weapon;
using EntityStates.VagrantNovaItem;
using HG.GeneralSerializer;
using IL.EntityStates;
using IL.EntityStates.ClayGrenadier;
using IL.EntityStates.GrandParentBoss;
using IL.EntityStates.VagrantNovaItem;
using IL.RoR2;
using IL.RoR2.Items;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates.GrandParentBoss;
using On.EntityStates.RoboBallMini.Weapon;
using On.RoR2;
using R2API;
using RoR2;
using RoR2.CharacterAI;
using RoR2.Navigation;
using RoR2.Projectile;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("SuperCyanTweaks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SuperCyanTweaks")]
[assembly: AssemblyTitle("SuperCyanTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace SuperCyanTweaks;

public static class Configs
{
	public static ConfigEntry<bool> disableByDefault { get; private set; }

	public static ConfigEntry<bool> alphaConstructTeleportEnabled { get; private set; }

	public static ConfigEntry<float> alphaConstructTeleportMinDist { get; private set; }

	public static ConfigEntry<float> alphaConstructTeleportCooldown { get; private set; }

	public static ConfigEntry<float> beetleSpawnDuration { get; private set; }

	public static ConfigEntry<float> beetleHeadbuttDmg { get; private set; }

	public static ConfigEntry<float> bighornBisonChargeCoeff { get; private set; }

	public static ConfigEntry<int> clayApothecaryCost { get; private set; }

	public static ConfigEntry<float> clayApothecaryTarBallRange { get; private set; }

	public static ConfigEntry<float> clayApothecaryMortarHealthThreshold { get; private set; }

	public static ConfigEntry<float> clayApothecarySlamSelfDmg { get; private set; }

	public static ConfigEntry<bool> clayApothecaryMortarTargeting { get; private set; }

	public static ConfigEntry<bool> falseSonGolemCountTweak { get; private set; }

	public static ConfigEntry<int> geepCost { get; private set; }

	public static ConfigEntry<int> grandparentCost { get; private set; }

	public static ConfigEntry<float> grandparentRockActivationRange { get; private set; }

	public static ConfigEntry<bool> grandparentRockDynamicSpeed { get; private set; }

	public static ConfigEntry<bool> grandparentRockTargeting { get; private set; }

	public static ConfigEntry<float> grandparentGravOrbForce { get; private set; }

	public static ConfigEntry<bool> grandparentGravOrbDynamicSpeed { get; private set; }

	public static ConfigEntry<bool> grandparentReduceDowntime { get; private set; }

	public static ConfigEntry<bool> gupDelayAttackOnSpawn { get; private set; }

	public static ConfigEntry<bool> halcyoniteOnMeridianPreLoop { get; private set; }

	public static ConfigEntry<bool> halcyoniteOnFalseSonLoop { get; private set; }

	public static ConfigEntry<bool> halcyoniteProperCategory { get; private set; }

	public static ConfigEntry<bool> impOnHelminthRoost { get; private set; }

	public static ConfigEntry<float> lemurianFireballRange { get; private set; }

	public static ConfigEntry<float> mushrumSprintDist { get; private set; }

	public static ConfigEntry<float> mushrumSprintCoeff { get; private set; }

	public static ConfigEntry<bool> mushrumOnHabitatFall { get; private set; }

	public static ConfigEntry<bool> scuRespectNodegraph { get; private set; }

	public static ConfigEntry<float> scuPrimaryAttackRange { get; private set; }

	public static ConfigEntry<float> scuProbeHealthThreshold { get; private set; }

	public static ConfigEntry<bool> scuOnSolusWingLoop { get; private set; }

	public static ConfigEntry<int> distributorCost { get; private set; }

	public static ConfigEntry<int> probeCost { get; private set; }

	public static ConfigEntry<bool> probeOnShipGraveyard { get; private set; }

	public static ConfigEntry<bool> probeOnRepurposedCrater { get; private set; }

	public static ConfigEntry<bool> probeOnSolusEvent { get; private set; }

	public static ConfigEntry<bool> probeDelayAttackOnSpawn { get; private set; }

	public static ConfigEntry<int> transporterCost { get; private set; }

	public static ConfigEntry<int> voidReaverCost { get; private set; }

	public static ConfigEntry<float> eclipseLiteBarrierBase { get; private set; }

	public static ConfigEntry<float> eclipseLiteBarrierStack { get; private set; }

	public static ConfigEntry<bool> eclipseLiteCountShields { get; private set; }

	public static ConfigEntry<bool> empathyCoresDamageTweak { get; private set; }

	public static ConfigEntry<bool> frostRelicCrit { get; private set; }

	public static ConfigEntry<float> genesisLoopProcCoeff { get; private set; }

	public static ConfigEntry<bool> genesisLoopLosTweak { get; private set; }

	public static ConfigEntry<int> growthNectarBuffCount { get; private set; }

	public static ConfigEntry<bool> allyAurelioniteTaunt { get; private set; }

	public static ConfigEntry<float> allyAurelioniteTauntRange { get; private set; }

	public static ConfigEntry<float> allyAurelioniteTauntDuration { get; private set; }

	public static ConfigEntry<float> allyAurelioniteMinLaserRange { get; private set; }

	public static ConfigEntry<float> happiestMaskProcChance { get; private set; }

	public static ConfigEntry<float> stealthKitThreshold { get; private set; }

	public static ConfigEntry<float> bestBuddyRamDamage { get; private set; }

	public static ConfigEntry<bool> bestBuddyBehaviorTweak { get; private set; }

	public static ConfigEntry<bool> bestBuddyHitDetection { get; private set; }

	public static ConfigEntry<bool> sonorousWhispersRework { get; private set; }

	public static ConfigEntry<float> wakeOfVulturesDurationBase { get; private set; }

	public static ConfigEntry<float> wakeOfVulturesDurationStack { get; private set; }

	public static ConfigEntry<bool> warBondsInheritable { get; private set; }

	public static ConfigEntry<bool> waxQuailMultiJump { get; private set; }

	public static ConfigEntry<float> eccentricVaseCooldown { get; private set; }

	public static ConfigEntry<float> eccentricVaseMaxDist { get; private set; }

	public static ConfigEntry<float> eccentricVaseAcceleration { get; private set; }

	public static ConfigEntry<bool> eccentricVaseCloak { get; private set; }

	public static ConfigEntry<bool> eccentricVaseIntangible { get; private set; }

	public static ConfigEntry<bool> eccentricVaseNoCrater { get; private set; }

	public static ConfigEntry<float> foreignFruitCooldown { get; private set; }

	public static ConfigEntry<float> molotovResidueSize { get; private set; }

	public static ConfigEntry<float> molotovResidueDuration { get; private set; }

	public static ConfigEntry<float> molotovResidueTickrate { get; private set; }

	public static ConfigEntry<float> molotovExplosionDamage { get; private set; }

	public static ConfigEntry<bool> equipDroneAlwaysFire { get; private set; }

	public static ConfigEntry<float> gunnerTurretRange { get; private set; }

	public static ConfigEntry<int> droneScrapperMaxCount { get; private set; }

	public static ConfigEntry<bool> droneScrapperOnHabitat { get; private set; }

	public static ConfigEntry<bool> moonCauldronTweak { get; private set; }

	public static ConfigEntry<bool> fanSpeedBoost { get; private set; }

	public static ConfigEntry<float> fanBuffDuration { get; private set; }

	public static ConfigEntry<float> fanBuffStrength { get; private set; }

	public static ConfigEntry<float> drifterCubeSearchAngle { get; private set; }

	public static ConfigEntry<float> drifterCubeSearchDistance { get; private set; }

	public static ConfigEntry<bool> drifterCleanupCooldownTweak { get; private set; }

	public static ConfigEntry<bool> eclipseTeamTweak { get; private set; }

	public static void Init(ConfigFile cfg)
	{
		disableByDefault = cfg.Bind<bool>("!Mod", "Disable New Configs", false, "If set to true, newly generated configs will always be disabled by default.");
		alphaConstructTeleportEnabled = cfg.Bind<bool>("Enemies - Alpha Construct", "Teleport To Players", !disableByDefault.Value, "Alpha Constructs that are out of range will periodically teleport near a target. Vanilla is false.");
		alphaConstructTeleportMinDist = cfg.Bind<float>("Enemies - Alpha Construct", "Minimum Teleport Distance", 75f, "Alpha Constructs will attempt to teleport if their target is past this range. For reference, their attacking range is 75m.");
		alphaConstructTeleportCooldown = cfg.Bind<float>("Enemies - Alpha Construct", "Teleport Cooldown", 30f, "Set the cooldown of the Alpha Construct's teleport skill.");
		beetleSpawnDuration = cfg.Bind<float>("Enemies - Beetle", "Spawn Duration", disableByDefault.Value ? (-1f) : 3.5f, "Set the spawn duration to this value. Vanilla is 5. Set to a negative value for no change.");
		beetleHeadbuttDmg = cfg.Bind<float>("Enemies - Beetle", "Headbutt Damage Coefficient", disableByDefault.Value ? (-1f) : 2.5f, "Set the damage coefficient to this value. Vanilla is 2. Set to a negative value for no change.");
		bighornBisonChargeCoeff = cfg.Bind<float>("Enemies - Bighorn Bison", "Charge Coefficient", -1f, "Base speed is multiplied by this value while charging. Vanilla is 8. Set to a negative value for no change.");
		clayApothecaryCost = cfg.Bind<int>("Enemies - Clay Apothecary", "Spawn Cost", disableByDefault.Value ? (-1) : 125, "Set the director credit cost. Vanilla is 150. Set to a negative value for no change.");
		clayApothecaryTarBallRange = cfg.Bind<float>("Enemies - Clay Apothecary", "Max Tar Ball Range", disableByDefault.Value ? (-1f) : 75f, "Clay Apothecaries will attack from this far away with tar balls. Vanilla is 65. Set to a negative value for no change.");
		clayApothecaryMortarHealthThreshold = cfg.Bind<float>("Enemies - Clay Apothecary", "Ranged Mortar Health Threshold", disableByDefault.Value ? (-1f) : 1f, "Clay Apothecaries will use their slam/mortar attack at range under this health fraction. Vanilla is 0.5. Set to a negative value for no change.");
		clayApothecarySlamSelfDmg = cfg.Bind<float>("Enemies - Clay Apothecary", "Slam Self-Damage", disableByDefault.Value ? (-1f) : 0f, "Clay Apothecaries will lose this percentage of their current health when using the slam/mortar attack. Vanilla is 5. Set to a negative value for no change.");
		clayApothecaryMortarTargeting = cfg.Bind<bool>("Enemies - Clay Apothecary", "Mortar Targeting", !disableByDefault.Value, "Mortar targets are sorted by angle only instead of this weird 'angle and distance' algorithm.\nThe attack will more reliably aim itself at the Clay Apothecary's target.");
		falseSonGolemCountTweak = cfg.Bind<bool>("Enemies - False Son", "Golem Count Scales With Stage Count", !disableByDefault.Value, "The maximum number of enemies that can spawn during Phase 2 is directly proportional to the current stage count.\nThus, it will be reduced from 5 to 4 if fought without looping.");
		geepCost = cfg.Bind<int>("Enemies - Geep", "Spawn Cost", disableByDefault.Value ? (-1) : 50, "Set the director credit cost. Vanilla is 35. Set to a negative value for no change.");
		grandparentCost = cfg.Bind<int>("Enemies - Grandparent", "Spawn Cost", disableByDefault.Value ? (-1) : 1000, "Set the director credit cost. Vanilla is 1150. Set to a negative value for no change.");
		grandparentRockActivationRange = cfg.Bind<float>("Enemies - Grandparent", "Rock Throw Activation Range", disableByDefault.Value ? (-1f) : 1500f, "Activation range of Rock Throw. Vanilla is 300. Set to a negative value for no change.");
		grandparentRockDynamicSpeed = cfg.Bind<bool>("Enemies - Grandparent", "Dynamic Rock Speed", !disableByDefault.Value, "Rock projectile speed scales with target distance. Vanilla is false.");
		grandparentRockTargeting = cfg.Bind<bool>("Enemies - Grandparent", "Improved Rock Targeting", !disableByDefault.Value, "Improves the target-searching logic to let the rock more reliably reach its destination. Vanilla is false.");
		grandparentGravOrbForce = cfg.Bind<float>("Enemies - Grandparent", "Gravity Orb Force", disableByDefault.Value ? (-1000f) : (-4000f), "The force of the gravity orb's pull. Set to vanilla value (-1000) for no change.");
		grandparentGravOrbDynamicSpeed = cfg.Bind<bool>("Enemies - Grandparent", "Dynamic Orb Speed", !disableByDefault.Value, "Gravity Orb projectile speed scales with target distance. Vanilla is false.");
		grandparentReduceDowntime = cfg.Bind<bool>("Enemies - Grandparent", "Reduce Downtime", !disableByDefault.Value, "Grandparents will spend less time in the 'rotate to target' behaviors. Vanilla is false.");
		gupDelayAttackOnSpawn = cfg.Bind<bool>("Enemies - Gup", "Delay Attack After Spawning", !disableByDefault.Value, "Adds a small delay between spawning and throwing out their first attack.");
		halcyoniteOnMeridianPreLoop = cfg.Bind<bool>("Enemies - Halcyonite", "Spawn on Prime Meridian (Pre-Loop)", !disableByDefault.Value, "Halcyonites appear on Prime Meridian pre-loop, as they do in other Path of the Colossus stages.");
		halcyoniteOnFalseSonLoop = cfg.Bind<bool>("Enemies - Halcyonite", "Spawn During False Son (Loop)", !disableByDefault.Value, "Halcyonites appear during False Son Phase 2 when looping.");
		halcyoniteProperCategory = cfg.Bind<bool>("Enemies - Halcyonite", "Monster Category Fix", !disableByDefault.Value, "Properly categorizes Halcyonite as a Miniboss monster on every stage where it is considered a Champion.\nWhich is pretty much everywhere except Gilded Coast & Prime Meridian.");
		impOnHelminthRoost = cfg.Bind<bool>("Enemies - Imp", "Spawn on Helminth Hatchery", !disableByDefault.Value, "Imps appear on Helminth Hatchery.");
		lemurianFireballRange = cfg.Bind<float>("Enemies - Lemurian", "Max Fireball Range", disableByDefault.Value ? (-1f) : 45f, "Lemurians will attack from this far away with fireballs. Strafe range is still capped at 30m. Vanilla is 30. Set to a negative value for no change.");
		mushrumSprintDist = cfg.Bind<float>("Enemies - Mini Mushrum", "Sprint Distance", disableByDefault.Value ? (-1f) : 60f, "Mini Mushrums start sprinting from this far away. Set to a negative value to disable.");
		mushrumSprintCoeff = cfg.Bind<float>("Enemies - Mini Mushrum", "Sprint Coefficient", disableByDefault.Value ? (-1f) : 3f, "Set the sprint speed multiplier to this value. Vanilla is 2.5. Set to a negative value for no change.");
		mushrumOnHabitatFall = cfg.Bind<bool>("Enemies - Mini Mushrum", "Spawn on Golden Dieback", !disableByDefault.Value, "Mini Mushrums appear on Golden Dieback.");
		scuRespectNodegraph = cfg.Bind<bool>("Enemies - Solus Control Unit", "Respect Nodegraph", !disableByDefault.Value, "Solus Control Units will properly follow the nodegraph while chasing. Applies to AWU as well.");
		scuPrimaryAttackRange = cfg.Bind<float>("Enemies - Solus Control Unit", "Max Primary Attack Range", disableByDefault.Value ? (-1f) : 100f, "Solus Control Units will attack from this far away. Vanilla is 50. Set to a negative value for no change. Applies to AWU as well.");
		scuProbeHealthThreshold = cfg.Bind<float>("Enemies - Solus Control Unit", "Probe Health Threshold", disableByDefault.Value ? (-1f) : 1f, "Solus Control Units will deploy Solus Probes under this health fraction. Vanilla is 0.9. Set to a negative value for no change. Applies to AWU as well.");
		scuOnSolusWingLoop = cfg.Bind<bool>("Enemies - Solus Control Unit", "Spawn During Solus Wing (Loop)", !disableByDefault.Value, "Solus Control Units appear during the Solus Wing fight when looping.");
		distributorCost = cfg.Bind<int>("Enemies - Solus Distributor", "Spawn Cost", disableByDefault.Value ? (-1) : 40, "Set the director credit cost. Vanilla is 20. Set to a negative value for no change.");
		probeCost = cfg.Bind<int>("Enemies - Solus Probe", "Spawn Cost", disableByDefault.Value ? (-1) : 40, "Set the director credit cost. Vanilla is 60. Set to a negative value for no change.");
		probeOnShipGraveyard = cfg.Bind<bool>("Enemies - Solus Probe", "Spawn on Siren’s Call", !disableByDefault.Value, "Solus Probes appear on Siren’s Call.");
		probeOnRepurposedCrater = cfg.Bind<bool>("Enemies - Solus Probe", "Spawn on Repurposed Crater", !disableByDefault.Value, "Solus Probes appear on Repurposed Crater.");
		probeOnSolusEvent = cfg.Bind<bool>("Enemies - Solus Probe", "Add to Solus Family Event", !disableByDefault.Value, "Solus Probes appear during the Solus Family Event.");
		probeDelayAttackOnSpawn = cfg.Bind<bool>("Enemies - Solus Probe", "Delay Attack After Spawning", !disableByDefault.Value, "Adds a small delay between spawning and throwing out their first attack.");
		transporterCost = cfg.Bind<int>("Enemies - Solus Transporter", "Spawn Cost", disableByDefault.Value ? (-1) : 125, "Set the director credit cost. Vanilla is 200. Set to a negative value for no change.");
		voidReaverCost = cfg.Bind<int>("Enemies - Void Reaver", "Spawn Cost", disableByDefault.Value ? (-1) : 250, "Set the director credit cost. Vanilla is 300. Set to a negative value for no change.");
		eclipseLiteBarrierBase = cfg.Bind<float>("Items - Eclipse Lite", "Base Barrier Percentage", -1f, "Set the barrier gain per second of cooldown, in percentage. Vanilla is 1%. Set to a negative value for no change.");
		eclipseLiteBarrierStack = cfg.Bind<float>("Items - Eclipse Lite", "Stack Barrier Percentage", disableByDefault.Value ? (-1f) : 0.5f, "Set the barrier gain per second of cooldown, in percentage. Vanilla is 0.25%. Set to a negative value for no change.");
		eclipseLiteCountShields = cfg.Bind<bool>("Items - Eclipse Lite", "Count Shields", !disableByDefault.Value, "Barrier gain is calculated using max health + shields instead of just max health.");
		empathyCoresDamageTweak = cfg.Bind<bool>("Items - Empathy Cores", "Empathy Cores Damage Tweak", !disableByDefault.Value, "Empathy Cores damage boost affects skill damage instead of base damage.\nThis nerfs synergies that depend on base damage, notably the chainguns from Spare Drone Parts.");
		frostRelicCrit = cfg.Bind<bool>("Items - Frost Relic", "Frost Relic Crit", !disableByDefault.Value, "Allow the Frost Relic to crit. Vanilla is false.");
		genesisLoopProcCoeff = cfg.Bind<float>("Items - Genesis Loop", "Proc Coefficient", disableByDefault.Value ? (-1f) : 3f, "Set the prof coefficient of the blast. Vanilla is 1. Set to a negative value for no change.");
		genesisLoopLosTweak = cfg.Bind<bool>("Items - Genesis Loop", "Line of Sight Tweak", !disableByDefault.Value, "The blast will ignore line of sight if used by a Player team member.");
		growthNectarBuffCount = cfg.Bind<int>("Items - Growth Nectar", "Buff Count", disableByDefault.Value ? (-1) : 5, "Set the maximum amount of buffs per stack this item can register. Vanilla is 4. Set to a negative value for no change.");
		allyAurelioniteTaunt = cfg.Bind<bool>("Items - Halcyon Seed", "Aurelionite Taunt", !disableByDefault.Value, "Aurelionite will get the attention of nearby enemies upon spawning, as well as any enemy that gets hit.");
		allyAurelioniteTauntRange = cfg.Bind<float>("Items - Halcyon Seed", "Taunt Range", disableByDefault.Value ? (-1f) : 60f, "Set the radius of the taunt effect.");
		allyAurelioniteTauntDuration = cfg.Bind<float>("Items - Halcyon Seed", "Taunt Duration", disableByDefault.Value ? (-1f) : 15f, "Set how long the enemy will be distracted for.\nIt'll take the highest value between this and the enemy's natural attention span.");
		allyAurelioniteMinLaserRange = cfg.Bind<float>("Items - Halcyon Seed", "Minimum Laser Range", disableByDefault.Value ? (-1f) : 0f, "The minimum distance Aurelionite is allowed to use the laser. Vanilla is 10. Set to a negative value for no change.");
		happiestMaskProcChance = cfg.Bind<float>("Items - Happiest Mask", "Proc Chance", disableByDefault.Value ? (-1f) : 10f, "Set the proc chance of this item, in percentage. Vanilla is 7%. Set to a negative value for no change.");
		stealthKitThreshold = cfg.Bind<float>("Items - Old War Stealthkit", "Activation Threshold", disableByDefault.Value ? (-1f) : 0.5f, "This item will activate under this health fraction. Vanilla is 0.25. Set to a negative value for no change.");
		bestBuddyRamDamage = cfg.Bind<float>("Items - Orphaned Core", "Ram Damage", disableByDefault.Value ? (-1f) : 6f, "Set the damage coefficient to this value. The value is multiplied by x2.5 against heavy targets. Vanilla is 4. Set to a negative value for no change.");
		bestBuddyBehaviorTweak = cfg.Bind<bool>("Items - Orphaned Core", "Tweak Behavior", !disableByDefault.Value, "Adjusts the AI of Best Buddy to be more competent. Vanilla is false.");
		bestBuddyHitDetection = cfg.Bind<bool>("Items - Orphaned Core", "Improve Hit Detection", !disableByDefault.Value, "Improves the re-hit rate and makes the kinetic aura hitbox roughly match the visuals. Vanilla is false.");
		sonorousWhispersRework = cfg.Bind<bool>("Items - Sonorous Whispers", "Sonorous Whispers Rework", !disableByDefault.Value, "Items only drop from bosses proper instead of Champions, and will no longer drop from elites.\nStacking improves item rarity.\nEffect is now team-wide.");
		wakeOfVulturesDurationBase = cfg.Bind<float>("Items - Wake of Vultures", "Base Duration", disableByDefault.Value ? (-1f) : 12f, "Set the aspect buff duration. Vanilla is 8. Set to a negative value for no change.");
		wakeOfVulturesDurationStack = cfg.Bind<float>("Items - Wake of Vultures", "Stack Duration", disableByDefault.Value ? (-1f) : 6f, "Set the aspect buff duration. Vanilla is 5. Set to a negative value for no change.");
		warBondsInheritable = cfg.Bind<bool>("Items - War Bonds", "War Bonds is Inheritable", disableByDefault.Value, "Whether this item can be inherited by turrets and such. Vanilla is true.");
		waxQuailMultiJump = cfg.Bind<bool>("Items - Wax Quail", "Wax Quail Multi Jump", !disableByDefault.Value, "Additional non-base jumps will grant a jump boost as well. Vanilla is false.");
		eccentricVaseCooldown = cfg.Bind<float>("Equipment - Eccentric Vase", "Cooldown", disableByDefault.Value ? (-1f) : 30f, "Adjust this equipment's cooldown. Vanilla is 45. Set to a negative value for no change.");
		eccentricVaseMaxDist = cfg.Bind<float>("Equipment - Eccentric Vase", "Max Range", disableByDefault.Value ? (-1f) : 2000f, "Adjust the maximum length of the zipline. Vanilla is 1000. Set to a negative value for no change.");
		eccentricVaseAcceleration = cfg.Bind<float>("Equipment - Eccentric Vase", "Acceleration", disableByDefault.Value ? (-1f) : 50f, "Set the acceleration value. Vanilla is 30. Set to a negative value for no change.");
		eccentricVaseCloak = cfg.Bind<bool>("Equipment - Eccentric Vase", "Cloaked While Traveling", !disableByDefault.Value, "User is cloaked while traveling. Vanilla is false.");
		eccentricVaseIntangible = cfg.Bind<bool>("Equipment - Eccentric Vase", "Intangible While Traveling", !disableByDefault.Value, "User is intangible while traveling. Vanilla is false.");
		eccentricVaseNoCrater = cfg.Bind<bool>("Equipment - Eccentric Vase", "No Cratering", !disableByDefault.Value, "User is briefly immune to fall damage on exit. Vanilla is false.");
		foreignFruitCooldown = cfg.Bind<float>("Equipment - Foreign Fruit", "Cooldown", disableByDefault.Value ? (-1f) : 30f, "Adjust this equipment's cooldown. Vanilla is 45. Set to a negative value for no change.");
		molotovResidueSize = cfg.Bind<float>("Equipment - Molotov (6-Pack)", "Fire Residue Size", disableByDefault.Value ? (-1f) : 1.75f, "Multiply the size of the lingering fire pools by this value. Vanilla is 1. Set to a negative value for no change.");
		molotovResidueDuration = cfg.Bind<float>("Equipment - Molotov (6-Pack)", "Fire Residue Duration", disableByDefault.Value ? (-1f) : 10f, "Adjust the duration of the lingering fire pools. Vanilla is 7. Set to a negative value for no change.");
		molotovResidueTickrate = cfg.Bind<float>("Equipment - Molotov (6-Pack)", "Fire Residue Tickrate", disableByDefault.Value ? (-1f) : 2f, "Adjust the tickrate of the lingering fire pools, in attacks per second. Vanilla is 1. Set to a negative value for no change.");
		molotovExplosionDamage = cfg.Bind<float>("Equipment - Molotov (6-Pack)", "Explosion Damage", -1f, "Set the damage coefficient of the fire explosions to this value. Vanilla is 2.5, despite what the description says. Set to a negative value for no change.");
		equipDroneAlwaysFire = cfg.Bind<bool>("Drones - Equipment Drone", "Always Fire Equipment", !disableByDefault.Value, "Equipment Drones will attempt to fire their Equipment as often as possible. Vanilla is false.");
		gunnerTurretRange = cfg.Bind<float>("Drones - Gunner Turret", "Attack Range", disableByDefault.Value ? (-1f) : 75f, "Gunner Turrets will attack from this far away. Vanilla is 60. Set to a negative value for no change.");
		droneScrapperMaxCount = cfg.Bind<int>("Interactables - Drone Scrapper", "Max Count", (!disableByDefault.Value) ? 1 : (-1), "Set the maximum amount of times it can spawn per stage. Vanilla is -1. Set to negative for no limit.");
		droneScrapperOnHabitat = cfg.Bind<bool>("Interactables - Drone Scrapper", "Spawn on Treeborn Colony", !disableByDefault.Value, "Drone Scrappers appear on Treeborn Colony & Golden Dieback.");
		moonCauldronTweak = cfg.Bind<bool>("Stages - Commencement", "Cauldron Tweak", !disableByDefault.Value, "Blacklist items tagged with 'OnStageBeginEffet', which includes things like Rusted Key/Sale Star.");
		fanSpeedBoost = cfg.Bind<bool>("Stages - Rallypoint Delta", "Enable Fan Speed Boost", !disableByDefault.Value, "Taking the fans temporarily increases movement speed for players.");
		fanBuffDuration = cfg.Bind<float>("Stages - Rallypoint Delta", "Fan Buff Duration", disableByDefault.Value ? (-1f) : 10f, "Set the duration of the speed boost, in seconds.");
		fanBuffStrength = cfg.Bind<float>("Stages - Rallypoint Delta", "Fan Buff Strength", disableByDefault.Value ? (-1f) : 50f, "Additively increase movement speed by this percentage while under the effects of the buff.");
		drifterCubeSearchAngle = cfg.Bind<float>("Survivors - Drifter", "Junk Cube Search Angle", disableByDefault.Value ? (-1f) : 15f, "Set the maximum angle at which Junk Cube will automatically lock on to a target when hit. Vanilla is 8. Set to a negative value for no change.");
		drifterCubeSearchDistance = cfg.Bind<float>("Survivors - Drifter", "Junk Cube Search Distance", disableByDefault.Value ? (-1f) : 50f, "Set the maximum distance at which Junk Cube will automatically lock on to a target when hit. Vanilla is 40. Set to a negative value for no change.");
		drifterCleanupCooldownTweak = cfg.Bind<bool>("Survivors - Drifter", "Cleanup Doesn’t Reset Cooldown", !disableByDefault.Value, "Using Cleanup no longer resets the skill's cooldown.\nJunk Cube doesn't have that quirk, as a matter of fact.");
		eclipseTeamTweak = cfg.Bind<bool>("Miscellaneous - Eclipse", "E4/E7 Team Tweak", !disableByDefault.Value, "Apply the vanilla Eclipse 4 & 7 modifiers to other non-ally teams, such as Void. Vanilla is false.");
	}
}
public class EquipmentDrone
{
	public static GameObject equipDroneMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Drones/EquipmentDroneMaster.prefab").WaitForCompletion();

	public EquipmentDrone()
	{
		if (!Configs.equipDroneAlwaysFire.Value)
		{
			return;
		}
		AISkillDriver[] components = equipDroneMasterPrefab.GetComponents<AISkillDriver>();
		AISkillDriver[] array = components;
		foreach (AISkillDriver val in array)
		{
			val.shouldFireEquipment = true;
			if (val.driverUpdateTimerOverride > 0.5f)
			{
				val.driverUpdateTimerOverride = 0.5f;
			}
		}
	}
}
public class GunnerTurret
{
	public static GameObject gunnerTurretMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Drones/Turret1Master.prefab").WaitForCompletion();

	public GunnerTurret()
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Invalid comparison between Unknown and I4
		if (!(Configs.gunnerTurretRange.Value >= 0f))
		{
			return;
		}
		AISkillDriver[] components = gunnerTurretMasterPrefab.GetComponents<AISkillDriver>();
		AISkillDriver[] array = components;
		foreach (AISkillDriver val in array)
		{
			if ((int)val.skillSlot == 0)
			{
				val.maxDistance = Configs.gunnerTurretRange.Value;
			}
		}
	}
}
public class AlphaConstruct
{
	public static GameObject minorConstructBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MinorConstructBody.prefab").WaitForCompletion();

	public static GameObject minorConstructMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MinorConstructMaster.prefab").WaitForCompletion();

	public static GameObject minorConstructAllyBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MinorConstructOnKillBody.prefab").WaitForCompletion();

	public static GameObject minorConstructAllyMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MinorConstructOnKillMaster.prefab").WaitForCompletion();

	public AlphaConstruct()
	{
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_026c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0274: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
		if (Configs.alphaConstructTeleportEnabled.Value)
		{
			BaseAI component = minorConstructMasterPrefab.GetComponent<BaseAI>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.enemySearch.maxDistanceFilter = float.PositiveInfinity;
				component.xrayVision = true;
			}
			if (!Object.op_Implicit((Object)(object)minorConstructBodyPrefab.GetComponent<TargetingAndPredictionController>()))
			{
				minorConstructBodyPrefab.AddComponent<TargetingAndPredictionController>();
			}
			bool flag = default(bool);
			ContentAddition.AddEntityState<MinorConstructTeleport>(ref flag);
			SkillDef val = ScriptableObject.CreateInstance<SkillDef>();
			val.activationState = new SerializableEntityStateType(typeof(MinorConstructTeleport));
			val.activationStateMachineName = "Body";
			val.baseMaxStock = 1;
			val.baseRechargeInterval = Configs.alphaConstructTeleportCooldown.Value;
			val.beginSkillCooldownOnSkillEnd = false;
			val.canceledFromSprinting = false;
			val.cancelSprintingOnActivation = true;
			val.dontAllowPastMaxStocks = true;
			val.forceSprintDuringState = false;
			val.fullRestockOnAssign = false;
			val.hideCooldown = false;
			val.hideStockCount = false;
			val.interruptPriority = (InterruptPriority)1;
			val.isCombatSkill = false;
			val.mustKeyPress = false;
			val.rechargeStock = 1;
			val.requiredStock = 1;
			val.resetCooldownTimerOnUse = false;
			val.skillName = "MINORCONSTRUCT_UTILITY_TELEPORT_NAME";
			val.stockToConsume = 1;
			ContentAddition.AddSkillDef(val);
			SkillFamily val2 = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val2).name = "MinorConstructUtilityFamily";
			Array.Resize(ref val2.variants, 1);
			val2.variants[0].skillDef = val;
			GenericSkill val3 = minorConstructBodyPrefab.AddComponent<GenericSkill>();
			val3.skillName = "MinorConstructTeleport";
			val3._skillFamily = val2;
			SkillLocator component2 = minorConstructBodyPrefab.GetComponent<SkillLocator>();
			component2.utility = val3;
			ContentAddition.AddSkillFamily(val2);
			AISkillDriver val4 = minorConstructMasterPrefab.AddComponent<AISkillDriver>();
			val4.activationRequiresAimConfirmation = false;
			val4.activationRequiresAimTargetLoS = false;
			val4.activationRequiresTargetLoS = false;
			val4.aimType = (AimType)1;
			val4.aimVectorDampTimeOverride = 0.05f;
			val4.aimVectorMaxSpeedOverride = float.PositiveInfinity;
			val4.buttonPressType = (ButtonPressType)2;
			val4.customName = "TeleportToTarget";
			val4.driverUpdateTimerOverride = 1f;
			val4.ignoreNodeGraph = false;
			val4.maxDistance = float.PositiveInfinity;
			val4.maxTargetHealthFraction = float.PositiveInfinity;
			val4.maxTimesSelected = -1;
			val4.maxUserHealthFraction = float.PositiveInfinity;
			val4.minDistance = Configs.alphaConstructTeleportMinDist.Value;
			val4.minTargetHealthFraction = float.NegativeInfinity;
			val4.minUserHealthFraction = float.NegativeInfinity;
			val4.moveInputScale = 1f;
			val4.movementType = (MovementType)0;
			val4.moveTargetType = (TargetType)0;
			val4.noRepeat = false;
			val4.requireEquipmentReady = false;
			val4.requireSkillReady = true;
			val4.resetCurrentEnemyOnNextDriverSelection = false;
			val4.selectionRequiresAimTarget = false;
			val4.selectionRequiresOnGround = false;
			val4.selectionRequiresTargetLoS = false;
			val4.selectionRequiresTargetNonFlier = false;
			val4.shouldFireEquipment = false;
			val4.shouldSprint = false;
			val4.skillSlot = (SkillSlot)2;
			minorConstructMasterPrefab.ReorderSkillDrivers(val4, 1);
			if (!Object.op_Implicit((Object)(object)minorConstructBodyPrefab.GetComponent<RemoveTeleportStocksOnStart>()))
			{
				minorConstructBodyPrefab.AddComponent<RemoveTeleportStocksOnStart>();
			}
		}
	}
}
public class RemoveTeleportStocksOnStart : MonoBehaviour
{
	private CharacterBody characterBody;

	private SkillLocator skillLocator;

	private void Awake()
	{
		characterBody = ((Component)this).GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)characterBody) && Object.op_Implicit((Object)(object)characterBody.skillLocator))
		{
			skillLocator = characterBody.skillLocator;
		}
	}

	private void Start()
	{
		if (Object.op_Implicit((Object)(object)skillLocator) && Object.op_Implicit((Object)(object)skillLocator.utility))
		{
			skillLocator.utility.RemoveAllStocks();
		}
	}
}
public class MinorConstructTeleport : BaseState
{
	public float duration = 0.2f;

	public float nodeSearchRadiusMin = 25f;

	public float nodeSearchRadiusMax = 40f;

	public float collisionCheckDistance = 5f;

	public int findSurfaceRaycastCount = 10;

	public float findSurfaceMaxRaycastLength = 50f;

	public GameObject teleportEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MajorConstructSpawnMinorConstructEffect.prefab").WaitForCompletion();

	public GameObject arrivalEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/MajorAndMinorConstruct/MajorConstructMuzzleflashSpawnMinorConstruct.prefab").WaitForCompletion();

	public string arrivalSoundString = "Play_majorConstruct_R_pulse";

	public HurtBox target;

	public override void OnEnter()
	{
		((BaseState)this).OnEnter();
		target = ((EntityState)this).GetComponent<TargetingAndPredictionController>().GetTargetHurtBox();
		if (!Object.op_Implicit((Object)(object)target))
		{
			((EntityState)this).outer.SetNextStateToMain();
		}
	}

	public override void FixedUpdate()
	{
		((EntityState)this).FixedUpdate();
		if (Object.op_Implicit((Object)(object)target) && ((EntityState)this).fixedAge > duration)
		{
			Teleport();
			((EntityState)this).outer.SetNextStateToMain();
		}
	}

	public override void OnExit()
	{
		((EntityState)this).OnExit();
	}

	private void Teleport()
	{
		//IL_001f: 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_0026: 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_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Expected O, but got Unknown
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Expected O, but got Unknown
		if (FindOffsetPosition(((Component)target).transform, out var offsetPosition))
		{
			Vector3 position = ((EntityState)this).transform.position;
			if (FindNearbySurface(offsetPosition))
			{
				EffectManager.SpawnEffect(teleportEffectPrefab, new EffectData
				{
					origin = position
				}, false);
				EffectManager.SpawnEffect(arrivalEffectPrefab, new EffectData
				{
					origin = ((EntityState)this).transform.position
				}, false);
				Util.PlaySound(arrivalSoundString, ((EntityState)this).gameObject);
			}
		}
	}

	private bool FindNearbySurface(Vector3 targetPos)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: 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_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		RaycastHit val = default(RaycastHit);
		bool result = false;
		if (((EntityState)this).isAuthority)
		{
			MinionOwnership minionOwnership = ((EntityState)this).characterBody.master.minionOwnership;
			if (!Object.op_Implicit((Object)(object)((minionOwnership != null) ? minionOwnership.ownerMaster : null)))
			{
				for (int i = 0; i < findSurfaceRaycastCount; i++)
				{
					if (Physics.Raycast(targetPos, Random.onUnitSphere, ref val, findSurfaceMaxRaycastLength, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
					{
						((EntityState)this).transform.position = ((RaycastHit)(ref val)).point;
						((EntityState)this).transform.up = ((RaycastHit)(ref val)).normal;
						result = true;
					}
				}
			}
		}
		return result;
	}

	private bool FindOffsetPosition(Transform targetTransform, out Vector3 offsetPosition)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		return FindBestTeleportPosition(targetTransform.position, out offsetPosition);
	}

	private bool FindBestTeleportPosition(Vector3 nearPosition, out Vector3 teleportPosition)
	{
		//IL_003d: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)DirectorCore.instance) || !Object.op_Implicit((Object)(object)SceneInfo.instance))
		{
			teleportPosition = default(Vector3);
			return false;
		}
		NodeGraph nodeGraph = SceneInfo.instance.GetNodeGraph((GraphType)1);
		List<NodeIndex> list = nodeGraph.FindNodesInRange(nearPosition, nodeSearchRadiusMin, nodeSearchRadiusMax, (HullMask)1);
		if (list.Count >= 1)
		{
			Vector3 val2 = default(Vector3);
			for (int i = 0; i < list.Count; i++)
			{
				NodeIndex val = list[i];
				if (!DirectorCore.instance.CheckNodeOccupied(nodeGraph, val) && nodeGraph.GetNodePosition(val, ref val2) && (!(collisionCheckDistance >= 0f) || CheckTeleportPositionValid(val2)))
				{
					teleportPosition = val2;
					return true;
				}
			}
		}
		teleportPosition = default(Vector3);
		return false;
	}

	private bool CheckTeleportPositionValid(Vector3 telePosition)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		if (Physics.OverlapSphere(telePosition, collisionCheckDistance, LayerMask.op_Implicit(CommonMasks.allCharacterCollisions), (QueryTriggerInteraction)1).Length != 0)
		{
			return false;
		}
		return true;
	}
}
public class Beetle
{
	public static EntityStateConfiguration beetleSpawn = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/Base/Beetle/EntityStates.BeetleMonster.SpawnState.asset").WaitForCompletion();

	public static EntityStateConfiguration beetleHeadbutt = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/Base/Beetle/EntityStates.BeetleMonster.HeadbuttState.asset").WaitForCompletion();

	public Beetle()
	{
		if (Configs.beetleSpawnDuration.Value >= 0f)
		{
			beetleSpawn.TryModifyFieldValue("duration", Configs.beetleSpawnDuration.Value);
		}
		if (Configs.beetleHeadbuttDmg.Value >= 0f)
		{
			beetleHeadbutt.TryModifyFieldValue("damageCoefficient", Configs.beetleHeadbuttDmg.Value);
		}
	}
}
public class BighornBison
{
	public static EntityStateConfiguration bisonCharge = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/Base/Bison/EntityStates.Bison.Charge.asset").WaitForCompletion();

	public BighornBison()
	{
		if (Configs.bighornBisonChargeCoeff.Value >= 0f)
		{
			bisonCharge.TryModifyFieldValue("chargeMovementSpeedCoefficient", Configs.bighornBisonChargeCoeff.Value);
		}
	}
}
public class ClayApothecary
{
	public static CharacterSpawnCard cscClayGrenadier = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/DLC1/ClayGrenadier/cscClayGrenadier.asset").WaitForCompletion();

	public static GameObject clayGrenadierMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/ClayGrenadier/ClayGrenadierMaster.prefab").WaitForCompletion();

	public static EntityStateConfiguration clayGrenadierFaceSlam = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/DLC1/ClayGrenadier/EntityStates.ClayGrenadier.FaceSlam.asset").WaitForCompletion();

	public ClayApothecary()
	{
		//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b3: Expected O, but got Unknown
		if (Configs.clayApothecaryCost.Value >= 0)
		{
			((SpawnCard)cscClayGrenadier).directorCreditCost = Configs.clayApothecaryCost.Value;
		}
		if (Configs.clayApothecaryTarBallRange.Value >= 0f || Configs.clayApothecaryMortarHealthThreshold.Value >= 0f)
		{
			AISkillDriver[] components = clayGrenadierMasterPrefab.GetComponents<AISkillDriver>();
			AISkillDriver[] array = components;
			foreach (AISkillDriver val in array)
			{
				if (val.customName == "ThrowBarrel" && Configs.clayApothecaryTarBallRange.Value >= 0f)
				{
					val.maxDistance = Configs.clayApothecaryTarBallRange.Value;
				}
				else if (val.customName == "LongDistanceMortar" && Configs.clayApothecaryMortarHealthThreshold.Value >= 0f)
				{
					if (Configs.clayApothecaryMortarHealthThreshold.Value >= 1f)
					{
						val.maxUserHealthFraction = float.PositiveInfinity;
					}
					else
					{
						val.maxUserHealthFraction = Configs.clayApothecaryMortarHealthThreshold.Value;
					}
				}
			}
		}
		if (Configs.clayApothecarySlamSelfDmg.Value >= 0f)
		{
			clayGrenadierFaceSlam.TryModifyFieldValue("healthCostFraction", Configs.clayApothecarySlamSelfDmg.Value / 100f);
		}
		if (!Configs.clayApothecaryMortarTargeting.Value)
		{
			return;
		}
		bool hookFailed = true;
		FaceSlam.FixedUpdate += (Manipulator)delegate(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val2 = new ILCursor(il);
			if (val2.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStfld<BullseyeSearch>(x, "sortMode")
			}))
			{
				int index = val2.Index;
				val2.Index = index - 1;
				val2.Next.OpCode = OpCodes.Ldc_I4_2;
				hookFailed = false;
			}
			if (hookFailed)
			{
				Log.Error("Clay Apothecary mortar targeting hook failed!");
			}
		};
	}
}
public class FalseSon
{
	public FalseSon()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Expected O, but got Unknown
		if (Configs.falseSonGolemCountTweak.Value)
		{
			MeridianEventTriggerInteraction.Start += new hook_Start(MeridianEventTriggerInteraction_Start);
		}
	}

	private void MeridianEventTriggerInteraction_Start(orig_Start orig, MeridianEventTriggerInteraction self)
	{
		orig.Invoke(self);
		if (Object.op_Implicit((Object)(object)self.phase2CombatDirector))
		{
			CombatDirector component = self.phase2CombatDirector.GetComponent<CombatDirector>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.maxSquadCount = (uint)Mathf.Min(Run.instance.stageClearCount + 1, 40);
			}
		}
	}
}
public class Geep
{
	public static CharacterSpawnCard cscGeep = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/DLC1/Gup/cscGeepBody.asset").WaitForCompletion();

	public Geep()
	{
		if (Configs.geepCost.Value >= 0)
		{
			((SpawnCard)cscGeep).directorCreditCost = Configs.geepCost.Value;
		}
	}
}
public class Grandparent
{
	public static CharacterSpawnCard cscGrandparent = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/Grandparent/cscGrandparent.asset").WaitForCompletion();

	public static GameObject grandparentMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Grandparent/GrandparentMaster.prefab").WaitForCompletion();

	public static GameObject gravOrb = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Grandparent/GrandparentGravSphere.prefab").WaitForCompletion();

	public static EntityStateConfiguration groundSwipe = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)"RoR2/Base/Grandparent/EntityStates.GrandParentBoss.GroundSwipe.asset").WaitForCompletion();

	public Grandparent()
	{
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Expected O, but got Unknown
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Expected O, but got Unknown
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Expected O, but got Unknown
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_0199: Invalid comparison between Unknown and I4
		if (Configs.grandparentCost.Value >= 0)
		{
			((SpawnCard)cscGrandparent).directorCreditCost = Configs.grandparentCost.Value;
		}
		if (Configs.grandparentRockActivationRange.Value >= 0f)
		{
			AISkillDriver[] components = grandparentMasterPrefab.GetComponents<AISkillDriver>();
			AISkillDriver[] array = components;
			foreach (AISkillDriver val in array)
			{
				if (val.customName == "GroundSwipe")
				{
					val.maxDistance = Configs.grandparentRockActivationRange.Value;
				}
			}
		}
		if (Configs.grandparentRockDynamicSpeed.Value)
		{
			GroundSwipe.FixedUpdate += new hook_FixedUpdate(RockDynamicSpeed);
		}
		if (Configs.grandparentRockTargeting.Value)
		{
			bool hookFailed = true;
			GroundSwipe.FixedUpdate += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_0222: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val3 = new ILCursor(il);
				if (val3.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchStfld<BullseyeSearch>(x, "searchOrigin")
				}) && val3.TryGotoPrev((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, "EntityStates.EntityState", "get_characterBody")
				}))
				{
					val3.RemoveRange(2);
					val3.EmitDelegate<Func<BaseState, Vector3>>((Func<BaseState, Vector3>)delegate(BaseState state)
					{
						//IL_0002: Unknown result type (might be due to invalid IL or missing references)
						//IL_0007: Unknown result type (might be due to invalid IL or missing references)
						//IL_000a: Unknown result type (might be due to invalid IL or missing references)
						//IL_000f: 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)
						Ray aimRay2 = state.GetAimRay();
						return ((Ray)(ref aimRay2)).origin;
					});
					if (val3.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchStfld<BullseyeSearch>(x, "searchDirection")
					}) && val3.TryGotoPrev((MoveType)0, new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, "EntityStates.EntityState", "get_characterBody")
					}))
					{
						val3.RemoveRange(2);
						val3.EmitDelegate<Func<BaseState, Vector3>>((Func<BaseState, Vector3>)delegate(BaseState state)
						{
							//IL_0002: Unknown result type (might be due to invalid IL or missing references)
							//IL_0007: Unknown result type (might be due to invalid IL or missing references)
							//IL_000a: Unknown result type (might be due to invalid IL or missing references)
							//IL_000f: 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)
							Ray aimRay = state.GetAimRay();
							return ((Ray)(ref aimRay)).direction;
						});
						if (val3.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
						{
							(Instruction x) => ILPatternMatchingExt.MatchStfld<BullseyeSearch>(x, "teamMaskFilter")
						}) && val3.TryGotoPrev((MoveType)0, new Func<Instruction, bool>[1]
						{
							(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<BaseState>(x, "GetTeam")
						}))
						{
							val3.RemoveRange(2);
							val3.EmitDelegate<Func<BaseState, TeamMask>>((Func<BaseState, TeamMask>)delegate(BaseState state)
							{
								//IL_0001: Unknown result type (might be due to invalid IL or missing references)
								//IL_0006: Unknown result type (might be due to invalid IL or missing references)
								//IL_002b: Unknown result type (might be due to invalid IL or missing references)
								//IL_002c: Unknown result type (might be due to invalid IL or missing references)
								//IL_001f: Unknown result type (might be due to invalid IL or missing references)
								//IL_002f: Unknown result type (might be due to invalid IL or missing references)
								TeamMask allButNeutral = TeamMask.allButNeutral;
								if (Object.op_Implicit((Object)(object)((EntityState)state).teamComponent))
								{
									((TeamMask)(ref allButNeutral)).RemoveTeam(((EntityState)state).teamComponent.teamIndex);
								}
								return allButNeutral;
							});
							if (val3.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
							{
								(Instruction x) => ILPatternMatchingExt.MatchStfld<BullseyeSearch>(x, "sortMode")
							}))
							{
								int index = val3.Index;
								val3.Index = index - 1;
								val3.Next.OpCode = OpCodes.Ldc_I4_2;
								groundSwipe.TryModifyFieldValue("maxBullseyeAngle", 90f);
								hookFailed = false;
							}
						}
					}
				}
				if (hookFailed)
				{
					Log.Error("Granparent rock targeting hook failed!");
				}
			};
		}
		if (Configs.grandparentGravOrbDynamicSpeed.Value)
		{
			FireSecondaryProjectile.Fire += new hook_Fire(FireGravOrb);
		}
		if (Configs.grandparentGravOrbForce.Value != -1000f)
		{
			RadialForce component = gravOrb.GetComponent<RadialForce>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.forceMagnitude = Configs.grandparentGravOrbForce.Value;
			}
		}
		if (!Configs.grandparentReduceDowntime.Value)
		{
			return;
		}
		AISkillDriver[] components2 = grandparentMasterPrefab.GetComponents<AISkillDriver>();
		AISkillDriver[] array2 = components2;
		foreach (AISkillDriver val2 in array2)
		{
			if ((int)val2.skillSlot == -1 && val2.driverUpdateTimerOverride > 2f)
			{
				val2.driverUpdateTimerOverride = 2f;
			}
		}
	}

	private void RockDynamicSpeed(orig_FixedUpdate orig, GroundSwipe self)
	{
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		float num = 0f;
		float num2 = 1f;
		if (((EntityState)self).isAuthority && !self.hasFired && ((EntityState)self).fixedAge >= self.fireProjectileDelay - 0.05f)
		{
			if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody) && Object.op_Implicit((Object)(object)((Component)((EntityState)self).characterBody).gameObject) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.master))
			{
				BaseAI component = ((Component)((EntityState)self).characterBody.master).GetComponent<BaseAI>();
				if (Object.op_Implicit((Object)(object)component) && component.currentEnemy != null && Object.op_Implicit((Object)(object)component.currentEnemy.characterBody) && Object.op_Implicit((Object)(object)((Component)component.currentEnemy.characterBody).gameObject))
				{
					Vector3 val = ((Component)((EntityState)self).characterBody).gameObject.transform.position - ((Component)component.currentEnemy.characterBody).gameObject.transform.position;
					num = ((Vector3)(ref val)).magnitude;
				}
			}
			num2 = Mathf.Clamp(num / 150f, 1f, 3.75f);
		}
		self.projectileHorizontalSpeed *= num2;
		orig.Invoke(self);
		self.projectileHorizontalSpeed /= num2;
	}

	private void FireGravOrb(orig_Fire orig, FireSecondaryProjectile self)
	{
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		float num = 0f;
		if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody) && Object.op_Implicit((Object)(object)((Component)((EntityState)self).characterBody).gameObject) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.master))
		{
			BaseAI component = ((Component)((EntityState)self).characterBody.master).GetComponent<BaseAI>();
			if (Object.op_Implicit((Object)(object)component) && component.currentEnemy != null && Object.op_Implicit((Object)(object)component.currentEnemy.characterBody) && Object.op_Implicit((Object)(object)((Component)component.currentEnemy.characterBody).gameObject))
			{
				Vector3 val = ((Component)((EntityState)self).characterBody).gameObject.transform.position - ((Component)component.currentEnemy.characterBody).gameObject.transform.position;
				num = ((Vector3)(ref val)).magnitude;
			}
		}
		float num2 = Mathf.Clamp(num / 90f, 1f, 15f);
		ProjectileSimple component2 = self.projectilePrefab.GetComponent<ProjectileSimple>();
		if (Object.op_Implicit((Object)(object)component2))
		{
			component2.desiredForwardSpeed *= num2;
		}
		orig.Invoke(self);
		if (Object.op_Implicit((Object)(object)component2))
		{
			component2.desiredForwardSpeed /= num2;
		}
	}
}
public class Gup
{
	public static GameObject gupMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Gup/GupMaster.prefab").WaitForCompletion();

	public Gup()
	{
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		if (Configs.gupDelayAttackOnSpawn.Value)
		{
			AISkillDriver val = gupMasterPrefab.AddComponent<AISkillDriver>();
			val.activationRequiresAimConfirmation = false;
			val.activationRequiresAimTargetLoS = false;
			val.activationRequiresTargetLoS = false;
			val.aimType = (AimType)1;
			val.buttonPressType = (ButtonPressType)1;
			val.customName = "SpawnAttackDelay";
			val.driverUpdateTimerOverride = 1f;
			val.ignoreNodeGraph = false;
			val.maxDistance = float.PositiveInfinity;
			val.maxTargetHealthFraction = float.PositiveInfinity;
			val.maxTimesSelected = 1;
			val.maxUserHealthFraction = float.PositiveInfinity;
			val.minDistance = 0f;
			val.minTargetHealthFraction = float.NegativeInfinity;
			val.minUserHealthFraction = float.NegativeInfinity;
			val.moveInputScale = 1f;
			val.movementType = (MovementType)1;
			val.moveTargetType = (TargetType)0;
			val.noRepeat = true;
			val.requireEquipmentReady = false;
			val.requireSkillReady = false;
			val.resetCurrentEnemyOnNextDriverSelection = false;
			val.selectionRequiresAimTarget = false;
			val.selectionRequiresOnGround = false;
			val.selectionRequiresTargetLoS = false;
			val.selectionRequiresTargetNonFlier = false;
			val.shouldFireEquipment = false;
			val.shouldSprint = false;
			val.skillSlot = (SkillSlot)(-1);
			gupMasterPrefab.ReorderSkillDrivers(val, 0);
		}
	}
}
public class Halcyonite
{
	public static GameObject halcyoniteBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/Halcyonite/HalcyoniteBody.prefab").WaitForCompletion();

	public static CharacterSpawnCard cscHalcyonite = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/DLC2/Halcyonite/cscHalcyonite.asset").WaitForCompletion();

	public static DirectorCardCategorySelection dccsFalseSonPhase2 = Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/meridian/dccsFalseSonBossPhase2.asset").WaitForCompletion();

	public static DirectorCardCategorySelection[] dccsWithHalcyoniteChampion = (DirectorCardCategorySelection[])(object)new DirectorCardCategorySelection[12]
	{
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsBlackBeachMonstersDLC2.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsGolemplainsMonstersDLC2Only.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsSnowyForestMonstersDLC2.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/lakes/dccsLakesMonstersDLC2.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/lakesnight/dccsLakesnightMonsters.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsGooLakeMonstersDLC2Only.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsFoggySwampMonstersDLC2Only.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/lemuriantemple/dccsLemurianTempleMonsters.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/habitat/dccsHabitatMonsters.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/habitatfall/dccsHabitatfallMonsters.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsDampCaveMonstersDLC2Only.asset").WaitForCompletion(),
		Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/dccsRootJungleMonstersDLC2.asset").WaitForCompletion()
	};

	public static Stage[] stagesWithHalcyoniteChampion;

	public Halcyonite()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: 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_0029: 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_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: 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_004e: Expected O, but got Unknown
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Expected O, but got Unknown
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Expected O, but got Unknown
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Expected O, but got Unknown
		//IL_0123: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Invalid comparison between Unknown and I8
		//IL_0135: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Invalid comparison between Unknown and I8
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_014d: Invalid comparison between Unknown and I8
		//IL_016a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Invalid comparison between Unknown and I8
		//IL_014f: Unknown result type (might be due to invalid IL or missing references)
		//IL_015a: Invalid comparison between Unknown and I8
		//IL_0182: Unknown result type (might be due to invalid IL or missing references)
		//IL_0187: Unknown result type (might be due to invalid IL or missing references)
		//IL_0188: Unknown result type (might be due to invalid IL or missing references)
		//IL_018d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Expected O, but got Unknown
		//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Expected O, but got Unknown
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
		if (Configs.halcyoniteOnMeridianPreLoop.Value)
		{
			DirectorCardHolder val = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 1,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscHalcyonite
				},
				MonsterCategory = (MonsterCategory)3
			};
			Helpers.RemoveExistingMonsterFromStage("Halcyonite", (Stage)2199023255552L, "");
			Helpers.AddNewMonsterToStage(val, false, (Stage)2199023255552L, "");
		}
		if (Configs.halcyoniteOnFalseSonLoop.Value)
		{
			DirectorCardHolder val2 = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 5,
					preventOverhead = false,
					selectionWeight = 25,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscHalcyonite
				},
				MonsterCategory = (MonsterCategory)3
			};
			DirectorAPI.AddCard(dccsFalseSonPhase2, val2);
		}
		if (!Configs.halcyoniteProperCategory.Value)
		{
			return;
		}
		for (int i = 0; i < dccsWithHalcyoniteChampion.Length; i++)
		{
			DirectorCardCategorySelection dccs = dccsWithHalcyoniteChampion[i];
			if (CheckForHalcyonite(dccs))
			{
				Stage val3 = stagesWithHalcyoniteChampion[i];
				int minimumStageCompletions = 4;
				int selectionWeight = 1;
				if ((long)val3 == 2147483648u || (long)val3 == 137438953472L || (long)val3 == 274877906944L || (long)val3 == 549755813888L)
				{
					minimumStageCompletions = 0;
				}
				if ((long)val3 == 137438953472L)
				{
					selectionWeight = 2;
				}
				DirectorCardHolder val4 = new DirectorCardHolder
				{
					Card = new DirectorCard
					{
						minimumStageCompletions = minimumStageCompletions,
						preventOverhead = false,
						selectionWeight = selectionWeight,
						spawnDistance = (MonsterSpawnDistance)0,
						spawnCard = (SpawnCard)(object)cscHalcyonite
					},
					MonsterCategory = (MonsterCategory)3
				};
				Helpers.RemoveExistingMonsterFromStage("Halcyonite", val3, "");
				Helpers.AddNewMonsterToStage(val4, false, val3, "");
			}
		}
	}

	private bool CheckForHalcyonite(DirectorCardCategorySelection dccs)
	{
		//IL_0011: 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_0019: Unknown result type (might be due to invalid IL or missing references)
		bool result = false;
		Category[] categories = dccs.categories;
		foreach (Category val in categories)
		{
			DirectorCard[] cards = val.cards;
			foreach (DirectorCard val2 in cards)
			{
				if ((Object)(object)val2.GetSpawnCard() == (Object)(object)cscHalcyonite)
				{
					result = true;
					break;
				}
			}
		}
		return result;
	}

	static Halcyonite()
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		Stage[] array = new Stage[12];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		stagesWithHalcyoniteChampion = (Stage[])(object)array;
	}
}
public class Imp
{
	public static CharacterSpawnCard cscImp = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/Imp/cscImp.asset").WaitForCompletion();

	public Imp()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: 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_0029: 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_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: 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_004e: Expected O, but got Unknown
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Expected O, but got Unknown
		if (Configs.impOnHelminthRoost.Value)
		{
			DirectorCardHolder val = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 2,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscImp
				},
				MonsterCategory = (MonsterCategory)2
			};
			Helpers.AddNewMonsterToStage(val, false, (Stage)1099511627776L, "");
		}
	}
}
public class Lemurian
{
	public static GameObject lemurianMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Lemurian/LemurianMaster.prefab").WaitForCompletion();

	public Lemurian()
	{
		//IL_005f: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Invalid comparison between Unknown and I4
		if (!(Configs.lemurianFireballRange.Value >= 0f))
		{
			return;
		}
		if (Configs.lemurianFireballRange.Value > 30f)
		{
			AISkillDriver val = lemurianMasterPrefab.AddComponent<AISkillDriver>();
			val.activationRequiresAimConfirmation = false;
			val.activationRequiresAimTargetLoS = false;
			val.activationRequiresTargetLoS = true;
			val.aimType = (AimType)1;
			val.buttonPressType = (ButtonPressType)0;
			val.customName = "ChasePrimary";
			val.driverUpdateTimerOverride = -1f;
			val.ignoreNodeGraph = false;
			val.maxDistance = Configs.lemurianFireballRange.Value;
			val.maxTargetHealthFraction = float.PositiveInfinity;
			val.maxTimesSelected = -1;
			val.maxUserHealthFraction = float.PositiveInfinity;
			val.minDistance = 15f;
			val.minTargetHealthFraction = float.NegativeInfinity;
			val.minUserHealthFraction = float.NegativeInfinity;
			val.moveInputScale = 1f;
			val.movementType = (MovementType)1;
			val.moveTargetType = (TargetType)0;
			val.noRepeat = false;
			val.requireEquipmentReady = false;
			val.requireSkillReady = false;
			val.resetCurrentEnemyOnNextDriverSelection = false;
			val.selectionRequiresAimTarget = false;
			val.selectionRequiresOnGround = false;
			val.selectionRequiresTargetLoS = true;
			val.selectionRequiresTargetNonFlier = false;
			val.shouldFireEquipment = false;
			val.shouldSprint = false;
			val.skillSlot = (SkillSlot)0;
			lemurianMasterPrefab.ReorderSkillDrivers(val, 4);
			return;
		}
		AISkillDriver[] components = lemurianMasterPrefab.GetComponents<AISkillDriver>();
		AISkillDriver[] array = components;
		foreach (AISkillDriver val2 in array)
		{
			if ((int)val2.skillSlot == 0)
			{
				val2.maxDistance = Configs.lemurianFireballRange.Value;
			}
		}
	}
}
public class MiniMushrum
{
	public static GameObject mushrumMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/MiniMushroom/MiniMushroomMaster.prefab").WaitForCompletion();

	public static GameObject mushrumBodyPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/MiniMushroom/MiniMushroomBody.prefab").WaitForCompletion();

	public static CharacterSpawnCard cscMiniMushroom = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/MiniMushroom/cscMiniMushroom.asset").WaitForCompletion();

	public MiniMushrum()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0185: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_018b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Expected O, but got Unknown
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01be: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c5: Expected O, but got Unknown
		if (Configs.mushrumSprintDist.Value >= 0f)
		{
			AISkillDriver val = mushrumMasterPrefab.AddComponent<AISkillDriver>();
			val.activationRequiresAimConfirmation = false;
			val.activationRequiresAimTargetLoS = false;
			val.activationRequiresTargetLoS = false;
			val.aimType = (AimType)1;
			val.buttonPressType = (ButtonPressType)0;
			val.customName = "PathSprint";
			val.driverUpdateTimerOverride = -1f;
			val.ignoreNodeGraph = false;
			val.maxDistance = float.PositiveInfinity;
			val.maxTargetHealthFraction = float.PositiveInfinity;
			val.maxTimesSelected = -1;
			val.maxUserHealthFraction = float.PositiveInfinity;
			val.minDistance = Configs.mushrumSprintDist.Value;
			val.minTargetHealthFraction = float.NegativeInfinity;
			val.minUserHealthFraction = float.NegativeInfinity;
			val.moveInputScale = 1f;
			val.movementType = (MovementType)1;
			val.moveTargetType = (TargetType)0;
			val.noRepeat = false;
			val.requireEquipmentReady = false;
			val.requireSkillReady = false;
			val.resetCurrentEnemyOnNextDriverSelection = false;
			val.selectionRequiresAimTarget = false;
			val.selectionRequiresOnGround = false;
			val.selectionRequiresTargetLoS = false;
			val.selectionRequiresTargetNonFlier = false;
			val.shouldFireEquipment = false;
			val.shouldSprint = true;
			val.skillSlot = (SkillSlot)(-1);
			mushrumMasterPrefab.ReorderSkillDrivers(val, 3);
		}
		if (Configs.mushrumSprintCoeff.Value >= 0f)
		{
			CharacterBody component = mushrumBodyPrefab.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.sprintingSpeedMultiplier = Configs.mushrumSprintCoeff.Value;
			}
		}
		if (Configs.mushrumOnHabitatFall.Value)
		{
			DirectorCardHolder val2 = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 1,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscMiniMushroom
				},
				MonsterCategory = (MonsterCategory)2
			};
			Helpers.AddNewMonsterToStage(val2, false, (Stage)549755813888L, "");
		}
	}
}
public class SolusControlUnit
{
	public static GameObject scuMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/RoboBallBoss/RoboBallBossMaster.prefab").WaitForCompletion();

	public static GameObject awuMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/RoboBallBoss/SuperRoboBallBossMaster.prefab").WaitForCompletion();

	public static CharacterSpawnCard cscScu = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/RoboBallBoss/cscRoboBallBoss.asset").WaitForCompletion();

	public SolusControlUnit()
	{
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Expected O, but got Unknown
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Expected O, but got Unknown
		if (Configs.scuRespectNodegraph.Value || Configs.scuPrimaryAttackRange.Value >= 0f || Configs.scuProbeHealthThreshold.Value >= 0f)
		{
			AISkillDriver[] components = scuMasterPrefab.GetComponents<AISkillDriver>();
			AISkillDriver[] array = components;
			foreach (AISkillDriver skillDriver in array)
			{
				AdjustSkillDrivers(skillDriver);
			}
			components = awuMasterPrefab.GetComponents<AISkillDriver>();
			AISkillDriver[] array2 = components;
			foreach (AISkillDriver skillDriver2 in array2)
			{
				AdjustSkillDrivers(skillDriver2);
			}
		}
		if (Configs.scuOnSolusWingLoop.Value)
		{
			DirectorCardHolder val = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 5,
					preventOverhead = false,
					selectionWeight = 20,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscScu
				},
				MonsterCategory = (MonsterCategory)4,
				MonsterCategorySelectionWeight = 33f
			};
			Helpers.AddNewMonsterToStage(val, false, (Stage)562949953421312L, "");
		}
	}

	private void AdjustSkillDrivers(AISkillDriver skillDriver)
	{
		switch (skillDriver.customName)
		{
		case "FireAndChase":
			if (Configs.scuRespectNodegraph.Value)
			{
				skillDriver.ignoreNodeGraph = false;
			}
			break;
		case "FireAndStop":
			if (Configs.scuPrimaryAttackRange.Value >= 0f)
			{
				skillDriver.maxDistance = Configs.scuPrimaryAttackRange.Value;
			}
			break;
		case "FireAndFlee":
			if (Configs.scuPrimaryAttackRange.Value >= 0f && Configs.scuPrimaryAttackRange.Value < skillDriver.maxDistance)
			{
				skillDriver.maxDistance = Configs.scuPrimaryAttackRange.Value;
			}
			break;
		case "DeployMinion":
			if (Configs.scuProbeHealthThreshold.Value >= 0f)
			{
				if (Configs.scuProbeHealthThreshold.Value >= 1f)
				{
					skillDriver.maxUserHealthFraction = float.PositiveInfinity;
				}
				else
				{
					skillDriver.maxUserHealthFraction = Configs.scuProbeHealthThreshold.Value;
				}
			}
			break;
		}
	}
}
public class SolusDistributor
{
	public static CharacterSpawnCard cscMinePod = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/DLC3/MinePod/cscMinePod.asset").WaitForCompletion();

	public SolusDistributor()
	{
		if (Configs.distributorCost.Value >= 0)
		{
			((SpawnCard)cscMinePod).directorCreditCost = Configs.distributorCost.Value;
		}
	}
}
public class SolusProbe
{
	public static CharacterSpawnCard cscProbe = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/RoboBallBoss/cscRoboBallMini.asset").WaitForCompletion();

	public static GameObject probeMasterPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/RoboBallBoss/RoboBallMiniMaster.prefab").WaitForCompletion();

	public static FamilyDirectorCardCategorySelection solusFamily = Addressables.LoadAssetAsync<FamilyDirectorCardCategorySelection>((object)"RoR2/DLC3/dccsSuperRoboBallpitFamily.asset").WaitForCompletion();

	public SolusProbe()
	{
		//IL_0041: 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_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Expected O, but got Unknown
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Expected O, but got Unknown
		//IL_00da: 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)
		//IL_00e3: Expected O, but got Unknown
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Expected O, but got Unknown
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Expected O, but got Unknown
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0221: Unknown result type (might be due to invalid IL or missing references)
		//IL_0229: Unknown result type (might be due to invalid IL or missing references)
		//IL_0281: Unknown result type (might be due to invalid IL or missing references)
		if (Configs.probeCost.Value >= 0)
		{
			((SpawnCard)cscProbe).directorCreditCost = Configs.probeCost.Value;
		}
		if (Configs.probeOnShipGraveyard.Value)
		{
			DirectorCardHolder val = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 5,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscProbe
				},
				MonsterCategory = (MonsterCategory)2
			};
			Helpers.AddNewMonsterToStage(val, false, (Stage)256, "");
		}
		if (Configs.probeOnRepurposedCrater.Value)
		{
			DirectorCardHolder val2 = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 5,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscProbe
				},
				MonsterCategory = (MonsterCategory)2
			};
			Helpers.AddNewMonsterToStage(val2, false, (Stage)140737488355328L, "");
		}
		if (Configs.probeOnSolusEvent.Value)
		{
			DirectorCardHolder val3 = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 1,
					spawnDistance = (MonsterSpawnDistance)0,
					spawnCard = (SpawnCard)(object)cscProbe
				},
				MonsterCategory = (MonsterCategory)2
			};
			DirectorAPI.AddCard((DirectorCardCategorySelection)(object)solusFamily, val3);
		}
		if (Configs.probeDelayAttackOnSpawn.Value)
		{
			AISkillDriver val4 = probeMasterPrefab.AddComponent<AISkillDriver>();
			val4.activationRequiresAimConfirmation = false;
			val4.activationRequiresAimTargetLoS = false;
			val4.activationRequiresTargetLoS = false;
			val4.aimType = (AimType)1;
			val4.buttonPressType = (ButtonPressType)1;
			val4.customName = "SpawnAttackDelay";
			val4.driverUpdateTimerOverride = 1.5f;
			val4.ignoreNodeGraph = false;
			val4.maxDistance = float.PositiveInfinity;
			val4.maxTargetHealthFraction = float.PositiveInfinity;
			val4.maxTimesSelected = 1;
			val4.maxUserHealthFraction = float.PositiveInfinity;
			val4.minDistance = 0f;
			val4.minTargetHealthFraction = float.NegativeInfinity;
			val4.minUserHealthFraction = float.NegativeInfinity;
			val4.moveInputScale = 1f;
			val4.movementType = (MovementType)2;
			val4.moveTargetType = (TargetType)0;
			val4.noRepeat = true;
			val4.requireEquipmentReady = false;
			val4.requireSkillReady = false;
			val4.resetCurrentEnemyOnNextDriverSelection = false;
			val4.selectionRequiresAimTarget = false;
			val4.selectionRequiresOnGround = false;
			val4.selectionRequiresTargetLoS = false;
			val4.selectionRequiresTargetNonFlier = false;
			val4.shouldFireEquipment = false;
			val4.shouldSprint = false;
			val4.skillSlot = (SkillSlot)(-1);
			probeMasterPrefab.ReorderSkillDrivers(val4, 0);
		}
	}
}
public class SolusTransporter
{
	public static CharacterSpawnCard cscIronHauler = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/DLC3/IronHauler/cscIronHauler.asset").WaitForCompletion();

	public SolusTransporter()
	{
		if (Configs.transporterCost.Value >= 0)
		{
			((SpawnCard)cscIronHauler).directorCreditCost = Configs.transporterCost.Value;
		}
	}
}
public class VoidReaver
{
	public static CharacterSpawnCard cscNullifier = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"RoR2/Base/Nullifier/cscNullifier.asset").WaitForCompletion();

	public VoidReaver()
	{
		if (Configs.voidReaverCost.Value >= 0)
		{
			((SpawnCard)cscNullifier).directorCreditCost = Configs.voidReaverCost.Value;
		}
	}
}
public class EccentricVase
{
	public static BuffDef cloakBuff = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Common/bdCloak.asset").WaitForCompletion();

	public static BuffDef intangibleBuff = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Common/bdIntangible.asset").WaitForCompletion();

	public static BuffDef fallImmuneBuff = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Junk/Common/bdIgnoreFallDamage.asset").WaitForCompletion();

	public static GameObject ziplineVehicle = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Gateway/ZiplineVehicle.prefab").WaitForCompletion();

	public static EquipmentDef gateway = Addressables.LoadAssetAsync<EquipmentDef>((object)"RoR2/Base/Gateway/Gateway.asset").WaitForCompletion();

	public EccentricVase()
	{
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: Expected O, but got Unknown
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: Expected O, but got Unknown
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Expected O, but got Unknown
		if (Configs.eccentricVaseCooldown.Value >= 0f)
		{
			gateway.cooldown = Configs.eccentricVaseCooldown.Value;
		}
		if (Configs.eccentricVaseMaxDist.Value >= 0f)
		{
			bool hookFailed = true;
			EquipmentSlot.FireGateway += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val = new ILCursor(il);
				float num = default(float);
				if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Component>(x, "GetComponent")
				}) && val.TryGotoPrev((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, ref num)
				}))
				{
					val.Next.Operand = Configs.eccentricVaseMaxDist.Value;
					hookFailed = false;
				}
				if (hookFailed)
				{
					Log.Error("Eccentric Vase length hook failed!");
				}
			};
			if (!hookFailed)
			{
				UpdateDescription(Configs.eccentricVaseMaxDist.Value);
			}
		}
		if (Configs.eccentricVaseAcceleration.Value >= 0f)
		{
			ziplineVehicle.GetComponent<ZiplineVehicle>().acceleration = Configs.eccentricVaseAcceleration.Value;
		}
		if (Configs.eccentricVaseCloak.Value || Configs.eccentricVaseIntangible.Value || Configs.eccentricVaseNoCrater.Value)
		{
			ZiplineVehicle.OnPassengerEnter += new hook_OnPassengerEnter(OnPassengerEnter);
			ZiplineVehicle.OnPassengerExit += new hook_OnPassengerExit(OnPassengerExit);
		}
	}

	private void OnPassengerEnter(orig_OnPassengerEnter orig, ZiplineVehicle self, GameObject passenger)
	{
		CharacterBody component = passenger.GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)component))
		{
			if (Configs.eccentricVaseCloak.Value)
			{
				component.AddBuff(cloakBuff);
			}
			if (Configs.eccentricVaseIntangible.Value)
			{
				component.AddBuff(intangibleBuff);
			}
		}
		orig.Invoke(self, passenger);
	}

	private void OnPassengerExit(orig_OnPassengerExit orig, ZiplineVehicle self, GameObject passenger)
	{
		orig.Invoke(self, passenger);
		CharacterBody component = passenger.GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)component))
		{
			if (Configs.eccentricVaseCloak.Value)
			{
				component.RemoveBuff(cloakBuff);
			}
			if (Configs.eccentricVaseIntangible.Value)
			{
				component.RemoveBuff(intangibleBuff);
			}
			if (Configs.eccentricVaseNoCrater.Value)
			{
				component.AddTimedBuff(fallImmuneBuff, 0.5f);
			}
		}
	}

	private void UpdateDescription(float distance)
	{
		string text = distance.ToString().Replace(",", ".");
		LanguageAPI.Add("EQUIPMENT_GATEWAY_DESC", "Create a <style=cIsUtility>quantum tunnel</style> of up to <style=cIsUtility>" + text + "m</style> in length. Lasts 30 seconds.", "en");
		LanguageAPI.Add("EQUIPMENT_GATEWAY_DESC", "生成一条最长为<style=cIsUtility>" + text + "米</style>的<style=cIsUtility>量子隧道</style>。持续30秒。", "zh-CN");
	}
}
public class ForeignFruit
{
	public static EquipmentDef fruit = Addressables.LoadAssetAsync<EquipmentDef>((object)"RoR2/Base/Fruit/Fruit.asset").WaitForCompletion();

	public ForeignFruit()
	{
		if (Configs.foreignFruitCooldown.Value >= 0f)
		{
			fruit.cooldown = Configs.foreignFruitCooldown.Value;
		}
	}
}
public class Molotov6Pack
{
	public static GameObject molotovDotZone = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Molotov/MolotovProjectileDotZone.prefab").WaitForCompletion();

	public static GameObject molotovClusterProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Molotov/MolotovClusterProjectile.prefab").WaitForCompletion();

	public static GameObject molotovSingleProjectile = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Molotov/MolotovSingleProjectile.prefab").WaitForCompletion();

	public Molotov6Pack()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		float num = 1f;
		float num2 = 2.5f;
		if (Configs.molotovResidueSize.Value >= 0f)
		{
			Transform transform = ((Component)molotovDotZone.GetComponent<ProjectileDotZone>()).gameObject.transform;
			transform.localScale *= Configs.molotovResidueSize.Value;
		}
		if (Configs.molotovResidueDuration.Value >= 0f)
		{
			molotovDotZone.GetComponent<ProjectileDotZone>().lifetime = Configs.molotovResidueDuration.Value;
		}
		if (Configs.molotovResidueTickrate.Value > 0f)
		{
			molotovDotZone.GetComponent<ProjectileDotZone>().fireFrequency = Configs.molotovResidueTickrate.Value;
			num = Configs.molotovResidueTickrate.Value;
		}
		else if (Configs.molotovResidueTickrate.Value == 0f)
		{
			((Behaviour)molotovDotZone.GetComponent<ProjectileDotZone>()).enabled = false;
			num = 0f;
		}
		if (Configs.molotovExplosionDamage.Value >= 0f)
		{
			((ProjectileExplosion)molotovClusterProjectile.GetComponent<ProjectileImpactExplosion>()).blastDamageCoefficient = Configs.molotovExplosionDamage.Value;
			((ProjectileExplosion)molotovSingleProjectile.GetComponent<ProjectileImpactExplosion>()).blastDamageCoefficient = Configs.molotovExplosionDamage.Value;
			num2 = Configs.molotovExplosionDamage.Value;
		}
		if (num != 2f || num2 != 5f)
		{
			UpdateDescription(num * 100f, num2 * 100f);
		}
	}

	private void UpdateDescription(float tickRate, float explosionDamage)
	{
		string text = tickRate.ToString().Replace(",", ".");
		string text2 = explosionDamage.ToString().Replace(",", ".");
		LanguageAPI.Add("EQUIPMENT_MOLOTOV_DESC", "Throw <style=cIsDamage>6</style> molotov cocktails that <style=cIsDamage>ignites</style> enemies for <style=cIsDamage>" + text2 + "% base damage</style>. Each molotov leaves a burning area for <style=cIsDamage>" + text + "% damage per second</style>.", "en");
		LanguageAPI.Add("EQUIPMENT_MOLOTOV_DESC", "投掷<style=cIsDamage>6</style>枚燃烧瓶,对敌人造成<style=cIsDamage>" + text2 + "%</style>基础伤害并使其<style=cIsDamage>点燃</style>。每枚燃烧瓶会留下一片燃烧区域,每秒造成<style=cIsDamage>" + text + "%</style>伤害。", "zh-CN");
	}
}
public class DroneScrapper
{
	public static InteractableSpawnCard iscDroneScrapper = Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/DLC3/DroneScrapper/iscDroneScrapper.asset").WaitForCompletion();

	public DroneScrapper()
	{
		//IL_002b: 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_0031: 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_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Expected O, but got Unknown
		//IL_005b: 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_0063: Expected O, but got Unknown
		iscDroneScrapper.maxSpawnsPerStage = Configs.droneScrapperMaxCount.Value;
		if (Configs.droneScrapperOnHabitat.Value)
		{
			DirectorCardHolder val = new DirectorCardHolder
			{
				Card = new DirectorCard
				{
					minimumStageCompletions = 0,
					preventOverhead = false,
					selectionWeight = 6,
					spawnCard = (SpawnCard)(object)iscDroneScrapper
				},
				InteractableCategory = (InteractableCategory)8
			};
			Helpers.AddNewInteractableToStage(val, (Stage)274877906944L, "");
			Helpers.AddNewInteractableToStage(val, (Stage)549755813888L, "");
		}
	}
}
public class EclipseLite
{
	public EclipseLite()
	{
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Expected O, but got Unknown
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Expected O, but got Unknown
		bool updated = false;
		float baseBarrier = 1f;
		float stackBarrier = 0.25f;
		if (Configs.eclipseLiteBarrierBase.Value >= 0f || Configs.eclipseLiteBarrierStack.Value >= 0f)
		{
			if (Configs.eclipseLiteBarrierBase.Value >= 0f)
			{
				baseBarrier = Configs.eclipseLiteBarrierBase.Value;
			}
			if (Configs.eclipseLiteBarrierStack.Value >= 0f)
			{
				stackBarrier = Configs.eclipseLiteBarrierStack.Value;
			}
			bool hookFailed = true;
			CharacterBody.OnSkillCooldown += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "BarrierOnCooldown")
				}) && val2.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.01f)
				}))
				{
					if (Configs.eclipseLiteBarrierBase.Value >= 0f)
					{
						val2.Next.Operand = Configs.eclipseLiteBarrierBase.Value / 100f;
					}
					int index = val2.Index;
					val2.Index = index + 1;
					if (Configs.eclipseLiteBarrierStack.Value >= 0f)
					{
						val2.Next.Operand = Configs.eclipseLiteBarrierStack.Value / 100f;
					}
					hookFailed = false;
					updated = true;
				}
				if (hookFailed)
				{
					Log.Error("Eclipse Lite barrier gain hook failed!");
				}
			};
		}
		if (Configs.eclipseLiteCountShields.Value)
		{
			bool hook2Failed = true;
			CharacterBody.OnSkillCooldown += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val = new ILCursor(il);
				if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "get_maxHealth")
				}))
				{
					va