using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using 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 const float WALKIE_WEIGHT = 1.03f;
private const float WALKIE_BATTERY = 400f;
private static StartMatchLever startMatchLever;
private static float tempNodeDistance = -1f;
[HarmonyPatch(typeof(StartOfRound), "Start")]
[HarmonyPostfix]
[HarmonyPriority(100)]
private static void StartOfRoundPostStart(StartOfRound __instance)
{
//IL_06b7: Unknown result type (might be due to invalid IL or missing references)
//IL_06bc: Unknown result type (might be due to invalid IL or missing references)
//IL_06cd: Unknown result type (might be due to invalid IL or missing references)
//IL_06d2: Unknown result type (might be due to invalid IL or missing references)
//IL_06e3: Unknown result type (might be due to invalid IL or missing references)
//IL_06e8: Unknown result type (might be due to invalid IL or missing references)
//IL_06ed: Unknown result type (might be due to invalid IL or missing references)
//IL_06f7: Expected O, but got Unknown
//IL_0d3d: Unknown result type (might be due to invalid IL or missing references)
//IL_0d42: Unknown result type (might be due to invalid IL or missing references)
//IL_0d4f: Unknown result type (might be due to invalid IL or missing references)
//IL_0d61: Expected O, but got Unknown
//IL_0b5f: Unknown result type (might be due to invalid IL or missing references)
//IL_0b64: Unknown result type (might be due to invalid IL or missing references)
//IL_0b6c: Unknown result type (might be due to invalid IL or missing references)
//IL_0b80: 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;
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":
Extensions.AddRange<string, int>(dictionary2, new Dictionary<string, int>
{
{ "SpringMan", 70 },
{ "Jester", 69 }
});
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>
{
{ "ForestGiant", 28 },
{ "Butler", 15 }
});
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.maxScrap = 25;
Extensions.AddRange<string, int>(dictionary3, new Dictionary<string, int>
{
{ "YieldSign", 12 },
{ "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))
{
continue;
}
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;
if (item5.Key == "Butler")
{
val7.enemyType.increasedChanceInterior = 1;
}
}
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 "ExtensionLadder":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.highestSalePercentage: {items.highestSalePercentage} -> 80");
items.highestSalePercentage = 80;
break;
case "Jetpack":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.batteryUsage: {items.batteryUsage}s -> 40s");
items.batteryUsage = 40f;
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.highestSalePercentage: {items.highestSalePercentage} -> 60");
items.highestSalePercentage = 60;
break;
case "ZapGun":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.creditsWorth: {items.creditsWorth} -> $200");
items.creditsWorth = 200;
break;
case "WalkieTalkie":
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.weight: {items.weight} -> {1.03f}");
items.weight = 1.03f;
Plugin.Logger.LogDebug((object)$"{((Object)items).name}.batteryUsage: {items.batteryUsage}s -> {400f}s");
items.batteryUsage = 400f;
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)
{
val9.MapTileSize = 1f;
Plugin.Logger.LogDebug((object)$"Level3Flow.MapTileSize: {val9.MapTileSize} -> 1");
}
}
[HarmonyPatch(typeof(NutcrackerEnemyAI), "GrabGun")]
[HarmonyPostfix]
private static void PostGrabGun(NutcrackerEnemyAI __instance, int ___randomSeedNumber)
{
if (!StartOfRound.Instance.isChallengeFile && !((NetworkBehaviour)__instance).IsServer)
{
((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 = 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(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";
}
}