Decompiled source of MuckFoods v1.5.0

MuckFoods.dll

Decompiled a year ago
using System;
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 HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("MuckFoods")]
[assembly: AssemblyConfiguration("RELEASE")]
[assembly: AssemblyDescription("Adds a wide variety of foods which can be cooked by combining various existing ingredients in a Cauldron. This also decreases the effectiveness of some vanilla foods, to encourage combining many ingredients into one.")]
[assembly: AssemblyFileVersion("1.5.0.0")]
[assembly: AssemblyInformationalVersion("1.5.0+c83f9cd55aa6877169f18117cf58bacd7dbf7b9a")]
[assembly: AssemblyProduct("MuckFoods")]
[assembly: AssemblyTitle("MuckFoods")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.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]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 BepInEx
{
	public static class Extensions
	{
		public static void LogItemCreated(this ManualLogSource log, InventoryItem item)
		{
			log.LogInfo((object)("Item \"" + item.name + "\" created, ID " + item.id));
		}

		public static ConfigEntry<int> BindMoreThanZero(this ConfigFile config, string section, string key, int defaultValue, string description)
		{
			ConfigEntry<int> val = config.Bind<int>(section, key, defaultValue, description);
			if (val.Value <= 0)
			{
				val.Value = defaultValue;
			}
			return val;
		}

		public static ConfigEntry<float> BindMoreThanZero(this ConfigFile config, string section, string key, float defaultValue, string description)
		{
			ConfigEntry<float> val = config.Bind<float>(section, key, defaultValue, description);
			if (val.Value <= 0f)
			{
				val.Value = defaultValue;
			}
			return val;
		}

		public static ConfigEntry<float> BindNonNegative(this ConfigFile config, string section, string key, float defaultValue, string description)
		{
			ConfigEntry<float> val = config.Bind<float>(section, key, defaultValue, description);
			if (val.Value < 0f)
			{
				val.Value = defaultValue;
			}
			return val;
		}

		public static ConfigEntry<int> BindNonNegative(this ConfigFile config, string section, string key, int defaultValue, string description)
		{
			ConfigEntry<int> val = config.Bind<int>(section, key, defaultValue, description);
			if ((float)val.Value < 0f)
			{
				val.Value = defaultValue;
			}
			return val;
		}

		public static InventoryItem Clone(this InventoryItem i)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			InventoryItem obj = ScriptableObject.CreateInstance<InventoryItem>();
			obj.amount = i.amount;
			obj.armor = i.armor;
			obj.armorComponent = i.armorComponent;
			obj.attackDamage = i.attackDamage;
			obj.attackRange = i.attackRange;
			obj.attackSpeed = i.attackSpeed;
			obj.attackTypes = i.attackTypes;
			obj.bowComponent = i.bowComponent;
			obj.buildRotation = i.buildRotation;
			obj.buildable = i.buildable;
			obj.craftAmount = i.craftAmount;
			obj.craftable = i.craftable;
			obj.description = i.description;
			obj.fuel = i.fuel;
			obj.grid = i.grid;
			obj.heal = i.heal;
			((Object)obj).hideFlags = ((Object)i).hideFlags;
			obj.hunger = i.hunger;
			obj.id = i.id;
			obj.important = i.important;
			obj.material = i.material;
			obj.max = i.max;
			obj.mesh = i.mesh;
			obj.name = i.name;
			obj.positionOffset = i.positionOffset;
			obj.prefab = i.prefab;
			obj.processTime = i.processTime;
			obj.processType = i.processType;
			obj.processable = i.processable;
			obj.processedItem = i.processedItem;
			obj.rarity = i.rarity;
			obj.requirements = i.requirements;
			obj.resourceDamage = i.resourceDamage;
			obj.rotationOffset = i.rotationOffset;
			obj.scale = i.scale;
			obj.sharpness = i.sharpness;
			obj.sprite = i.sprite;
			obj.stackable = i.stackable;
			obj.stamina = i.stamina;
			obj.stationRequirement = i.stationRequirement;
			obj.swingFx = i.swingFx;
			obj.tag = i.tag;
			obj.tier = i.tier;
			obj.type = i.type;
			obj.unlockWithFirstRequirementOnly = i.unlockWithFirstRequirementOnly;
			return obj;
		}
	}
}
namespace MuckFoods
{
	public class CreateRecipesPatch
	{
		public static InventoryItem[] NewFoods = (InventoryItem[])(object)new InventoryItem[0];

		[HarmonyPatch(typeof(ItemManager), "InitAllItems")]
		[HarmonyPostfix]
		private static void InitializeFoods()
		{
			InventoryItem val = ItemManager.Instance.allItems[45];
			InventoryItem val2 = ItemManager.Instance.allItems[46];
			InventoryItem val3 = ItemManager.Instance.allItems[47];
			InventoryItem val4 = ItemManager.Instance.allItems[49];
			InventoryItem val5 = ItemManager.Instance.allItems[50];
			InventoryItem val6 = ItemManager.Instance.allItems[51];
			InventoryItem val7 = ItemManager.Instance.allItems[52];
			InventoryItem val8 = ItemManager.Instance.allItems[53];
			InventoryItem val9 = ItemManager.Instance.allItems[54];
			InventoryItem val10 = ItemManager.Instance.allItems[56];
			InventoryItem val11 = ItemManager.Instance.allItems[57];
			InventoryItem val12 = ItemManager.Instance.allItems[58];
			InventoryItem val13 = ItemManager.Instance.allItems[59];
			InventoryItem val14 = ItemManager.Instance.allItems[60];
			InventoryItem val15 = ItemManager.Instance.allItems[61];
			InventoryItem val16 = ItemManager.Instance.allItems[62];
			InventoryItem val17 = ItemManager.Instance.allItems[63];
			InventoryItem val18 = ItemManager.Instance.allItems[64];
			SetStats(val2, 0f, 0f, 0f);
			SetStats(val4, 0f, 0f, 0f);
			if (Plugin.RebalanceFoods)
			{
				SetStats(val, 4f, 4f, 4f);
				SetStats(val5, 6f, 6f, 3f);
				val6.heal = 10f;
				val7.hunger = 10f;
				val9.stamina = 10f;
				SetStats(val8, 10f, 10f, 10f);
				SetStats(val16, 25f, 10f, 10f);
				SetStats(val18, 10f, 25f, 10f);
				SetStats(val15, 10f, 10f, 25f);
				SetStats(val17, 30f, 30f, 30f);
				Restoration.FromIngredients(val5).Apply(val11);
				Restoration.FromIngredients(val11, val2).Apply(val14);
				Restoration.FromIngredients(val, val10, val2).Apply(val12);
				Restoration.FromIngredients(val11, val2, val10).Apply(val13);
			}
			InventoryItem val19 = CreateFood(val, Resources.AppleBakedSprite, "Baked Apple", "soft and sweet, but looks familiar somehow...", CraftRequirements(val), val);
			InventoryItem val20 = CreateFood(val6, Resources.ShroomRedToastySprite, "Toasted Gulpon Shroom", "nice and hot!", CraftRequirements(val6), val6);
			InventoryItem val21 = CreateFood(val7, Resources.ShroomYellowToastySprite, "Toasted Ligon Shroom", "tasty and filling", CraftRequirements(val7), val7);
			InventoryItem val22 = CreateFood(val9, Resources.ShroomPurpleToastySprite, "Toasted Sugon Shroom", "keeps you jumping at your best", CraftRequirements(val9), val9);
			InventoryItem val23 = CreateFood(val8, Resources.ShroomSusToastySprite, "Toasted Slurbon Shroom", "still kinda sus...", CraftRequirements(val8), val8);
			val19.processTime = val11.processTime;
			val20.processTime = val11.processTime;
			val21.processTime = val11.processTime;
			val22.processTime = val11.processTime;
			val23.processTime = val11.processTime;
			List<InventoryItem> list = new List<InventoryItem>();
			list.Add(val19);
			list.Add(val20);
			list.Add(val21);
			list.Add(val22);
			list.Add(val23);
			list.Add(CreateFood(val12, val12.sprite, "Pie Pie", "it's pie flavoured", CraftRequirements(val3, val2), val10, val2));
			list.Add(CreateFood(val10, Resources.FlaxseedBreadSprite, "Flaxseed Bread", "what else can you do with flax?", CraftRequirements(val3, val4), val10, val4));
			list.Add(CreateFood(val14, Resources.AppleMeatStewSprite, "Apple Meat Stew", "yummy", CraftRequirements(val, val5, val2), val, val11, val2));
			list.Add(CreateFood(val12, Resources.PieAppleMeatSprite, "Apple Meat Pie", "dessert and dinner in one", CraftRequirements(val, val5, val3, val2), val, val11, val10, val2));
			list.Add(CreateFood(val17, Resources.LessWeirdSoupSprite, "Less Weird Soup", "food for a fun guy", CraftRequirements(val6, val7, val9, val2), val6, val7, val9, val2));
			List<InventoryItem> list2 = list;
			(InventoryItem, string, string, InventoryItem)[] array = new(InventoryItem, string, string, InventoryItem)[4]
			{
				(val6, "Gulpon", "Red", val16),
				(val7, "Ligon", "Yellow", val18),
				(val9, "Sugon", "Purple", val15),
				(val8, "Slurbon", "Weird", val17)
			};
			DescrSprite[] array2 = new DescrSprite[4]
			{
				new DescrSprite("spicy pie", Resources.PieRedSprite),
				new DescrSprite("pie with shroom", Resources.PieYellowSprite),
				new DescrSprite("pie in the sky", Resources.PiePurpleSprite),
				new DescrSprite("mystery pie", Resources.PieSusSprite)
			};
			DescrSprite[] array3 = new DescrSprite[4]
			{
				new DescrSprite("pretty healthy", Resources.PieRedAppleSprite),
				new DescrSprite("pie with apple and shroom", Resources.PieYellowAppleSprite),
				new DescrSprite("pretty fast pie", Resources.PiePurpleAppleSprite),
				new DescrSprite("who needs meat anyway?", Resources.PieSusAppleSprite)
			};
			DescrSprite[] array4 = new DescrSprite[4]
			{
				new DescrSprite("don't die pie", Resources.PieRedMeatSprite),
				new DescrSprite("could feed an army (or just you)", Resources.PieYellowMeatSprite),
				new DescrSprite("fills you with energy", Resources.PiePurpleMeatSprite),
				new DescrSprite("sus, savoury, scrumptious", Resources.PieSusMeatSprite)
			};
			DescrSprite[] array5 = new DescrSprite[4]
			{
				new DescrSprite("red and vegan friendly", Resources.SoupRedAppleSprite),
				new DescrSprite("it's sweet and savoury", Resources.SoupYellowAppleSprite),
				new DescrSprite("better than nothing ig", Resources.SoupPurpleAppleSprite),
				new DescrSprite("lv 5 vegans only", Resources.SoupSusAppleSprite)
			};
			DescrSprite[] array6 = new DescrSprite[4]
			{
				new DescrSprite("savoury stew", Resources.SoupRedMeatSprite),
				new DescrSprite("tender meat and shroom", Resources.SoupYellowMeatSprite),
				new DescrSprite("tasty stew for when you're tired", Resources.SoupPurpleMeatSprite),
				new DescrSprite("i think the meat became rainbows", Resources.SoupSusMeatSprite)
			};
			DescrSprite[] array7 = new DescrSprite[4]
			{
				new DescrSprite("reddest food ever made", Resources.SoupRedAppleMeatSprite),
				new DescrSprite("a real hunter-gatherer's meal", Resources.SoupYellowAppleMeatSprite),
				new DescrSprite("keeps you going", Resources.SoupPurpleAppleMeatSprite),
				new DescrSprite("the heartiest stew in the land", Resources.SoupSusAppleMeatSprite)
			};
			int num = 0;
			(InventoryItem, string, string, InventoryItem)[] array8 = array;
			for (int i = 0; i < array8.Length; i++)
			{
				(InventoryItem, string, string, InventoryItem) tuple = array8[i];
				list2.Add(CreateFood(val12, array2[num].Sprite, tuple.Item2 + " Shroom Pie", array2[num].Descr, CraftRequirements(val3, tuple.Item1, val2), val10, tuple.Item4, val2));
				list2.Add(CreateFood(val12, array3[num].Sprite, "Apple and " + tuple.Item2 + " Shroom Pie", array3[num].Descr, CraftRequirements(val3, val, tuple.Item1, val2), val10, val, tuple.Item4, val2));
				list2.Add(CreateFood(val12, array4[num].Sprite, "Meat and " + tuple.Item2 + " Shroom Pie", array4[num].Descr, CraftRequirements(val3, val5, tuple.Item1, val2), val10, val11, tuple.Item4, val2));
				list2.Add(CreateFood(tuple.Item4, array5[num].Sprite, "Apple and " + tuple.Item2 + " Shroom Stew", array5[num].Descr, CraftRequirements(val, tuple.Item1, val2), val, tuple.Item4, val2));
				list2.Add(CreateFood(tuple.Item4, array6[num].Sprite, "Meat and " + tuple.Item2 + " Shroom Stew", array6[num].Descr, CraftRequirements(val5, tuple.Item1, val2), val11, tuple.Item4, val2));
				list2.Add(CreateFood(tuple.Item4, array7[num].Sprite, tuple.Item3 + " Gourmet Stew", array7[num].Descr, CraftRequirements(val5, val, tuple.Item1, val2), val11, val, tuple.Item4, val2));
				num++;
			}
			val12.sprite = Resources.PieAppleSprite;
			val13.sprite = Resources.PieMeatSprite;
			int num2 = ItemManager.Instance.allItems.Keys.DefaultIfEmpty(0).Max() + 1;
			foreach (InventoryItem item in list2)
			{
				item.id = num2++;
				ItemManager.Instance.allItems.Add(item.id, item);
				Plugin.Log.LogItemCreated(item);
			}
			ItemManager.Instance.allScriptableItems = ItemManager.Instance.allScriptableItems.Concat(list2).ToArray();
			NewFoods = list2.ToArray();
		}

		[HarmonyPatch(typeof(CauldronUI), "Awake")]
		[HarmonyPostfix]
		private static void AddFoodsToCauldron()
		{
			CauldronUI.Instance.processableFood = CauldronUI.Instance.processableFood.Concat(NewFoods).ToArray();
		}

		private static InventoryItem CreateFood(InventoryItem baseItem, Sprite sprite, string name, string descr, CraftRequirement[] requirements, params InventoryItem[] restoresSumOf)
		{
			Plugin.Log.LogInfo((object)("Making: " + name));
			Restoration resto = Restoration.FromIngredients(restoresSumOf);
			InventoryItem val = Clone(baseItem, name, descr, sprite, requirements, resto);
			Plugin.Log.LogInfo((object)("Added food \"" + name + "\" which restores " + resto.Heal + " Health, " + resto.Hunger + " Hunger, " + resto.Stamina + " Stamina. Made from: " + string.Join(",", val.requirements.Select((CraftRequirement x) => x.item.name))));
			return val;
		}

		private static CraftRequirement[] CraftRequirements(params InventoryItem[] items)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			CraftRequirement[] array = (CraftRequirement[])(object)new CraftRequirement[items.Length];
			for (int i = 0; i < items.Length; i++)
			{
				array[i] = new CraftRequirement
				{
					item = items[i],
					amount = 1
				};
			}
			return array;
		}

		private static void SetStats(InventoryItem food, float heal, float hunger, float stamina)
		{
			food.heal = heal;
			food.hunger = hunger;
			food.stamina = stamina;
		}

		private static InventoryItem Clone(InventoryItem item, string name, string description, Sprite sprite, CraftRequirement[] requirements, Restoration resto)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			InventoryItem val = ScriptableObject.CreateInstance<InventoryItem>();
			val.material = item.material;
			val.sprite = sprite;
			val.name = name;
			val.description = description;
			val.requirements = requirements;
			resto.Apply(val);
			val.important = false;
			val.type = (ItemType)8;
			val.tier = item.tier;
			val.mesh = item.mesh;
			val.rotationOffset = item.rotationOffset;
			val.positionOffset = item.positionOffset;
			val.scale = item.scale;
			val.stackable = true;
			val.amount = 1;
			val.max = 69;
			val.resourceDamage = 1;
			val.attackDamage = 1;
			val.attackSpeed = 1f;
			val.attackRange = 0f;
			val.sharpness = 0f;
			val.craftable = false;
			val.unlockWithFirstRequirementOnly = item.unlockWithFirstRequirementOnly;
			val.stationRequirement = item.stationRequirement;
			val.buildable = false;
			val.grid = false;
			val.prefab = item.prefab;
			val.buildRotation = item.buildRotation;
			val.processable = false;
			val.processType = item.processType;
			val.processedItem = item.processedItem;
			val.processTime = 5f;
			val.armor = 0;
			val.swingFx = item.swingFx;
			val.bowComponent = item.bowComponent;
			val.armorComponent = item.armorComponent;
			val.fuel = item.fuel;
			val.tag = (ItemTag)2;
			val.rarity = item.rarity;
			val.attackTypes = item.attackTypes;
			((Object)val).hideFlags = ((Object)item).hideFlags;
			val.craftAmount = 1;
			return val;
		}
	}
	public sealed class DescrSprite
	{
		public string Descr { get; }

		public Sprite Sprite { get; }

		public DescrSprite(string descr, Sprite sprite)
		{
			Descr = descr;
			Sprite = sprite;
		}
	}
	[BepInPlugin("MuckFoods.MichMcb", "Muck Foods", "1.5.0")]
	public class Plugin : BaseUnityPlugin
	{
		public static ManualLogSource Log = null;

		public static bool RebalanceFoods = true;

		public static float CookHealthBonus = 5f;

		public static float CookHungerBonus = 5f;

		public static float CookStaminaBonus = 5f;

		public static float[] HealthBonus = new float[4];

		public static float[] HungerBonus = new float[4];

		public static float[] StaminaBonus = new float[4];

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			RebalanceFoods = ((BaseUnityPlugin)this).Config.Bind<bool>("Main", "RebalanceFoods", RebalanceFoods, "If true, then vanilla foods' Health/Hunger/Stamina will be rebalanced. These foods will be affected:\nApple: 5/15/5 -> 4/4/4\nRaw Meat: 5/10/0 -> 6/6/3\nGulpon Shroom: 12 Health -> 10 Health\nLigon Shroom: 12 Hunger -> 10 Hunger\nSugon Shroom: 12 Stamina -> 10 Stamina\nSlurbon Shroon: 15/15/15 -> 10/10/10\nRed Soup: 30/10/10 -> 25/10/10\nYellow Soup: 10/50/10 -> 10/25/10\nPurple Soup: 10/10/40 -> 10/10/25\nWeird Soup: 40/40/40 -> 30/30/30Cooked Meat: 20/50/5 -> Depends on config\nMeat Soup: 30/50/20 -> Depends on config\nApple Pie: 30/60/20 -> Depends on config\nMeat Pie: 30/60/20 -> Depends on config").Value;
			CookHealthBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "CookHealthBonus", CookHealthBonus, "The base bonus to health that foods gain when cooked. Additive with bonuses for multiple ingredients").Value;
			CookHungerBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "CookHungerBonus", CookHungerBonus, "The base bonus to hunger that foods gain when cooked. Additive with bonuses for multiple ingredients").Value;
			CookStaminaBonus = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "CookStaminaBonus", CookStaminaBonus, "The base bonus to stamina that foods gain when cooked. Additive with bonuses for multiple ingredients").Value;
			HealthBonus[0] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "OneFoodHealthBonus", 0f, "The bonus to health that foods with 1 ingredient gain").Value;
			HungerBonus[0] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "OneFoodHungerBonus", 0f, "The bonus to hunger that foods with 1 ingredient gain").Value;
			StaminaBonus[0] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "OneFoodStaminaBonus", 0f, "The bonus to stamina that foods with 1 ingredient gain").Value;
			HealthBonus[1] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "TwoFoodHealthBonus", 3f, "The bonus to health that foods with 2 ingredients gain").Value;
			HungerBonus[1] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "TwoFoodHungerBonus", 3f, "The bonus to hunger that foods with 2 ingredients gain").Value;
			StaminaBonus[1] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "TwoFoodStaminaBonus", 3f, "The bonus to stamina that foods with 2 ingredients gain").Value;
			HealthBonus[2] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "ThreeFoodHealthBonus", 6f, "The bonus to health that foods with 3 ingredients gain").Value;
			HungerBonus[2] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "ThreeFoodHungerBonus", 6f, "The bonus to hunger that foods with 3 ingredients gain").Value;
			StaminaBonus[2] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "ThreeFoodStaminaBonus", 6f, "The bonus to stamina that foods with 3 ingredients gain").Value;
			HealthBonus[3] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "FourFoodHealthBonus", 10f, "The bonus to health that foods with 4 ingredients gain").Value;
			HungerBonus[3] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "FourFoodHungerBonus", 10f, "The bonus to hunger that foods with 4 ingredients gain").Value;
			StaminaBonus[3] = ((BaseUnityPlugin)this).Config.Bind<float>("Main", "FourFoodStaminaBonus", 10f, "The bonus to stamina that foods with 4 ingredients gain").Value;
			((BaseUnityPlugin)this).Config.Save();
			Resources.Load();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"MuckFoods loaded!");
			Harmony.CreateAndPatchAll(typeof(CreateRecipesPatch), (string)null);
		}
	}
	public static class Resources
	{
		public static Sprite AppleBakedSprite;

		public static Sprite AppleMeatStewSprite;

		public static Sprite FlaxseedBreadSprite;

		public static Sprite LessWeirdSoupSprite;

		public static Sprite PieAppleMeatSprite;

		public static Sprite PieAppleSprite;

		public static Sprite PieMeatSprite;

		public static Sprite PiePurpleAppleSprite;

		public static Sprite PiePurpleMeatSprite;

		public static Sprite PiePurpleSprite;

		public static Sprite PieRedAppleSprite;

		public static Sprite PieRedMeatSprite;

		public static Sprite PieRedSprite;

		public static Sprite PieSusAppleSprite;

		public static Sprite PieSusMeatSprite;

		public static Sprite PieSusSprite;

		public static Sprite PieYellowAppleSprite;

		public static Sprite PieYellowMeatSprite;

		public static Sprite PieYellowSprite;

		public static Sprite SoupPurpleAppleMeatSprite;

		public static Sprite SoupPurpleAppleSprite;

		public static Sprite SoupPurpleMeatSprite;

		public static Sprite SoupRedAppleMeatSprite;

		public static Sprite SoupRedAppleSprite;

		public static Sprite SoupRedMeatSprite;

		public static Sprite SoupSusAppleMeatSprite;

		public static Sprite SoupSusAppleSprite;

		public static Sprite SoupSusMeatSprite;

		public static Sprite SoupYellowAppleMeatSprite;

		public static Sprite SoupYellowAppleSprite;

		public static Sprite SoupYellowMeatSprite;

		public static Sprite ShroomRedToastySprite;

		public static Sprite ShroomYellowToastySprite;

		public static Sprite ShroomPurpleToastySprite;

		public static Sprite ShroomSusToastySprite;

		public static void Load()
		{
			using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MuckFoods.resources");
			AssetBundle obj = AssetBundle.LoadFromStream(stream);
			AppleBakedSprite = obj.LoadAsset<Sprite>("AppleBaked.png");
			ShroomRedToastySprite = obj.LoadAsset<Sprite>("ShroomRedToasty.png");
			ShroomYellowToastySprite = obj.LoadAsset<Sprite>("ShroomYellowToasty.png");
			ShroomPurpleToastySprite = obj.LoadAsset<Sprite>("ShroomPurpleToasty.png");
			ShroomSusToastySprite = obj.LoadAsset<Sprite>("ShroomSusToasty.png");
			AppleMeatStewSprite = obj.LoadAsset<Sprite>("AppleMeatStew.png");
			FlaxseedBreadSprite = obj.LoadAsset<Sprite>("FlaxseedBread.png");
			LessWeirdSoupSprite = obj.LoadAsset<Sprite>("LessWeirdSoup.png");
			PieAppleMeatSprite = obj.LoadAsset<Sprite>("PieAppleMeat.png");
			PieAppleSprite = obj.LoadAsset<Sprite>("PieApple.png");
			PieMeatSprite = obj.LoadAsset<Sprite>("PieMeat.png");
			PiePurpleAppleSprite = obj.LoadAsset<Sprite>("PiePurpleApple.png");
			PiePurpleMeatSprite = obj.LoadAsset<Sprite>("PiePurpleMeat.png");
			PiePurpleSprite = obj.LoadAsset<Sprite>("PiePurple.png");
			PieRedAppleSprite = obj.LoadAsset<Sprite>("PieRedApple.png");
			PieRedMeatSprite = obj.LoadAsset<Sprite>("PieRedMeat.png");
			PieRedSprite = obj.LoadAsset<Sprite>("PieRed.png");
			PieSusAppleSprite = obj.LoadAsset<Sprite>("PieSusApple.png");
			PieSusMeatSprite = obj.LoadAsset<Sprite>("PieSusMeat.png");
			PieSusSprite = obj.LoadAsset<Sprite>("PieSus.png");
			PieYellowAppleSprite = obj.LoadAsset<Sprite>("PieYellowApple.png");
			PieYellowMeatSprite = obj.LoadAsset<Sprite>("PieYellowMeat.png");
			PieYellowSprite = obj.LoadAsset<Sprite>("PieYellow.png");
			SoupPurpleAppleMeatSprite = obj.LoadAsset<Sprite>("SoupPurpleAppleMeat.png");
			SoupPurpleAppleSprite = obj.LoadAsset<Sprite>("SoupPurpleApple.png");
			SoupPurpleMeatSprite = obj.LoadAsset<Sprite>("SoupPurpleMeat.png");
			SoupRedAppleMeatSprite = obj.LoadAsset<Sprite>("SoupRedAppleMeat.png");
			SoupRedAppleSprite = obj.LoadAsset<Sprite>("SoupRedApple.png");
			SoupRedMeatSprite = obj.LoadAsset<Sprite>("SoupRedMeat.png");
			SoupSusAppleMeatSprite = obj.LoadAsset<Sprite>("SoupSusAppleMeat.png");
			SoupSusAppleSprite = obj.LoadAsset<Sprite>("SoupSusApple.png");
			SoupSusMeatSprite = obj.LoadAsset<Sprite>("SoupSusMeat.png");
			SoupYellowAppleMeatSprite = obj.LoadAsset<Sprite>("SoupYellowAppleMeat.png");
			SoupYellowAppleSprite = obj.LoadAsset<Sprite>("SoupYellowApple.png");
			SoupYellowMeatSprite = obj.LoadAsset<Sprite>("SoupYellowMeat.png");
			Plugin.Log.LogInfo((object)"Assets loaded");
		}
	}
	public readonly struct Restoration
	{
		public float Heal { get; }

		public float Hunger { get; }

		public float Stamina { get; }

		public Restoration(float heal, float hunger, float stamina)
		{
			Heal = heal;
			Hunger = hunger;
			Stamina = stamina;
		}

		public void Apply(InventoryItem item)
		{
			item.heal = Math.Max(0f, Heal);
			item.hunger = Math.Max(0f, Hunger);
			item.stamina = Math.Max(0f, Stamina);
		}

		public static Restoration FromItem(InventoryItem item)
		{
			return new Restoration(item.heal, item.hunger, item.stamina);
		}

		public static Restoration FromFloats(float[] values)
		{
			float heal = ((values.Length != 0) ? values[0] : 0f);
			float hunger = ((values.Length > 1) ? values[1] : 0f);
			float stamina = ((values.Length > 2) ? values[2] : 0f);
			return new Restoration(heal, hunger, stamina);
		}

		public static Restoration FromIngredients(params InventoryItem[] items)
		{
			float num = Plugin.CookHealthBonus + Plugin.HealthBonus[items.Length - 1];
			float num2 = Plugin.CookHungerBonus + Plugin.HungerBonus[items.Length - 1];
			float num3 = Plugin.CookStaminaBonus + Plugin.StaminaBonus[items.Length - 1];
			foreach (InventoryItem val in items)
			{
				Plugin.Log.LogInfo((object)("Adding " + val.name + " ingredient value: " + val.heal + "/" + val.hunger + "/" + val.stamina));
				num += val.heal;
				num2 += val.hunger;
				num3 += val.stamina;
			}
			return new Restoration(num, num2, num3);
		}
	}
}