using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
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.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Chameleon.Info;
using DunGen;
using DunGen.Graph;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: AssemblyCompany("Chameleon")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Changes visual elements of interiors for more variety")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyInformationalVersion("1.3.0+ac84648e56f6d147b6b1ad8c3443b80fb7ff6ccb")]
[assembly: AssemblyProduct("Chameleon")]
[assembly: AssemblyTitle("Chameleon")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.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 Chameleon
{
internal class Configuration
{
internal enum GordionStorms
{
Never = -1,
Chance,
Always
}
internal struct MoonCavernMapping
{
internal string moon;
internal CavernType type;
internal int weight;
}
private static ConfigFile configFile;
internal static ConfigEntry<bool> fancyEntranceDoors;
internal static ConfigEntry<bool> recolorRandomRocks;
internal static ConfigEntry<bool> doorLightColors;
internal static ConfigEntry<bool> rainyMarch;
internal static ConfigEntry<bool> eclipsesBlockMusic;
internal static ConfigEntry<bool> autoAdaptSnow;
internal static ConfigEntry<bool> powerOffBreakerBox;
internal static ConfigEntry<bool> powerOffWindows;
internal static ConfigEntry<bool> planetPreview;
internal static ConfigEntry<bool> snowyGiants;
internal static ConfigEntry<bool> fixDoors;
internal static ConfigEntry<bool> fancyFoliage;
internal static ConfigEntry<bool> fancyShrouds;
internal static ConfigEntry<GordionStorms> stormyGordion;
internal static List<MoonCavernMapping> mappings = new List<MoonCavernMapping>();
internal static void Init(ConfigFile cfg)
{
configFile = cfg;
ExteriorConfig();
InteriorConfig();
MigrateLegacyConfigs();
}
private static void ExteriorConfig()
{
planetPreview = configFile.Bind<bool>("Exterior", "PlanetPreview", true, "The currently orbited planet is visible on the ship's external security camera while in space, as it used to be in v38.\nYou should disable this if you encounter lighting issues on the ship.");
fancyEntranceDoors = configFile.Bind<bool>("Exterior", "FancyEntranceDoors", true, "Changes the front doors to match how they look on the inside when a manor interior generates. (Works for ONLY vanilla levels!)");
fancyFoliage = configFile.Bind<bool>("Exterior", "FancyFoliage", true, "Light passes and spreads through the foliage for nicer visuals. Performance impact is negligible.");
fancyShrouds = configFile.Bind<bool>("Exterior", "FancyShrouds", true, "Applies FancyFoliage's changes to Vain Shrouds as well. (Really puts the \"vain\" in Vain Shrouds.)");
recolorRandomRocks = configFile.Bind<bool>("Exterior", "RecolorRandomRocks", true, "Recolors random boulders to be white on snowy moons so they blend in better.");
rainyMarch = configFile.Bind<bool>("Exterior", "RainyMarch", true, "March is constantly rainy, as described in its terminal page. This is purely visual and does not affect quicksand generation.");
stormyGordion = configFile.Bind<GordionStorms>("Exterior", "StormyGordion", GordionStorms.Chance, "Allows for storms on Gordion, as described in its terminal page. This is purely visual and lightning does not strike at The Company.");
eclipsesBlockMusic = configFile.Bind<bool>("Exterior", "EclipsesBlockMusic", true, "Prevents the morning/afternoon ambience music from playing during Eclipsed weather, which has its own ambient track.");
snowyGiants = configFile.Bind<bool>("Exterior", "SnowyGiants", true, "When the surface is snowy, Forest Keepers will blend in a little better with the environment.\nIf you are experiencing issues with giants and have other skin mods installed, you should probably disable this setting.");
}
private static void InteriorConfig()
{
doorLightColors = configFile.Bind<bool>("Interior", "DoorLightColors", true, "Dynamically adjust the color of the light behind the entrance doors depending on where you land and the current weather.");
powerOffBreakerBox = configFile.Bind<bool>("Interior", "PowerOffBreakerBox", true, "When the apparatus is unplugged, the light on the breaker box will turn off to indicate it is inactive.");
fixDoors = configFile.Bind<bool>("Interior", "FixDoors", true, "Fixes the glass on the steel doors in factories (and some custom interiors) to show on both sides. Also fixes doorknobs looking incorrect on one side.");
InteriorManorConfig();
InteriorMineshaftConfig();
}
private static void InteriorManorConfig()
{
powerOffWindows = configFile.Bind<bool>("Interior.Manor", "PowerOffWindows", true, "When the breaker box is turned off, the \"fake window\" rooms will also turn off.");
}
private static void InteriorMineshaftConfig()
{
PopulateGlobalListWithCavernType(CavernType.Vanilla, "Vow:100,March:100,Adamance:100,Artifice:80");
PopulateGlobalListWithCavernType(CavernType.Mesa, "Experimentation:100,Titan:100");
PopulateGlobalListWithCavernType(CavernType.Desert, "Assurance:100,Offense:100");
PopulateGlobalListWithCavernType(CavernType.Ice, "Rend:100,Dine:100");
PopulateGlobalListWithCavernType(CavernType.Amethyst, "Embrion:100");
PopulateGlobalListWithCavernType(CavernType.Gravel, "Artifice:20");
autoAdaptSnow = configFile.Bind<bool>("Interior.Mineshaft", "AutoAdaptSnow", true, "Automatically enable ice caverns on modded levels that are snowy.\nIf you have Artifice Blizzard installed, this will also change the caverns to ice specifically when the blizzard is active.");
}
private static void PopulateGlobalListWithCavernType(CavernType type, string defaultList)
{
string text = $"{type}CavesList";
string value = configFile.Bind<string>("Interior.Mineshaft", text, defaultList, string.Format("A list of moons for which to assign \"{0}\" caves, with their respective weights.{1}\n", type, (type != CavernType.Vanilla) ? " Leave empty to disable." : string.Empty) + "Moon names are not case-sensitive, and can be left incomplete (ex. \"as\" will map to both Assurance and Asteroid-13.)" + ((type == CavernType.Vanilla) ? "\nUpon hosting a lobby, the full list of moon names will be printed in the debug log, which you can use as a guide." : string.Empty)).Value;
if (string.IsNullOrEmpty(value))
{
Plugin.Logger.LogDebug((object)("User has no " + text + " defined"));
return;
}
try
{
string[] array = value.Split(',');
foreach (string text2 in array)
{
string[] array2 = text2.Split(':');
int result = -1;
if (array2.Length == 2 && int.TryParse(array2[1], out result))
{
MoonCavernMapping moonCavernMapping = default(MoonCavernMapping);
moonCavernMapping.moon = array2[0].ToLower();
moonCavernMapping.type = type;
moonCavernMapping.weight = (int)Mathf.Clamp((float)result, 0f, 99999f);
MoonCavernMapping item = moonCavernMapping;
mappings.Add(item);
Plugin.Logger.LogDebug((object)$"Successfully added \"{item.moon}\" to \"{item.type}\" caves list with weight {item.weight}");
}
else
{
Plugin.Logger.LogWarning((object)("Encountered an error parsing entry \"" + text2 + "\" in the \"" + text + "\" setting. It has been skipped"));
}
}
}
catch
{
Plugin.Logger.LogError((object)("Encountered an error parsing the \"" + text + "\" setting. Please double check that your config follows proper syntax, then restart your game."));
}
}
private static void MigrateLegacyConfigs()
{
string[] array = new string[6] { "IceCaves", "AmethystCave", "DesertCave", "MesaCave", "IcyTitan", "AdaptiveArtifice" };
foreach (string text in array)
{
configFile.Bind<bool>("Interior", text, false, "Legacy setting, doesn't work");
configFile.Remove(configFile["Interior", text].Definition);
}
configFile.Save();
}
}
[BepInPlugin("butterystancakes.lethalcompany.chameleon", "Chameleon", "1.3.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
private const string PLUGIN_GUID = "butterystancakes.lethalcompany.chameleon";
private const string PLUGIN_NAME = "Chameleon";
private const string PLUGIN_VERSION = "1.3.0";
internal static ManualLogSource Logger;
private const string GUID_ARTIFICE_BLIZZARD = "butterystancakes.lethalcompany.artificeblizzard";
internal static bool INSTALLED_ARTIFICE_BLIZZARD;
private void Awake()
{
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
Logger = ((BaseUnityPlugin)this).Logger;
if (Chainloader.PluginInfos.ContainsKey("butterystancakes.lethalcompany.artificeblizzard"))
{
INSTALLED_ARTIFICE_BLIZZARD = true;
Logger.LogInfo((object)"CROSS-COMPATIBILITY - Artifice Blizzard detected");
}
Configuration.Init(((BaseUnityPlugin)this).Config);
new Harmony("butterystancakes.lethalcompany.chameleon").PatchAll();
SceneManager.sceneUnloaded += delegate
{
SceneOverrides.done = false;
SceneOverrides.forceRainy = false;
SceneOverrides.forceStormy = false;
SceneOverrides.breakerBoxOff = false;
SceneOverrides.windowsInManor = false;
};
Logger.LogInfo((object)"Chameleon v1.3.0 loaded");
}
}
[HarmonyPatch]
internal class ChameleonPatches
{
private static Animator shipAnimator;
private static Light sunlight;
private static Texture giantSnowy;
[HarmonyPatch(typeof(RoundManager), "FinishGeneratingNewLevelClientRpc")]
[HarmonyPostfix]
private static void PostFinishGeneratingNewLevelClientRpc(RoundManager __instance)
{
if (!SceneOverrides.done)
{
SceneOverrides.done = true;
SceneOverrides.SetupCompatibility();
SceneOverrides.ExteriorOverrides();
if (((Object)StartOfRound.Instance.currentLevel).name != "CompanyBuildingLevel")
{
SceneOverrides.InteriorOverrides();
}
}
}
[HarmonyPatch(typeof(TimeOfDay), "Update")]
[HarmonyPostfix]
private static void TimeOfDayPostUpdate(TimeOfDay __instance)
{
//IL_00b0: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
if (SceneOverrides.forceRainy)
{
if ((!GameNetworkManager.Instance.localPlayerController.isInsideFactory && !GameNetworkManager.Instance.localPlayerController.isPlayerDead) || ((Object)(object)GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript != (Object)null && !GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript.isInsideFactory))
{
__instance.effects[1].effectEnabled = true;
}
}
else if (SceneOverrides.forceStormy)
{
GameObject effectObject = __instance.effects[2].effectObject;
Vector3 position = (GameNetworkManager.Instance.localPlayerController.isPlayerDead ? ((Component)StartOfRound.Instance.spectateCamera).transform : ((Component)GameNetworkManager.Instance.localPlayerController).transform).position;
position.y = Mathf.Max(position.y, -24f);
effectObject.transform.position = position;
effectObject.SetActive(true);
}
}
[HarmonyPatch(typeof(TimeOfDay), "PlayTimeMusicDelayed")]
[HarmonyPostfix]
private static void PostPlayTimeMusicDelayed(TimeOfDay __instance, AudioClip clip)
{
if ((Object)(object)clip == (Object)(object)StartOfRound.Instance.companyVisitMusic && SceneOverrides.forceStormy)
{
__instance.TimeOfDayMusic.volume = 1f;
}
}
[HarmonyPatch(typeof(SoundManager), "PlayRandomOutsideMusic")]
[HarmonyPrefix]
private static bool PrePlayRandomOutsideMusic(SoundManager __instance)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Invalid comparison between Unknown and I4
if (Configuration.eclipsesBlockMusic.Value)
{
return (int)StartOfRound.Instance.currentLevel.currentWeather != 5;
}
return true;
}
[HarmonyPatch(typeof(HUDManager), "HelmetCondensationDrops")]
[HarmonyPostfix]
private static void PostHelmetCondensationDrops(HUDManager __instance)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
if (!__instance.increaseHelmetCondensation && SceneOverrides.forceStormy && !TimeOfDay.Instance.insideLighting && ((Component)GameNetworkManager.Instance.localPlayerController).transform.position.y >= -5.5f && Vector3.Angle(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.forward, Vector3.up) < 45f)
{
__instance.increaseHelmetCondensation = true;
}
}
[HarmonyPatch(typeof(StartOfRound), "Start")]
[HarmonyPostfix]
[HarmonyPriority(0)]
private static void StartOfRoundPostStart()
{
SceneOverrides.BuildWeightLists();
}
[HarmonyPatch(typeof(RoundManager), "Update")]
[HarmonyPostfix]
private static void RoundManagerPostUpdate(RoundManager __instance)
{
if (__instance.powerOffPermanently && !SceneOverrides.breakerBoxOff)
{
SceneOverrides.breakerBoxOff = true;
if (Configuration.powerOffBreakerBox.Value)
{
SceneOverrides.ShutdownBreakerBox();
}
}
}
[HarmonyPatch(typeof(RoundManager), "TurnOnAllLights")]
[HarmonyPostfix]
private static void RoundManagerPostTurnOnAllLights(RoundManager __instance, bool on)
{
if (SceneOverrides.windowsInManor)
{
SceneOverrides.ToggleAllWindows(on);
}
}
[HarmonyPatch(typeof(StartOfRound), "Awake")]
[HarmonyPostfix]
private static void StartOfRoundPostAwake(StartOfRound __instance)
{
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
if (!Configuration.planetPreview.Value || !((Object)(object)__instance.outerSpaceSunAnimator != (Object)null))
{
return;
}
sunlight = ((Component)__instance.outerSpaceSunAnimator).GetComponent<Light>();
if ((Object)(object)sunlight != (Object)null)
{
((Behaviour)__instance.outerSpaceSunAnimator).enabled = false;
((Component)__instance.outerSpaceSunAnimator).transform.rotation = Quaternion.Euler(10.560008f, 188.70499f, 173.56802f);
((Behaviour)sunlight).enabled = true;
shipAnimator = ((Component)__instance.shipAnimatorObject).GetComponent<Animator>();
}
if (!Plugin.INSTALLED_ARTIFICE_BLIZZARD)
{
GameObject planetPrefab = ((IEnumerable<SelectableLevel>)__instance.levels).FirstOrDefault((Func<SelectableLevel, bool>)((SelectableLevel level) => (Object)(object)level.planetPrefab != (Object)null && ((Object)level.planetPrefab).name.StartsWith("Moon2"))).planetPrefab;
SelectableLevel val = ((IEnumerable<SelectableLevel>)__instance.levels).FirstOrDefault((Func<SelectableLevel, bool>)((SelectableLevel level) => ((Object)level).name == "ArtificeLevel"));
if ((Object)(object)planetPrefab != (Object)null && (Object)(object)val != (Object)null)
{
val.planetPrefab = planetPrefab;
}
}
}
[HarmonyPatch(typeof(StartOfRound), "LateUpdate")]
[HarmonyPostfix]
private static void StartOfRoundPostLateUpdate(StartOfRound __instance)
{
if (__instance.firingPlayersCutsceneRunning && (Object)(object)sunlight != (Object)null && (Object)(object)shipAnimator != (Object)null && shipAnimator.GetBool("AlarmRinging"))
{
((Behaviour)sunlight).enabled = false;
}
}
[HarmonyPatch(typeof(StartOfRound), "EndPlayersFiredSequenceClientRpc")]
[HarmonyPostfix]
private static void PostEndPlayersFiredSequenceClientRpc(StartOfRound __instance)
{
if ((Object)(object)sunlight != (Object)null)
{
((Behaviour)sunlight).enabled = true;
}
}
[HarmonyPatch(typeof(StartOfRound), "ChangePlanet")]
[HarmonyPostfix]
private static void PostChangePlanet(StartOfRound __instance)
{
if ((Object)(object)sunlight != (Object)null && ((Object)__instance.currentLevel).name == "CompanyBuildingLevel" && (Object)(object)__instance.currentPlanetPrefab != (Object)null)
{
Renderer[] componentsInChildren = __instance.currentPlanetPrefab.GetComponentsInChildren<Renderer>();
foreach (Renderer obj in componentsInChildren)
{
obj.enabled = false;
obj.forceRenderingOff = true;
}
}
}
[HarmonyPatch(typeof(ForestGiantAI), "Start")]
[HarmonyPostfix]
private static void ForestGiantAIPostStart(ForestGiantAI __instance)
{
if (!SceneOverrides.IsSnowLevel())
{
return;
}
if ((Object)(object)giantSnowy == (Object)null)
{
try
{
AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "enemyskins"));
giantSnowy = obj.LoadAsset<Texture>("ForestGiantTexWithEyesSnowy");
obj.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)"Encountered some error loading assets from bundle \"enemyskins\". Did you install the plugin correctly?");
return;
}
}
if ((Object)(object)giantSnowy != (Object)null)
{
SkinnedMeshRenderer[] componentsInChildren = ((Component)__instance).GetComponentsInChildren<SkinnedMeshRenderer>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Renderer)componentsInChildren[i]).material.mainTexture = giantSnowy;
}
Plugin.Logger.LogDebug((object)"Forest Keeper: Snow \"camouflage\"");
}
}
[HarmonyPatch(typeof(FoliageDetailDistance), "Start")]
[HarmonyPostfix]
private static void FoliageDetailDistancePostStart(FoliageDetailDistance __instance)
{
if (Configuration.fancyFoliage.Value && __instance.allBushRenderers.Count > 0)
{
((Renderer)__instance.allBushRenderers[0]).sharedMaterial = __instance.highDetailMaterial;
SceneOverrides.ApplyFoliageDiffusion(new <>z__ReadOnlySingleElementList<Renderer>((Renderer)(object)__instance.allBushRenderers[0]));
__instance.highDetailMaterial = ((Renderer)__instance.allBushRenderers[0]).sharedMaterial;
}
}
[HarmonyPatch(typeof(MoldSpreadManager), "Start")]
[HarmonyPostfix]
private static void MoldSpreadManagerPostStart(MoldSpreadManager __instance)
{
if (Configuration.fancyShrouds.Value)
{
SceneOverrides.ApplyFoliageDiffusion(from rend in __instance.moldPrefab.GetComponentsInChildren<Renderer>()
where ((Component)rend).gameObject.layer != 22
select rend);
}
}
}
internal static class SceneOverrides
{
internal static bool done;
internal static bool forceRainy;
internal static bool forceStormy;
internal static bool breakerBoxOff;
internal static bool windowsInManor;
private static GameObject artificeBlizzard;
private static Dictionary<string, IntWithRarity[]> mineshaftWeightLists = new Dictionary<string, IntWithRarity[]>();
private static Material breakerLightOff;
private static Material fakeWindowOff;
private static Material fakeWindowOn;
private static List<(Renderer room, Light light)> windowTiles = new List<(Renderer, Light)>();
private static Material diffuseLeaves;
private static DiffusionProfile foliageDiffusionProfile;
private static float foliageDiffusionProfileHash;
private static Material material001;
private static Material helmetGlass;
internal static void ExteriorOverrides()
{
//IL_0421: Unknown result type (might be due to invalid IL or missing references)
//IL_0427: Invalid comparison between Unknown and I4
//IL_0433: Unknown result type (might be due to invalid IL or missing references)
//IL_0439: Invalid comparison between Unknown and I4
//IL_044c: Unknown result type (might be due to invalid IL or missing references)
//IL_0452: Invalid comparison between Unknown and I4
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
if (Configuration.recolorRandomRocks.Value && IsSnowLevel())
{
if ((Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null)
{
RoundManager.Instance.mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer");
}
if ((Object)(object)RoundManager.Instance.mapPropsContainer != (Object)null)
{
foreach (Transform item in RoundManager.Instance.mapPropsContainer.transform)
{
Transform val = item;
if (((Object)val).name.StartsWith("LargeRock"))
{
Renderer[] componentsInChildren = ((Component)val).GetComponentsInChildren<Renderer>();
foreach (Renderer obj in componentsInChildren)
{
obj.material.SetTexture("_MainTex", (Texture)null);
obj.material.SetTexture("_BaseColorMap", (Texture)null);
}
}
}
}
}
if (((Object)StartOfRound.Instance.currentLevel).name == "CompanyBuildingLevel")
{
GameObject obj2 = GameObject.Find("/Environment/Map");
Transform val2 = ((obj2 != null) ? obj2.transform : null);
string[] array = new string[30]
{
"CompanyPlanet/Cube", "CompanyPlanet/Cube/Colliders/Cube", "CompanyPlanet/Cube/Colliders/Cube (2)", "CompanyPlanet/Cube/Colliders/Cube (3)", "CompanyPlanet/Elbow Joint.001", "CompanyPlanet/Cube.003", "ShippingContainers/ShippingContainer", "ShippingContainers/ShippingContainer (1)", "ShippingContainers/ShippingContainer (2)", "ShippingContainers/ShippingContainer (3)",
"ShippingContainers/ShippingContainer (4)", "ShippingContainers/ShippingContainer (5)", "ShippingContainers/ShippingContainer (6)", "ShippingContainers/ShippingContainer (7)", "ShippingContainers/ShippingContainer (8)", "ShippingContainers/ShippingContainer (9)", "ShippingContainers/ShippingContainer (10)", "CompanyPlanet/Cube.005", "CompanyPlanet/CatwalkChunk", "CompanyPlanet/CatwalkChunk.001",
"CompanyPlanet/CatwalkStairTile", "CompanyPlanet/Cylinder", "CompanyPlanet/Cylinder.001", "CompanyPlanet/LargePipeSupportBeam", "CompanyPlanet/LargePipeSupportBeam.001", "CompanyPlanet/LargePipeSupportBeam.002", "CompanyPlanet/LargePipeSupportBeam.003", "CompanyPlanet/Scaffolding", "CompanyPlanet/Scaffolding.001", "GiantDrill/DrillMainBody"
};
Renderer val4 = default(Renderer);
foreach (string text in array)
{
Transform val3 = val2.Find(text);
if ((Object)(object)val3 != (Object)null)
{
if (((Component)val3).gameObject.layer == 11 && ((Component)val3).TryGetComponent<Renderer>(ref val4))
{
val4.enabled = false;
}
((Component)val3).gameObject.layer = 8;
}
}
if (Configuration.stormyGordion.Value == Configuration.GordionStorms.Always)
{
forceStormy = true;
}
else if (Configuration.stormyGordion.Value == Configuration.GordionStorms.Chance && TimeOfDay.Instance.profitQuota > 130)
{
float num = 0.7f;
int num2 = 0;
GrabbableObject[] array2 = Object.FindObjectsOfType<GrabbableObject>();
foreach (GrabbableObject val5 in array2)
{
if (val5.itemProperties.isScrap)
{
num2 += val5.scrapValue;
}
}
if (TimeOfDay.Instance.daysUntilDeadline < 1)
{
if (num2 < 1)
{
num = 0.98f;
}
else if (num2 < TimeOfDay.Instance.profitQuota)
{
num += 0.17f;
}
else if (Mathf.FloorToInt((float)(num2 - TimeOfDay.Instance.profitQuota - 75) * 1.2f) + TimeOfDay.Instance.profitQuota >= 1500)
{
num = 0.6f;
}
}
if (num2 > TimeOfDay.Instance.profitQuota - 75 && !StartOfRound.Instance.levels.Any((SelectableLevel level) => (int)level.currentWeather != -1))
{
num *= 0.55f;
}
if (new Random(StartOfRound.Instance.randomMapSeed).NextDouble() <= (double)num)
{
forceStormy = true;
}
}
}
else if ((((Object)StartOfRound.Instance.currentLevel).name == "MarchLevel" || ((Object)StartOfRound.Instance.currentLevel).name == "ReMarchLevel") && Configuration.rainyMarch.Value && (int)StartOfRound.Instance.currentLevel.currentWeather != 2 && (int)StartOfRound.Instance.currentLevel.currentWeather != 4)
{
float num3 = 0.76f;
if ((int)StartOfRound.Instance.currentLevel.currentWeather == 3)
{
num3 *= 0.45f;
}
if (new Random(StartOfRound.Instance.randomMapSeed).NextDouble() <= (double)num3)
{
forceRainy = true;
}
}
if (Configuration.fancyFoliage.Value)
{
SetUpFoliageDiffusion();
}
}
internal static void InteriorOverrides()
{
if (Configuration.fixDoors.Value)
{
FixDoorMaterials();
}
RoundManager instance = RoundManager.Instance;
object obj;
if (instance == null)
{
obj = null;
}
else
{
RuntimeDungeon dungeonGenerator = instance.dungeonGenerator;
if (dungeonGenerator == null)
{
obj = null;
}
else
{
DungeonGenerator generator = dungeonGenerator.Generator;
if (generator == null)
{
obj = null;
}
else
{
DungeonFlow dungeonFlow = generator.DungeonFlow;
obj = ((dungeonFlow != null) ? ((Object)dungeonFlow).name : null);
}
}
}
string text = (string)obj;
if (string.IsNullOrEmpty(text))
{
return;
}
VanillaLevelsInfo.predefinedLevels.TryGetValue(((Object)StartOfRound.Instance.currentLevel).name, out var value);
if ((Object)(object)breakerLightOff == (Object)null || (Object)(object)fakeWindowOff == (Object)null)
{
try
{
AssetBundle obj2 = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "lightmats"));
breakerLightOff = obj2.LoadAsset<Material>("LEDLightYellowOff");
fakeWindowOff = obj2.LoadAsset<Material>("FakeWindowViewOff");
obj2.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)"Encountered some error loading assets from bundle \"lightmats\". Did you install the plugin correctly?");
return;
}
}
if (text == "Level2Flow" || text == "SDMLevel")
{
if (Configuration.fancyEntranceDoors.Value && value != null)
{
SetUpFancyEntranceDoors(value);
}
if (text == "Level2Flow" && Configuration.powerOffWindows.Value)
{
SetUpManorWindows();
}
return;
}
if (Configuration.doorLightColors.Value)
{
ColorDoorLight(value);
}
if (!(text == "Level3Flow"))
{
return;
}
IntWithRarity[] value2;
if (Configuration.autoAdaptSnow.Value && IsSnowLevel() && ((Object)(object)artificeBlizzard != (Object)null || !VanillaLevelsInfo.predefinedLevels.ContainsKey(((Object)StartOfRound.Instance.currentLevel).name)))
{
RetextureCaverns(CavernType.Ice);
Plugin.Logger.LogDebug((object)"Snow level detected, automatically enabling ice caverns");
}
else if (mineshaftWeightLists.TryGetValue(((Object)StartOfRound.Instance.currentLevel).name, out value2))
{
int randomWeightedIndex = RoundManager.Instance.GetRandomWeightedIndex(value2.Select((IntWithRarity x) => x.rarity).ToArray(), new Random(StartOfRound.Instance.randomMapSeed));
if (randomWeightedIndex >= 0 && randomWeightedIndex < value2.Length)
{
int id = value2[randomWeightedIndex].id;
if (Enum.IsDefined(typeof(CavernType), id))
{
if (id > -1)
{
RetextureCaverns((CavernType)id);
}
}
else
{
Plugin.Logger.LogWarning((object)"Tried to assign an unknown cavern type. This shouldn't happen! (Falling back to vanilla caverns)");
}
}
else
{
Plugin.Logger.LogWarning((object)"An error occurred indexing a random cavern type. This shouldn't happen! (Falling back to vanilla caverns)");
}
}
else
{
Plugin.Logger.LogDebug((object)"No custom cave weights were defined for the current moon. Falling back to vanilla caverns");
}
}
private static void SetUpFancyEntranceDoors(LevelCosmeticInfo levelCosmeticInfo)
{
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01db: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_020b: Unknown result type (might be due to invalid IL or missing references)
//IL_0211: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: Unknown result type (might be due to invalid IL or missing references)
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_023e: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Unknown result type (might be due to invalid IL or missing references)
GameObject val = GameObject.Find(levelCosmeticInfo.fakeDoor1Path);
GameObject val2 = GameObject.Find(levelCosmeticInfo.fakeDoor2Path);
object obj2;
if (!string.IsNullOrEmpty(levelCosmeticInfo.planePath))
{
GameObject obj = GameObject.Find(levelCosmeticInfo.planePath);
obj2 = ((obj != null) ? obj.transform : null);
}
else
{
obj2 = null;
}
Transform val3 = (Transform)obj2;
object obj4;
if (!string.IsNullOrEmpty(levelCosmeticInfo.framePath))
{
GameObject obj3 = GameObject.Find(levelCosmeticInfo.framePath);
obj4 = ((obj3 != null) ? obj3.transform : null);
}
else
{
obj4 = null;
}
Transform val4 = (Transform)obj4;
if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (!string.IsNullOrEmpty(levelCosmeticInfo.planePath) && (Object)(object)val3 == (Object)null) || (!string.IsNullOrEmpty(levelCosmeticInfo.framePath) && (Object)(object)val4 == (Object)null))
{
Plugin.Logger.LogWarning((object)"\"FancyEntranceDoors\" skipped because some GameObjects were missing.");
return;
}
GameObject val5 = null;
try
{
AssetBundle obj5 = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "fancyentrancedoors"));
val5 = obj5.LoadAsset<GameObject>("WideDoorFrame");
obj5.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)"Encountered some error loading assets from bundle \"fancyentrancedoors\". Did you install the plugin correctly?");
return;
}
if ((Object)(object)val5 == (Object)null)
{
Plugin.Logger.LogWarning((object)"\"FancyEntranceDoors\" skipped because fancy door asset was missing.");
return;
}
if ((Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null)
{
RoundManager.Instance.mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer");
}
if ((Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null)
{
Plugin.Logger.LogWarning((object)"\"FancyEntranceDoors\" skipped because disposable prop container did not exist in scene.");
return;
}
val.SetActive(false);
val2.SetActive(false);
Transform transform = Object.Instantiate<GameObject>(val5, levelCosmeticInfo.fancyDoorPos, levelCosmeticInfo.fancyDoorRot, RoundManager.Instance.mapPropsContainer.transform).transform;
if (levelCosmeticInfo.fancyDoorScalar != Vector3.one)
{
transform.localScale = Vector3.Scale(transform.localScale, levelCosmeticInfo.fancyDoorScalar);
}
if ((Object)(object)val4 != (Object)null)
{
val4.localScale = new Vector3(val4.localScale.x, val4.localScale.y + 0.05f, val4.localScale.z);
}
if ((Object)(object)val3 != (Object)null)
{
val3.localPosition += levelCosmeticInfo.planeOffset;
val3.localScale = new Vector3(val3.localScale.x + 0.047f, val3.localScale.y, val3.localScale.z + 0.237f);
}
}
private static void RetextureCaverns(CavernType type)
{
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
string text = type.ToString().ToLower() + "cave";
Material val = null;
Material val2 = null;
try
{
AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), text));
val = obj.LoadAsset<Material>("CaveRocks1");
val2 = obj.LoadAsset<Material>("CoalMat");
obj.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)("Encountered some error loading assets from bundle \"" + text + "\". Did you install the plugin correctly?"));
}
if ((Object)(object)val == (Object)null)
{
Plugin.Logger.LogWarning((object)"Skipping mineshaft retexture because there was an error loading the replacement material.");
return;
}
GameObject val3 = GameObject.Find("/Systems/LevelGeneration/LevelGenerationRoot");
if ((Object)(object)val3 == (Object)null)
{
Plugin.Logger.LogWarning((object)"Skipping mineshaft retexture because there was an error finding the dungeon object tree.");
return;
}
VanillaLevelsInfo.predefinedCaverns.TryGetValue(type, out var value);
if (value == null)
{
Plugin.Logger.LogWarning((object)"Skipping mineshaft retexture because there was an error finding cavern specifications.");
return;
}
Renderer[] componentsInChildren = val3.GetComponentsInChildren<Renderer>();
foreach (Renderer val4 in componentsInChildren)
{
if (((Object)val4).name == "MineshaftStartTileMesh")
{
Material[] materials = val4.materials;
materials[3] = val;
val4.materials = materials;
}
else
{
if (!((Object)(object)val4.sharedMaterial != (Object)null))
{
continue;
}
if (((Object)val4.sharedMaterial).name.StartsWith(((Object)val).name))
{
val4.material = val;
if (((Component)val4).CompareTag("Rock") && !string.IsNullOrEmpty(value.tag))
{
((Component)val4).tag = value.tag;
}
}
else if (value.waterColor && ((Object)val4).name == "Water (1)" && ((Object)val4.sharedMaterial).name.StartsWith("CaveWater"))
{
val4.material.SetColor("Color_6a9a916e2c84442984edc20c082efe79", value.waterColor1);
val4.sharedMaterial.SetColor("Color_c9a840f2115c4802ba54d713194f761d", value.waterColor2);
}
else if ((Object)(object)val2 != (Object)null && ((Object)val4.sharedMaterial).name.StartsWith(((Object)val2).name))
{
val4.material = val2;
}
}
}
if (!value.noDrips)
{
return;
}
LocalPropSet[] componentsInChildren2 = val3.GetComponentsInChildren<LocalPropSet>();
foreach (LocalPropSet val5 in componentsInChildren2)
{
if (((Object)val5).name.StartsWith("WaterDrips"))
{
((Component)val5).gameObject.SetActive(false);
Plugin.Logger.LogDebug((object)"Disabled water drips");
}
}
}
internal static void SetupCompatibility()
{
if (((Object)StartOfRound.Instance.currentLevel).name == "ArtificeLevel" && Plugin.INSTALLED_ARTIFICE_BLIZZARD)
{
artificeBlizzard = GameObject.Find("/Systems/Audio/BlizzardAmbience");
if ((Object)(object)artificeBlizzard != (Object)null)
{
Plugin.Logger.LogInfo((object)"Artifice Blizzard compatibility success");
}
}
}
internal static bool IsSnowLevel()
{
if (StartOfRound.Instance.currentLevel.levelIncludesSnowFootprints)
{
if (!((Object)(object)artificeBlizzard == (Object)null))
{
return artificeBlizzard.activeSelf;
}
return true;
}
return false;
}
internal static void BuildWeightLists()
{
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Expected O, but got Unknown
mineshaftWeightLists.Clear();
Plugin.Logger.LogInfo((object)"List of all indexed moons (Use this to set up your config!):");
SelectableLevel[] levels = StartOfRound.Instance.levels;
foreach (SelectableLevel val in levels)
{
if (((Object)val).name != "CompanyBuildingLevel")
{
Plugin.Logger.LogInfo((object)("\"" + ((Object)val).name + "\""));
}
}
Plugin.Logger.LogDebug((object)"Now assembling final weighted lists");
levels = StartOfRound.Instance.levels;
foreach (SelectableLevel level in levels)
{
if (((Object)level).name == "CompanyBuildingLevel")
{
continue;
}
try
{
List<IntWithRarity> list = new List<IntWithRarity>();
foreach (Configuration.MoonCavernMapping item in Configuration.mappings.Where((Configuration.MoonCavernMapping x) => ((Object)level).name.ToLower().StartsWith(x.moon)))
{
list.Add(new IntWithRarity
{
id = (int)item.type,
rarity = item.weight
});
Plugin.Logger.LogDebug((object)$"{((Object)level).name} - {item.type} @ {item.weight}");
}
if (list.Count > 0)
{
mineshaftWeightLists.Add(((Object)level).name, list.ToArray());
}
}
catch
{
Plugin.Logger.LogError((object)"Failed to finish assembling weighted lists. If you are encountering this error, it's likely there is a problem with your config - look for warnings further up in your log!");
}
}
}
private static void ColorDoorLight(LevelCosmeticInfo levelCosmeticInfo)
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Invalid comparison between Unknown and I4
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
SpriteRenderer val = ((IEnumerable<SpriteRenderer>)Object.FindObjectsOfType<SpriteRenderer>()).FirstOrDefault((Func<SpriteRenderer, bool>)((SpriteRenderer spriteRenderer) => ((Object)spriteRenderer).name == "LightBehindDoor"));
if ((Object)(object)val != (Object)null)
{
if ((int)StartOfRound.Instance.currentLevel.currentWeather == 5)
{
val.color = DoorLightPalette.ECLIPSE_BACKGROUND;
}
else if (IsSnowLevel())
{
val.color = DoorLightPalette.BLIZZARD_BACKGROUND;
}
else if (levelCosmeticInfo != null)
{
val.color = levelCosmeticInfo.doorLightColor;
}
else
{
Plugin.Logger.LogDebug((object)"Could not recolor door light - No information exists for the current level (Are you playing a custom moon?)");
}
}
else
{
Plugin.Logger.LogDebug((object)"Could not recolor door light - GameObject \"LightBehindDoor\" was not found (Are you playing a custom interior?)");
}
}
internal static void ShutdownBreakerBox()
{
if ((Object)(object)breakerLightOff != (Object)null)
{
BreakerBox val = Object.FindObjectOfType<BreakerBox>();
if (!((Object)(object)val != (Object)null))
{
return;
}
Transform val2 = ((Component)val).transform.Find("Light");
Renderer component = ((Component)val2).GetComponent<Renderer>();
if ((Object)(object)component != (Object)null)
{
Material[] sharedMaterials = component.sharedMaterials;
if (sharedMaterials.Length != 2)
{
Plugin.Logger.LogWarning((object)"Breaker box materials are different than expected. Is this a custom interior?");
return;
}
sharedMaterials[1] = breakerLightOff;
component.sharedMaterials = sharedMaterials;
Transform obj = val2.Find("RedLight");
if (obj != null)
{
GameObject gameObject = ((Component)obj).gameObject;
if (gameObject != null)
{
gameObject.SetActive(false);
}
}
if ((Object)(object)val.breakerBoxHum != (Object)null)
{
val.breakerBoxHum.Stop();
val.breakerBoxHum.mute = true;
}
}
Plugin.Logger.LogDebug((object)"Breaker box light was turned off");
}
else
{
Plugin.Logger.LogWarning((object)"Can't disable breaker box light because material is missing. Asset bundle(s) were likely installed incorrectly");
}
}
private static void SetUpManorWindows()
{
windowTiles.Clear();
if ((Object)(object)fakeWindowOff == (Object)null)
{
Plugin.Logger.LogWarning((object)"Skipping window caching because the asset bundle materials failed to load.");
return;
}
GameObject val = GameObject.Find("/Systems/LevelGeneration/LevelGenerationRoot");
if ((Object)(object)val == (Object)null)
{
Plugin.Logger.LogWarning((object)"Skipping manor search because there was an error finding the dungeon object tree.");
return;
}
Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>();
foreach (Renderer val2 in componentsInChildren)
{
if (!(((Object)val2).name == "mesh") || val2.sharedMaterials.Length <= 5)
{
continue;
}
Material obj = val2.sharedMaterials[5];
if (((obj != null) ? ((Object)obj).name : null) == "FakeWindowView")
{
if ((Object)(object)fakeWindowOn == (Object)null)
{
fakeWindowOn = val2.sharedMaterials[5];
fakeWindowOff.mainTexture = fakeWindowOn.GetTexture("_EmissiveColorMap");
}
Transform obj2 = ((Component)val2).transform.parent.Find("ScreenLight");
Light val3 = ((obj2 != null) ? ((Component)obj2).GetComponent<Light>() : null);
if ((Object)(object)val3 != (Object)null)
{
windowTiles.Add((val2, val3));
Plugin.Logger.LogDebug((object)"Cached window tile instance");
}
}
}
if (windowTiles.Count > 0)
{
windowsInManor = true;
BreakerBox val4 = Object.FindObjectOfType<BreakerBox>();
if ((Object)(object)val4 != (Object)null && val4.leversSwitchedOff > 0)
{
ToggleAllWindows(powered: false);
}
}
}
internal static void ToggleAllWindows(bool powered)
{
if (!windowsInManor || windowTiles.Count < 1 || (Object)(object)fakeWindowOn == (Object)null || (Object)(object)fakeWindowOff == (Object)null)
{
return;
}
foreach (var windowTile in windowTiles)
{
Renderer item = windowTile.room;
Light item2 = windowTile.light;
Material[] sharedMaterials = item.sharedMaterials;
sharedMaterials[5] = (powered ? fakeWindowOn : fakeWindowOff);
item.sharedMaterials = sharedMaterials;
((Behaviour)item2).enabled = powered;
}
}
private static void FixDoorMaterials()
{
if ((Object)(object)helmetGlass == (Object)null || (Object)(object)material001 == (Object)null)
{
try
{
AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "doublesides"));
helmetGlass = obj.LoadAsset<Material>("HelmetGlass 1");
material001 = obj.LoadAsset<Material>("Material.001");
obj.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)"Encountered some error loading assets from bundle \"doublesides\". Did you install the plugin correctly?");
return;
}
}
foreach (Renderer item in from rend in Object.FindObjectsOfType<Renderer>()
where ((Object)rend).name == "DoorMesh"
select rend)
{
if (item.sharedMaterials.Length == 7)
{
Material obj3 = item.sharedMaterials[2];
if (((obj3 != null) ? ((Object)obj3).name : null).StartsWith("Material.001"))
{
Material obj4 = item.sharedMaterials[5];
if (((obj4 != null) ? ((Object)obj4).name : null).StartsWith("HelmetGlass"))
{
Material[] sharedMaterials = item.sharedMaterials;
sharedMaterials[2] = material001;
if ((Object)(object)((Component)item).GetComponentInChildren<InteractTrigger>() != (Object)null)
{
sharedMaterials[5] = helmetGlass;
}
item.sharedMaterials = sharedMaterials;
continue;
}
}
}
if ((((Object)item.sharedMaterial).name.StartsWith("FancyManorTex") && (Object)(object)((Component)item).GetComponentInChildren<InteractTrigger>() != (Object)null) || ((Object)item.sharedMaterial).name.StartsWith("DoorWood"))
{
item.sharedMaterial.shader = material001.shader;
item.sharedMaterial.doubleSidedGI = true;
item.sharedMaterial.EnableKeyword("_DOUBLESIDED_ON");
item.sharedMaterial.SetFloat("_CullMode", 0f);
item.sharedMaterial.SetFloat("_CullModeForward", 0f);
item.sharedMaterial.SetFloat("_DoubleSidedEnable", 1f);
}
}
}
internal static bool GetFoliageDiffusionReferences()
{
if ((Object)(object)diffuseLeaves == (Object)null)
{
try
{
AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "fancyfoliage"));
diffuseLeaves = obj.LoadAsset<Material>("DiffuseLeaves");
obj.Unload(false);
}
catch
{
Plugin.Logger.LogError((object)"Encountered some error loading assets from bundle \"fancyfoliage\". Did you install the plugin correctly?");
return false;
}
}
if (foliageDiffusionProfile == null)
{
foliageDiffusionProfile = ((IEnumerable<DiffusionProfileSettings>)((VolumeParameter<DiffusionProfileSettings[]>)(object)HDRenderPipelineGlobalSettings.instance.GetOrCreateDiffusionProfileList()?.diffusionProfiles).value).FirstOrDefault((Func<DiffusionProfileSettings, bool>)((DiffusionProfileSettings profile) => ((profile != null) ? ((Object)profile).name : null) == "Foliage Diffusion Profile"))?.profile;
if (foliageDiffusionProfile != null)
{
foliageDiffusionProfileHash = BitConverter.Int32BitsToSingle((int)foliageDiffusionProfile.hash);
}
}
if ((Object)(object)diffuseLeaves != (Object)null)
{
return foliageDiffusionProfile != null;
}
return false;
}
internal static void ApplyFoliageDiffusion(IEnumerable<Renderer> renderers)
{
if (!GetFoliageDiffusionReferences())
{
return;
}
foreach (Renderer renderer in renderers)
{
Material sharedMaterial = renderer.sharedMaterial;
int renderQueue = sharedMaterial.renderQueue;
sharedMaterial.shader = diffuseLeaves.shader;
sharedMaterial.renderQueue = renderQueue;
sharedMaterial.SetFloat("_DiffusionProfileHash", foliageDiffusionProfileHash);
sharedMaterial.shaderKeywords = sharedMaterial.shaderKeywords.Union(diffuseLeaves.shaderKeywords).ToArray();
if (((Object)sharedMaterial).name.StartsWith("ForestTexture"))
{
sharedMaterial.SetTexture("_TransmissionMaskMap", diffuseLeaves.GetTexture("_TransmissionMaskMap"));
}
Plugin.Logger.LogDebug((object)("Applied foliage diffusion to \"" + ((Object)renderer).name + "\""));
}
}
private static void SetUpFoliageDiffusion()
{
GameObject obj = GameObject.Find("/Environment/Map");
Transform val = ((obj != null) ? obj.transform : null);
if ((Object)(object)val != (Object)null)
{
ApplyFoliageDiffusion(((Component)val).GetComponentsInChildren<Renderer>().Where(FilterFoliageObjects));
}
if ((Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null)
{
RoundManager.Instance.mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer");
}
if ((Object)(object)RoundManager.Instance.mapPropsContainer != (Object)null)
{
ApplyFoliageDiffusion(RoundManager.Instance.mapPropsContainer.GetComponentsInChildren<Renderer>().Where(FilterFoliageObjects));
}
}
private static bool FilterFoliageObjects(Renderer rend)
{
if ((Object)(object)rend.sharedMaterial != (Object)null)
{
if (!((Object)rend.sharedMaterial).name.StartsWith("ForestTexture") && !((Object)rend.sharedMaterial).name.StartsWith("TreeFlat"))
{
return ((Object)rend.sharedMaterial).name.StartsWith("Leaves");
}
return true;
}
return false;
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "Chameleon";
public const string PLUGIN_NAME = "Chameleon";
public const string PLUGIN_VERSION = "1.3.0";
}
}
namespace Chameleon.Info
{
internal enum CavernType
{
Vanilla = -1,
Ice,
Amethyst,
Desert,
Mesa,
Gravel
}
internal class CavernInfo
{
internal string tag = string.Empty;
internal bool waterColor;
internal Color waterColor1 = new Color(0.3018868f, 0.24540168f, 0.22926308f, 0.972549f);
internal Color waterColor2 = new Color(27f / 106f, 0.2132654f, 0.17181382f, 84f / 85f);
internal bool noDrips;
}
internal static class DoorLightPalette
{
internal static readonly Color WITCHES_BACKGROUND = new Color(0.4901961f, 0.4693464f, 32f / 85f);
internal static readonly Color BLIZZARD_BACKGROUND = new Color(0.4845f, 0.4986666f, 0.51f);
internal static readonly Color AMETHYST_BACKGROUND = new Color(0.4901961f, 0.3714178f, 0.3578431f);
internal static readonly Color ECLIPSE_BACKGROUND = new Color(0.4901961f, 0.3336095f, 23f / 102f);
}
internal class LevelCosmeticInfo
{
internal string fakeDoor1Path = "/Environment/SteelDoorFake";
internal string fakeDoor2Path = "/Environment/SteelDoorFake (1)";
internal string framePath = "/Environment/DoorFrame (1)";
internal string planePath = "/Environment/Plane";
internal Vector3 fancyDoorPos;
internal Quaternion fancyDoorRot;
internal Vector3 fancyDoorScalar = Vector3.one;
internal Vector3 planeOffset = new Vector3(0f, -1f, 0f);
internal Color doorLightColor = new Color(0.490566f, 0.4165709f, 0.3355286f);
}
internal static class VanillaLevelsInfo
{
internal static Dictionary<string, LevelCosmeticInfo> predefinedLevels = new Dictionary<string, LevelCosmeticInfo>
{
{
"ExperimentationLevel",
new LevelCosmeticInfo
{
fakeDoor1Path = "/Environment/SteelDoor (6)",
fakeDoor2Path = "/Environment/SteelDoor (5)",
framePath = string.Empty,
planePath = string.Empty,
fancyDoorPos = new Vector3(-113.911f, 2.895f, -17.67f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 0f),
fancyDoorScalar = new Vector3(1f, 1.07f, 1f)
}
},
{
"AssuranceLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(135.249f, 6.452f, 74.49f),
fancyDoorRot = Quaternion.Euler(-90f, 180f, 0f),
planeOffset = new Vector3(0.075f, -1f, 0f)
}
},
{
"VowLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(-29.279f, -1.176f, 151.069f),
fancyDoorRot = Quaternion.Euler(-90f, 90f, 0f),
planeOffset = new Vector3(0.075f, -1f, 0f)
}
},
{
"OffenseLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(128.936f, 16.35f, -53.713f),
fancyDoorRot = Quaternion.Euler(-90f, 180f, -73.621f),
planeOffset = new Vector3(0f, -1f, -0.075f)
}
},
{
"MarchLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(-158.18f, -3.953f, 21.708f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 0f),
planeOffset = new Vector3(0f, -1f, -0.075f)
}
},
{
"AdamanceLevel",
new LevelCosmeticInfo
{
fakeDoor1Path = "/Environment/Teleports/EntranceTeleportA/SteelDoorFake",
fakeDoor2Path = "/Environment/Teleports/EntranceTeleportA/SteelDoorFake (1)",
framePath = "/Environment/Teleports/EntranceTeleportA/DoorFrame (1)",
planePath = "/Environment/Teleports/EntranceTeleportA/Plane",
fancyDoorPos = new Vector3(-122.032f, 1.843f, -3.617f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 0f),
planeOffset = new Vector3(-0.0033637f, -0.069986f, -1.0246016f),
doorLightColor = DoorLightPalette.WITCHES_BACKGROUND
}
},
{
"EmbrionLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(-195.47f, 6.357f, -7.83f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 39.517f),
planeOffset = new Vector3(-0.045f, -1f, -0.05513f),
doorLightColor = DoorLightPalette.AMETHYST_BACKGROUND
}
},
{
"RendLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(50.545f, -16.822502f, -152.71658f),
fancyDoorRot = Quaternion.Euler(-90f, 180f, 64.342f),
doorLightColor = DoorLightPalette.BLIZZARD_BACKGROUND
}
},
{
"DineLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(-120.70987f, -16.337002f, -4.2681026f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 90.836f),
doorLightColor = DoorLightPalette.BLIZZARD_BACKGROUND
}
},
{
"TitanLevel",
new LevelCosmeticInfo
{
fancyDoorPos = new Vector3(-35.877f, 47.64f, 8.939f),
fancyDoorRot = Quaternion.Euler(-90f, 0f, 35.333f),
planeOffset = new Vector3(0.03f, -1f, 0.036f),
doorLightColor = DoorLightPalette.BLIZZARD_BACKGROUND
}
},
{
"ArtificeLevel",
new LevelCosmeticInfo
{
fakeDoor1Path = "/Environment/MainFactory/SteelDoorFake",
fakeDoor2Path = "/Environment/MainFactory/SteelDoorFake (1)",
framePath = "/Environment/MainFactory/DoorFrame (1)",
planePath = "/Environment/MainFactory/Plane",
fancyDoorPos = new Vector3(52.32f, -0.665f, -156.146f),
fancyDoorRot = Quaternion.Euler(-90f, -90f, 0f)
}
}
};
internal static Dictionary<CavernType, CavernInfo> predefinedCaverns = new Dictionary<CavernType, CavernInfo>
{
{
CavernType.Ice,
new CavernInfo
{
tag = "Snow",
waterColor = true,
waterColor1 = new Color(0f, 0.18982977f, 0.20754719f, 0.972549f),
waterColor2 = new Color(0.12259702f, 0.1792453f, 0.16491137f, 84f / 85f)
}
},
{
CavernType.Amethyst,
new CavernInfo
{
noDrips = true,
waterColor = true,
waterColor1 = new Color(0.2509804f, 0.2627451f, 0.2784314f, 0.972549f),
waterColor2 = new Color(14f / 85f, 0.14901961f, 0.17254902f, 84f / 85f)
}
},
{
CavernType.Desert,
new CavernInfo()
},
{
CavernType.Mesa,
new CavernInfo
{
tag = "Gravel"
}
},
{
CavernType.Gravel,
new CavernInfo
{
tag = "Gravel",
waterColor = true,
waterColor1 = new Color(0.2f, 0.2f, 0.2f, 0.972549f),
waterColor2 = new Color(0.15f, 0.15f, 0.15f, 84f / 85f)
}
}
};
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}
internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T>
{
private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T>
{
object IEnumerator.Current => _item;
T IEnumerator<T>.Current => _item;
public Enumerator(T item)
{
_item = item;
}
bool IEnumerator.MoveNext()
{
if (!_moveNextCalled)
{
return _moveNextCalled = true;
}
return false;
}
void IEnumerator.Reset()
{
_moveNextCalled = false;
}
void IDisposable.Dispose()
{
}
}
int ICollection.Count => 1;
bool ICollection.IsSynchronized => false;
object ICollection.SyncRoot => this;
object IList.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
set
{
throw new NotSupportedException();
}
}
bool IList.IsFixedSize => true;
bool IList.IsReadOnly => true;
int IReadOnlyCollection<T>.Count => 1;
T IReadOnlyList<T>.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
}
int ICollection<T>.Count => 1;
bool ICollection<T>.IsReadOnly => true;
T IList<T>.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
set
{
throw new NotSupportedException();
}
}
public <>z__ReadOnlySingleElementList(T item)
{
_item = item;
}
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(_item);
}
void ICollection.CopyTo(Array array, int index)
{
array.SetValue(_item, index);
}
int IList.Add(object value)
{
throw new NotSupportedException();
}
void IList.Clear()
{
throw new NotSupportedException();
}
bool IList.Contains(object value)
{
return EqualityComparer<T>.Default.Equals(_item, (T)value);
}
int IList.IndexOf(object value)
{
if (!EqualityComparer<T>.Default.Equals(_item, (T)value))
{
return -1;
}
return 0;
}
void IList.Insert(int index, object value)
{
throw new NotSupportedException();
}
void IList.Remove(object value)
{
throw new NotSupportedException();
}
void IList.RemoveAt(int index)
{
throw new NotSupportedException();
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return new Enumerator(_item);
}
void ICollection<T>.Add(T item)
{
throw new NotSupportedException();
}
void ICollection<T>.Clear()
{
throw new NotSupportedException();
}
bool ICollection<T>.Contains(T item)
{
return EqualityComparer<T>.Default.Equals(_item, item);
}
void ICollection<T>.CopyTo(T[] array, int arrayIndex)
{
array[arrayIndex] = _item;
}
bool ICollection<T>.Remove(T item)
{
throw new NotSupportedException();
}
int IList<T>.IndexOf(T item)
{
if (!EqualityComparer<T>.Default.Equals(_item, item))
{
return -1;
}
return 0;
}
void IList<T>.Insert(int index, T item)
{
throw new NotSupportedException();
}
void IList<T>.RemoveAt(int index)
{
throw new NotSupportedException();
}
}