Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SadisticCompany v1.0.0
BepInEx/plugins/Sadistic Company/Sadistic Company.dll
Decompiled 6 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using UnityEngine; using UnityEngine.AI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Sadistic Company")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Sadistic Company")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b545d1b4-c426-4c7a-83de-3259a76823f5")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace SadisticCompany; [BepInPlugin("kviks.sadisticcompany", "Sadistic Company", "1.0.0")] public class SadisticCompanyPlugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static bool DebugEnabled; internal static float FactorySizeMultiplier; internal static float DaySpeedMultiplier; internal static float InsidePowerMultiplier; internal static float OutsidePowerMultiplier; internal static float DaytimePowerMultiplier; internal static float InsideDiversityMultiplier; internal static float OutsideDiversityMultiplier; internal static float SpawnRangeBonus; internal static float DaytimeSpawnRangeBonus; internal static float HazardMultiplier; internal static float OutsidePropMultiplier; internal static float DoorLockTimeMultiplier; internal static float ExtraDoorLockChance; internal static float EnemyMaxCountMultiplier; internal static float EnemyDoorSpeedMultiplier; internal static float EnemyProbabilityMultiplier; internal static float EnemyPowerBudgetMultiplier; internal static float EnemyRarityMultiplier; internal static float EnemyStunTimeMultiplier; internal static float EnemyPushForceMultiplier; internal static float EnemyVentDelayMultiplier; internal static float EnemyNavSpeedMultiplier; internal static float EnemyNavAccelerationMultiplier; internal static float EnemyNavAngularSpeedMultiplier; internal static int EnemySpawnGroupBonus; internal static bool EnemiesIgnoreFog; internal static bool DisableEnemyStuns; internal static bool UseNamedEnemyBiases; internal static float PlayerDamageMultiplier; internal static float ScrapWeightMultiplier; internal static float ScrapWeightExtraCap; internal static float ScrapAmountMultiplier; internal static float ScrapValueMultiplier; internal static float BatteryLifeMultiplier; private static readonly HashSet<int> PatchedLevels = new HashSet<int>(); private static readonly HashSet<int> PatchedEnemies = new HashSet<int>(); private static readonly HashSet<int> PatchedItems = new HashSet<int>(); private static readonly HashSet<int> PatchedEnemyInstances = new HashSet<int>(); private static Harmony _harmony; private ConfigEntry<bool> _debug; private ConfigEntry<float> _factorySizeMultiplier; private ConfigEntry<float> _daySpeedMultiplier; private ConfigEntry<float> _insidePowerMultiplier; private ConfigEntry<float> _outsidePowerMultiplier; private ConfigEntry<float> _daytimePowerMultiplier; private ConfigEntry<float> _insideDiversityMultiplier; private ConfigEntry<float> _outsideDiversityMultiplier; private ConfigEntry<float> _spawnRangeBonus; private ConfigEntry<float> _daytimeSpawnRangeBonus; private ConfigEntry<float> _hazardMultiplier; private ConfigEntry<float> _outsidePropMultiplier; private ConfigEntry<float> _doorLockTimeMultiplier; private ConfigEntry<float> _extraDoorLockChance; private ConfigEntry<float> _enemyMaxCountMultiplier; private ConfigEntry<float> _enemyDoorSpeedMultiplier; private ConfigEntry<float> _enemyProbabilityMultiplier; private ConfigEntry<float> _enemyPowerBudgetMultiplier; private ConfigEntry<float> _enemyRarityMultiplier; private ConfigEntry<float> _enemyStunTimeMultiplier; private ConfigEntry<float> _enemyPushForceMultiplier; private ConfigEntry<float> _enemyVentDelayMultiplier; private ConfigEntry<float> _enemyNavSpeedMultiplier; private ConfigEntry<float> _enemyNavAccelerationMultiplier; private ConfigEntry<float> _enemyNavAngularSpeedMultiplier; private ConfigEntry<int> _enemySpawnGroupBonus; private ConfigEntry<bool> _enemiesIgnoreFog; private ConfigEntry<bool> _disableEnemyStuns; private ConfigEntry<bool> _useNamedEnemyBiases; private ConfigEntry<float> _playerDamageMultiplier; private ConfigEntry<float> _scrapWeightMultiplier; private ConfigEntry<float> _scrapWeightExtraCap; private ConfigEntry<float> _scrapAmountMultiplier; private ConfigEntry<float> _scrapValueMultiplier; private ConfigEntry<float> _batteryLifeMultiplier; private void Awake() { //IL_051a: Unknown result type (might be due to invalid IL or missing references) //IL_0524: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; _debug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableDebugLogging", false, "Enables debug logging."); _factorySizeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Level", "FactorySizeMultiplier", 1.55f, "Bigger factory generation."); _daySpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Level", "DaySpeedMultiplier", 1.45f, "Higher means the day moves faster."); _insidePowerMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "InsidePowerMultiplier", 2.8f, "Multiplies inside enemy power budget."); _outsidePowerMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "OutsidePowerMultiplier", 2.35f, "Multiplies outside enemy power budget."); _daytimePowerMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "DaytimePowerMultiplier", 2.1f, "Multiplies daytime enemy power budget."); _insideDiversityMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "InsideDiversityMultiplier", 1.9f, "Multiplies inside diversity budget."); _outsideDiversityMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "OutsideDiversityMultiplier", 1.75f, "Multiplies outside diversity budget."); _spawnRangeBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "InsideSpawnRangeBonus", 5f, "Adds to level spawnProbabilityRange."); _daytimeSpawnRangeBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Spawns", "DaytimeSpawnRangeBonus", 12f, "Adds to daytimeEnemiesProbabilityRange."); _hazardMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map", "IndoorHazardMultiplier", 2.8f, "Multiplies indoor hazard counts."); _outsidePropMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map", "OutsidePropMultiplier", 2.2f, "Multiplies outside hazard or object counts."); _doorLockTimeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map", "DoorLockTimeMultiplier", 2.25f, "Higher locked-door pick time."); _extraDoorLockChance = ((BaseUnityPlugin)this).Config.Bind<float>("Map", "ExtraDoorLockChance", 0.58f, "Chance to lock additional lockable doors after vanilla setup."); _enemyMaxCountMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyMaxCountMultiplier", 2.2f, "Higher per-enemy max count."); _enemyDoorSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyDoorSpeedMultiplier", 1.65f, "Enemies open doors faster."); _enemyProbabilityMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyProbabilityMultiplier", 1.45f, "Multiplies enemy probability curves."); _enemyPowerBudgetMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyPowerLevelMultiplier", 0.72f, "Lower values let more enemies fit into the power budget."); _enemyRarityMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyRarityMultiplier", 1.45f, "Multiplies spawn rarity in level enemy lists."); _enemyStunTimeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyStunTimeMultiplier", 0.55f, "Lower means enemies recover from stun faster."); _enemyPushForceMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyPushForceMultiplier", 1.35f, "Higher push force and distance from enemies."); _enemyVentDelayMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyVentDelayMultiplier", 0.7f, "Lower means less warning before vent audio and spawn pressure."); _enemyNavSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyNavSpeedMultiplier", 1.18f, "Multiplies spawned enemy nav speed."); _enemyNavAccelerationMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyNavAccelerationMultiplier", 1.25f, "Multiplies spawned enemy nav acceleration."); _enemyNavAngularSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Enemies", "EnemyNavAngularSpeedMultiplier", 1.18f, "Multiplies spawned enemy turn speed."); _enemySpawnGroupBonus = ((BaseUnityPlugin)this).Config.Bind<int>("Enemies", "EnemySpawnGroupBonus", 1, "Adds to spawnInGroupsOf where applicable."); _enemiesIgnoreFog = ((BaseUnityPlugin)this).Config.Bind<bool>("Enemies", "EnemiesIgnoreFog", true, "Enemies can see through fog."); _disableEnemyStuns = ((BaseUnityPlugin)this).Config.Bind<bool>("Enemies", "DisableEnemyStuns", false, "Enemies cannot be stunned."); _useNamedEnemyBiases = ((BaseUnityPlugin)this).Config.Bind<bool>("Enemies", "UseNamedEnemyBiases", true, "Extra buffs for iconic high-threat enemies."); _playerDamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player", "DamageTakenMultiplier", 1.35f, "All received damage multiplier."); _scrapWeightMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Rewards", "ExtraScrapBurdenMultiplier", 1.08f, "Only scales the weight above vanilla baseline so light scrap stays light."); _scrapWeightExtraCap = ((BaseUnityPlugin)this).Config.Bind<float>("Rewards", "ExtraScrapBurdenCap", 0.3f, "Maximum added weight above vanilla baseline."); _scrapAmountMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Rewards", "ScrapAmountMultiplier", 1.3f, "Higher means more scrap spawns in the level."); _scrapValueMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Rewards", "ScrapValueMultiplier", 1.4f, "Higher means scrap rolls more cash value."); _batteryLifeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player", "BatteryLifeMultiplier", 0.75f, "Lower means batteries drain faster."); ApplyConfig(); HookConfig(); _harmony = new Harmony("kviks.sadisticcompany"); _harmony.PatchAll(); if (DebugEnabled) { Log.LogInfo((object)"[SC] Loaded risk/reward balanced preset."); } } private void ApplyConfig() { DebugEnabled = _debug.Value; FactorySizeMultiplier = Mathf.Max(1f, _factorySizeMultiplier.Value); DaySpeedMultiplier = Mathf.Max(0.5f, _daySpeedMultiplier.Value); InsidePowerMultiplier = Mathf.Max(1f, _insidePowerMultiplier.Value); OutsidePowerMultiplier = Mathf.Max(1f, _outsidePowerMultiplier.Value); DaytimePowerMultiplier = Mathf.Max(1f, _daytimePowerMultiplier.Value); InsideDiversityMultiplier = Mathf.Max(1f, _insideDiversityMultiplier.Value); OutsideDiversityMultiplier = Mathf.Max(1f, _outsideDiversityMultiplier.Value); SpawnRangeBonus = Mathf.Max(0f, _spawnRangeBonus.Value); DaytimeSpawnRangeBonus = Mathf.Max(0f, _daytimeSpawnRangeBonus.Value); HazardMultiplier = Mathf.Max(1f, _hazardMultiplier.Value); OutsidePropMultiplier = Mathf.Max(1f, _outsidePropMultiplier.Value); DoorLockTimeMultiplier = Mathf.Max(1f, _doorLockTimeMultiplier.Value); ExtraDoorLockChance = Mathf.Clamp01(_extraDoorLockChance.Value); EnemyMaxCountMultiplier = Mathf.Max(1f, _enemyMaxCountMultiplier.Value); EnemyDoorSpeedMultiplier = Mathf.Max(1f, _enemyDoorSpeedMultiplier.Value); EnemyProbabilityMultiplier = Mathf.Max(1f, _enemyProbabilityMultiplier.Value); EnemyPowerBudgetMultiplier = Mathf.Clamp(_enemyPowerBudgetMultiplier.Value, 0.2f, 2f); EnemyRarityMultiplier = Mathf.Max(1f, _enemyRarityMultiplier.Value); EnemyStunTimeMultiplier = Mathf.Clamp(_enemyStunTimeMultiplier.Value, 0.1f, 3f); EnemyPushForceMultiplier = Mathf.Max(1f, _enemyPushForceMultiplier.Value); EnemyVentDelayMultiplier = Mathf.Clamp(_enemyVentDelayMultiplier.Value, 0.1f, 2f); EnemyNavSpeedMultiplier = Mathf.Max(1f, _enemyNavSpeedMultiplier.Value); EnemyNavAccelerationMultiplier = Mathf.Max(1f, _enemyNavAccelerationMultiplier.Value); EnemyNavAngularSpeedMultiplier = Mathf.Max(1f, _enemyNavAngularSpeedMultiplier.Value); EnemySpawnGroupBonus = Mathf.Clamp(_enemySpawnGroupBonus.Value, 0, 5); EnemiesIgnoreFog = _enemiesIgnoreFog.Value; DisableEnemyStuns = _disableEnemyStuns.Value; UseNamedEnemyBiases = _useNamedEnemyBiases.Value; PlayerDamageMultiplier = Mathf.Max(1f, _playerDamageMultiplier.Value); ScrapWeightMultiplier = Mathf.Clamp(_scrapWeightMultiplier.Value, 1f, 1.5f); ScrapWeightExtraCap = Mathf.Clamp(_scrapWeightExtraCap.Value, 0f, 0.5f); ScrapAmountMultiplier = Mathf.Clamp(_scrapAmountMultiplier.Value, 1f, 4f); ScrapValueMultiplier = Mathf.Clamp(_scrapValueMultiplier.Value, 1f, 4f); BatteryLifeMultiplier = Mathf.Clamp(_batteryLifeMultiplier.Value, 0.1f, 1f); } private void HookConfig() { _debug.SettingChanged += delegate { ApplyConfig(); }; _factorySizeMultiplier.SettingChanged += delegate { ApplyConfig(); }; _daySpeedMultiplier.SettingChanged += delegate { ApplyConfig(); }; _insidePowerMultiplier.SettingChanged += delegate { ApplyConfig(); }; _outsidePowerMultiplier.SettingChanged += delegate { ApplyConfig(); }; _daytimePowerMultiplier.SettingChanged += delegate { ApplyConfig(); }; _insideDiversityMultiplier.SettingChanged += delegate { ApplyConfig(); }; _outsideDiversityMultiplier.SettingChanged += delegate { ApplyConfig(); }; _spawnRangeBonus.SettingChanged += delegate { ApplyConfig(); }; _daytimeSpawnRangeBonus.SettingChanged += delegate { ApplyConfig(); }; _hazardMultiplier.SettingChanged += delegate { ApplyConfig(); }; _outsidePropMultiplier.SettingChanged += delegate { ApplyConfig(); }; _doorLockTimeMultiplier.SettingChanged += delegate { ApplyConfig(); }; _extraDoorLockChance.SettingChanged += delegate { ApplyConfig(); }; _enemyMaxCountMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyDoorSpeedMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyProbabilityMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyPowerBudgetMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyRarityMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyStunTimeMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyPushForceMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyVentDelayMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyNavSpeedMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyNavAccelerationMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemyNavAngularSpeedMultiplier.SettingChanged += delegate { ApplyConfig(); }; _enemySpawnGroupBonus.SettingChanged += delegate { ApplyConfig(); }; _enemiesIgnoreFog.SettingChanged += delegate { ApplyConfig(); }; _disableEnemyStuns.SettingChanged += delegate { ApplyConfig(); }; _useNamedEnemyBiases.SettingChanged += delegate { ApplyConfig(); }; _playerDamageMultiplier.SettingChanged += delegate { ApplyConfig(); }; _scrapWeightMultiplier.SettingChanged += delegate { ApplyConfig(); }; _scrapWeightExtraCap.SettingChanged += delegate { ApplyConfig(); }; _scrapAmountMultiplier.SettingChanged += delegate { ApplyConfig(); }; _scrapValueMultiplier.SettingChanged += delegate { ApplyConfig(); }; _batteryLifeMultiplier.SettingChanged += delegate { ApplyConfig(); }; } internal static void TuneItems(StartOfRound startOfRound) { if (!((Object)(object)startOfRound == (Object)null) && !((Object)(object)startOfRound.allItemsList == (Object)null) && startOfRound.allItemsList.itemsList != null) { for (int i = 0; i < startOfRound.allItemsList.itemsList.Count; i++) { TuneItem(startOfRound.allItemsList.itemsList[i]); } } } internal static void TuneLevel(SelectableLevel level) { if ((Object)(object)level == (Object)null) { return; } int instanceID = ((Object)level).GetInstanceID(); if (!PatchedLevels.Add(instanceID)) { return; } level.factorySizeMultiplier *= FactorySizeMultiplier; level.DaySpeedMultiplier *= DaySpeedMultiplier; level.maxEnemyPowerCount = Mathf.Max(1, Mathf.RoundToInt((float)level.maxEnemyPowerCount * InsidePowerMultiplier)); level.maxOutsideEnemyPowerCount = Mathf.Max(1, Mathf.RoundToInt((float)level.maxOutsideEnemyPowerCount * OutsidePowerMultiplier)); level.maxDaytimeEnemyPowerCount = Mathf.Max(1, Mathf.RoundToInt((float)level.maxDaytimeEnemyPowerCount * DaytimePowerMultiplier)); level.maxInsideDiversityPowerCount = Mathf.Max(1, Mathf.RoundToInt((float)level.maxInsideDiversityPowerCount * InsideDiversityMultiplier)); level.maxOutsideDiversityPowerCount = Mathf.Max(1, Mathf.RoundToInt((float)level.maxOutsideDiversityPowerCount * OutsideDiversityMultiplier)); level.spawnProbabilityRange += SpawnRangeBonus; level.daytimeEnemiesProbabilityRange += DaytimeSpawnRangeBonus; level.minScrap = Mathf.Max(0, Mathf.RoundToInt((float)level.minScrap * ScrapAmountMultiplier)); level.maxScrap = Mathf.Max(level.minScrap + 1, Mathf.RoundToInt((float)level.maxScrap * ScrapAmountMultiplier)); if (level.enemySpawnChanceThroughoutDay != null) { level.enemySpawnChanceThroughoutDay = ScaleCurve(level.enemySpawnChanceThroughoutDay, 1.45f, 0f, 0f, 40f); } if (level.outsideEnemySpawnChanceThroughDay != null) { level.outsideEnemySpawnChanceThroughDay = ScaleCurve(level.outsideEnemySpawnChanceThroughDay, 1.35f, 0f, 0f, 40f); } if (level.daytimeEnemySpawnChanceThroughDay != null) { level.daytimeEnemySpawnChanceThroughDay = ScaleCurve(level.daytimeEnemySpawnChanceThroughDay, 1.3f, 0f, 0f, 40f); } if (level.indoorMapHazards != null) { for (int i = 0; i < level.indoorMapHazards.Length; i++) { if (level.indoorMapHazards[i] != null && level.indoorMapHazards[i].numberToSpawn != null) { level.indoorMapHazards[i].numberToSpawn = ScaleCurve(level.indoorMapHazards[i].numberToSpawn, HazardMultiplier, 0f, 0f, 200f); } } } if (level.spawnableOutsideObjects != null) { for (int j = 0; j < level.spawnableOutsideObjects.Length; j++) { if (level.spawnableOutsideObjects[j] != null && level.spawnableOutsideObjects[j].randomAmount != null) { level.spawnableOutsideObjects[j].randomAmount = ScaleCurve(level.spawnableOutsideObjects[j].randomAmount, OutsidePropMultiplier, 0f, 0f, 200f); } } } TuneEnemyList(level.Enemies); TuneEnemyList(level.OutsideEnemies); TuneEnemyList(level.DaytimeEnemies); if (DebugEnabled) { Log.LogInfo((object)("[SC] Tuned level " + level.PlanetName)); } } internal static void ApplyRoundBudgets(RoundManager roundManager) { if (!((Object)(object)roundManager == (Object)null)) { roundManager.currentMaxInsidePower = Mathf.Max(roundManager.currentMaxInsidePower, roundManager.currentMaxInsidePower * InsidePowerMultiplier); roundManager.currentMaxOutsidePower = Mathf.Max(roundManager.currentMaxOutsidePower, roundManager.currentMaxOutsidePower * OutsidePowerMultiplier); roundManager.currentMaxInsideDiversityLevel = Mathf.Max(roundManager.currentMaxInsideDiversityLevel, Mathf.RoundToInt((float)roundManager.currentMaxInsideDiversityLevel * InsideDiversityMultiplier)); roundManager.currentMaxOutsideDiversityLevel = Mathf.Max(roundManager.currentMaxOutsideDiversityLevel, Mathf.RoundToInt((float)roundManager.currentMaxOutsideDiversityLevel * OutsideDiversityMultiplier)); roundManager.scrapAmountMultiplier = Mathf.Max(roundManager.scrapAmountMultiplier, ScrapAmountMultiplier); roundManager.scrapValueMultiplier = Mathf.Max(roundManager.scrapValueMultiplier, ScrapValueMultiplier); roundManager.minEnemiesToSpawn = Mathf.Max(roundManager.minEnemiesToSpawn, 2); } } internal static void InflateExtraDoorLocks(Vector3 mainEntrancePosition) { //IL_0095: 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_00af: 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_00c3: Unknown result type (might be due to invalid IL or missing references) if (ExtraDoorLockChance <= 0f || (Object)(object)StartOfRound.Instance == (Object)null) { return; } Random random = new Random(StartOfRound.Instance.randomMapSeed + 9124); DoorLock[] array = Object.FindObjectsOfType<DoorLock>(); if (array == null || array.Length == 0) { return; } foreach (DoorLock val in array) { if (!((Object)(object)val == (Object)null) && !val.isLocked && val.canBeLocked && !(((Component)val).transform.position.y > -160f) && (!(mainEntrancePosition != Vector3.zero) || !(Vector3.Distance(mainEntrancePosition, ((Component)val).transform.position) < 18f)) && !(random.NextDouble() > (double)ExtraDoorLockChance)) { float num = Mathf.Clamp(24f + (float)random.NextDouble() * 55f, 10f, 120f); val.LockDoor(num); } } } internal static void TuneEnemyInstance(EnemyAI enemy) { if ((Object)(object)enemy == (Object)null) { return; } int instanceID = ((Object)enemy).GetInstanceID(); if (PatchedEnemyInstances.Add(instanceID)) { float num = EnemyNavSpeedMultiplier; if (UseNamedEnemyBiases && (Object)(object)enemy.enemyType != (Object)null) { num *= GetNamedEnemyNavBias(enemy.enemyType); } enemy.openDoorSpeedMultiplier *= EnemyDoorSpeedMultiplier; if ((Object)(object)enemy.agent != (Object)null) { NavMeshAgent agent = enemy.agent; agent.speed *= num; NavMeshAgent agent2 = enemy.agent; agent2.acceleration *= EnemyNavAccelerationMultiplier; NavMeshAgent agent3 = enemy.agent; agent3.angularSpeed *= EnemyNavAngularSpeedMultiplier; } } } private static void TuneEnemyList(List<SpawnableEnemyWithRarity> enemies) { if (enemies == null) { return; } for (int i = 0; i < enemies.Count; i++) { SpawnableEnemyWithRarity val = enemies[i]; if (val != null && !((Object)(object)val.enemyType == (Object)null)) { val.rarity = Mathf.Clamp(Mathf.RoundToInt((float)val.rarity * EnemyRarityMultiplier), 1, 999); TuneEnemy(val.enemyType); } } } private static void TuneEnemy(EnemyType enemy) { int instanceID = ((Object)enemy).GetInstanceID(); if (PatchedEnemies.Add(instanceID)) { float maxCountMultiplier = EnemyMaxCountMultiplier; float powerBudgetMultiplier = EnemyPowerBudgetMultiplier; float probabilityMultiplier = EnemyProbabilityMultiplier; float doorSpeedMultiplier = EnemyDoorSpeedMultiplier; float navSpeedMultiplier = EnemyNavSpeedMultiplier; int spawnGroupBonus = EnemySpawnGroupBonus; if (UseNamedEnemyBiases) { ApplyNamedEnemyBiases(enemy, ref maxCountMultiplier, ref powerBudgetMultiplier, ref probabilityMultiplier, ref doorSpeedMultiplier, ref navSpeedMultiplier, ref spawnGroupBonus); } enemy.MaxCount = Mathf.Clamp(Mathf.RoundToInt((float)enemy.MaxCount * maxCountMultiplier), 1, 64); enemy.PowerLevel = Mathf.Clamp(enemy.PowerLevel * powerBudgetMultiplier, 0.05f, 100f); enemy.doorSpeedMultiplier *= doorSpeedMultiplier; enemy.stunTimeMultiplier = Mathf.Clamp(enemy.stunTimeMultiplier * EnemyStunTimeMultiplier, 0.1f, 10f); enemy.pushPlayerForce *= EnemyPushForceMultiplier; enemy.pushPlayerDistance *= Mathf.Lerp(1f, EnemyPushForceMultiplier, 0.5f); enemy.timeToPlayAudio = Mathf.Clamp(enemy.timeToPlayAudio * EnemyVentDelayMultiplier, 1f, 60f); enemy.canSeeThroughFog = enemy.canSeeThroughFog || EnemiesIgnoreFog; enemy.canBeStunned = !DisableEnemyStuns && enemy.canBeStunned; if (enemy.spawnInGroupsOf > 0) { enemy.spawnInGroupsOf = Mathf.Clamp(enemy.spawnInGroupsOf + spawnGroupBonus, 1, 8); } if (enemy.probabilityCurve != null) { enemy.probabilityCurve = ScaleCurve(enemy.probabilityCurve, probabilityMultiplier, 0f, 0f, 200f); } if (enemy.useNumberSpawnedFalloff && enemy.numberSpawnedFalloff != null) { enemy.numberSpawnedFalloff = ScaleCurve(enemy.numberSpawnedFalloff, 1.2f, 0f, 0f, 200f); } enemy.nestsSpawned = 0; enemy.numberSpawned = 0; enemy.hasSpawnedAtLeastOne = false; } } private static float GetNamedEnemyNavBias(EnemyType enemy) { string text = ((enemy.enemyName == null) ? string.Empty : enemy.enemyName.ToLowerInvariant()); if (text.Contains("thumper") || text.Contains("crawler") || text.Contains("spider") || text.Contains("centipede")) { return 1.15f; } if (text.Contains("forest") || text.Contains("keeper") || text.Contains("dog") || text.Contains("baboon") || text.Contains("hawk")) { return 1.12f; } if (text.Contains("coil") || text.Contains("head") || text.Contains("bracken") || text.Contains("masked")) { return 1.08f; } return 1f; } private static void ApplyNamedEnemyBiases(EnemyType enemy, ref float maxCountMultiplier, ref float powerBudgetMultiplier, ref float probabilityMultiplier, ref float doorSpeedMultiplier, ref float navSpeedMultiplier, ref int spawnGroupBonus) { string text = ((enemy.enemyName == null) ? string.Empty : enemy.enemyName.ToLowerInvariant()); if (text.Contains("jester") || text.Contains("girl") || text.Contains("dress") || text.Contains("ghost")) { maxCountMultiplier *= 1.25f; powerBudgetMultiplier *= 0.85f; probabilityMultiplier *= 1.2f; } if (text.Contains("coil") || text.Contains("head") || text.Contains("bracken") || text.Contains("masked")) { maxCountMultiplier *= 1.2f; powerBudgetMultiplier *= 0.82f; probabilityMultiplier *= 1.15f; doorSpeedMultiplier *= 1.15f; navSpeedMultiplier *= 1.08f; } if (text.Contains("thumper") || text.Contains("crawler") || text.Contains("spider") || text.Contains("centipede")) { maxCountMultiplier *= 1.15f; powerBudgetMultiplier *= 0.84f; probabilityMultiplier *= 1.18f; navSpeedMultiplier *= 1.15f; } if (text.Contains("forest") || text.Contains("keeper") || text.Contains("dog") || text.Contains("baboon") || text.Contains("hawk")) { maxCountMultiplier *= 1.2f; powerBudgetMultiplier *= 0.8f; probabilityMultiplier *= 1.2f; navSpeedMultiplier *= 1.12f; spawnGroupBonus++; } } private static void TuneItem(Item item) { if ((Object)(object)item == (Object)null) { return; } int instanceID = ((Object)item).GetInstanceID(); if (PatchedItems.Add(instanceID)) { if (item.isScrap) { float num = 1f; float num2 = Mathf.Max(0f, item.weight - num); float num3 = Mathf.Min(num2 * (ScrapWeightMultiplier - 1f), ScrapWeightExtraCap); item.weight = num + num2 + num3; } if (item.requiresBattery) { item.batteryUsage = Mathf.Clamp(item.batteryUsage * BatteryLifeMultiplier, 0.1f, 999f); } } } private static AnimationCurve ScaleCurve(AnimationCurve source, float valueMultiplier, float valueOffset, float minValue, float maxValue) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown if (source == null) { return null; } Keyframe[] keys = source.keys; for (int i = 0; i < keys.Length; i++) { Keyframe val = keys[i]; ((Keyframe)(ref val)).value = Mathf.Clamp(((Keyframe)(ref val)).value * valueMultiplier + valueOffset, minValue, maxValue); ((Keyframe)(ref val)).inTangent = ((Keyframe)(ref val)).inTangent * valueMultiplier; ((Keyframe)(ref val)).outTangent = ((Keyframe)(ref val)).outTangent * valueMultiplier; keys[i] = val; } return new AnimationCurve(keys) { preWrapMode = source.preWrapMode, postWrapMode = source.postWrapMode }; } } [HarmonyPatch] internal static class SadisticCompanyPatches { [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPostfix] private static void StartOfRoundAwakePostfix(StartOfRound __instance) { SadisticCompanyPlugin.TuneItems(__instance); } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPostfix] private static void LoadNewLevelPostfix(RoundManager __instance, SelectableLevel newLevel) { SadisticCompanyPlugin.TuneLevel(newLevel ?? __instance.currentLevel); } [HarmonyPatch(typeof(RoundManager), "RefreshEnemiesList")] [HarmonyPostfix] private static void RefreshEnemiesListPostfix(RoundManager __instance) { SadisticCompanyPlugin.ApplyRoundBudgets(__instance); } [HarmonyPatch(typeof(RoundManager), "SetLockedDoors")] [HarmonyPostfix] private static void SetLockedDoorsPostfix(Vector3 mainEntrancePosition) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) SadisticCompanyPlugin.InflateExtraDoorLocks(mainEntrancePosition); } [HarmonyPatch(typeof(DoorLock), "LockDoor")] [HarmonyPrefix] private static void LockDoorPrefix(ref float timeToLockPick) { timeToLockPick = Mathf.Clamp(timeToLockPick * SadisticCompanyPlugin.DoorLockTimeMultiplier, 2f, 240f); } [HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")] [HarmonyPrefix] private static void DamagePlayerPrefix(ref int damageNumber) { damageNumber = Mathf.Max(1, Mathf.RoundToInt((float)damageNumber * SadisticCompanyPlugin.PlayerDamageMultiplier)); } [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPostfix] private static void EnemyStartPostfix(EnemyAI __instance) { SadisticCompanyPlugin.TuneEnemyInstance(__instance); } }