Decompiled source of CotLMiniMods v1.2.3

plugins/CotlMiniMods/CotlMiniMods.dll

Decompiled 4 months ago
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.Configuration;
using BepInEx.Logging;
using COTL_API.CustomFollowerCommand;
using COTL_API.CustomInventory;
using COTL_API.CustomSettings;
using COTL_API.CustomStructures;
using COTL_API.CustomTarotCard;
using COTL_API.CustomTasks;
using COTL_API.Guid;
using COTL_API.Helpers;
using CotLMiniMods;
using CotLMiniMods.API;
using CotLMiniMods.CCommands.Tasks;
using CotLMiniMods.CustomFollowerCommands;
using CotLMiniMods.Helpers;
using CotLMiniMods.Interactions;
using CotLMiniMods.Items;
using CotLMiniMods.Meals;
using CotLMiniMods.Patches.Rituals;
using CotLMiniMods.Rituals;
using CotLMiniMods.Structures;
using CotLMiniMods.Structures.Mines;
using CotLMiniMods.Structures.Productivity;
using CotLMiniMods.Structures.Proxies;
using CotLMiniMods.Tarots;
using CotLTemplateMod.CustomFollowerCommands;
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using FMOD.Studio;
using HarmonyLib;
using I2.Loc;
using Lamb.UI;
using Lamb.UI.Assets;
using Lamb.UI.BuildMenu;
using Lamb.UI.FollowerInteractionWheel;
using Lamb.UI.FollowerSelect;
using Lamb.UI.Rituals;
using MMTools;
using Microsoft.CodeAnalysis;
using Spine;
using Spine.Unity;
using TMPro;
using UnityEngine;
using src.Extensions;
using src.UI;
using src.UI.InfoCards;
using src.UI.Menus;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("CotlMiniMods")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+81ce4f8cb3108cc204a68d53b11cc52cd7fdddcd")]
[assembly: AssemblyProduct("CotlMiniMods")]
[assembly: AssemblyTitle("CotlMiniMods")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.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 CotLTemplateMod.Patches
{
	[HarmonyPatch]
	internal class RelicResetPatch
	{
		public static RelicType temp;

		[HarmonyPatch(typeof(DataManager), "SetNewRun")]
		[HarmonyPrefix]
		public static void DataManager_SetNewRun(out RelicType __state)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected I4, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.relicNoReset.Value)
			{
				Plugin.Log.LogInfo((object)"GOT current relic (SINGLEPLAYER ONLY)");
				Plugin.Log.LogInfo((object)PlayerFarming.Instance.currentRelicType);
				__state = (RelicType)(int)PlayerFarming.Instance.currentRelicType;
				temp = PlayerFarming.Instance.currentRelicType;
			}
			else
			{
				__state = (RelicType)0;
			}
		}

		[HarmonyPatch(typeof(DataManager), "SetNewRun")]
		[HarmonyPostfix]
		public static void DataManager_SetNewRun_Post(RelicType __state)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			if ((int)__state > 0)
			{
				Plugin.Log.LogInfo((object)"GOT old relic");
				Plugin.Log.LogInfo((object)__state);
				PlayerFarming.Instance.currentRelicType = __state;
				PlayerFarming.Instance.playerRelic.EquipRelic(EquipmentManager.GetRelicData(PlayerFarming.Instance.currentRelicType), false, false);
			}
		}

		[HarmonyPatch(typeof(PlayerFarming), "Awake")]
		[HarmonyPostfix]
		public static void DataManager_ResetRunData_Post()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			Plugin.Log.LogInfo((object)"Forced Relic");
			Plugin.Log.LogInfo((object)temp);
			if ((int)temp > 0)
			{
				PlayerFarming.Instance.playerRelic.EquipRelic(EquipmentManager.GetRelicData(temp), false, false);
			}
		}
	}
}
namespace CotLTemplateMod.CustomFollowerCommands
{
	internal class EatWaiterTask : FollowerTask_EatMeal
	{
		public EatWaiterTask(int mealID)
			: base(mealID)
		{
		}

		public override Vector3 UpdateDestination(Follower follower)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			return follower.Brain.LastPosition;
		}

		public override void OnStart()
		{
			((FollowerTask)this).SetState((FollowerTaskState)4);
		}
	}
}
namespace CotLMiniMods
{
	internal class ConfigListener
	{
		public static void AddConfigEntries()
		{
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Chef Job", Plugin.chefJob, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Waiter Job", Plugin.waiterJob, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Fisher Job", Plugin.fisherJob, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Reaper Job", Plugin.reaperJob, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Custom Food", Plugin.customFood, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Custom Rituals", Plugin.customRituals, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Enable Custom Structures", Plugin.customStructures, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Death Cat Repeat", Plugin.deathCatRepeat, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Shrimp Chef Repeat", Plugin.shrimpChefRepeat, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Player Eat unlimited", Plugin.playerEatMore, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Kitchen Discount", Plugin.kitchenDiscount, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "Skip Splash", Plugin.skipSplash, (Action<bool>)null);
			CustomSettingsManager.AddBepInExConfig("CotLMiniMods", "One Click Shrine Collection", Plugin.oneClickShrineCollection, (Action<bool>)null);
		}
	}
	[BepInPlugin("InfernoDragon0.cotl.CotLChef", "CotLMiniMods", "1.2.3")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[HarmonyPatch]
	public class Plugin : BaseUnityPlugin
	{
		public const string PluginGuid = "InfernoDragon0.cotl.CotLChef";

		public const string PluginName = "CotLMiniMods";

		public const string PluginVer = "1.2.3";

		internal static ManualLogSource Log;

		internal static readonly Harmony Harmony = new Harmony("InfernoDragon0.cotl.CotLChef");

		internal static string PluginPath;

		internal static WaiterCommand waiterTask;

		internal static FisherCommand fisherTask;

		internal static DivorceCommand DivorceCommand;

		internal static FlipCoinCommand FlipCoinCommand;

		internal static KnucklebonesCommand KnucklebonesCommand;

		internal static BoneMineCommand BoneMineCommand;

		internal static SilkMineCommand SilkMineCommand;

		internal static CrystalMineCommand CrystalMineCommand;

		internal static HRManagementStructure HRManagementStructure;

		internal static CrystalMineStructure CrystalMineStructure;

		internal static BoneMineStructure BoneMineStructure;

		internal static SilkMineStructure SilkMineStructure;

		internal static WishingWellStructure WishingWellStructure;

		internal static WaiterDeskStructure WaiterDeskStructure;

		internal static ChefDeskStructure ChefDeskStructure;

		internal static Structures_LuckyNarinder Structures_LuckyNarinder;

		internal static Structures_StudyTable Structures_StudyTable;

		internal static Structures_Telescope Structures_Telescope;

		internal static Structures_AlchemyCauldron Structures_AlchemyCauldron;

		internal static Structures_EndlessPit Structures_EndlessPit;

		internal static Structures_RelicGenerator Structures_RelicGenerator;

		internal static ITEM_TYPE StrangeMaterialItem;

		internal static ITEM_TYPE StrangeEnergyItem;

		internal static ConfigEntry<bool> biggerShrine;

		internal static ConfigEntry<int> shrineSize;

		internal static ConfigEntry<bool> oneClickShrineCollection;

		internal static ConfigEntry<bool> skipSplash;

		internal static ConfigEntry<bool> kitchenDiscount;

		internal static ConfigEntry<bool> playerEatMore;

		internal static ConfigEntry<bool> deathCatRepeat;

		internal static ConfigEntry<bool> shrimpChefRepeat;

		internal static ConfigEntry<bool> chefJob;

		internal static ConfigEntry<bool> fisherJob;

		internal static ConfigEntry<bool> waiterJob;

		internal static ConfigEntry<bool> reaperJob;

		internal static ConfigEntry<bool> customFood;

		internal static ConfigEntry<bool> customStructures;

		internal static ConfigEntry<bool> customRituals;

		internal static ConfigEntry<bool> customTarots;

		internal static ConfigEntry<bool> telescopeGivesQuest;

		internal static ConfigEntry<bool> relicNoReset;

		internal static ConfigEntry<bool> NoExhaustMating;

		internal static bool SinnedToday = false;

		private void Awake()
		{
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_050e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0523: Unknown result type (might be due to invalid IL or missing references)
			//IL_052e: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0367: Unknown result type (might be due to invalid IL or missing references)
			//IL_037c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0424: Unknown result type (might be due to invalid IL or missing references)
			//IL_0439: Unknown result type (might be due to invalid IL or missing references)
			//IL_0444: Unknown result type (might be due to invalid IL or missing references)
			//IL_044f: Unknown result type (might be due to invalid IL or missing references)
			//IL_045a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0465: Unknown result type (might be due to invalid IL or missing references)
			//IL_0470: Unknown result type (might be due to invalid IL or missing references)
			//IL_047b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0486: Unknown result type (might be due to invalid IL or missing references)
			//IL_049b: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04df: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_054a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0555: Unknown result type (might be due to invalid IL or missing references)
			//IL_0560: Unknown result type (might be due to invalid IL or missing references)
			//IL_056b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0576: Unknown result type (might be due to invalid IL or missing references)
			//IL_0581: Unknown result type (might be due to invalid IL or missing references)
			//IL_058c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0597: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05cf: Unknown result type (might be due to invalid IL or missing references)
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded CotLMiniMods!");
			Log = ((BaseUnityPlugin)this).Logger;
			PluginPath = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			biggerShrine = ((BaseUnityPlugin)this).Config.Bind<bool>("", "biggerShrine", true, "Increases max capacity of shrine");
			shrineSize = ((BaseUnityPlugin)this).Config.Bind<int>("", "shrineSize", 2000, "Max capacity of shrine");
			oneClickShrineCollection = ((BaseUnityPlugin)this).Config.Bind<bool>("", "oneClickShrineCollection", true, "Instantly collect all souls in one click from shrine");
			skipSplash = ((BaseUnityPlugin)this).Config.Bind<bool>("", "skipSplash", true, "Skips the splash screen");
			kitchenDiscount = ((BaseUnityPlugin)this).Config.Bind<bool>("", "kitchenDiscount", true, "Enables a 50% food discount on Kitchen 1");
			playerEatMore = ((BaseUnityPlugin)this).Config.Bind<bool>("", "playerEatMore", true, "Allows you to eat as many times as you want per day.");
			deathCatRepeat = ((BaseUnityPlugin)this).Config.Bind<bool>("", "deathCatRepeat", false, "Allows you to re-challenge The one who waits as many times as you want.");
			shrimpChefRepeat = ((BaseUnityPlugin)this).Config.Bind<bool>("", "shrimpChefRepeat", false, "Allows you to re-challenge Chef Rakshasa as many times as you want.");
			chefJob = ((BaseUnityPlugin)this).Config.Bind<bool>("", "chefJob", true, "Allows followers to take on the chef role.");
			fisherJob = ((BaseUnityPlugin)this).Config.Bind<bool>("", "fisherJob", true, "Allows you to command followers to fish (different loot table).");
			waiterJob = ((BaseUnityPlugin)this).Config.Bind<bool>("", "waiterJob", true, "Allows followers to take on the waiter role. If you enable this, followers will not walk towards food, but wait for someone to serve.");
			reaperJob = ((BaseUnityPlugin)this).Config.Bind<bool>("", "reaperJob", true, "Allows followers to bury other followers in an Endless Pit.");
			customFood = ((BaseUnityPlugin)this).Config.Bind<bool>("", "customFood", false, "Adds custom food (partial implementation, not ready yet).");
			customStructures = ((BaseUnityPlugin)this).Config.Bind<bool>("", "customStructures", true, "Adds Custom Structures.");
			customRituals = ((BaseUnityPlugin)this).Config.Bind<bool>("", "customRituals", true, "Adds Custom Rituals.");
			customTarots = ((BaseUnityPlugin)this).Config.Bind<bool>("", "customTarots", true, "Adds Custom Tarots.");
			telescopeGivesQuest = ((BaseUnityPlugin)this).Config.Bind<bool>("", "telescopeGivesQuest", true, "Set to true if the telescope should give quests in the morning. False will provide Strange Material at a lower rate in the day.");
			relicNoReset = ((BaseUnityPlugin)this).Config.Bind<bool>("", "relicNoReset", true, "Set to true for the Relic Infuser to work, and getting to keep relics after runs.");
			NoExhaustMating = ((BaseUnityPlugin)this).Config.Bind<bool>("", "NoExhaustMating", true, "Set to true to allow mating without exhausting the follower.");
			ConfigListener.AddConfigEntries();
			TimeManager.OnNewDayStarted = (Action)Delegate.Combine(TimeManager.OnNewDayStarted, new Action(OnNewDayStarted));
			if (waiterJob.Value)
			{
				waiterTask = new WaiterCommand();
				CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)waiterTask);
			}
			if (fisherJob.Value)
			{
				fisherTask = new FisherCommand();
				CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)fisherTask);
			}
			if (customFood.Value)
			{
				CustomMealManager.AddAll();
			}
			if (customStructures.Value)
			{
				HRManagementStructure = new HRManagementStructure();
				CustomStructureManager.Add((CustomStructure)(object)HRManagementStructure);
				CrystalMineStructure = new CrystalMineStructure();
				CustomStructureManager.Add((CustomStructure)(object)CrystalMineStructure);
				WishingWellStructure = new WishingWellStructure();
				CustomStructureManager.Add((CustomStructure)(object)WishingWellStructure);
				BoneMineStructure = new BoneMineStructure();
				CustomStructureManager.Add((CustomStructure)(object)BoneMineStructure);
				SilkMineStructure = new SilkMineStructure();
				CustomStructureManager.Add((CustomStructure)(object)SilkMineStructure);
				WaiterDeskStructure = new WaiterDeskStructure();
				CustomStructureManager.Add((CustomStructure)(object)WaiterDeskStructure);
				ChefDeskStructure = new ChefDeskStructure();
				CustomStructureManager.Add((CustomStructure)(object)ChefDeskStructure);
				Structures_LuckyNarinder = new Structures_LuckyNarinder();
				CustomStructureManager.Add((CustomStructure)(object)Structures_LuckyNarinder);
				Structures_StudyTable = new Structures_StudyTable();
				CustomStructureManager.Add((CustomStructure)(object)Structures_StudyTable);
				Structures_Telescope = new Structures_Telescope();
				CustomStructureManager.Add((CustomStructure)(object)Structures_Telescope);
				Structures_AlchemyCauldron = new Structures_AlchemyCauldron();
				CustomStructureManager.Add((CustomStructure)(object)Structures_AlchemyCauldron);
				Structures_EndlessPit = new Structures_EndlessPit();
				CustomStructureManager.Add((CustomStructure)(object)Structures_EndlessPit);
				Structures_RelicGenerator = new Structures_RelicGenerator();
				CustomStructureManager.Add((CustomStructure)(object)Structures_RelicGenerator);
				CustomStructureManager.Add((CustomStructure)(object)new Structures_StrangeGenerator());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_EnergyController());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_StasisChamber());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_AIOQuarry());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_AIOFarmer());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_GiftTree());
				CustomStructureManager.Add((CustomStructure)(object)new Structures_Boutique());
				BoneMineCommand = new BoneMineCommand();
				CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)BoneMineCommand);
				SilkMineCommand = new SilkMineCommand();
				CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)SilkMineCommand);
				CrystalMineCommand = new CrystalMineCommand();
				CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)CrystalMineCommand);
				StrangeMaterialItem = CustomItemManager.Add((CustomInventoryItem)(object)new StrangeMaterialItem());
				StrangeEnergyItem = CustomItemManager.Add((CustomInventoryItem)(object)new StrangeEnergyItem());
			}
			DivorceCommand = new DivorceCommand();
			CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)DivorceCommand);
			FlipCoinCommand = new FlipCoinCommand();
			CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)FlipCoinCommand);
			KnucklebonesCommand = new KnucklebonesCommand();
			CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)KnucklebonesCommand);
			CustomFollowerCommandManager.Add((CustomFollowerCommand)(object)new Command_ForIHaveSinned());
			if (customRituals.Value)
			{
				CustomRitualManager.Add(new DistributionRitual());
				CustomRitualManager.Add(new RitualFrenzyRitual());
				CustomRitualManager.Add(new FusionRitual());
				CustomRitualManager.Add(new YouthRitual());
				CustomRitualManager.Add(new ReversalRitual());
				CustomRitualManager.Add(new MistletoeRitual());
				CustomRitualManager.Add(new MassResurrectionRitual());
				CustomRitualManager.Add(new ExiledRitual());
				CustomRitualManager.Add(new MassacreRitual());
			}
			if (customTarots.Value)
			{
				Log.LogInfo((object)"Added tarots");
				CustomTarotCardManager.Add((CustomTarotCard)(object)new Tarot_StrangeExtraction());
			}
		}

		private void OnNewDayStarted()
		{
			SinnedToday = false;
			Log.LogInfo((object)"You can now sin again.");
		}

		private void OnEnable()
		{
			Harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded CotLMiniMods!");
		}

		private void OnDisable()
		{
			Harmony.UnpatchSelf();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Unloaded CotLMiniMods!");
		}
	}
}
namespace CotLMiniMods.Tarots
{
	public class Tarot_StrangeExtraction : CustomTarotCard
	{
		public override string InternalName => "STRANGE_EXTRACTION";

		public override string Skin => "Trinkets/Sun";

		public override string LocalisedName(int upgradeIndex)
		{
			return "<color=\"red\">Strange Extraction</color>";
		}

		public override string LocalisedLore()
		{
			return "Our enemies.. <color=\"yellow\">they possess it..</color>";
		}

		public override string LocalisedDescription(int upgradeIndex)
		{
			return "When an enemy dies, they are converted into <color=\"red\">Strange Material</color>.";
		}

		public override InventoryItem GetItemToDrop(TarotCard card)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			return new InventoryItem(Plugin.StrangeMaterialItem);
		}
	}
}
namespace CotLMiniMods.Structures
{
	internal class CustomEnergyStructure : CustomStructure, IEnergyProvider
	{
		public int currentEnergy = 0;

		public int maxEnergy = 1000;

		public int regenRate = 0;

		public override string InternalName => "Custom_Energy_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/endlesspit.png"));

		public override int BuildDurationMinutes => 30;

		public int EnergyCurrent
		{
			get
			{
				return currentEnergy;
			}
			set
			{
				currentEnergy = value;
			}
		}

		public virtual int EnergyMax
		{
			get
			{
				return maxEnergy;
			}
			set
			{
				maxEnergy = value;
			}
		}

		public virtual int EnergyRegenRate
		{
			get
			{
				return 1;
			}
			set
			{
				regenRate = value;
			}
		}

		public virtual bool CanAdd => false;

		public virtual bool CanRemove => true;

		public virtual bool WorksAtNight => true;

		public virtual bool WorksAtDay => true;

		public override string GetLocalizedName()
		{
			return "Custom Energy Structure";
		}

		public override string GetLocalizedDescription()
		{
			return "Structure that uses or generates Strange Energy";
		}

		public int AddEnergy(int amount)
		{
			int result = 0;
			if (amount < 0)
			{
				return result;
			}
			if (EnergyCurrent + amount >= EnergyMax)
			{
				result = EnergyMax - EnergyCurrent;
				EnergyCurrent = EnergyMax;
			}
			else
			{
				EnergyCurrent += amount;
				result = amount;
			}
			return result;
		}

		public int RemoveEnergy(int amount)
		{
			int result = 0;
			if (amount < 0)
			{
				return result;
			}
			if (EnergyCurrent - amount <= 0)
			{
				result = EnergyCurrent;
				EnergyCurrent = 0;
			}
			else
			{
				result = amount;
				EnergyCurrent -= amount;
			}
			return result;
		}
	}
	internal class Structures_EndlessPit : CustomEnergyStructure, ITaskProvider
	{
		public int energyPerFollower = 1;

		public override string InternalName => "Structures_EndlessPit";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/endlesspit.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 20),
			new ItemCost(Plugin.StrangeMaterialItem, 10)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override int EnergyRegenRate
		{
			get
			{
				return ((StructureBrain)this).Data.Inventory.Count * energyPerFollower;
			}
			set
			{
				energyPerFollower = value;
			}
		}

		public override bool CanAdd => false;

		public override bool CanRemove => true;

		public override bool WorksAtNight => true;

		public override bool WorksAtDay => true;

		public override string GetLocalizedName()
		{
			return "Endless Pit of Gluttony";
		}

		public override string GetLocalizedDescription()
		{
			return "A pit that emits Strange Energy from dead followers. Max 10000 Energy Stored";
		}

		public override void OnAdded()
		{
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Combine(TimeManager.OnNewPhaseStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
			EnergyMax = 10000;
		}

		public override void OnRemoved()
		{
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Remove(TimeManager.OnNewPhaseStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
		}

		public override void OnNewPhaseStarted()
		{
			Plugin.Log.LogInfo((object)"Add more energy");
			AddEnergy(EnergyRegenRate);
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			foreach (Structures_DeadWorshipper item in StructureManager.GetAllStructuresOfType<Structures_DeadWorshipper>((FollowerLocation)1))
			{
				if (!((StructureBrain)item).Data.Rotten && !((StructureBrain)item).ReservedForTask)
				{
					num++;
				}
			}
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && num != 0 && Plugin.reaperJob.Value)
			{
				FollowerTask_Reaper followerTask_Reaper = new FollowerTask_Reaper(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_Reaper).Priorty, (FollowerTask)(object)followerTask_Reaper);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}
	}
	internal class Structures_StrangeGenerator : CustomEnergyStructure
	{
		public int energyPerFollower = 1;

		public override string InternalName => "Structures_StrangeGenerator";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/generator.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 200),
			new ItemCost(Plugin.StrangeMaterialItem, 3)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override int EnergyRegenRate
		{
			get
			{
				return 1000;
			}
			set
			{
				energyPerFollower = value;
			}
		}

		public override bool CanAdd => false;

		public override bool CanRemove => true;

		public override bool WorksAtNight => true;

		public override bool WorksAtDay => true;

		public override string GetLocalizedName()
		{
			return "Strange Generator";
		}

		public override string GetLocalizedDescription()
		{
			return "A machine that converts Strange Material to Strange Energy on demand. Max 10000 Energy Stored.";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
			EnergyMax = 10000;
		}
	}
	internal class FridgeStructure : CustomStructure
	{
		public override string InternalName => "Fridge_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/cotlpc.png"));
	}
	internal class HRManagementStructure : CustomStructure
	{
		public override string InternalName => "HR_Management";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/cotlpc.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 30)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override string GetLocalizedName()
		{
			return "Follower Manager";
		}

		public override string GetLocalizedDescription()
		{
			return "A modern device to manage your followers remotely.";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
		}
	}
	internal class Structures_AlchemyCauldron : CustomStructure
	{
		public ITEM_TYPE SelectedCookItem = (ITEM_TYPE)45;

		public override string InternalName => "Structures_AlchemyCauldron";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/cauldron.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 750),
			new ItemCost(Plugin.StrangeMaterialItem, 25)
		};

		public List<ITEM_TYPE> CookItems => new List<ITEM_TYPE>
		{
			(ITEM_TYPE)45,
			(ITEM_TYPE)46,
			(ITEM_TYPE)47,
			(ITEM_TYPE)48,
			(ITEM_TYPE)49,
			(ITEM_TYPE)124,
			(ITEM_TYPE)123,
			(ITEM_TYPE)127,
			(ITEM_TYPE)125,
			(ITEM_TYPE)122,
			(ITEM_TYPE)126
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override string GetLocalizedName()
		{
			return "Alchemy Cauldron";
		}

		public override string GetLocalizedDescription()
		{
			return "A Cauldron that allows you to fabricate necklaces using the power of Strange Materials.";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
		}
	}
	internal class Structures_AugmentTable : CustomStructure
	{
		public override string InternalName => "Structures_AugmentTable";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/cauldron.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 500),
			new ItemCost(Plugin.StrangeMaterialItem, 8)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override string GetLocalizedName()
		{
			return "Augment Table";
		}

		public override string GetLocalizedDescription()
		{
			return "A machine that helps infuse The Lamb with Strange Material.";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
		}
	}
	internal class Structures_EnergyController : CustomEnergyStructure
	{
		public int energyPerPhase = 0;

		public bool timeFrozen = false;

		public override string InternalName => "Structures_EnergyController";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/wireless.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 1000),
			new ItemCost(Plugin.StrangeMaterialItem, 25)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override int EnergyRegenRate => 0;

		public override bool CanAdd => true;

		public override bool CanRemove => true;

		public override bool WorksAtNight => true;

		public override bool WorksAtDay => true;

		public override string GetLocalizedName()
		{
			return "Energy Controller";
		}

		public override string GetLocalizedDescription()
		{
			return "A device that collects and transfers Strange Energy. Stores up to 10000 Strange Energy";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
			EnergyMax = 10000;
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Combine(TimeManager.OnNewPhaseStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
		}

		public override void OnRemoved()
		{
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Remove(TimeManager.OnNewPhaseStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
		}

		public override void OnNewPhaseStarted()
		{
			Plugin.Log.LogInfo((object)"Collecting energy..");
			foreach (StructureBrain item in StructureManager.StructuresAtLocation((FollowerLocation)1))
			{
				if (!(item is Structures_EnergyController) && item is CustomEnergyStructure customEnergyStructure && customEnergyStructure.CanRemove)
				{
					Plugin.Log.LogInfo((object)("Found energy structure: " + ((CustomStructure)customEnergyStructure).InternalName + " with " + customEnergyStructure.EnergyCurrent + " energy"));
					int amount = ((customEnergyStructure.EnergyCurrent + base.EnergyCurrent < customEnergyStructure.EnergyMax) ? customEnergyStructure.EnergyCurrent : (EnergyMax - base.EnergyCurrent));
					Plugin.Log.LogInfo((object)("Before adding, this structure has " + base.EnergyCurrent + " energy"));
					AddEnergy(amount);
					customEnergyStructure.RemoveEnergy(amount);
					Plugin.Log.LogInfo((object)("Now this structure has " + base.EnergyCurrent + " energy"));
				}
			}
			Plugin.Log.LogInfo((object)"Distributing Energy..");
			foreach (StructureBrain item2 in StructureManager.StructuresAtLocation((FollowerLocation)1))
			{
				if (!(item2 is Structures_EnergyController) && item2 is CustomEnergyStructure customEnergyStructure2 && customEnergyStructure2.CanAdd)
				{
					Plugin.Log.LogInfo((object)("Found to add structure: " + ((CustomStructure)customEnergyStructure2).InternalName + " with " + customEnergyStructure2.EnergyCurrent + " energy"));
					int amount2 = ((customEnergyStructure2.EnergyCurrent + base.EnergyCurrent < EnergyMax) ? base.EnergyCurrent : (EnergyMax - base.EnergyCurrent));
					Plugin.Log.LogInfo((object)("Before removing, that structure has " + customEnergyStructure2.EnergyCurrent + " energy"));
					RemoveEnergy(amount2);
					customEnergyStructure2.AddEnergy(amount2);
					Plugin.Log.LogInfo((object)("Now that structure has " + customEnergyStructure2.EnergyCurrent + " energy"));
					Plugin.Log.LogInfo((object)("Now this structure has " + base.EnergyCurrent + " energy"));
				}
			}
		}
	}
	internal class Structures_StasisChamber : CustomEnergyStructure
	{
		public int energyPerPhase = 50;

		public bool timeFrozen = false;

		public override string InternalName => "Structures_StasisChamber";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/stasis.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 150),
			new ItemCost(Plugin.StrangeMaterialItem, 10)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override int EnergyRegenRate => 0;

		public override bool CanAdd => true;

		public override bool CanRemove => false;

		public override bool WorksAtNight => true;

		public override bool WorksAtDay => true;

		public override string GetLocalizedName()
		{
			return "Stasis Chamber";
		}

		public override string GetLocalizedDescription()
		{
			return "An exotic machine that uses Strange Material to freeze time.";
		}

		public override void OnAdded()
		{
			((StructureBrain)this).OnAdded();
			EnergyMax = 1000;
		}
	}
	internal class SprinklerStructure : CustomStructure
	{
		public override string InternalName => "Sprinkler_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/cotlpc.png"));
	}
	internal class Structures_RelicGenerator : CustomStructure
	{
		public override string InternalName => "Structures_RelicGenerator";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/Icon_Pond.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 250),
			new ItemCost(Plugin.StrangeMaterialItem, 5)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override string GetLocalizedName()
		{
			return "Relic Infuser";
		}

		public override string GetLocalizedDescription()
		{
			return "Infuse Strange Material into the Lamb to bond with a Relic. If the relic is dropped, it will transform back after your next encounter.";
		}
	}
	internal class WishingWellStructure : CustomStructure
	{
		public override string InternalName => "Wishing_Well";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/Icon_Pond.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 50),
			new ItemCost((ITEM_TYPE)86, 5)
		};

		public override Category Category => (Category)0;

		public override Categories StructureCategories => (Categories)13;

		public override string GetLocalizedName()
		{
			return "Wishing Well";
		}

		public override string GetLocalizedDescription()
		{
			return "Give Coins. Get blessed.";
		}
	}
}
namespace CotLMiniMods.Structures.Proxies
{
	internal class ChefDeskStructure : CustomStructure, ITaskProvider
	{
		public ITEM_TYPE SelectedCookItem = (ITEM_TYPE)57;

		public override string InternalName => "Chef_Desk_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/chefdesk.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 10),
			new ItemCost((ITEM_TYPE)35, 5),
			new ItemCost((ITEM_TYPE)1, 10)
		};

		public List<ITEM_TYPE> CookItems => new List<ITEM_TYPE>
		{
			(ITEM_TYPE)57,
			(ITEM_TYPE)69,
			(ITEM_TYPE)100,
			(ITEM_TYPE)112,
			(ITEM_TYPE)108,
			(ITEM_TYPE)106,
			(ITEM_TYPE)58,
			(ITEM_TYPE)80,
			(ITEM_TYPE)109,
			(ITEM_TYPE)107
		};

		public override string GetLocalizedName()
		{
			return "Sous Chef Desk";
		}

		public override string GetLocalizedDescription()
		{
			return "A Desk for the Sous Chef to create Signature Dishes.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask)
			{
				if (Interaction_FollowerKitchen.FollowerKitchens.Count > 0 && ((Interaction_Kitchen)Interaction_FollowerKitchen.FollowerKitchens[0]).StructureInfo.QueuedMeals.Count > 0)
				{
					FollowerTask_CookCustom followerTask_CookCustom = new FollowerTask_CookCustom(((StructureBrain)this).Data.ID);
					sortedTasks.Add(((FollowerTask)followerTask_CookCustom).Priorty, (FollowerTask)(object)followerTask_CookCustom);
				}
				if (FollowerManager.GetHungriestFollowerBrain().GetHungerScore() > 0f)
				{
					Debug.Log((object)("Someone is hungry at " + FollowerManager.GetHungriestFollowerBrain().GetHungerScore()));
					FollowerTask_CookCustom followerTask_CookCustom2 = new FollowerTask_CookCustom(((StructureBrain)this).Data.ID);
					sortedTasks.Add(((FollowerTask)followerTask_CookCustom2).Priorty, (FollowerTask)(object)followerTask_CookCustom2);
				}
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class WaiterDeskStructure : CustomStructure, ITaskProvider
	{
		public override string InternalName => "Waiter_Desk_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/waiterdesk.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 10),
			new ItemCost((ITEM_TYPE)35, 5),
			new ItemCost((ITEM_TYPE)1, 10)
		};

		public override string GetLocalizedName()
		{
			return "Waiter Desk";
		}

		public override string GetLocalizedDescription()
		{
			return "A Desk to allow followers to serve food to other followers.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			foreach (Structures_Meal item in StructureManager.GetAllStructuresOfType<Structures_Meal>((FollowerLocation)1))
			{
				if (!((StructureBrain)item).Data.Rotten && !((StructureBrain)item).Data.Burned && !((StructureBrain)item).ReservedForTask)
				{
					num++;
				}
			}
			foreach (Interaction_FollowerKitchen followerKitchen in Interaction_FollowerKitchen.FollowerKitchens)
			{
				foreach (InventoryItem item2 in followerKitchen.foodStorage.StructureInfo.Inventory)
				{
					if (item2.UnreservedQuantity > 0)
					{
						num++;
					}
				}
			}
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && num != 0)
			{
				WaiterTask waiterTask = new WaiterTask(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)waiterTask).Priorty, (FollowerTask)(object)waiterTask);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
}
namespace CotLMiniMods.Structures.Productivity
{
	internal class Structures_LuckyNarinder : CustomStructure, ITaskProvider
	{
		public override string InternalName => "Structures_LuckyNarinder";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/luckynarinder.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 15),
			new ItemCost((ITEM_TYPE)81, 5),
			new ItemCost((ITEM_TYPE)82, 5)
		};

		public override string GetLocalizedName()
		{
			return "Lucky Narinder Statue";
		}

		public override string GetLocalizedDescription()
		{
			return "Follower can admire this statue and pray to it. Provides Faith.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask)
			{
				FollowerTask_DevoteNarinder followerTask_DevoteNarinder = new FollowerTask_DevoteNarinder(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_DevoteNarinder).Priorty, (FollowerTask)(object)followerTask_DevoteNarinder);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_StudyTable : CustomStructure, ITaskProvider
	{
		public override string InternalName => "Structures_StudyTable";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/study.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 15),
			new ItemCost((ITEM_TYPE)81, 7),
			new ItemCost((ITEM_TYPE)35, 10)
		};

		public override string GetLocalizedName()
		{
			return "Study Table";
		}

		public override string GetLocalizedDescription()
		{
			return "Allows your followers to research in Strange Materials. Invest Gold to increase generation. The follower will gain loyalty as well.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask)
			{
				FollowerTask_StudyResearch followerTask_StudyResearch = new FollowerTask_StudyResearch(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_StudyResearch).Priorty, (FollowerTask)(object)followerTask_StudyResearch);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_Telescope : CustomStructure, ITaskProvider
	{
		public bool UsedForTheDay = false;

		public override string InternalName => "Structures_Telescope";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/telescope.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 15),
			new ItemCost((ITEM_TYPE)81, 5),
			new ItemCost((ITEM_TYPE)82, 5)
		};

		public override string GetLocalizedName()
		{
			return "Telescope";
		}

		public override string GetLocalizedDescription()
		{
			return "Allows your followers to see the stars, and gain inspiration.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && !UsedForTheDay)
			{
				FollowerTask_Stargazing followerTask_Stargazing = new FollowerTask_Stargazing(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_Stargazing).Priorty, (FollowerTask)(object)followerTask_Stargazing);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}

		public override void OnAdded()
		{
			TimeManager.OnNewDayStarted = (Action)Delegate.Combine(TimeManager.OnNewDayStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Combine(TimeManager.OnNewPhaseStarted, new Action(CheckNight));
		}

		public override void OnRemoved()
		{
			TimeManager.OnNewDayStarted = (Action)Delegate.Remove(TimeManager.OnNewDayStarted, new Action(((StructureBrain)this).OnNewPhaseStarted));
			TimeManager.OnNewPhaseStarted = (Action)Delegate.Remove(TimeManager.OnNewPhaseStarted, new Action(CheckNight));
		}

		public override void OnNewPhaseStarted()
		{
			Plugin.Log.LogInfo((object)"Reset use for the day for telescope");
			UsedForTheDay = false;
		}

		public void CheckNight()
		{
			if (TimeManager.IsNight)
			{
				Plugin.Log.LogInfo((object)"Reset for the night");
				UsedForTheDay = false;
			}
		}
	}
}
namespace CotLMiniMods.Structures.Mines
{
	internal class BoneMineStructure : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 150;

		public override string InternalName => "Bone_Mine_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/bonemines.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 6),
			new ItemCost((ITEM_TYPE)9, 5),
			new ItemCost((ITEM_TYPE)2, 5)
		};

		public override string GetLocalizedName()
		{
			return "Bone Mines";
		}

		public override string GetLocalizedDescription()
		{
			return "A place to mine bones.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_BoneMiner followerTask_BoneMiner = new FollowerTask_BoneMiner(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_BoneMiner).Priorty, (FollowerTask)(object)followerTask_BoneMiner);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class CrystalMineStructure : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 150;

		public override string InternalName => "Crystal_Mine_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/crystalmines.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 15),
			new ItemCost((ITEM_TYPE)89, 3),
			new ItemCost((ITEM_TYPE)2, 5)
		};

		public override string GetLocalizedName()
		{
			return "Crystal Mines";
		}

		public override string GetLocalizedDescription()
		{
			return "A place to mine crystals.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_CrystalMiner followerTask_CrystalMiner = new FollowerTask_CrystalMiner(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_CrystalMiner).Priorty, (FollowerTask)(object)followerTask_CrystalMiner);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class SilkMineStructure : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 150;

		public override string InternalName => "Silk_Mine_Structure";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/silkmines.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 55),
			new ItemCost((ITEM_TYPE)86, 3),
			new ItemCost((ITEM_TYPE)2, 15)
		};

		public override string GetLocalizedName()
		{
			return "Silk Mines";
		}

		public override string GetLocalizedDescription()
		{
			return "A place to harvest webs.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_SilkMiner followerTask_SilkMiner = new FollowerTask_SilkMiner(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_SilkMiner).Priorty, (FollowerTask)(object)followerTask_SilkMiner);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_AIOFarmer : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 1000;

		public ITEM_TYPE SelectedQuarryItem = (ITEM_TYPE)35;

		public override string InternalName => "Structures_AIOFarmer";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/aiofarm.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 1000),
			new ItemCost(Plugin.StrangeMaterialItem, 15)
		};

		public List<ITEM_TYPE> QuarryItems => new List<ITEM_TYPE>
		{
			(ITEM_TYPE)50,
			(ITEM_TYPE)97,
			(ITEM_TYPE)102,
			(ITEM_TYPE)29,
			(ITEM_TYPE)21,
			(ITEM_TYPE)55,
			(ITEM_TYPE)56,
			(ITEM_TYPE)77,
			(ITEM_TYPE)35
		};

		public override string GetLocalizedName()
		{
			return "Incubation Chamber";
		}

		public override string GetLocalizedDescription()
		{
			return "A machine powered by Strange Energy to incubate seeds.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_AIOFarmer followerTask_AIOFarmer = new FollowerTask_AIOFarmer(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_AIOFarmer).Priorty, (FollowerTask)(object)followerTask_AIOFarmer);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_AIOQuarry : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 1000;

		public ITEM_TYPE SelectedQuarryItem = (ITEM_TYPE)2;

		public override string InternalName => "Structures_AIOQuarry";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/aio.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 1500),
			new ItemCost(Plugin.StrangeMaterialItem, 20)
		};

		public List<ITEM_TYPE> QuarryItems => new List<ITEM_TYPE>
		{
			(ITEM_TYPE)20,
			(ITEM_TYPE)2,
			(ITEM_TYPE)82,
			(ITEM_TYPE)1,
			(ITEM_TYPE)81,
			(ITEM_TYPE)117,
			(ITEM_TYPE)39,
			(ITEM_TYPE)83,
			(ITEM_TYPE)6,
			(ITEM_TYPE)7
		};

		public override string GetLocalizedName()
		{
			return "AIO Quarry";
		}

		public override string GetLocalizedDescription()
		{
			return "A machine powered by Strange Energy to generate your preferred output.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_AIOMiner followerTask_AIOMiner = new FollowerTask_AIOMiner(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_AIOMiner).Priorty, (FollowerTask)(object)followerTask_AIOMiner);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_Boutique : CustomStructure, ITaskProvider
	{
		public override string InternalName => "Structures_Boutique";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/GiftTree.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost(Plugin.StrangeMaterialItem, 5),
			new ItemCost((ITEM_TYPE)1, 10)
		};

		public override string GetLocalizedName()
		{
			return "The Boutique";
		}

		public override string GetLocalizedDescription()
		{
			return "Followers can create Gifts to pass to other followers to improve their relationship.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask)
			{
				FollowerTask_Boutique followerTask_Boutique = new FollowerTask_Boutique(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_Boutique).Priorty, (FollowerTask)(object)followerTask_Boutique);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
	internal class Structures_GiftTree : CustomStructure, ITaskProvider
	{
		public int ResourceMax = 150;

		public override string InternalName => "Structures_GiftTree";

		public override Sprite Sprite => TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/GiftTree.png"));

		public override int BuildDurationMinutes => 30;

		public override List<ItemCost> Cost => new List<ItemCost>
		{
			new ItemCost(Plugin.StrangeMaterialItem, 5),
			new ItemCost((ITEM_TYPE)1, 10)
		};

		public override string GetLocalizedName()
		{
			return "Tree of Giving";
		}

		public override string GetLocalizedDescription()
		{
			return "Followers can work here to pack collectable gifts.";
		}

		public bool CheckOverrideComplete()
		{
			return true;
		}

		public void GetAvailableTasks(ScheduledActivity activity, SortedList<float, FollowerTask> sortedTasks)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			if ((int)activity == 0 && !((StructureBrain)this).ReservedForTask && ((StructureBrain)this).Data.Inventory.Count < ResourceMax)
			{
				FollowerTask_GiftPacking followerTask_GiftPacking = new FollowerTask_GiftPacking(((StructureBrain)this).Data.ID);
				sortedTasks.Add(((FollowerTask)followerTask_GiftPacking).Priorty, (FollowerTask)(object)followerTask_GiftPacking);
			}
		}

		public FollowerTask GetOverrideTask(FollowerBrain brain)
		{
			throw new NotImplementedException();
		}
	}
}
namespace CotLMiniMods.Rituals
{
	public abstract class CustomRitual : Ritual
	{
		internal string ModPrefix;

		public Type upgradeType;

		public abstract string InternalName { get; }

		public virtual Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/placeholder.png"));


		public virtual List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)1, 1)
		};


		public override Type RitualType => upgradeType;

		public virtual string GetLocalizedName => "Custom_Ritual_" + InternalName;

		public virtual string GetLocalizedDescription => "Custom_Ritual_" + InternalName + "_Description";

		public virtual float FaithChange { get; } = 5f;


		public virtual TraitType RitualTrait { get; } = (TraitType)0;


		public virtual float Cooldown => 120f;
	}
	public class DistributionRitual : CustomRitual
	{
		private EventInstance loopedSound;

		public override string InternalName { get; } = "Distribution_Ritual";


		public override Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/ritual_leveling.png"));


		public override List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 300)
		};


		public override string GetLocalizedName => "Distribution Ritual";

		public override string GetLocalizedDescription => "Distribute your wealth among the followers! They will instantly level up.";

		public override float FaithChange { get; } = 10f;


		public override TraitType RitualTrait { get; } = (TraitType)0;


		public override float Cooldown => 60f;

		public override void Play()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			((Ritual)this).Play();
			ManualLogSource log = Plugin.Log;
			string? text = ((object)(Type)(ref upgradeType)).ToString();
			Type ritualType = ((Ritual)this).RitualType;
			log.LogInfo((object)("Starting ritual for " + text + " and " + ((object)(Type)(ref ritualType)).ToString()));
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(RitualRoutine());
		}

		private IEnumerator RitualRoutine()
		{
			AudioManager.Instance.PlayOneShot("event:/rituals/generic_start_ritual");
			Interaction_TempleAltar.Instance.SimpleSetCamera.Play();
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).WaitFollowersFormCircle(false, true, 12f));
			((Interaction)Interaction_TempleAltar.Instance).state.CURRENT_STATE = (State)49;
			PlayerFarming.Instance.simpleSpineAnimator.Animate("build", 0, true);
			TweenSettingsExtensions.SetUpdate<TweenerCore<Vector3, Vector3, VectorOptions>>(TweenSettingsExtensions.SetEase<TweenerCore<Vector3, Vector3, VectorOptions>>(ShortcutExtensions.DOMove(((Component)PlayerFarming.Instance.state).transform, ChurchFollowerManager.Instance.RitualCenterPosition.position, 0.1f, false), (Ease)4), true);
			Bone obj = ((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.FindBone("ritualring");
			obj.Rotation += 60f;
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.UpdateWorldTransform();
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.Update(Time.deltaTime);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-start", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("rituals/ritual-loop", 0, true, 0f);
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(true);
			ChurchFollowerManager.Instance.StartRitualOverlay();
			BiomeConstants.Instance.ChromaticAbberationTween(2f, BiomeConstants.Instance.ChromaticAberrationDefaultValue, 1f);
			BiomeConstants.Instance.VignetteTween(2f, BiomeConstants.Instance.VignetteDefaultValue, 0.7f);
			TweenSettingsExtensions.SetEase<TweenerCore<float, float, FloatOptions>>(DOTween.To((DOGetter<float>)(() => GameManager.GetInstance().CamFollowTarget.targetDistance), (DOSetter<float>)delegate(float x)
			{
				GameManager.GetInstance().CamFollowTarget.targetDistance = x;
			}, 6.5f, 1f), (Ease)3);
			yield return (object)new WaitForSeconds(1.2f);
			loopedSound = AudioManager.Instance.CreateLoop("event:/rituals/coin_loop", ((Component)PlayerFarming.Instance).gameObject, true, true);
			float delay = 0f;
			foreach (FollowerBrain followerBrain3 in Ritual.GetFollowersAvailableToAttendSermon(false))
			{
				((MonoBehaviour)this).StartCoroutine(GiveCoins(FollowerManager.FindFollowerByID(followerBrain3.Info.ID), 5f, delay));
				delay += 0.1f;
			}
			yield return (object)new WaitForSeconds(5f);
			AudioManager.Instance.StopLoop(loopedSound);
			yield return (object)new WaitForSeconds(1.2f);
			Interaction_TempleAltar.Instance.PulseDisplacementObject(PlayerFarming.Instance.CameraBone.transform.position);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
			foreach (FollowerBrain followerBrain2 in Ritual.FollowerToAttendSermon)
			{
				if (followerBrain2.CurrentTask is FollowerTask_AttendRitual)
				{
					FollowerTask currentTask = followerBrain2.CurrentTask;
					((FollowerTask_AttendRitual)((currentTask is FollowerTask_AttendRitual) ? currentTask : null)).Cheer();
				}
			}
			yield return (object)new WaitForSeconds(0.5f);
			BiomeConstants.Instance.ChromaticAbberationTween(1f, 1f, BiomeConstants.Instance.ChromaticAberrationDefaultValue);
			BiomeConstants.Instance.VignetteTween(1f, 0.7f, BiomeConstants.Instance.VignetteDefaultValue);
			ChurchFollowerManager.Instance.EndRitualOverlay();
			GameManager.GetInstance().CamFollowTarget.targetDistance = 11f;
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(false);
			float EndingDelay = 0f;
			foreach (FollowerBrain followerBrain in Ritual.FollowerToAttendSermon)
			{
				FollowerBrain brain = followerBrain;
				brain.AddThought((Thought)177, false, false);
				brain.Stats.Adoration = brain.Stats.MAX_ADORATION;
				Follower f = FollowerManager.FindFollowerByID(brain.Info.ID);
				f.AdorationUI.BarController.SetBarSize(brain.Stats.Adoration / brain.Stats.MAX_ADORATION, false, true, (NotificationData)null);
				((MonoBehaviour)f).StartCoroutine(brain.AddAdorationIE(f, (AdorationActions)0, (Action)null));
			}
			yield return (object)new WaitForSeconds(3f + EndingDelay);
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			((Ritual)this).CompleteRitual(false, -1, -1, true);
			yield return (object)new WaitForSeconds(1f);
			CultFaithManager.AddThought((Thought)244, -1, 1f, Array.Empty<string>());
		}

		private IEnumerator GiveCoins(Follower follower, float totalTime, float delay)
		{
			yield return (object)new WaitForSeconds(delay);
			int randomCoins = 50;
			float increment = (totalTime - delay) / (float)randomCoins;
			int i = 0;
			while (i < randomCoins)
			{
				AudioManager.Instance.PlayOneShot("event:/followers/pop_in", ((Component)PlayerFarming.Instance).transform.position);
				ResourceCustomTarget.Create(((Component)follower).gameObject, ((Component)PlayerFarming.Instance).transform.position, (ITEM_TYPE)20, (Action)PlayCoinSound, true);
				yield return (object)new WaitForSeconds(increment);
				int num = i + 1;
				i = num;
			}
		}

		private void PlayCoinSound()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			AudioManager.Instance.PlayOneShot("event:/rituals/coins", ((Component)PlayerFarming.Instance).transform.position);
		}
	}
	public class ExiledRitual : CustomRitual
	{
		public Follower followerToLeave;

		public override string InternalName { get; } = "Exiled_Ritual";


		public override Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/ritual_exile.png"));


		public override List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost(Plugin.StrangeMaterialItem, 3)
		};


		public override string GetLocalizedName => "Ritual of Exile";

		public override string GetLocalizedDescription => "Removes a follower from existence, permanently leaving the cult. Warning: this action is irreversible!";

		public override float FaithChange { get; } = 10f;


		public override TraitType RitualTrait { get; } = (TraitType)0;


		public override float Cooldown => 60f;

		public override void Play()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			((Ritual)this).Play();
			ManualLogSource log = Plugin.Log;
			string? text = ((object)(Type)(ref upgradeType)).ToString();
			Type ritualType = ((Ritual)this).RitualType;
			log.LogInfo((object)("Starting ritual for " + text + " and " + ((object)(Type)(ref ritualType)).ToString()));
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(RitualRoutine());
		}

		private IEnumerator RitualRoutine()
		{
			bool Cancelled = false;
			AudioManager.Instance.PlayOneShot("event:/rituals/generic_start_ritual");
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).CentreAndAnimatePlayer());
			Interaction_TempleAltar.Instance.SimpleSetCamera.Play();
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).WaitFollowersFormCircle(false, true, 12f));
			Bone obj = ((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.FindBone("ritualring");
			obj.Rotation += 60f;
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.UpdateWorldTransform();
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.Update(Time.deltaTime);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-start", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("rituals/ritual-loop", 0, true, 0f);
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(true);
			ChurchFollowerManager.Instance.StartRitualOverlay();
			UIFollowerSelectMenuController followerSelectInstance = GameObjectExtensions.Instantiate<UIFollowerSelectMenuController>(MonoSingleton<UIManager>.Instance.FollowerSelectMenuTemplate);
			new List<FollowerInfo>();
			Helper.MakeSimpleFSEFromList(DataManager.Instance.Followers, (Status)0);
			followerSelectInstance.Show(Ritual.GetFollowerSelectEntriesForSermon(0, false), false, (Type)60, true, true, true, false);
			UIFollowerSelectMenuController obj2 = followerSelectInstance;
			((UIFollowerSelectBase<FollowerInformationBox>)(object)obj2).OnFollowerSelected = (Action<FollowerInfo>)Delegate.Combine(((UIFollowerSelectBase<FollowerInformationBox>)(object)obj2).OnFollowerSelected, (Action<FollowerInfo>)delegate(FollowerInfo followerInfo)
			{
				followerToLeave = FollowerManager.FindFollowerByID(followerInfo.ID);
				UIManager.PlayAudio("event:/ritual_sacrifice/ritual_begin");
			});
			((UIMenuBase)followerSelectInstance).OnCancel = (Action)Delegate.Combine(((UIMenuBase)followerSelectInstance).OnCancel, (Action)delegate
			{
				((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(EndRitual());
				Cancelled = true;
				((Ritual)this).CompleteRitual(true, -1, -1, true);
				((Ritual)this).CancelFollowers();
			});
			UIFollowerSelectMenuController obj3 = followerSelectInstance;
			((UIMenuBase)obj3).OnHidden = (Action)Delegate.Combine(((UIMenuBase)obj3).OnHidden, (Action)delegate
			{
				followerSelectInstance = null;
			});
			UIFollowerSelectMenuController obj4 = followerSelectInstance;
			((UIMenuBase)obj4).OnShow = (Action)Delegate.Combine(((UIMenuBase)obj4).OnShow, (Action)delegate
			{
				foreach (FollowerInformationBox followerInfoBox in ((UIFollowerSelectBase<FollowerInformationBox>)(object)followerSelectInstance).FollowerInfoBoxes)
				{
					((TMP_Text)followerInfoBox.FollowerRole).text = "Warning: permanently erases follower!!";
				}
			});
			while ((Object)(object)followerSelectInstance != (Object)null && !Cancelled)
			{
				yield return null;
			}
			if (!Cancelled)
			{
				yield return (object)new WaitForSeconds(1.2f);
				ChurchFollowerManager.Instance.PlayOverlay((OverlayType)0, "resurrect", "", false);
				yield return (object)new WaitForSeconds(0.5f);
				((Ritual)this).PlaySacrificePortalEffect();
				followerToLeave.Brain.CompleteCurrentTask();
				FollowerTask_ManualControl nextTask = new FollowerTask_ManualControl();
				followerToLeave.Brain.HardSwapToTask((FollowerTask)(object)nextTask);
				followerToLeave.Brain.InRitual = true;
				followerToLeave.SetOutfit(followerToLeave.Brain.Info.Outfit, true, (Thought)0);
				foreach (FollowerBrain allBrain in FollowerBrain.AllBrains)
				{
					if ((int)allBrain.CurrentTaskType == 21)
					{
						FollowerTask currentTask = allBrain.CurrentTask;
						((FollowerTask_AttendRitual)((currentTask is FollowerTask_AttendRitual) ? currentTask : null)).WorshipTentacle();
					}
				}
				yield return (object)new WaitForSeconds(0.5f);
				AudioManager.Instance.PlayOneShot("event:/rituals/resurrect");
				yield return (object)new WaitForSeconds(1.2f);
				TweenCallback val = default(TweenCallback);
				followerToLeave.HoodOff("idle", false, (Action)delegate
				{
					//IL_0047: 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)
					//IL_006e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0070: Expected O, but got Unknown
					//IL_0075: Expected O, but got Unknown
					followerToLeave.Spine.AnimationState.SetAnimation(1, "walk", true);
					TweenerCore<Vector3, Vector3, VectorOptions> obj5 = ShortcutExtensions.DOMove(((Component)followerToLeave).gameObject.transform, ((Component)Interaction_TempleAltar.Instance.PortalEffect).transform.position, 2.5f, false);
					TweenCallback obj6 = val;
					if (obj6 == null)
					{
						TweenCallback val2 = delegate
						{
							Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
							((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(ExileRoutine());
						};
						TweenCallback val3 = val2;
						val = val2;
						obj6 = val3;
					}
					TweenSettingsExtensions.OnComplete<TweenerCore<Vector3, Vector3, VectorOptions>>(obj5, obj6);
				});
				yield return (object)new WaitForSeconds(10f);
				((Ritual)this).StopSacrificePortalEffect();
				ChurchFollowerManager.Instance.StopSacrificePortalEffect();
				Interaction_TempleAltar.Instance.PulseDisplacementObject(PlayerFarming.Instance.CameraBone.transform.position);
				PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
				PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
				foreach (FollowerBrain followerBrain in Ritual.FollowerToAttendSermon)
				{
					if (followerBrain.CurrentTask is FollowerTask_AttendRitual)
					{
						FollowerTask currentTask2 = followerBrain.CurrentTask;
						((FollowerTask_AttendRitual)((currentTask2 is FollowerTask_AttendRitual) ? currentTask2 : null)).Cheer();
					}
				}
				yield return (object)new WaitForSeconds(3f);
			}
			ChurchFollowerManager.Instance.EndRitualOverlay();
			GameManager.GetInstance().CamFollowTarget.targetDistance = 11f;
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(false);
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			((Ritual)this).CompleteRitual(false, -1, -1, true);
		}

		private IEnumerator EndRitual()
		{
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
			yield return (object)new WaitForSeconds(2f / 3f);
		}

		private IEnumerator ExileRoutine()
		{
			ChurchFollowerManager.Instance.RemoveBrainFromAudience(followerToLeave.Brain);
			followerToLeave.Spine.AnimationState.SetAnimation(1, "Reactions/react-scared", false);
			yield return (object)new WaitForSeconds(1.9f);
			followerToLeave.Spine.AnimationState.SetAnimation(1, "Spawn-Out-Portal", false);
			yield return (object)new WaitForSeconds(2.8f);
			followerToLeave.Brain.LeftCult = true;
			followerToLeave.LeaveCult();
		}
	}
	public class FusionRitual : CustomRitual
	{
		private Follower sacrificeFollower;

		private Follower absorbtionFollower;

		public override string InternalName { get; } = "Fusion_Ritual";


		public override Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/ritual_fusion.png"));


		public override List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost((ITEM_TYPE)20, 1000)
		};


		public override string GetLocalizedName => "Fusion Ritual";

		public override string GetLocalizedDescription => "Sacrifice a selected Follower. The next selected Follower gets the sacrificed follower's traits.";

		public override float FaithChange { get; } = 20f;


		public override float Cooldown => 60f;

		public override TraitType RitualTrait { get; } = (TraitType)0;


		public override void Play()
		{
			((Ritual)this).Play();
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(RitualRoutine());
		}

		private IEnumerator RitualRoutine()
		{
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).CentreAndAnimatePlayer());
			Interaction_TempleAltar.Instance.SimpleSetCamera.Play();
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).WaitFollowersFormCircle(false, true, 12f));
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-start", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("rituals/ritual-loop", 0, true, 0f);
			yield return (object)new WaitForSeconds(1f);
			bool Cancelled = false;
			UIFollowerSelectMenuController followerSelectInstance = GameObjectExtensions.Instantiate<UIFollowerSelectMenuController>(MonoSingleton<UIManager>.Instance.FollowerSelectMenuTemplate);
			followerSelectInstance.Show(Ritual.GetFollowerSelectEntriesForSermon(0, false), false, (Type)60, true, true, true, false);
			UIFollowerSelectMenuController obj = followerSelectInstance;
			((UIFollowerSelectBase<FollowerInformationBox>)(object)obj).OnFollowerSelected = (Action<FollowerInfo>)Delegate.Combine(((UIFollowerSelectBase<FollowerInformationBox>)(object)obj).OnFollowerSelected, (Action<FollowerInfo>)delegate(FollowerInfo followerInfo)
			{
				sacrificeFollower = FollowerManager.FindFollowerByID(followerInfo.ID);
				UIManager.PlayAudio("event:/ritual_sacrifice/ritual_begin");
			});
			UIFollowerSelectMenuController obj2 = followerSelectInstance;
			((UIMenuBase)obj2).OnShow = (Action)Delegate.Combine(((UIMenuBase)obj2).OnShow, (Action)delegate
			{
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				foreach (FollowerInformationBox followerInfoBox in ((UIFollowerSelectBase<FollowerInformationBox>)(object)followerSelectInstance).FollowerInfoBoxes)
				{
					string text = "";
					foreach (TraitType trait in followerInfoBox.followBrain.Info.Traits)
					{
						TraitType current3 = trait;
						text = text + ((object)(TraitType)(ref current3)).ToString() + " | ";
					}
					((TMP_Text)followerInfoBox.FollowerRole).text = "Traits: " + text;
				}
			});
			((UIMenuBase)followerSelectInstance).OnCancel = (Action)Delegate.Combine(((UIMenuBase)followerSelectInstance).OnCancel, (Action)delegate
			{
				((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(EndRitual());
				Cancelled = true;
				((Ritual)this).CompleteRitual(true, -1, -1, true);
				((Ritual)this).CancelFollowers();
			});
			Plugin.Log.LogInfo((object)"on hidden");
			UIFollowerSelectMenuController obj3 = followerSelectInstance;
			((UIMenuBase)obj3).OnHidden = (Action)Delegate.Combine(((UIMenuBase)obj3).OnHidden, (Action)delegate
			{
				followerSelectInstance = null;
			});
			while ((Object)(object)followerSelectInstance != (Object)null && !Cancelled)
			{
				yield return null;
			}
			if (Cancelled)
			{
				yield break;
			}
			AudioManager.Instance.PlayOneShot("event:/ritual_sacrifice/select_follower", ((Component)PlayerFarming.Instance).gameObject);
			sacrificeFollower.Brain.CompleteCurrentTask();
			FollowerTask_ManualControl nextTask = new FollowerTask_ManualControl();
			sacrificeFollower.Brain.HardSwapToTask((FollowerTask)(object)nextTask);
			sacrificeFollower.Brain.InRitual = true;
			yield return null;
			sacrificeFollower.SetOutfit(sacrificeFollower.Brain.Info.Outfit, true, (Thought)0);
			TweenCallback val = default(TweenCallback);
			sacrificeFollower.HoodOff("idle", false, (Action)delegate
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Invalid comparison between Unknown and I4
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f5: Expected O, but got Unknown
				//IL_00fa: Expected O, but got Unknown
				ChurchFollowerManager.Instance.RemoveBrainFromAudience(sacrificeFollower.Brain);
				foreach (FollowerBrain allBrain in FollowerBrain.AllBrains)
				{
					if ((int)allBrain.CurrentTaskType == 21)
					{
						allBrain.CurrentTask.RecalculateDestination();
						allBrain.CurrentTask.Setup(FollowerManager.FindFollowerByID(allBrain.Info.ID));
					}
				}
				sacrificeFollower.Spine.AnimationState.SetAnimation(1, "walk", true);
				TweenerCore<Vector3, Vector3, VectorOptions> obj4 = ShortcutExtensions.DOMove(((Component)sacrificeFollower).gameObject.transform, ((Component)Interaction_TempleAltar.Instance.PortalEffect).transform.position, 2.5f, false);
				TweenCallback obj5 = val;
				if (obj5 == null)
				{
					TweenCallback val2 = delegate
					{
						Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
						((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(PreSacrificeRoutine());
					};
					TweenCallback val3 = val2;
					val = val2;
					obj5 = val3;
				}
				TweenSettingsExtensions.OnComplete<TweenerCore<Vector3, Vector3, VectorOptions>>(obj4, obj5);
			});
			GameManager.GetInstance().OnConversationNext(((Component)sacrificeFollower).gameObject, 9f);
		}

		private IEnumerator PreSacrificeRoutine()
		{
			Plugin.Log.LogInfo((object)"Pre sacrifice routine");
			sacrificeFollower.Spine.AnimationState.SetAnimation(1, "devotion/devotion-collect-loopstart-whiteyes", false);
			yield return (object)new WaitForSeconds(1.3f);
			sacrificeFollower.Spine.AnimationState.SetAnimation(1, "devotion/devotion-collect-loop-whiteyes", true);
			foreach (TraitType trait in sacrificeFollower.Brain.Info.Traits)
			{
				yield return (object)new WaitForSeconds(1f);
				ResourceCustomTarget.Create(((Component)PlayerFarming.Instance).gameObject, ((Component)sacrificeFollower).transform.position, FollowerTrait.GetIcon(trait), (Action)null);
				AudioManager.Instance.PlayOneShot("event:/building/building_bell_ring", ((Component)PlayerFarming.Instance).gameObject);
			}
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(DoSacrificeRoutine());
			yield return null;
		}

		private IEnumerator DoSacrificeRoutine()
		{
			GameManager.GetInstance().OnConversationNext(((Component)sacrificeFollower).gameObject, 4f);
			ChurchFollowerManager.Instance.PlayOverlay((OverlayType)2, "1", "", false);
			sacrificeFollower.Spine.AnimationState.Event += new TrackEntryEventDelegate(HandleSacrificeAnimationStateEvent);
			sacrificeFollower.State.CURRENT_STATE = (State)49;
			Ritual.FollowerToAttendSermon.Remove(sacrificeFollower.Brain);
			_ = (double)sacrificeFollower.SetBodyAnimation("sacrifice-tentacles", false);
			_ = sacrificeFollower.Brain.Info.ID;
			yield return (object)new WaitForSeconds(0.5f);
			((Ritual)this).PlaySacrificePortalEffect();
			Interaction_TempleAltar.Instance.PulseDisplacementObject(((Component)Interaction_TempleAltar.Instance.PortalEffect).transform.position);
			BiomeConstants.Instance.ChromaticAbberationTween(1f, BiomeConstants.Instance.ChromaticAberrationDefaultValue, 7f);
			foreach (FollowerBrain allBrain2 in FollowerBrain.AllBrains)
			{
				if ((int)allBrain2.CurrentTaskType == 21)
				{
					FollowerTask currentTask = allBrain2.CurrentTask;
					((FollowerTask_AttendRitual)((currentTask is FollowerTask_AttendRitual) ? currentTask : null)).WorshipTentacle();
				}
			}
			yield return (object)new WaitForSeconds(1.5f);
			foreach (FollowerBrain allBrain in FollowerBrain.AllBrains)
			{
				if ((int)allBrain.CurrentTaskType == 21)
				{
					FollowerTask currentTask2 = allBrain.CurrentTask;
					((FollowerTask_AttendRitual)((currentTask2 is FollowerTask_AttendRitual) ? currentTask2 : null)).Cheer();
				}
			}
			ChurchFollowerManager.Instance.StartRitualOverlay();
			AudioManager.Instance.PlayOneShot("event:/ritual_sacrifice/ritual_end", ((Component)PlayerFarming.Instance).gameObject);
			yield return (object)new WaitForSeconds(0.7f);
			Interaction_TempleAltar.Instance.PulseDisplacementObject(sacrificeFollower.CameraBone.transform.position);
			yield return (object)new WaitForSeconds(3.1666665f);
			Interaction_TempleAltar.Instance.PulseDisplacementObject(((Component)Interaction_TempleAltar.Instance.PortalEffect).transform.position);
			yield return (object)new WaitForSeconds(0.3f);
			GameManager.GetInstance().OnConversationNext(Interaction_TempleAltar.Instance.RitualCameraPosition, 8f);
			yield return (object)new WaitForSeconds(0.5f);
			yield return (object)new WaitForSeconds(1f);
			GameManager.GetInstance().OnConversationNext(Interaction_TempleAltar.Instance.RitualCameraPosition, 6f);
			((Ritual)this).StopSacrificePortalEffect();
			sacrificeFollower.Spine.AnimationState.Event -= new TrackEntryEventDelegate(HandleSacrificeAnimationStateEvent);
			foreach (FollowerBrain followerBrain in Ritual.FollowerToAttendSermon)
			{
				if ((int)sacrificeFollower.Brain.Info.CursedState == 146)
				{
					followerBrain.AddThought((Thought)178, false, false);
				}
			}
			FollowerManager.FollowerDie(sacrificeFollower.Brain.Info.ID, (NotificationType)33);
			Object.Destroy((Object)(object)((Component)sacrificeFollower).gameObject);
			JudgementMeter.ShowModify(DataManager.Instance.CultTraits.Contains((TraitType)9) ? 1 : (-1));
			ChurchFollowerManager.Instance.EndRitualOverlay();
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			DataManager instance = DataManager.Instance;
			instance.STATS_Sacrifices++;
			((MonoBehaviour)this).StartCoroutine(((Ritual)this).WaitFollowersFormCircle(false, true, 12f));
			yield return GetAbsorptionFollower();
		}

		private IEnumerator EndRitual()
		{
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
			yield return (object)new WaitForSeconds(2f / 3f);
		}

		private IEnumerator GetAbsorptionFollower()
		{
			UIFollowerSelectMenuController followerSelectInstance = GameObjectExtensions.Instantiate<UIFollowerSelectMenuController>(MonoSingleton<UIManager>.Instance.FollowerSelectMenuTemplate);
			followerSelectInstance.Show(Ritual.GetFollowerSelectEntriesForSermon(0, false), false, (Type)287, true, false, true, false);
			UIFollowerSelectMenuController obj = followerSelectInstance;
			((UIFollowerSelectBase<FollowerInformationBox>)(object)obj).OnFollowerSelected = (Action<FollowerInfo>)Delegate.Combine(((UIFollowerSelectBase<FollowerInformationBox>)(object)obj).OnFollowerSelected, (Action<FollowerInfo>)delegate(FollowerInfo followerInfo)
			{
				absorbtionFollower = FollowerManager.FindFollowerByID(followerInfo.ID);
				UIManager.PlayAudio("event:/ritual_sacrifice/ritual_begin");
			});
			UIFollowerSelectMenuController obj2 = followerSelectInstance;
			((UIMenuBase)obj2).OnHidden = (Action)Delegate.Combine(((UIMenuBase)obj2).OnHidden, (Action)delegate
			{
				followerSelectInstance = null;
			});
			while ((Object)(object)followerSelectInstance != (Object)null)
			{
				yield return null;
			}
			absorbtionFollower.Brain.CompleteCurrentTask();
			FollowerTask_ManualControl nextTask = new FollowerTask_ManualControl();
			absorbtionFollower.Brain.HardSwapToTask((FollowerTask)(object)nextTask);
			ChurchFollowerManager.Instance.RemoveBrainFromAudience(absorbtionFollower.Brain);
			foreach (FollowerBrain allBrain in FollowerBrain.AllBrains)
			{
				if ((int)allBrain.CurrentTaskType == 21)
				{
					allBrain.CurrentTask.RecalculateDestination();
					allBrain.CurrentTask.Setup(FollowerManager.FindFollowerByID(allBrain.Info.ID));
				}
			}
			absorbtionFollower.Spine.AnimationState.SetAnimation(1, "walk", true);
			TweenSettingsExtensions.OnComplete<TweenerCore<Vector3, Vector3, VectorOptions>>(ShortcutExtensions.DOMove(((Component)absorbtionFollower).gameObject.transform, ((Component)Interaction_TempleAltar.Instance.PortalEffect).transform.position, 2.5f, false), (TweenCallback)delegate
			{
				Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
				((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(FusionAddTraits());
			});
			yield return null;
		}

		private IEnumerator FusionAddTraits()
		{
			Plugin.Log.LogInfo((object)"Start fusion");
			absorbtionFollower.Brain.CompleteCurrentTask();
			FollowerTask_ManualControl nextTask = new FollowerTask_ManualControl();
			absorbtionFollower.Brain.HardSwapToTask((FollowerTask)(object)nextTask);
			absorbtionFollower.TimedAnimation("devotion/devotion-collect-loopstart", 1.3f, (Action)delegate
			{
				absorbtionFollower.SimpleAnimator.Animate("devotion/devotion-collect-loop", 1, true);
			}, true, true);
			yield return (object)new WaitForSeconds(1f);
			foreach (TraitType trait in sacrificeFollower.Brain.Info.Traits)
			{
				Plugin.Log.LogInfo((object)"Looping fusion");
				if (!absorbtionFollower.Brain.Info.Traits.Contains(trait))
				{
					ResourceCustomTarget.Create(((Component)absorbtionFollower).gameObject, ((Component)PlayerFarming.Instance).transform.position, FollowerTrait.GetIcon(trait), (Action)null);
					AudioManager.Instance.PlayOneShot("event:/building/building_bell_ring", ((Component)PlayerFarming.Instance).gameObject);
					absorbtionFollower.AddTrait(trait, false);
					yield return (object)new WaitForSeconds(0.5f);
				}
			}
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
			float num3 = 0.5f;
			yield return (object)new WaitForSeconds(0.5f);
			foreach (FollowerBrain brain in Ritual.FollowerToAttendSermon)
			{
				float Delay = Random.Range(0.1f, 0.5f);
				num3 += Delay;
				((MonoBehaviour)this).StartCoroutine(((Ritual)this).DelayFollowerReaction(brain, Delay, true));
			}
			yield return (object)new WaitForSeconds(0.5f);
			((Ritual)this).CompleteRitual(false, -1, -1, true);
			yield return null;
		}

		private void HandleSacrificeAnimationStateEvent(TrackEntry trackEntry, Event e)
		{
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			switch (e.Data.Name)
			{
			case "CamOffset-Remove":
				GameManager.GetInstance().CamFollowTarget.SetOffset(Vector3.zero);
				BiomeConstants.Instance.DepthOfFieldTween(0.15f, 8.7f, 26f, 1f, 200f);
				BiomeConstants.Instance.ChromaticAbberationTween(1f, 1f, BiomeConstants.Instance.ChromaticAberrationDefaultValue);
				break;
			case "CamOffset-Add":
				GameManager.GetInstance().CamFollowTarget.SetOffset(new Vector3(0f, 0f, 1f));
				BiomeConstants.Instance.DepthOfFieldTween(0.5f, 7f, 8f, 1f, 150f);
				break;
			case "Shake-big":
				CameraManager.instance.ShakeCameraForDuration(0.6f, 0.7f, 0.6f, true);
				GameManager.GetInstance().OnConversationNext(sacrificeFollower.CameraBone, 8f);
				Interaction_TempleAltar.Instance.PulseDisplacementObject(sacrificeFollower.CameraBone.transform.position);
				BiomeConstants.Instance.ImpactFrameForDuration(0.2f, 0f);
				break;
			case "Shake-small":
				CameraManager.instance.ShakeCameraForDuration(0.4f, 0.5f, 0.3f, true);
				GameManager.GetInstance().OnConversationNext(sacrificeFollower.CameraBone, 6f);
				Interaction_TempleAltar.Instance.PulseDisplacementObject(sacrificeFollower.CameraBone.transform.position);
				break;
			}
		}
	}
	public class MassacreRitual : CustomRitual
	{
		public override string InternalName { get; } = "Massacre_Ritual";


		public override Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/ritual_massres.png"));


		public override List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost(Plugin.StrangeMaterialItem, 12)
		};


		public override string GetLocalizedName => "Ritual of Massacre";

		public override string GetLocalizedDescription => "Kills every follower except 1 random follower.";

		public override float FaithChange { get; } = 10f;


		public override TraitType RitualTrait { get; } = (TraitType)0;


		public override float Cooldown => 60f;

		public override void Play()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			((Ritual)this).Play();
			ManualLogSource log = Plugin.Log;
			string? text = ((object)(Type)(ref upgradeType)).ToString();
			Type ritualType = ((Ritual)this).RitualType;
			log.LogInfo((object)("Starting ritual for " + text + " and " + ((object)(Type)(ref ritualType)).ToString()));
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(RitualRoutine());
		}

		private IEnumerator RitualRoutine()
		{
			bool Cancelled = false;
			AudioManager.Instance.PlayOneShot("event:/rituals/generic_start_ritual");
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).CentreAndAnimatePlayer());
			Interaction_TempleAltar.Instance.SimpleSetCamera.Play();
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).WaitFollowersFormCircle(false, true, 12f));
			Bone obj = ((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.FindBone("ritualring");
			obj.Rotation += 60f;
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.UpdateWorldTransform();
			((SkeletonRenderer)PlayerFarming.Instance.Spine).skeleton.Update(Time.deltaTime);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-start", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("rituals/ritual-loop", 0, true, 0f);
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(true);
			ChurchFollowerManager.Instance.StartRitualOverlay();
			UIFollowerSelectMenuController followerSelectInstance = GameObjectExtensions.Instantiate<UIFollowerSelectMenuController>(MonoSingleton<UIManager>.Instance.FollowerSelectMenuTemplate);
			List<FollowerInfo> tempList = new List<FollowerInfo>();
			FollowerInfo selectedSurvivor = null;
			if (DataManager.Instance.Followers_Dead.Count > 0)
			{
				tempList.Add(DataManager.Instance.Followers_Dead[0]);
			}
			List<FollowerSelectEntry> FSE = Ritual.GetFollowerSelectEntriesForSermon(0, false);
			followerSelectInstance.Show(FSE, false, (Type)154, true, true, true, false);
			UIFollowerSelectMenuController obj2 = followerSelectInstance;
			((UIFollowerSelectBase<FollowerInformationBox>)(object)obj2).OnFollowerSelected = (Action<FollowerInfo>)Delegate.Combine(((UIFollowerSelectBase<FollowerInformationBox>)(object)obj2).OnFollowerSelected, (Action<FollowerInfo>)delegate(FollowerInfo followerInfo)
			{
				selectedSurvivor = followerInfo;
				UIManager.PlayAudio("event:/ritual_sacrifice/ritual_begin");
			});
			((UIMenuBase)followerSelectInstance).OnCancel = (Action)Delegate.Combine(((UIMenuBase)followerSelectInstance).OnCancel, (Action)delegate
			{
				((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(EndRitual());
				Cancelled = true;
				((Ritual)this).CompleteRitual(true, -1, -1, true);
				((Ritual)this).CancelFollowers();
			});
			UIFollowerSelectMenuController obj3 = followerSelectInstance;
			((UIMenuBase)obj3).OnHidden = (Action)Delegate.Combine(((UIMenuBase)obj3).OnHidden, (Action)delegate
			{
				followerSelectInstance = null;
			});
			UIFollowerSelectMenuController obj4 = followerSelectInstance;
			((UIMenuBase)obj4).OnShow = (Action)Delegate.Combine(((UIMenuBase)obj4).OnShow, (Action)delegate
			{
				foreach (FollowerInformationBox followerInfoBox in ((UIFollowerSelectBase<FollowerInformationBox>)(object)followerSelectInstance).FollowerInfoBoxes)
				{
					int count = DataManager.Instance.Followers_Dead.Count;
					((TMP_Text)followerInfoBox.FollowerRole).text = "Select one follower to be left alive.";
				}
			});
			while ((Object)(object)followerSelectInstance != (Object)null && !Cancelled)
			{
				yield return null;
			}
			if (!Cancelled)
			{
				yield return (object)new WaitForSeconds(1.2f);
				ChurchFollowerManager.Instance.PlayOverlay((OverlayType)0, "resurrect", "", false);
				yield return (object)new WaitForSeconds(0.5f);
				((Ritual)this).PlaySacrificePortalEffect();
				foreach (FollowerBrain allBrain in FollowerBrain.AllBrains)
				{
					if ((int)allBrain.CurrentTaskType == 21)
					{
						FollowerTask currentTask = allBrain.CurrentTask;
						((FollowerTask_AttendRitual)((currentTask is FollowerTask_AttendRitual) ? currentTask : null)).WorshipTentacle();
					}
				}
				yield return (object)new WaitForSeconds(0.5f);
				AudioManager.Instance.PlayOneShot("event:/rituals/resurrect");
				yield return (object)new WaitForSeconds(1.2f);
				int groupResurrect = 0;
				ChurchFollowerManager.Instance.GodRays.gameObject.SetActive(true);
				ChurchFollowerManager.Instance.GodRays.GetComponent<ParticleSystem>().Play();
				((Component)ChurchFollowerManager.Instance.Goop).gameObject.SetActive(true);
				ChurchFollowerManager.Instance.Goop.Play("Show");
				((Renderer)((Component)ChurchFollowerManager.Instance.Goop).GetComponentInChildren<MeshRenderer>()).material.SetColor("_TintCOlor", Color.red);
				yield return (object)new WaitForSeconds(0.5f);
				bool survivor = false;
				new List<Follower>();
				foreach (FollowerSelectEntry fs in FSE)
				{
					if (!survivor && selectedSurvivor == null)
					{
						survivor = true;
						continue;
					}
					if (!survivor && fs.FollowerInfo == selectedSurvivor)
					{
						survivor = true;
						continue;
					}
					Follower killing = FollowerManager.FindFollowerByID(fs.FollowerInfo.ID);
					ChurchFollowerManager.Instance.RemoveBrainFromAudience(killing.Brain);
					killing.TimedAnimation("ascend", 1.3f, (Action)delegate
					{
						killing.Die((NotificationType)52, false, 1, "die", "dead", (Action<GameObject>)null, true);
					}, true, true);
					Ritual.FollowerToAttendSermon.Remove(killing.Brain);
					groupResurrect++;
					yield return (object)new WaitForSeconds(0.1f);
					if (groupResurrect >= 7)
					{
						yield return (object)new WaitForSeconds(0.33f);
						groupResurrect = 0;
					}
				}
				((Ritual)this).StopSacrificePortalEffect();
				ChurchFollowerManager.Instance.StopSacrificePortalEffect();
				((Component)ChurchFollowerManager.Instance.Goop).gameObject.SetActive(false);
				ChurchFollowerManager.Instance.GodRays.SetActive(false);
				ChurchFollowerManager.Instance.Sparkles.Stop();
				PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
				PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
				foreach (FollowerBrain followerBrain in Ritual.FollowerToAttendSermon)
				{
					if (followerBrain.CurrentTask is FollowerTask_AttendRitual)
					{
						FollowerTask currentTask2 = followerBrain.CurrentTask;
						((FollowerTask_AttendRitual)((currentTask2 is FollowerTask_AttendRitual) ? currentTask2 : null)).Cheer();
					}
				}
				yield return (object)new WaitForSeconds(7f);
			}
			ChurchFollowerManager.Instance.EndRitualOverlay();
			GameManager.GetInstance().CamFollowTarget.targetDistance = 11f;
			((Component)Interaction_TempleAltar.Instance.RitualLighting).gameObject.SetActive(false);
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			((Ritual)this).CompleteRitual(false, -1, -1, true);
		}

		private IEnumerator EndRitual()
		{
			Interaction_TempleAltar.Instance.SimpleSetCamera.Reset(1f);
			PlayerFarming.Instance.simpleSpineAnimator.Animate("rituals/ritual-stop", 0, false);
			PlayerFarming.Instance.simpleSpineAnimator.AddAnimate("idle", 0, true, 0f);
			yield return (object)new WaitForSeconds(2f / 3f);
		}
	}
	public class MassResurrectionRitual : CustomRitual
	{
		public override string InternalName { get; } = "MassResurrection_Ritual";


		public override Sprite Sprite { get; } = TextureHelper.CreateSpriteFromPath(Path.Combine(Plugin.PluginPath, "Assets/ritual_massres.png"));


		public override List<ItemCost> ItemCosts { get; } = new List<ItemCost>
		{
			new ItemCost(Plugin.StrangeMaterialItem, 12)
		};


		public override string GetLocalizedName => "Mass Resurrection Ritual";

		public override string GetLocalizedDescription => "Resurrects all dead followers. Beware, your cult may be flooded with followers!";

		public override float FaithChange { get; } = 10f;


		public override TraitType RitualTrait { get; } = (TraitType)0;


		public override float Cooldown => 60f;

		public override void Play()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			((Ritual)this).Play();
			ManualLogSource log = Plugin.Log;
			string? text = ((object)(Type)(ref upgradeType)).ToString();
			Type ritualType = ((Ritual)this).RitualType;
			log.LogInfo((object)("Starting ritual for " + text + " and " + ((object)(Type)(ref ritualType)).ToString()));
			((MonoBehaviour)GameManager.GetInstance()).StartCoroutine(RitualRoutine());
		}

		private IEnumerator RitualRoutine()
		{
			bool Cancelled = false;
			AudioManager.Instance.PlayOneShot("event:/rituals/generic_start_ritual");
			yield return ((MonoBehaviour)this).StartCoroutine(((Ritual)this).CentreAndAnimatePlayer());
			Interaction_TempleAltar.Instance.SimpleSetCamera.Play();
			yield