using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using DunGen;
using DunGen.Graph;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MonoMod.Utils;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("LegalCompany")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Legal Company")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: AssemblyInformationalVersion("0.0.0")]
[assembly: AssemblyProduct("LegalCompany")]
[assembly: AssemblyTitle("LegalCompany")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace LegalCompany
{
[BepInPlugin("butterystancakes.lethalcompany.legalcompany", "Legal Company", "0.0.0")]
public class Plugin : BaseUnityPlugin
{
private const string PLUGIN_GUID = "butterystancakes.lethalcompany.legalcompany";
private const string PLUGIN_NAME = "Legal Company";
private const string PLUGIN_VERSION = "0.0.0";
internal static ManualLogSource Logger;
private void Awake()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
Logger = ((BaseUnityPlugin)this).Logger;
new Harmony("butterystancakes.lethalcompany.legalcompany").PatchAll();
Logger.LogInfo((object)"Legal Company v0.0.0 loaded");
}
}
[HarmonyPatch]
internal class Patches
{
private static StartMatchLever startMatchLever;
private static float tempNodeDistance = -1f;
[HarmonyPatch(typeof(StartOfRound), "Start")]
[HarmonyPostfix]
[HarmonyPriority(100)]
private static void StartOfRoundPostStart(StartOfRound __instance)
{
//IL_0720: Unknown result type (might be due to invalid IL or missing references)
//IL_0725: Unknown result type (might be due to invalid IL or missing references)
//IL_0736: Unknown result type (might be due to invalid IL or missing references)
//IL_073b: Unknown result type (might be due to invalid IL or missing references)
//IL_074c: Unknown result type (might be due to invalid IL or missing references)
//IL_0751: Unknown result type (might be due to invalid IL or missing references)
//IL_0756: Unknown result type (might be due to invalid IL or missing references)
//IL_0760: Expected O, but got Unknown
//IL_0dc0: Unknown result type (might be due to invalid IL or missing references)
//IL_0dc5: Unknown result type (might be due to invalid IL or missing references)
//IL_0dd2: Unknown result type (might be due to invalid IL or missing references)
//IL_0de4: Expected O, but got Unknown
//IL_0c05: Unknown result type (might be due to invalid IL or missing references)
//IL_0c0a: Unknown result type (might be due to invalid IL or missing references)
//IL_0c12: Unknown result type (might be due to invalid IL or missing references)
//IL_0c26: Expected O, but got Unknown
startMatchLever = Object.FindObjectOfType<StartMatchLever>();
if (__instance.isChallengeFile)
{
return;
}
Dictionary<string, EnemyType> dictionary = new Dictionary<string, EnemyType>();
QuickMenuManager val = Object.FindObjectOfType<QuickMenuManager>();
if ((Object)(object)val != (Object)null)
{
List<SpawnableEnemyWithRarity>[] array = new List<SpawnableEnemyWithRarity>[3]
{
val.testAllEnemiesLevel.Enemies,
val.testAllEnemiesLevel.OutsideEnemies,
val.testAllEnemiesLevel.DaytimeEnemies
};
for (int i = 0; i < array.Length; i++)
{
foreach (SpawnableEnemyWithRarity item3 in array[i])
{
if (!dictionary.ContainsKey(((Object)item3.enemyType).name))
{
dictionary.Add(((Object)item3.enemyType).name, item3.enemyType);
}
}
}
}
RoundManager val2 = RoundManager.Instance ?? Object.FindObjectOfType<RoundManager>();
Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
Dictionary<string, int> dictionary3 = new Dictionary<string, int>();
Dictionary<string, int> dictionary4 = new Dictionary<string, int>();
SpawnableMapObject val3 = null;
AnimationCurve val4 = null;
SelectableLevel[] levels = __instance.levels;
foreach (SelectableLevel val5 in levels)
{
switch (((Object)val5).name)
{
case "ExperimentationLevel":
val5.minScrap = 11;
val5.maxScrap = 16;
break;
case "AssuranceLevel":
val5.minScrap = 11;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 94 },
{ "EnginePart1", 80 },
{ "BigBolt", 89 },
{ "ToyCube", 18 },
{ "StopSign", 27 },
{ "YieldSign", 28 },
{ "ToiletPaperRolls", 18 },
{ "MetalSheet", 100 }
});
break;
case "VowLevel":
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 30 },
{ "EnginePart1", 31 },
{ "BottleBin", 58 },
{ "Flask", 49 },
{ "ToiletPaperRolls", 32 },
{ "PlasticCup", 27 }
});
dictionary4.Add("Level3Flow", 300);
break;
case "MarchLevel":
val5.minScrap = 16;
val5.maxScrap = 21;
val5.factorySizeMultiplier = 1.8f;
dictionary2.Add("RedLocustBees", 72);
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 25 },
{ "EnginePart1", 25 },
{ "BottleBin", 30 },
{ "ToiletPaperRolls", 34 },
{ "PlasticCup", 22 },
{ "Bell", 40 },
{ "MoldPan", 13 }
});
val5.maxEnemyPowerCount = 11;
val5.overrideWeather = true;
break;
case "OffenseLevel":
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 30 },
{ "EnginePart1", 40 },
{ "MetalSheet", 23 },
{ "BigBolt", 59 },
{ "ToyCube", 31 },
{ "StopSign", 34 },
{ "YieldSign", 17 },
{ "ToiletPaperRolls", 19 },
{ "Bell", 28 }
});
val5.maxScrap = 19;
dictionary4.Add("Level3Flow", 300);
break;
case "AdamanceLevel":
val5.minScrap = 19;
val5.maxScrap = 24;
dictionary4.Add("Level2Flow", 17);
break;
case "RendLevel":
val5.factorySizeMultiplier = 1.6f;
Extensions.AddRange<string, int>(dictionary2, new Dictionary<string, int>
{
{ "SpringMan", 70 },
{ "Jester", 69 },
{ "SandWorm", 18 }
});
break;
case "DineLevel":
val5.maxScrap = 28;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 15 },
{ "EnginePart1", 14 },
{ "FancyLamp", 54 },
{ "Ring", 26 },
{ "RobotToy", 26 },
{ "PillBottle", 14 },
{ "PerfumeBottle", 34 },
{ "BottleBin", 30 },
{ "Hairdryer", 22 },
{ "7Ball", 30 },
{ "Airhorn", 16 },
{ "ClownHorn", 17 },
{ "FancyPainting", 50 },
{ "CashRegister", 12 },
{ "Candy", 16 },
{ "GiftBox", 21 },
{ "TragedyMask", 64 }
});
Extensions.AddRange<string, int>(dictionary2, new Dictionary<string, int>
{
{ "DressGirl", 3 },
{ "SandSpider", 7 },
{ "Blob", 3 },
{ "HoarderBug", 8 },
{ "Jester", 5 },
{ "Centipede", 6 },
{ "ForestGiant", 28 },
{ "Butler", 14 }
});
val5.outsideEnemySpawnChanceThroughDay = new AnimationCurve((Keyframe[])(object)new Keyframe[3]
{
new Keyframe(-7.7369623E-07f, -2.8875f),
new Keyframe(0.47669196f, 0.6959345f),
new Keyframe(1.0052626f, 5.3594007f)
});
Plugin.Logger.LogDebug((object)(((Object)val5).name + ".outsideEnemySpawnChanceThroughDay"));
val5.maxEnemyPowerCount = 15;
break;
case "TitanLevel":
val5.maxScrap = 36;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "Cog1", 19 },
{ "EnginePart1", 19 },
{ "FancyLamp", 29 },
{ "FancyPainting", 44 },
{ "PerfumeBottle", 16 },
{ "Mug", 44 },
{ "7Ball", 24 },
{ "DiyFlashbang", 10 },
{ "WhoopieCushion", 18 }
});
Extensions.AddRange<string, int>(dictionary2, new Dictionary<string, int>
{
{ "Blob", 29 },
{ "ForestGiant", 20 },
{ "DressGirl", 28 },
{ "RadMech", 13 }
});
dictionary4.Add("Level2Flow", 69);
val5.canSpawnMold = false;
break;
case "ArtificeLevel":
val5.minScrap = 31;
val5.maxScrap = 38;
val5.factorySizeMultiplier = 2f;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int> { { "GoldBar", 36 } });
Extensions.AddRange<string, int>(dictionary4, new Dictionary<string, int>
{
{ "Level1Flow", 94 },
{ "Level2Flow", 300 }
});
val3 = ((IEnumerable<SpawnableMapObject>)val5.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)delegate(SpawnableMapObject spawnableMapObject)
{
GameObject prefabToSpawn = spawnableMapObject.prefabToSpawn;
return ((prefabToSpawn != null) ? ((Object)prefabToSpawn).name : null) == "TurretContainer";
});
break;
case "EmbrionLevel":
val5.minScrap = 20;
val5.maxScrap = 25;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "YieldSign", 12 },
{ "GiftBox", 64 },
{ "EasterEgg", 17 },
{ "ControlPad", 52 },
{ "SoccerBall", 45 },
{ "MetalSheet", 65 },
{ "Cog1", 37 },
{ "EnginePart1", 40 },
{ "BigBolt", 55 },
{ "FlashLaserPointer", 10 },
{ "BottleBin", 42 },
{ "RobotToy", 49 },
{ "MagnifyingGlass", 37 },
{ "TeaKettle", 23 },
{ "Dentures", 37 },
{ "Phone", 45 },
{ "Airhorn", 39 },
{ "ClownHorn", 31 }
});
val5.canSpawnMold = false;
break;
case "LiquidationLevel":
val4 = ((IEnumerable<SpawnableMapObject>)val5.spawnableMapObjects).FirstOrDefault((Func<SpawnableMapObject, bool>)delegate(SpawnableMapObject spawnableMapObject)
{
GameObject prefabToSpawn2 = spawnableMapObject.prefabToSpawn;
return ((prefabToSpawn2 != null) ? ((Object)prefabToSpawn2).name : null) == "TurretContainer";
})?.numberToSpawn;
break;
}
if (dictionary3.Count > 0)
{
foreach (SpawnableItemWithRarity item4 in val5.spawnableScrap)
{
if (dictionary3.ContainsKey(((Object)item4.spawnableItem).name))
{
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.spawnableScrap: {item4.spawnableItem.itemName} - {item4.rarity} => {dictionary3[((Object)item4.spawnableItem).name]}");
item4.rarity = dictionary3[((Object)item4.spawnableItem).name];
dictionary3.Remove(((Object)item4.spawnableItem).name);
}
if (((Object)item4.spawnableItem).name == "GiftBox" && val5.levelIncludesSnowFootprints && ((Object)val5).name != "ArtificeLevel")
{
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.spawnableScrap: \"GiftBox\" - {item4.rarity} => {item4.rarity + 30}");
item4.rarity += 30;
}
}
if (dictionary3.Count > 0)
{
foreach (KeyValuePair<string, int> itemID in dictionary3)
{
Item val6 = ((IEnumerable<Item>)__instance.allItemsList.itemsList).FirstOrDefault((Func<Item, bool>)((Item item) => ((Object)item).name == itemID.Key));
if ((Object)(object)val6 != (Object)null)
{
SpawnableItemWithRarity item2 = new SpawnableItemWithRarity
{
spawnableItem = val6,
rarity = itemID.Value
};
val5.spawnableScrap.Add(item2);
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.spawnableScrap: +({val6.itemName}, {itemID.Value})");
}
}
}
dictionary3.Clear();
}
if (dictionary2.Count > 0)
{
foreach (KeyValuePair<string, int> item5 in dictionary2)
{
if (dictionary.TryGetValue(item5.Key, out var enemy))
{
List<SpawnableEnemyWithRarity> list = null;
string empty = string.Empty;
if (enemy.isDaytimeEnemy)
{
list = val5.DaytimeEnemies;
empty = "DaytimeEnemies";
}
else if (enemy.isOutsideEnemy && ((Object)enemy).name != "MaskedPlayerEnemy")
{
list = val5.OutsideEnemies;
empty = "OutsideEnemies";
}
else
{
list = val5.Enemies;
empty = "Enemies";
}
SpawnableEnemyWithRarity val7 = ((IEnumerable<SpawnableEnemyWithRarity>)list).FirstOrDefault((Func<SpawnableEnemyWithRarity, bool>)((SpawnableEnemyWithRarity spawnableEnemyWithRarity) => (Object)(object)spawnableEnemyWithRarity.enemyType == (Object)(object)enemy));
if (val7 != null)
{
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.{empty}: {val7.enemyType.enemyName} - {val7.rarity} => {item5.Value}");
val7.rarity = item5.Value;
}
else
{
list.Add(new SpawnableEnemyWithRarity
{
enemyType = enemy,
rarity = item5.Value
});
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.{empty}: +({enemy.enemyName}, {item5.Value})");
}
}
}
dictionary2.Clear();
}
if (dictionary4.Count <= 0)
{
continue;
}
if (val5.dungeonFlowTypes.Length != 0 && (Object)(object)val2 != (Object)null)
{
IntWithRarity[] dungeonFlowTypes = val5.dungeonFlowTypes;
foreach (IntWithRarity val8 in dungeonFlowTypes)
{
DungeonFlow dungeonFlow = val2.dungeonFlowTypes[val8.id].dungeonFlow;
if (dictionary4.TryGetValue((dungeonFlow != null) ? ((Object)dungeonFlow).name : null, out var value))
{
Plugin.Logger.LogDebug((object)$"{((Object)val5).name}.dungeonFlowTypes: {((Object)val2.dungeonFlowTypes[val8.id].dungeonFlow).name}, {val8.rarity} -> {value}");
val8.rarity = value;
}
}
}
dictionary4.Clear();
}
if (val3 != null && val4 != null)
{
val3.numberToSpawn = val4;
Plugin.Logger.LogDebug((object)"ArtificeLevel.spawnableMapObjects.TurretContainer");
}
foreach (Item items in __instance.allItemsList.itemsList)
{
switch (((Object)items).name)
{
case "Jetpack":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.batteryUsage: {items.batteryUsage}s -> 40s");
items.batteryUsage = 40f;
break;
case "ZapGun":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.creditsWorth: {items.creditsWorth} -> $200");
items.creditsWorth = 200;
break;
case "StunGrenade":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.creditsWorth: {items.creditsWorth} -> $40");
items.creditsWorth = 40;
break;
case "RadarBooster":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.creditsWorth: {items.creditsWorth} -> $50");
items.creditsWorth = 50;
break;
}
}
foreach (KeyValuePair<string, EnemyType> item6 in dictionary)
{
if (item6.Key == "Butler")
{
item6.Value.increasedChanceInterior = 1;
Plugin.Logger.LogDebug((object)"Butler.increasedChanceInterior: 1");
}
}
IndoorMapType val9 = ((IEnumerable<IndoorMapType>)val2?.dungeonFlowTypes).FirstOrDefault((Func<IndoorMapType, bool>)((IndoorMapType dungeonFlowType) => ((Object)dungeonFlowType.dungeonFlow).name == "Level3Flow"));
if (val9 != null)
{
Plugin.Logger.LogDebug((object)$"Level3Flow.MapTileSize: {val9.MapTileSize} -> 1.1");
val9.MapTileSize = 1.111111f;
}
}
[HarmonyPatch(typeof(NutcrackerEnemyAI), "GrabGun")]
[HarmonyPostfix]
private static void PostGrabGun(NutcrackerEnemyAI __instance, int ___randomSeedNumber)
{
if (!StartOfRound.Instance.isChallengeFile && !((NetworkBehaviour)__instance).IsServer && ((GrabbableObject)__instance.gun).scrapValue == 60)
{
((GrabbableObject)__instance.gun).SetScrapValue(new Random(___randomSeedNumber).Next(25, 90));
}
}
[HarmonyPatch(typeof(NutcrackerEnemyAI), "InitializeNutcrackerValuesClientRpc")]
[HarmonyPostfix]
private static void PostInitializeNutcrackerValuesClientRpc(NutcrackerEnemyAI __instance, int ___randomSeedNumber)
{
if (!StartOfRound.Instance.isChallengeFile && (Object)(object)__instance.gun != (Object)null)
{
((GrabbableObject)__instance.gun).SetScrapValue(new Random(___randomSeedNumber).Next(25, 90));
}
}
[HarmonyPatch(typeof(LungProp), "Start")]
[HarmonyPostfix]
private static void LungPropPostStart(LungProp __instance)
{
if (!StartOfRound.Instance.isChallengeFile && (Object)(object)startMatchLever != (Object)null && startMatchLever.leverHasBeenPulled && ((GrabbableObject)__instance).scrapValue == 80)
{
((GrabbableObject)__instance).scrapValue = new Random(StartOfRound.Instance.randomMapSeed).Next(40, 120);
}
}
[HarmonyPatch(typeof(GrabbableObject), "Start")]
[HarmonyPostfix]
private static void GrabbableObjectPostStart(GrabbableObject __instance)
{
if (!StartOfRound.Instance.isChallengeFile && (Object)(object)startMatchLever != (Object)null && startMatchLever.leverHasBeenPulled && __instance is KnifeItem)
{
__instance.SetScrapValue((int)((float)new Random(StartOfRound.Instance.randomMapSeed + (int)((NetworkBehaviour)__instance).NetworkObjectId).Next(70, 210) * RoundManager.Instance.scrapValueMultiplier));
}
}
[HarmonyPatch(typeof(TetraChemicalItem), "Update")]
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> TZPUpdate(IEnumerable<CodeInstruction> instructions)
{
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldc_R4 && (float)list[i].operand == 22f)
{
list[i].operand = 24f;
Plugin.Logger.LogDebug((object)"Transpiler (TZP capacity): Increase to 24");
return list;
}
}
return instructions;
}
[HarmonyPatch(typeof(RuntimeDungeon), "Generate")]
[HarmonyPrefix]
private static void RuntimeDungeonPreGenerate(RuntimeDungeon __instance)
{
if (!StartOfRound.Instance.isChallengeFile && RoundManager.Instance.currentDungeonType == 4)
{
if (((Object)StartOfRound.Instance.currentLevel).name == "ArtificeLevel")
{
DungeonGenerator generator = __instance.Generator;
generator.LengthMultiplier *= 0.9f;
}
else if (((Object)StartOfRound.Instance.currentLevel).name == "DineLevel")
{
DungeonGenerator generator2 = __instance.Generator;
generator2.LengthMultiplier *= Mathf.Min(new float[3]
{
StartOfRound.Instance.levels[6].factorySizeMultiplier / StartOfRound.Instance.currentLevel.factorySizeMultiplier * 1.0833333f,
0.923077f,
1f
});
}
}
}
[HarmonyPatch(typeof(FlowermanAI), "Start")]
[HarmonyPostfix]
private static void PostChooseFarthestNodeFromPosition(FlowermanAI __instance)
{
tempNodeDistance = -1f;
}
[HarmonyPatch(typeof(EnemyAI), "ChooseFarthestNodeFromPosition")]
[HarmonyPostfix]
private static void PostChooseFarthestNodeFromPosition(EnemyAI __instance, Transform __result)
{
if ((Object)(object)__result != (Object)null && __instance is FlowermanAI)
{
tempNodeDistance = __instance.mostOptimalDistance;
}
}
[HarmonyPatch(typeof(FlowermanAI), "AvoidClosestPlayer")]
[HarmonyPrefix]
private static void FlowermanAIPreAvoidClosestPlayer(FlowermanAI __instance, ref float __state)
{
__state = ((EnemyAI)__instance).mostOptimalDistance;
if (tempNodeDistance >= 0f)
{
((EnemyAI)__instance).mostOptimalDistance = tempNodeDistance;
}
}
[HarmonyPatch(typeof(FlowermanAI), "AvoidClosestPlayer")]
[HarmonyPostfix]
private static void FlowermanAIPostAvoidClosestPlayer(FlowermanAI __instance, float __state)
{
((EnemyAI)__instance).mostOptimalDistance = __state;
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "LegalCompany";
public const string PLUGIN_NAME = "LegalCompany";
public const string PLUGIN_VERSION = "0.0.0";
}
}