Decompiled source of S1API Forked v1.8.1

Plugins/S1APILoader.MelonLoader.dll

Decompiled 16 hours ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using MelonLoader;
using Microsoft.CodeAnalysis;
using S1APILoader;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1APILoader.S1APILoader), "S1APILoader", "1.6.7", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("S1APILoader")]
[assembly: AssemblyConfiguration("MonoMelon")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+2b3a3229939aba2d6613f48d3054372e2b895477")]
[assembly: AssemblyProduct("S1APILoader")]
[assembly: AssemblyTitle("S1APILoader")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[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;
		}
	}
}
namespace S1APILoader
{
	public class S1APILoader : MelonPlugin
	{
		private const string BuildFolderName = "S1API";

		public override void OnPreModsLoaded()
		{
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			if (directoryName == null)
			{
				throw new Exception("Failed to identify plugins folder.");
			}
			string fullPath = Path.GetFullPath(Path.Combine(directoryName, "../Mods"));
			string text = (MelonUtils.IsGameIl2Cpp() ? "Il2Cpp" : "Mono");
			string build = ((!MelonUtils.IsGameIl2Cpp()) ? "Il2Cpp" : "Mono");
			MelonLogger.Msg("Loading S1API for " + text + "...");
			NormalizeBuild(fullPath, text, shouldBeEnabled: true);
			NormalizeBuild(fullPath, build, shouldBeEnabled: false);
			MelonLogger.Msg("Successfully loaded S1API for " + text + "!");
		}

		private static void NormalizeBuild(string modsFolder, string build, bool shouldBeEnabled)
		{
			string text = Path.Combine(modsFolder, "S1API." + build + ".MelonLoader.dll");
			string text2 = text + ".disabled";
			bool flag = File.Exists(text);
			bool flag2 = File.Exists(text2);
			string text3 = null;
			if (flag)
			{
				text3 = text;
			}
			if (flag2)
			{
				text3 = ChooseNewest(text3, text2);
			}
			if (text3 == null)
			{
				return;
			}
			if (shouldBeEnabled)
			{
				if (!StringComparer.OrdinalIgnoreCase.Equals(text3, text))
				{
					SafeDelete(text);
					SafeMoveReplace(text3, text);
				}
				SafeDelete(text2);
			}
			else
			{
				if (!StringComparer.OrdinalIgnoreCase.Equals(text3, text2))
				{
					SafeDelete(text2);
					SafeMoveReplace(text3, text2);
				}
				SafeDelete(text);
			}
		}

		private static string ChooseNewest(string? currentBestPath, string candidatePath)
		{
			if (currentBestPath == null)
			{
				return candidatePath;
			}
			Version version = TryGetAssemblyVersion(currentBestPath);
			Version version2 = TryGetAssemblyVersion(candidatePath);
			if (version != null && version2 != null)
			{
				return (version2 > version) ? candidatePath : currentBestPath;
			}
			DateTime safeWriteTimeUtc = GetSafeWriteTimeUtc(currentBestPath);
			DateTime safeWriteTimeUtc2 = GetSafeWriteTimeUtc(candidatePath);
			return (safeWriteTimeUtc2 > safeWriteTimeUtc) ? candidatePath : currentBestPath;
		}

		private static Version? TryGetAssemblyVersion(string path)
		{
			try
			{
				return AssemblyName.GetAssemblyName(path).Version;
			}
			catch
			{
				return null;
			}
		}

		private static DateTime GetSafeWriteTimeUtc(string path)
		{
			try
			{
				return File.GetLastWriteTimeUtc(path);
			}
			catch
			{
				return DateTime.MinValue;
			}
		}

		private static void SafeMoveReplace(string sourcePath, string destinationPath)
		{
			try
			{
				if (File.Exists(destinationPath))
				{
					File.Delete(destinationPath);
				}
				File.Move(sourcePath, destinationPath);
			}
			catch (Exception ex)
			{
				MelonLogger.Warning("Failed to move '" + sourcePath + "' to '" + destinationPath + "': " + ex.Message);
			}
		}

		private static void SafeDelete(string path)
		{
			try
			{
				if (File.Exists(path))
				{
					File.Delete(path);
				}
			}
			catch (Exception ex)
			{
				MelonLogger.Warning("Failed to delete '" + path + "': " + ex.Message);
			}
		}
	}
}

Mods/S1API.Il2Cpp.MelonLoader.dll

Decompiled 16 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using HarmonyLib;
using Il2Cpp;
using Il2CppFishNet;
using Il2CppFishNet.Connection;
using Il2CppFishNet.Managing;
using Il2CppFishNet.Object;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne;
using Il2CppScheduleOne.AvatarFramework;
using Il2CppScheduleOne.Calling;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Dialogue;
using Il2CppScheduleOne.Economy;
using Il2CppScheduleOne.GameTime;
using Il2CppScheduleOne.Growing;
using Il2CppScheduleOne.Interaction;
using Il2CppScheduleOne.ItemFramework;
using Il2CppScheduleOne.Levelling;
using Il2CppScheduleOne.Map;
using Il2CppScheduleOne.Messaging;
using Il2CppScheduleOne.Money;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.NPCs.Behaviour;
using Il2CppScheduleOne.NPCs.Relation;
using Il2CppScheduleOne.NPCs.Responses;
using Il2CppScheduleOne.NPCs.Schedules;
using Il2CppScheduleOne.Noise;
using Il2CppScheduleOne.Persistence;
using Il2CppScheduleOne.Persistence.Datas;
using Il2CppScheduleOne.Persistence.Loaders;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.PlayerScripts.Health;
using Il2CppScheduleOne.Product;
using Il2CppScheduleOne.Product.Packaging;
using Il2CppScheduleOne.Properties;
using Il2CppScheduleOne.Property;
using Il2CppScheduleOne.Quests;
using Il2CppScheduleOne.ScriptableObjects;
using Il2CppScheduleOne.Storage;
using Il2CppScheduleOne.UI;
using Il2CppScheduleOne.UI.Phone;
using Il2CppScheduleOne.UI.Phone.ContactsApp;
using Il2CppScheduleOne.UI.Phone.ProductManagerApp;
using Il2CppScheduleOne.UI.WorldspacePopup;
using Il2CppScheduleOne.Variables;
using Il2CppScheduleOne.Vehicles;
using Il2CppScheduleOne.Vehicles.Modification;
using Il2CppScheduleOne.Vision;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API;
using S1API.Conditions;
using S1API.Console;
using S1API.Entities;
using S1API.Entities.Appearances.AccessoryFields;
using S1API.Entities.Appearances.Base;
using S1API.Entities.Appearances.BodyLayerFields;
using S1API.Entities.Appearances.CustomizationFields;
using S1API.Entities.Appearances.FaceLayerFields;
using S1API.Entities.Interfaces;
using S1API.Internal.Abstraction;
using S1API.Internal.Patches;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Logging;
using S1API.Map;
using S1API.Messaging;
using S1API.Money;
using S1API.PhoneApp;
using S1API.PhoneCalls;
using S1API.PhoneCalls.Constants;
using S1API.Products;
using S1API.Properties;
using S1API.Properties.Interfaces;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using S1API.Storages;
using S1API.Vehicles;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1API.S1API), "S1API (Forked by Bars)", "1.8.1", "KaBooMa", null)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("ifBars")]
[assembly: AssemblyConfiguration("Il2CppMelon")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer (Forked from the original S1API by Kabooma)")]
[assembly: AssemblyFileVersion("1.8.1.0")]
[assembly: AssemblyInformationalVersion("1.8.1+b394d85a199fa3b13ecc9b8a4d3cd9d66db58d85")]
[assembly: AssemblyProduct("S1API")]
[assembly: AssemblyTitle("S1API")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ifBars/S1API")]
[assembly: AssemblyVersion("1.8.1.0")]
[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.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;
		}
	}
}
public class ClickHandler
{
	private readonly UnityAction _callback;

	public ClickHandler(UnityAction callback)
	{
		_callback = callback;
	}

	public void OnClick()
	{
		_callback.Invoke();
	}
}
namespace S1API
{
	public class S1API : MelonMod
	{
	}
}
namespace S1API.Vehicles
{
	public class LandVehicle
	{
		internal LandVehicle S1LandVehicle = null;

		private static readonly Log _logger = new Log("S1API.LandVehicle");

		private static readonly FieldInfo? VehiclePriceField = typeof(LandVehicle).GetField("vehiclePrice", BindingFlags.NonPublic);

		private NetworkConnection? _conn;

		public float VehiclePrice
		{
			get
			{
				return S1LandVehicle.VehiclePrice;
			}
			set
			{
				VehiclePriceField?.SetValue(S1LandVehicle, value);
			}
		}

		public float TopSpeed
		{
			get
			{
				return S1LandVehicle.TopSpeed;
			}
			set
			{
				S1LandVehicle.TopSpeed = value;
			}
		}

		public bool IsPlayerOwned
		{
			get
			{
				return S1LandVehicle.IsPlayerOwned;
			}
			set
			{
				SetIsPlayerOwned(value);
			}
		}

		public VehicleColor Color
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (VehicleColor)S1LandVehicle.OwnedColor;
			}
			set
			{
				SetColor(value);
			}
		}

		public LandVehicle(string vehicleCode)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			LandVehicle vehiclePrefab = NetworkSingleton<VehicleManager>.Instance.GetVehiclePrefab(vehicleCode);
			if ((Object)(object)vehiclePrefab == (Object)null)
			{
				_logger.Error("SpawnVehicle: '" + vehicleCode + "' is not a valid vehicle code!");
				return;
			}
			LandVehicle component = Object.Instantiate<GameObject>(((Component)vehiclePrefab).gameObject).GetComponent<LandVehicle>();
			component.SetGUID(GUIDManager.GenerateUniqueGUID());
			NetworkSingleton<VehicleManager>.Instance.AllVehicles.Add(component);
			S1LandVehicle = component;
			SetConnection();
		}

		public void Spawn(Vector3 position, Quaternion rotation)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			if (!InstanceFinder.IsServer)
			{
				_logger.Warning("Spawn can only be called on the server!");
				return;
			}
			if ((Object)(object)S1LandVehicle == (Object)null)
			{
				throw new Exception("Unable to spawn vehicle, S1LandVehicle is null!");
			}
			((Component)S1LandVehicle).transform.position = position;
			((Component)S1LandVehicle).transform.rotation = rotation;
			((NetworkBehaviour)NetworkSingleton<VehicleManager>.Instance).Spawn(((Component)S1LandVehicle).gameObject, (NetworkConnection)null, default(Scene));
		}

		internal LandVehicle(LandVehicle landVehicle)
		{
			S1LandVehicle = landVehicle;
			SetConnection();
		}

		private void SetConnection()
		{
			NetworkManager networkManager = InstanceFinder.NetworkManager;
			if (networkManager.IsClientOnly)
			{
				NetworkConnection connection = InstanceFinder.ClientManager.Connection;
				if (connection != (NetworkConnection)null && connection.IsValid)
				{
					_conn = connection;
				}
			}
			else if (networkManager.IsServerOnly || (networkManager.IsServer && !networkManager.IsClient))
			{
				NetworkConnection owner = ((NetworkBehaviour)S1LandVehicle).Owner;
				if (owner != (NetworkConnection)null && owner.IsValid)
				{
					_conn = owner;
				}
			}
		}

		private void SetIsPlayerOwned(bool isPlayerOwned)
		{
			S1LandVehicle.SetIsPlayerOwned(_conn, isPlayerOwned);
			if (isPlayerOwned)
			{
				NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Add(S1LandVehicle);
			}
			else
			{
				NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Remove(S1LandVehicle);
			}
		}

		private void SetColor(VehicleColor color)
		{
			MethodInfo method = typeof(LandVehicle).GetMethod("SetOwnedColor", BindingFlags.Instance | BindingFlags.NonPublic);
			if (method == null)
			{
				_logger.Error("SetOwnedColor method not found!");
				return;
			}
			method.Invoke(S1LandVehicle, new object[2]
			{
				_conn,
				(object)(EVehicleColor)color
			});
		}
	}
	public enum VehicleColor
	{
		Black,
		DarkGrey,
		LightGrey,
		White,
		Yellow,
		Orange,
		Red,
		DullRed,
		Pink,
		Purple,
		Navy,
		DarkBlue,
		LightBlue,
		Cyan,
		LightGreen,
		DarkGreen,
		Custom
	}
}
namespace S1API.UI
{
	public static class UIFactory
	{
		private static Sprite roundedSprite;

		public static GameObject Panel(string name, Transform parent, Color bgColor, Vector2? anchorMin = null, Vector2? anchorMax = null, bool fullAnchor = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0025: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			if (fullAnchor)
			{
				val2.anchorMin = Vector2.zero;
				val2.anchorMax = Vector2.one;
				val2.offsetMin = Vector2.zero;
				val2.offsetMax = Vector2.zero;
			}
			else
			{
				val2.anchorMin = (Vector2)(((??)anchorMin) ?? new Vector2(0.5f, 0.5f));
				val2.anchorMax = (Vector2)(((??)anchorMax) ?? new Vector2(0.5f, 0.5f));
			}
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			return val;
		}

		public static Text Text(string name, string content, Transform parent, int fontSize = 14, TextAnchor anchor = 0, FontStyle style = 0)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			Text val3 = val.AddComponent<Text>();
			val3.text = content;
			val3.fontSize = fontSize;
			val3.alignment = anchor;
			val3.fontStyle = style;
			val3.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			((Graphic)val3).color = Color.white;
			val3.horizontalOverflow = (HorizontalWrapMode)0;
			val3.verticalOverflow = (VerticalWrapMode)1;
			return val3;
		}

		public static RectTransform ScrollableVerticalList(string name, Transform parent, out ScrollRect scrollRect)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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_00fa: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			scrollRect = val.AddComponent<ScrollRect>();
			scrollRect.horizontal = false;
			GameObject val3 = new GameObject("Viewport");
			val3.transform.SetParent(val.transform, false);
			RectTransform val4 = val3.AddComponent<RectTransform>();
			val4.anchorMin = Vector2.zero;
			val4.anchorMax = Vector2.one;
			val4.offsetMin = Vector2.zero;
			val4.offsetMax = Vector2.zero;
			((Graphic)val3.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.05f);
			val3.AddComponent<Mask>().showMaskGraphic = false;
			scrollRect.viewport = val4;
			GameObject val5 = new GameObject("Content");
			val5.transform.SetParent(val3.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = new Vector2(0f, 1f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.pivot = new Vector2(0.5f, 1f);
			VerticalLayoutGroup val7 = val5.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val7).spacing = 10f;
			((LayoutGroup)val7).padding = new RectOffset(10, 10, 10, 10);
			((HorizontalOrVerticalLayoutGroup)val7).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val7).childForceExpandHeight = false;
			val5.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			scrollRect.content = val6;
			return val6;
		}

		public static void FitContentHeight(RectTransform content)
		{
			ContentSizeFitter val = ((Component)content).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)content).gameObject.AddComponent<ContentSizeFitter>();
			}
			val.verticalFit = (FitMode)2;
		}

		public static (GameObject, Button, Text) RoundedButtonWithLabel(string name, string label, Transform parent, Color bgColor, float width, float height, int fontSize, Color textColor)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_002c: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Expected O, but got Unknown
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: 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_01aa: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name + "_RoundedMask");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(width, height);
			LayoutElement val3 = val.AddComponent<LayoutElement>();
			val3.preferredWidth = width;
			val3.preferredHeight = height;
			Image val4 = val.AddComponent<Image>();
			val4.sprite = GetRoundedSprite();
			val4.type = (Type)1;
			((Graphic)val4).color = Color.white;
			Mask val5 = val.AddComponent<Mask>();
			val5.showMaskGraphic = true;
			GameObject val6 = new GameObject(name);
			val6.transform.SetParent(val.transform, false);
			RectTransform val7 = val6.AddComponent<RectTransform>();
			val7.anchorMin = Vector2.zero;
			val7.anchorMax = Vector2.one;
			val7.offsetMin = Vector2.zero;
			val7.offsetMax = Vector2.zero;
			Image val8 = val6.AddComponent<Image>();
			((Graphic)val8).color = bgColor;
			val8.sprite = GetRoundedSprite();
			val8.type = (Type)1;
			Button val9 = val6.AddComponent<Button>();
			((Selectable)val9).targetGraphic = (Graphic)(object)val8;
			GameObject val10 = new GameObject("Label");
			val10.transform.SetParent(val6.transform, false);
			RectTransform val11 = val10.AddComponent<RectTransform>();
			val11.anchorMin = Vector2.zero;
			val11.anchorMax = Vector2.one;
			val11.offsetMin = Vector2.zero;
			val11.offsetMax = Vector2.zero;
			Text val12 = val10.AddComponent<Text>();
			val12.text = label;
			val12.alignment = (TextAnchor)4;
			val12.fontSize = fontSize;
			val12.fontStyle = (FontStyle)1;
			((Graphic)val12).color = textColor;
			val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val9, val12);
		}

		private static Sprite GetRoundedSprite()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: 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_0179: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)roundedSprite != (Object)null)
			{
				return roundedSprite;
			}
			int num = 32;
			Texture2D val = new Texture2D(num, num, (TextureFormat)5, false);
			Color32 val2 = default(Color32);
			((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0);
			Color32 val3 = default(Color32);
			((Color32)(ref val3))..ctor(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
			float num2 = 6f;
			for (int i = 0; i < num; i++)
			{
				for (int j = 0; j < num; j++)
				{
					bool flag = ((float)j < num2 && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, num2)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, num2)) > num2) || ((float)j < num2 && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, (float)num - num2 - 1f)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, (float)num - num2 - 1f)) > num2);
					val.SetPixel(j, i, Color32.op_Implicit(flag ? val2 : val3));
				}
			}
			val.Apply();
			Vector4 val4 = default(Vector4);
			((Vector4)(ref val4))..ctor(8f, 8f, 8f, 8f);
			roundedSprite = Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, val4);
			return roundedSprite;
		}

		public static GameObject ButtonRow(string name, Transform parent, float spacing = 12f, TextAnchor alignment = 4)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val3).spacing = spacing;
			((LayoutGroup)val3).childAlignment = alignment;
			((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = false;
			((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = false;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
			return val;
		}

		public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor, float Width, float Height)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_0070: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(Height, Width);
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			val3.sprite = Resources.GetBuiltinResource<Sprite>("UI/Skin/UISprite.psd");
			val3.type = (Type)1;
			Button val4 = val.AddComponent<Button>();
			((Selectable)val4).targetGraphic = (Graphic)(object)val3;
			GameObject val5 = new GameObject("Label");
			val5.transform.SetParent(val.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = Vector2.zero;
			val6.anchorMax = Vector2.one;
			val6.offsetMin = Vector2.zero;
			val6.offsetMax = Vector2.zero;
			Text val7 = val5.AddComponent<Text>();
			val7.text = label;
			val7.alignment = (TextAnchor)4;
			val7.fontSize = 16;
			val7.fontStyle = (FontStyle)1;
			((Graphic)val7).color = Color.white;
			val7.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val4, val7);
		}

		public static void SetIcon(Sprite sprite, Transform parent)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0022: 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)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Icon");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			Image val3 = val.AddComponent<Image>();
			val3.sprite = sprite;
			val3.preserveAspect = true;
		}

		public static void CreateTextBlock(Transform parent, string title, string subtitle, bool isCompleted)
		{
			Text(((Object)parent).name + "Title", title, parent, 16, (TextAnchor)3, (FontStyle)1);
			Text(((Object)parent).name + "Subtitle", subtitle, parent, 14, (TextAnchor)0, (FontStyle)0);
			if (isCompleted)
			{
				Text("CompletedLabel", "<color=#888888><i>Already Delivered</i></color>", parent, 12, (TextAnchor)0, (FontStyle)0);
			}
		}

		public static void CreateRowButton(GameObject go, UnityAction clickHandler, bool enabled)
		{
			Button val = go.AddComponent<Button>();
			Image component = go.GetComponent<Image>();
			((Selectable)val).targetGraphic = (Graphic)(object)component;
			((Selectable)val).interactable = enabled;
			((UnityEvent)val.onClick).AddListener(clickHandler);
		}

		public static void ClearChildren(Transform parent)
		{
			for (int num = parent.childCount - 1; num >= 0; num--)
			{
				Transform child = parent.GetChild(num);
				Object.Destroy((Object)(object)((Component)child).gameObject);
			}
		}

		public static void VerticalLayoutOnGO(GameObject go, int spacing = 10, RectOffset? padding = null)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			VerticalLayoutGroup val = go.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset(10, 10, 10, 10)));
		}

		public static GameObject CreateQuestRow(string name, Transform parent, out GameObject iconPanel, out GameObject textPanel)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Row_" + name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(0f, 90f);
			val.AddComponent<LayoutElement>().minHeight = 50f;
			((Shadow)val.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.2f);
			GameObject val3 = Panel("Separator", val.transform, new Color(1f, 1f, 1f, 0.05f));
			val3.GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 1f);
			Image val4 = val.AddComponent<Image>();
			((Graphic)val4).color = new Color(0.12f, 0.12f, 0.12f);
			Button val5 = val.AddComponent<Button>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4;
			HorizontalLayoutGroup val6 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val6).spacing = 20f;
			((LayoutGroup)val6).padding = new RectOffset(75, 10, 10, 10);
			((LayoutGroup)val6).childAlignment = (TextAnchor)3;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandHeight = false;
			LayoutElement val7 = val.AddComponent<LayoutElement>();
			val7.minHeight = 90f;
			val7.flexibleWidth = 1f;
			iconPanel = Panel("IconPanel", val.transform, new Color(0.12f, 0.12f, 0.12f));
			RectTransform component = iconPanel.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(80f, 80f);
			LayoutElement val8 = iconPanel.AddComponent<LayoutElement>();
			val8.preferredWidth = 80f;
			val8.preferredHeight = 80f;
			textPanel = Panel("TextPanel", val.transform, Color.clear);
			VerticalLayoutOnGO(textPanel, 2);
			LayoutElement val9 = textPanel.AddComponent<LayoutElement>();
			val9.minWidth = 200f;
			val9.flexibleWidth = 1f;
			return val;
		}

		public static GameObject TopBar(string name, Transform parent, string title, float topbarSize, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom)
		{
			//IL_0012: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			GameObject val = Panel(name, parent, new Color(0.15f, 0.15f, 0.15f), (Vector2?)new Vector2(0f, topbarSize), (Vector2?)new Vector2(1f, 1f), fullAnchor: false);
			HorizontalLayoutGroup val2 = val.AddComponent<HorizontalLayoutGroup>();
			((LayoutGroup)val2).padding = new RectOffset(paddingLeft, paddingRight, paddingTop, paddingBottom);
			((HorizontalOrVerticalLayoutGroup)val2).spacing = 20f;
			((LayoutGroup)val2).childAlignment = (TextAnchor)4;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = true;
			Text val3 = Text("TopBarTitle", title, val.transform, 26, (TextAnchor)3, (FontStyle)1);
			LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
			val4.minWidth = 300f;
			val4.flexibleWidth = 1f;
			return val;
		}

		public static void HorizontalLayoutOnGO(GameObject go, int spacing = 10, int padLeft = 0, int padRight = 0, int padTop = 0, int padBottom = 0, TextAnchor alignment = 4)
		{
			//IL_0012: 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_003b: Expected O, but got Unknown
			HorizontalLayoutGroup val = go.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).childAlignment = alignment;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
			((LayoutGroup)val).padding = new RectOffset(padLeft, padRight, padTop, padBottom);
		}

		public static void SetLayoutGroupPadding(LayoutGroup layoutGroup, int left, int right, int top, int bottom)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			layoutGroup.padding = new RectOffset(left, right, top, bottom);
		}

		public static void BindAcceptButton(Button btn, Text label, string text, UnityAction callback)
		{
			label.text = text;
			((UnityEventBase)btn.onClick).RemoveAllListeners();
			((UnityEvent)btn.onClick).AddListener(callback);
		}
	}
}
namespace S1API.Storages
{
	public class StorageInstance
	{
		internal readonly StorageEntity S1Storage;

		public ItemSlotInstance[] Slots => ((IEnumerable<ItemSlot>)S1Storage.ItemSlots.ToArray()).Select((ItemSlot itemSlot) => new ItemSlotInstance(itemSlot)).ToArray();

		public event Action OnOpened
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onOpened);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onOpened);
			}
		}

		public event Action OnClosed
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onClosed);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onClosed);
			}
		}

		internal StorageInstance(StorageEntity storage)
		{
			S1Storage = storage;
		}

		public bool CanItemFit(ItemInstance itemInstance, int quantity = 1)
		{
			return S1Storage.CanItemFit(itemInstance.S1ItemInstance, quantity);
		}

		public void AddItem(ItemInstance itemInstance)
		{
			S1Storage.InsertItem(itemInstance.S1ItemInstance, true);
		}
	}
}
namespace S1API.Saveables
{
	[Obsolete("Manual registration is no longer required. Classes that directly inherit from Saveable are automatically discovered. Remove calls to ModSaveableRegistry.Register() and simply inherit from Saveable.")]
	public static class ModSaveableRegistry
	{
		internal class Entry
		{
			public Saveable Saveable;

			public string? FolderName;
		}

		internal static readonly List<Entry> Registered = new List<Entry>();

		[Obsolete("Manual registration is no longer required. Classes that directly inherit from Saveable are automatically discovered.")]
		public static void Register(Saveable saveable, string? folderName = null)
		{
			if (saveable != null)
			{
				MelonLogger.Warning($"ModSaveableRegistry.Register() is deprecated! The saveable '{saveable.GetType().Name}' will be automatically discovered. Mod users can safely ignore this warning - their saves will continue to work normally. Mod developers should remove ModSaveableRegistry.Register() calls and simply inherit from Saveable.");
				Registered.Add(new Entry
				{
					Saveable = saveable,
					FolderName = folderName
				});
			}
		}
	}
	internal static class SaveableAutoRegistry
	{
		[CompilerGenerated]
		private sealed class <GetOrCreateInstances>d__7 : IEnumerable<Saveable>, IEnumerable, IEnumerator<Saveable>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private Saveable <>2__current;

			private int <>l__initialThreadId;

			private List<Type>.Enumerator <>s__1;

			private Type <saveableType>5__2;

			private Saveable <instance>5__3;

			Saveable IEnumerator<Saveable>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetOrCreateInstances>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>s__1 = default(List<Type>.Enumerator);
				<saveableType>5__2 = null;
				<instance>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -3;
						goto IL_00eb;
					}
					<>1__state = -1;
					<>s__1 = _discoveredSaveableTypes.GetEnumerator();
					<>1__state = -3;
					goto IL_00fa;
					IL_00eb:
					<instance>5__3 = null;
					<saveableType>5__2 = null;
					goto IL_00fa;
					IL_00fa:
					if (<>s__1.MoveNext())
					{
						<saveableType>5__2 = <>s__1.Current;
						if (!_instances.TryGetValue(<saveableType>5__2, out <instance>5__3))
						{
							try
							{
								<instance>5__3 = (Saveable)Activator.CreateInstance(<saveableType>5__2, nonPublic: true);
								if (<instance>5__3 != null)
								{
									_instances[<saveableType>5__2] = <instance>5__3;
								}
							}
							catch
							{
							}
						}
						if (<instance>5__3 != null)
						{
							<>2__current = <instance>5__3;
							<>1__state = 1;
							return true;
						}
						goto IL_00eb;
					}
					<>m__Finally1();
					<>s__1 = default(List<Type>.Enumerator);
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>s__1).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<Saveable> IEnumerable<Saveable>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <GetOrCreateInstances>d__7(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<Saveable>)this).GetEnumerator();
			}
		}

		private static readonly List<Type> _discoveredSaveableTypes = new List<Type>();

		private static readonly Dictionary<Type, Saveable> _instances = new Dictionary<Type, Saveable>();

		private static bool _discoveryPerformed = false;

		private static readonly object _lock = new object();

		public static IEnumerable<Saveable> GetRegisteredSaveables()
		{
			lock (_lock)
			{
				if (!_discoveryPerformed)
				{
					DiscoverSaveableTypes();
					_discoveryPerformed = true;
				}
				return GetOrCreateInstances();
			}
		}

		private static void DiscoverSaveableTypes()
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				try
				{
					if (assembly == executingAssembly)
					{
						continue;
					}
					string? fullName = assembly.FullName;
					if (fullName != null && fullName.StartsWith("System"))
					{
						continue;
					}
					string? fullName2 = assembly.FullName;
					if (fullName2 != null && fullName2.StartsWith("Unity"))
					{
						continue;
					}
					string? fullName3 = assembly.FullName;
					if (fullName3 != null && fullName3.StartsWith("mscorlib"))
					{
						continue;
					}
					string? fullName4 = assembly.FullName;
					if (fullName4 != null && fullName4.StartsWith("netstandard"))
					{
						continue;
					}
					Type[] types = assembly.GetTypes();
					Type[] array = types;
					foreach (Type type in array)
					{
						try
						{
							if (IsDirectSaveableInheritor(type))
							{
								_discoveredSaveableTypes.Add(type);
							}
						}
						catch
						{
						}
					}
				}
				catch
				{
				}
			}
		}

		private static bool IsDirectSaveableInheritor(Type type)
		{
			if (!typeof(Saveable).IsAssignableFrom(type))
			{
				return false;
			}
			if (type.IsAbstract || type.IsInterface)
			{
				return false;
			}
			Type baseType = type.BaseType;
			return baseType == typeof(Saveable);
		}

		[IteratorStateMachine(typeof(<GetOrCreateInstances>d__7))]
		private static IEnumerable<Saveable> GetOrCreateInstances()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetOrCreateInstances>d__7(-2);
		}

		internal static void ClearCache()
		{
			lock (_lock)
			{
				_discoveredSaveableTypes.Clear();
				_instances.Clear();
				_discoveryPerformed = false;
			}
		}
	}
	[AttributeUsage(AttributeTargets.Field)]
	public class SaveableField : Attribute
	{
		internal string SaveName { get; }

		public SaveableField(string saveName)
		{
			SaveName = saveName;
		}
	}
}
namespace S1API.Quests
{
	public abstract class Quest : Saveable
	{
		protected readonly List<QuestEntry> QuestEntries = new List<QuestEntry>();

		[SaveableField("QuestData")]
		private readonly QuestData _questData;

		internal readonly Quest S1Quest;

		private readonly GameObject _gameObject;

		protected abstract string Title { get; }

		protected abstract string Description { get; }

		protected virtual bool AutoBegin => true;

		protected QuestState QuestState => (QuestState)S1Quest.State;

		internal string? SaveFolder => S1Quest.SaveFolderName;

		protected virtual Sprite? QuestIcon => null;

		public Quest()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Expected O, but got Unknown
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Expected O, but got Unknown
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Expected O, but got Unknown
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Expected O, but got Unknown
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Expected O, but got Unknown
			//IL_0268: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Expected O, but got Unknown
			_questData = new QuestData(GetType().Name);
			_gameObject = new GameObject("Quest");
			S1Quest = _gameObject.AddComponent<Quest>();
			S1Quest.StaticGUID = string.Empty;
			S1Quest.title = Title;
			S1Quest.onActiveState = new UnityEvent();
			S1Quest.onComplete = new UnityEvent();
			S1Quest.onInitialComplete = new UnityEvent();
			S1Quest.onQuestBegin = new UnityEvent();
			S1Quest.onQuestEnd = new UnityEvent<EQuestState>();
			S1Quest.onTrackChange = new UnityEvent<bool>();
			S1Quest.TrackOnBegin = true;
			S1Quest.AutoCompleteOnAllEntriesComplete = true;
			S1Quest.autoInitialize = false;
			GameObject val = new GameObject("IconPrefab", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val.transform.SetParent(_gameObject.transform);
			Image component = val.GetComponent<Image>();
			component.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1Quest.IconPrefab = val.GetComponent<RectTransform>();
			GameObject val2 = new GameObject("PoIUIPrefab", (Type[])(object)new Type[4]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<EventTrigger>(),
				CrossType.Of<Button>()
			});
			val2.transform.SetParent(_gameObject.transform);
			GameObject val3 = new GameObject("MainLabel", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Text>()
			});
			val3.transform.SetParent(val2.transform);
			GameObject val4 = new GameObject("IconContainer", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val4.transform.SetParent(val2.transform);
			Image component2 = val4.GetComponent<Image>();
			component2.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			RectTransform component3 = ((Component)component2).GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(20f, 20f);
			GameObject val5 = new GameObject("POIPrefab");
			val5.SetActive(false);
			val5.transform.SetParent(_gameObject.transform);
			POI val6 = val5.AddComponent<POI>();
			val6.DefaultMainText = "Did it work?";
			val6.UIPrefab = val2;
			S1Quest.PoIPrefab = val5;
			S1Quest.onQuestEnd.AddListener(UnityAction<EQuestState>.op_Implicit((Action<EQuestState>)OnQuestEnded));
		}

		internal override void CreateInternal()
		{
			base.CreateInternal();
			Quest s1Quest = S1Quest;
			string title = Title;
			string description = Description;
			Il2CppReferenceArray<QuestEntryData> obj = Il2CppReferenceArray<QuestEntryData>.op_Implicit(Array.Empty<QuestEntryData>());
			Quest s1Quest2 = S1Quest;
			s1Quest.InitializeQuest(title, description, obj, (s1Quest2 != null) ? s1Quest2.StaticGUID : null);
			if (AutoBegin)
			{
				Quest s1Quest3 = S1Quest;
				if (s1Quest3 != null)
				{
					s1Quest3.Begin(true);
				}
			}
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string text = Path.Combine(folderPath, S1Quest.SaveFolderName);
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			base.SaveInternal(text, ref extraSaveables);
		}

		internal void OnQuestEnded(EQuestState questState)
		{
			Quest.Quests.Remove(S1Quest);
			QuestManager.Quests.Remove(this);
		}

		protected QuestEntry AddEntry(string title, Vector3? poiPosition = null)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("QuestEntry");
			Transform transform = val.transform;
			GameObject gameObject = _gameObject;
			transform.SetParent((gameObject != null) ? gameObject.transform : null);
			QuestEntry val2 = val.AddComponent<QuestEntry>();
			val2.PoILocation = val.transform;
			S1Quest.Entries.Add(val2);
			QuestEntry questEntry = new QuestEntry(val2)
			{
				Title = title,
				POIPosition = (Vector3)(((??)poiPosition) ?? Vector3.zero)
			};
			QuestEntries.Add(questEntry);
			return questEntry;
		}

		public void Begin()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Begin(true);
			}
		}

		public void Cancel()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Cancel(true);
			}
		}

		public void Expire()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Expire(true);
			}
		}

		public void Fail()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Fail(true);
			}
		}

		public void Complete()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Complete(true);
			}
		}

		public void End()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.End();
			}
		}
	}
	public class QuestData
	{
		public readonly string ClassName;

		public QuestData(string className)
		{
			ClassName = className;
		}
	}
	public class QuestEntry
	{
		internal readonly QuestEntry S1QuestEntry;

		public QuestState State => (QuestState)S1QuestEntry.State;

		public string Title
		{
			get
			{
				return S1QuestEntry.Title;
			}
			set
			{
				S1QuestEntry.SetEntryTitle(value);
			}
		}

		public Vector3 POIPosition
		{
			get
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				return S1QuestEntry.PoILocation.position;
			}
			set
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				S1QuestEntry.PoILocation.position = value;
			}
		}

		public event Action OnComplete
		{
			add
			{
				EventHelper.AddListener(value, S1QuestEntry.onComplete);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1QuestEntry.onComplete);
			}
		}

		internal QuestEntry(QuestEntry questEntry)
		{
			S1QuestEntry = questEntry;
		}

		public void Begin()
		{
			S1QuestEntry.Begin();
		}

		public void Complete()
		{
			S1QuestEntry.Complete();
		}

		public void SetState(QuestState questState)
		{
			S1QuestEntry.SetState((EQuestState)questState, true);
		}
	}
	public static class QuestManager
	{
		internal static readonly List<Quest> Quests = new List<Quest>();

		public static Quest CreateQuest<T>(string? guid = null) where T : Quest
		{
			return CreateQuest(typeof(T), guid);
		}

		public static Quest CreateQuest(Type questType, string? guid = null)
		{
			Quest quest = (Quest)Activator.CreateInstance(questType);
			if (quest == null)
			{
				throw new Exception("Unable to create quest instance of " + questType.FullName + "!");
			}
			Quests.Add(quest);
			return quest;
		}

		public static Quest? GetQuestByGuid(string guid)
		{
			string guid2 = guid;
			return Quests.FirstOrDefault((Quest x) => x.S1Quest.StaticGUID == guid2);
		}

		public static Quest? GetQuestByName(string questName)
		{
			string questName2 = questName;
			return Quests.FirstOrDefault((Quest x) => x.S1Quest.Title == questName2);
		}
	}
}
namespace S1API.Quests.Constants
{
	public enum QuestAction
	{
		Begin,
		Success,
		Fail,
		Expire,
		Cancel
	}
	public enum QuestState
	{
		Inactive,
		Active,
		Completed,
		Failed,
		Expired,
		Cancelled
	}
}
namespace S1API.Property
{
	public abstract class BaseProperty
	{
		public abstract string PropertyName { get; }

		public abstract string PropertyCode { get; }

		public abstract float Price { get; }

		public abstract bool IsOwned { get; }

		public abstract int EmployeeCapacity { get; set; }

		public abstract void SetOwned();

		public abstract bool IsPointInside(Vector3 point);
	}
	public static class PropertyManager
	{
		public static List<PropertyWrapper> GetAllProperties()
		{
			List<PropertyWrapper> list = new List<PropertyWrapper>();
			Enumerator<Property> enumerator = Property.Properties.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Property current = enumerator.Current;
				list.Add(new PropertyWrapper(current));
			}
			return list;
		}

		public static List<PropertyWrapper> GetOwnedProperties()
		{
			List<PropertyWrapper> list = new List<PropertyWrapper>();
			Enumerator<Property> enumerator = Property.OwnedProperties.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Property current = enumerator.Current;
				list.Add(new PropertyWrapper(current));
			}
			return list;
		}

		public static PropertyWrapper FindPropertyByName(string name)
		{
			Enumerator<Property> enumerator = Property.Properties.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Property current = enumerator.Current;
				if (current.PropertyName == name)
				{
					return new PropertyWrapper(current);
				}
			}
			return null;
		}
	}
	public class PropertyWrapper : BaseProperty
	{
		internal readonly Property InnerProperty;

		public override string PropertyName => InnerProperty.PropertyName;

		public override string PropertyCode => InnerProperty.PropertyCode;

		public override float Price => InnerProperty.Price;

		public override bool IsOwned => InnerProperty.IsOwned;

		public override int EmployeeCapacity
		{
			get
			{
				return InnerProperty.EmployeeCapacity;
			}
			set
			{
				InnerProperty.EmployeeCapacity = value;
			}
		}

		public PropertyWrapper(Property property)
		{
			InnerProperty = property;
		}

		public override void SetOwned()
		{
			InnerProperty.SetOwned();
		}

		public override bool IsPointInside(Vector3 point)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return InnerProperty.DoBoundsContainPoint(point);
		}
	}
}
namespace S1API.Properties
{
	public class ProductPropertyWrapper : PropertyBase
	{
		private readonly Property _innerProperty;

		public override string ID => _innerProperty.ID;

		public override string Name => _innerProperty.Name;

		public override string name => ((Object)_innerProperty).name;

		public override string Description => _innerProperty.Description;

		public override int Tier => _innerProperty.Tier;

		public override float Addictiveness => _innerProperty.Addictiveness;

		internal Property InnerProperty => _innerProperty;

		internal ProductPropertyWrapper(Property property)
		{
			_innerProperty = property;
		}
	}
}
namespace S1API.Properties.Interfaces
{
	public abstract class PropertyBase
	{
		public abstract string ID { get; }

		public abstract string Name { get; }

		public abstract string name { get; }

		public abstract string Description { get; }

		public abstract int Tier { get; }

		public abstract float Addictiveness { get; }
	}
}
namespace S1API.Products
{
	public class CocaineDefinition : ProductDefinition
	{
		internal CocaineDefinition S1CocaineDefinition => CrossType.As<CocaineDefinition>((object)base.S1ItemDefinition);

		internal CocaineDefinition(CocaineDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1CocaineDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			CocaineDefinition s1CocaineDefinition = S1CocaineDefinition;
			List<Property> val = ((s1CocaineDefinition != null) ? ((PropertyItemDefinition)s1CocaineDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(val[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			CocaineDefinition s1CocaineDefinition = S1CocaineDefinition;
			List<Property> val = ((s1CocaineDefinition != null) ? ((PropertyItemDefinition)s1CocaineDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(val[i]);
				}
			}
			return list;
		}
	}
	public class MethDefinition : ProductDefinition
	{
		internal MethDefinition S1MethDefinition => CrossType.As<MethDefinition>((object)base.S1ItemDefinition);

		internal MethDefinition(MethDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1MethDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			MethDefinition s1MethDefinition = S1MethDefinition;
			List<Property> val = ((s1MethDefinition != null) ? ((PropertyItemDefinition)s1MethDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(val[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			MethDefinition s1MethDefinition = S1MethDefinition;
			List<Property> val = ((s1MethDefinition != null) ? ((PropertyItemDefinition)s1MethDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(val[i]);
				}
			}
			return list;
		}
	}
	public class PackagingDefinition : ItemDefinition
	{
		internal PackagingDefinition S1PackagingDefinition => CrossType.As<PackagingDefinition>((object)base.S1ItemDefinition);

		public int Quantity => S1PackagingDefinition.Quantity;

		internal PackagingDefinition(ItemDefinition s1ItemDefinition)
			: base(s1ItemDefinition)
		{
		}
	}
	public class ProductDefinition : ItemDefinition
	{
		internal ProductDefinition S1ProductDefinition => CrossType.As<ProductDefinition>((object)base.S1ItemDefinition);

		public float Price => S1ProductDefinition.Price;

		public float BasePrice => S1ProductDefinition.BasePrice;

		public float MarketValue => S1ProductDefinition.MarketValue;

		public new Sprite Icon => ((ItemDefinition)S1ProductDefinition).Icon;

		public IReadOnlyList<PropertyBase> Properties
		{
			get
			{
				List<Property> properties = ((PropertyItemDefinition)S1ProductDefinition).Properties;
				List<PropertyBase> list = new List<PropertyBase>(properties.Count);
				for (int i = 0; i < properties.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(properties[i]));
				}
				return list.AsReadOnly();
			}
		}

		public IReadOnlyList<DrugTypeContainer> DrugTypes
		{
			get
			{
				List<DrugTypeContainer> drugTypes = S1ProductDefinition.DrugTypes;
				List<DrugTypeContainer> list = new List<DrugTypeContainer>(drugTypes?.Count ?? 0);
				if (drugTypes != null)
				{
					for (int i = 0; i < drugTypes.Count; i++)
					{
						list.Add(drugTypes[i]);
					}
				}
				return list.AsReadOnly();
			}
		}

		public EDrugType DrugType => S1ProductDefinition.DrugType;

		internal ProductDefinition(ItemDefinition productDefinition)
			: base(productDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1ProductDefinition).GetDefaultInstance(quantity)));
		}
	}
	public static class ProductDefinitionWrapper
	{
		public static ProductDefinition Wrap(ProductDefinition def)
		{
			ItemDefinition s1ItemDefinition = def.S1ItemDefinition;
			if (CrossType.Is<WeedDefinition>((object)s1ItemDefinition, out WeedDefinition result))
			{
				return new WeedDefinition(result);
			}
			if (CrossType.Is<MethDefinition>((object)s1ItemDefinition, out MethDefinition result2))
			{
				return new MethDefinition(result2);
			}
			if (CrossType.Is<CocaineDefinition>((object)s1ItemDefinition, out CocaineDefinition result3))
			{
				return new CocaineDefinition(result3);
			}
			return def;
		}
	}
	public class ProductInstance : ItemInstance
	{
		internal ProductItemInstance S1ProductInstance => CrossType.As<ProductItemInstance>((object)S1ItemInstance);

		public bool IsPackaged => Object.op_Implicit((Object)(object)S1ProductInstance.AppliedPackaging);

		public PackagingDefinition AppliedPackaging => new PackagingDefinition((ItemDefinition)(object)S1ProductInstance.AppliedPackaging);

		public Quality Quality => ((QualityItemInstance)S1ProductInstance).Quality.ToAPI();

		public new ProductDefinition Definition => new ProductDefinition(((ItemInstance)S1ProductInstance).Definition);

		public IReadOnlyList<PropertyBase> Properties => Definition.Properties;

		internal ProductInstance(ProductItemInstance productInstance)
			: base((ItemInstance)(object)productInstance)
		{
		}
	}
	public static class ProductManager
	{
		public static ProductDefinition[] DiscoveredProducts => ((IEnumerable<ProductDefinition>)ProductManager.DiscoveredProducts.ToArray()).Select((ProductDefinition productDefinition) => ProductDefinitionWrapper.Wrap(new ProductDefinition((ItemDefinition)(object)productDefinition))).ToArray();
	}
	public enum Quality
	{
		Trash,
		Poor,
		Standard,
		Premium,
		Heavenly
	}
	internal static class QualityExtensions
	{
		internal static Quality ToAPI(this EQuality quality)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected I4, but got Unknown
			if (1 == 0)
			{
			}
			Quality result = (int)quality switch
			{
				0 => Quality.Trash, 
				1 => Quality.Poor, 
				2 => Quality.Standard, 
				3 => Quality.Premium, 
				4 => Quality.Heavenly, 
				_ => Quality.Trash, 
			};
			if (1 == 0)
			{
			}
			return result;
		}

		internal static EQuality ToInternal(this Quality quality)
		{
			//IL_0022: 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_002a: 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)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (1 == 0)
			{
			}
			EQuality result = (EQuality)(quality switch
			{
				Quality.Trash => 0, 
				Quality.Poor => 1, 
				Quality.Standard => 2, 
				Quality.Premium => 3, 
				Quality.Heavenly => 4, 
				_ => 0, 
			});
			if (1 == 0)
			{
			}
			return result;
		}
	}
	public class WeedDefinition : ProductDefinition
	{
		internal WeedDefinition S1WeedDefinition => CrossType.As<WeedDefinition>((object)base.S1ItemDefinition);

		internal WeedDefinition(WeedDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1WeedDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			WeedDefinition s1WeedDefinition = S1WeedDefinition;
			List<Property> val = ((s1WeedDefinition != null) ? ((PropertyItemDefinition)s1WeedDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(val[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			WeedDefinition s1WeedDefinition = S1WeedDefinition;
			List<Property> val = ((s1WeedDefinition != null) ? ((PropertyItemDefinition)s1WeedDefinition).Properties : null);
			if (val != null)
			{
				for (int i = 0; i < val.Count; i++)
				{
					list.Add(val[i]);
				}
			}
			return list;
		}
	}
}
namespace S1API.PhoneCalls
{
	public class CallerDefinition
	{
		internal readonly CallerID S1CallerIDEntry;

		public string Name
		{
			get
			{
				return S1CallerIDEntry.Name;
			}
			set
			{
				S1CallerIDEntry.Name = value;
			}
		}

		public Sprite? ProfilePicture
		{
			get
			{
				return S1CallerIDEntry.ProfilePicture;
			}
			set
			{
				S1CallerIDEntry.ProfilePicture = value;
			}
		}

		internal CallerDefinition(CallerID s1CallerID)
		{
			S1CallerIDEntry = s1CallerID;
		}
	}
	public static class CallManager
	{
		private static readonly Queue<PhoneCallData> PendingCalls = new Queue<PhoneCallData>();

		private static bool subscribedToCallCompleted;

		internal static bool IsDispatchingToGameQueue;

		public static int PendingCount => PendingCalls.Count;

		public static void QueueCall(PhoneCallDefinition phoneCallDefinition)
		{
			if (phoneCallDefinition == null)
			{
				throw new ArgumentNullException("phoneCallDefinition");
			}
			PendingCalls.Enqueue(phoneCallDefinition.S1PhoneCallData);
			EnsureSubscribed();
			TryProcessQueue();
		}

		internal static void QueueCall(PhoneCallData phoneCallData)
		{
			if ((Object)(object)phoneCallData == (Object)null)
			{
				throw new ArgumentNullException("phoneCallData");
			}
			PendingCalls.Enqueue(phoneCallData);
			EnsureSubscribed();
			TryProcessQueue();
		}

		public static void ClearPendingQueue()
		{
			PendingCalls.Clear();
		}

		private static void EnsureSubscribed()
		{
			if (subscribedToCallCompleted)
			{
				return;
			}
			CallInterface instance = Singleton<CallInterface>.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			Action<PhoneCallData> action = OnCallCompleted;
			try
			{
				MethodInfo method = typeof(CallInterface).GetMethod("add_CallCompleted");
				if (method != null)
				{
					method.Invoke(instance, new object[1] { action });
				}
				else
				{
					Action<PhoneCallData> val = Action<PhoneCallData>.op_Implicit(action);
					Action<PhoneCallData> callCompleted = instance.CallCompleted;
					Delegate val2 = (Delegate)(((object)((callCompleted != null) ? ((Delegate)callCompleted).CombineImpl((Delegate)(object)val) : null)) ?? ((object)val));
					instance.CallCompleted = ((Il2CppObjectBase)val2).Cast<Action<PhoneCallData>>();
				}
			}
			catch
			{
				Action<PhoneCallData> val3 = Action<PhoneCallData>.op_Implicit(action);
				if ((Delegate)(object)instance.CallCompleted == (Delegate)null)
				{
					instance.CallCompleted = val3;
				}
				else
				{
					Delegate val4 = ((Delegate)instance.CallCompleted).CombineImpl((Delegate)(object)val3);
					instance.CallCompleted = ((Il2CppObjectBase)val4).Cast<Action<PhoneCallData>>();
				}
			}
			subscribedToCallCompleted = true;
		}

		private static void OnCallCompleted(PhoneCallData _)
		{
			TryProcessQueue();
		}

		private static void TryProcessQueue()
		{
			CallManager instance = Singleton<CallManager>.Instance;
			if ((Object)(object)instance == (Object)null || (Object)(object)instance.QueuedCallData != (Object)null || PendingCalls.Count == 0)
			{
				return;
			}
			PhoneCallData val = PendingCalls.Dequeue();
			IsDispatchingToGameQueue = true;
			try
			{
				instance.QueueCall(val);
			}
			finally
			{
				IsDispatchingToGameQueue = false;
			}
		}
	}
	public class CallStageEntry
	{
		internal readonly Stage S1Stage;

		protected readonly List<SystemTriggerEntry> StartTriggerEntries = new List<SystemTriggerEntry>();

		protected readonly List<SystemTriggerEntry> DoneTriggerEntries = new List<SystemTriggerEntry>();

		public string Text
		{
			get
			{
				return S1Stage.Text;
			}
			set
			{
				S1Stage.Text = value;
			}
		}

		internal CallStageEntry(Stage stage)
		{
			S1Stage = stage;
		}

		public SystemTriggerEntry AddSystemTrigger(SystemTriggerType triggerType)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			SystemTrigger val = new SystemTrigger();
			SystemTriggerEntry systemTriggerEntry = new SystemTriggerEntry(val);
			switch (triggerType)
			{
			case SystemTriggerType.StartTrigger:
				S1Stage.OnStartTriggers = S1Stage.OnStartTriggers.AddItemToArray<SystemTrigger>((SystemTrigger[]?)(object)new SystemTrigger[1] { val });
				StartTriggerEntries.Add(systemTriggerEntry);
				break;
			case SystemTriggerType.DoneTrigger:
				S1Stage.OnDoneTriggers = S1Stage.OnDoneTriggers.AddItemToArray<SystemTrigger>((SystemTrigger[]?)(object)new SystemTrigger[1] { val });
				DoneTriggerEntries.Add(systemTriggerEntry);
				break;
			}
			return systemTriggerEntry;
		}
	}
	public abstract class PhoneCallDefinition
	{
		public CallerDefinition? Caller;

		public readonly PhoneCallData S1PhoneCallData;

		protected readonly List<CallStageEntry> StageEntries = new List<CallStageEntry>();

		protected PhoneCallDefinition(string name, Sprite? profilePicture = null)
		{
			S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
			PhoneCallData s1PhoneCallData = S1PhoneCallData;
			if (s1PhoneCallData.Stages == null)
			{
				Il2CppReferenceArray<Stage> val2 = (s1PhoneCallData.Stages = Il2CppReferenceArray<Stage>.op_Implicit(Array.Empty<Stage>()));
			}
			AddCallerID(name, profilePicture);
		}

		protected PhoneCallDefinition(NPC? npcCallerID)
		{
			S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
			PhoneCallData s1PhoneCallData = S1PhoneCallData;
			if (s1PhoneCallData.Stages == null)
			{
				Il2CppReferenceArray<Stage> val2 = (s1PhoneCallData.Stages = Il2CppReferenceArray<Stage>.op_Implicit(Array.Empty<Stage>()));
			}
			AddCallerID(npcCallerID);
		}

		protected CallerDefinition AddCallerID(string name, Sprite? profilePicture = null)
		{
			CallerID val = ScriptableObject.CreateInstance<CallerID>();
			val.Name = name;
			val.ProfilePicture = profilePicture;
			S1PhoneCallData.CallerID = val;
			Caller = new CallerDefinition(val)
			{
				Name = name,
				ProfilePicture = profilePicture
			};
			return Caller;
		}

		protected CallerDefinition AddCallerID(NPC? npc)
		{
			CallerID val = ScriptableObject.CreateInstance<CallerID>();
			val.Name = npc?.FullName ?? "Unknown Caller";
			val.ProfilePicture = npc?.Icon;
			S1PhoneCallData.CallerID = val;
			Caller = new CallerDefinition(val)
			{
				Name = (npc?.FullName ?? "Unknown Caller"),
				ProfilePicture = npc?.Icon
			};
			return Caller;
		}

		protected CallStageEntry AddStage(string text)
		{
			//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_000f: Expected O, but got Unknown
			Stage val = new Stage
			{
				Text = text
			};
			S1PhoneCallData.Stages = S1PhoneCallData.Stages.AddItemToArray<Stage>((Stage[]?)(object)new Stage[1] { val });
			CallStageEntry callStageEntry = new CallStageEntry(val)
			{
				Text = text
			};
			StageEntries.Add(callStageEntry);
			return callStageEntry;
		}

		public void Completed()
		{
			S1PhoneCallData.Completed();
		}
	}
}
namespace S1API.PhoneCalls.Constants
{
	public enum EvaluationType
	{
		PassOnTrue,
		PassOnFalse
	}
	public enum SystemTriggerType
	{
		StartTrigger,
		DoneTrigger
	}
}
namespace S1API.PhoneApp
{
	public abstract class PhoneApp : Registerable
	{
		public enum EOrientation
		{
			Horizontal,
			Vertical
		}

		protected static readonly Log Logger = new Log("PhoneApp");

		private GameObject? _appPanel;

		private bool _appCreated;

		private bool _iconModified;

		private Image? _iconImage;

		private Sprite? _pendingIconSprite;

		private HomeScreen? _homeScreenInstance;

		private Action? _closeAppAction;

		private ExitDelegate? _exitDelegate;

		private Action? _onPhoneClosedAction;

		protected abstract string AppName { get; }

		protected abstract string AppTitle { get; }

		protected abstract string IconLabel { get; }

		protected abstract string IconFileName { get; }

		protected virtual Sprite? IconSprite => null;

		protected virtual EOrientation Orientation => EOrientation.Horizontal;

		protected abstract void OnCreatedUI(GameObject container);

		protected override void OnCreated()
		{
			PhoneAppRegistry.Register(this);
		}

		protected override void OnDestroyed()
		{
			if ((Object)(object)_appPanel != (Object)null)
			{
				Object.Destroy((Object)(object)_appPanel);
				_appPanel = null;
			}
			_appCreated = false;
			_iconModified = false;
			_iconImage = null;
			_pendingIconSprite = null;
			if (PlayerSingleton<Phone>.InstanceExists && _closeAppAction != null)
			{
				Phone instance = PlayerSingleton<Phone>.Instance;
				instance.closeApps -= Action.op_Implicit(_closeAppAction);
				_closeAppAction = null;
			}
			if ((Delegate)(object)_exitDelegate != (Delegate)null)
			{
				GameInput.DeregisterExitListener(_exitDelegate);
				_exitDelegate = null;
			}
			if (PlayerSingleton<Phone>.InstanceExists && _onPhoneClosedAction != null)
			{
				Phone instance2 = PlayerSingleton<Phone>.Instance;
				instance2.onPhoneClosed -= Action.op_Implicit(_onPhoneClosedAction);
				_onPhoneClosedAction = null;
			}
		}

		public virtual void Exit(ExitAction exit)
		{
			if (!exit.Used && IsOpen() && PlayerSingleton<Phone>.InstanceExists && PlayerSingleton<Phone>.Instance.IsOpen)
			{
				exit.Used = true;
				CloseApp();
			}
		}

		protected virtual void OnPhoneClosed()
		{
		}

		public bool IsOpen()
		{
			return (Object)(object)_appPanel != (Object)null && _appPanel.activeInHierarchy && (Object)(object)Phone.ActiveApp == (Object)(object)_appPanel;
		}

		internal void SpawnUI(HomeScreen homeScreenInstance)
		{
			_homeScreenInstance = homeScreenInstance;
			Transform obj = ((Component)homeScreenInstance).transform.parent.Find("AppsCanvas");
			GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
			if ((Object)(object)val == (Object)null)
			{
				Logger.Error("AppsCanvas not found.");
				return;
			}
			Transform val2 = val.transform.Find(AppName);
			if ((Object)(object)val2 != (Object)null)
			{
				_appPanel = ((Component)val2).gameObject;
				SetupExistingAppPanel(_appPanel);
			}
			else
			{
				Transform val3 = val.transform.Find("ProductManagerApp");
				if ((Object)(object)val3 == (Object)null)
				{
					Logger.Error("Template ProductManagerApp not found.");
					return;
				}
				_appPanel = Object.Instantiate<GameObject>(((Component)val3).gameObject, val.transform);
				((Object)_appPanel).name = AppName;
				Transform val4 = _appPanel.transform.Find("Container");
				if ((Object)(object)val4 != (Object)null)
				{
					GameObject gameObject = ((Component)val4).gameObject;
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
				_appCreated = true;
			}
			_appPanel.SetActive(true);
			if ((Object)(object)_appPanel.GetComponent<PhoneAppButtonHandler>() == (Object)null)
			{
				PhoneAppButtonHandler phoneAppButtonHandler = _appPanel.AddComponent<PhoneAppButtonHandler>();
				phoneAppButtonHandler.phoneApp = this;
			}
			if (PlayerSingleton<Phone>.InstanceExists)
			{
				_closeAppAction = CloseApp;
				Phone instance = PlayerSingleton<Phone>.Instance;
				instance.closeApps += Action.op_Implicit(_closeAppAction);
				_exitDelegate = DelegateSupport.ConvertDelegate<ExitDelegate>((Delegate)new Action<ExitAction>(Exit));
				GameInput.RegisterExitListener(_exitDelegate, 1);
				_onPhoneClosedAction = OnPhoneClosed;
				Phone instance2 = PlayerSingleton<Phone>.Instance;
				instance2.onPhoneClosed += Action.op_Implicit(_onPhoneClosedAction);
			}
		}

		internal void SpawnIcon(HomeScreen homeScreenInstance)
		{
			if (_iconModified)
			{
				return;
			}
			Transform obj = ((Component)homeScreenInstance).transform.Find("AppIcons");
			GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
			if ((Object)(object)val == (Object)null)
			{
				Logger.Error("AppIcons not found under HomeScreen.");
				return;
			}
			Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Logger.Error("No icons found in AppIcons.");
				return;
			}
			GameObject gameObject = ((Component)val2).gameObject;
			((Object)gameObject).name = AppName;
			Transform val3 = gameObject.transform.Find("Mask/Image");
			_iconImage = (((Object)(object)val3 != (Object)null) ? ((Component)val3).GetComponent<Image>() : null);
			Transform val4 = gameObject.transform.Find("Label");
			Text val5 = ((val4 != null) ? ((Component)val4).GetComponent<Text>() : null);
			if ((Object)(object)val5 != (Object)null)
			{
				val5.text = IconLabel;
			}
			if ((Object)(object)_iconImage != (Object)null)
			{
				Sprite val6 = (((Object)(object)_pendingIconSprite != (Object)null) ? _pendingIconSprite : IconSprite);
				if ((Object)(object)val6 != (Object)null)
				{
					_iconImage.sprite = val6;
					_iconModified = true;
					_pendingIconSprite = null;
				}
				else
				{
					_iconModified = ChangeAppIconImage(gameObject, IconFileName);
				}
			}
			else
			{
				_iconModified = ChangeAppIconImage(gameObject, IconFileName);
			}
			Button component = gameObject.GetComponent<Button>();
			if ((Object)(object)component != (Object)null)
			{
				((UnityEventBase)component.onClick).RemoveAllListeners();
				EventHelper.AddListener(OpenApp, (UnityEvent)(object)component.onClick);
			}
		}

		public void OpenApp()
		{
			try
			{
				if ((Object)(object)Phone.ActiveApp != (Object)null && (Object)(object)Phone.ActiveApp != (Object)(object)_appPanel)
				{
					PlayerSingleton<Phone>.Instance.RequestCloseApp();
				}
				SetAppOpen(open: true);
				Logger.Msg("Opened phone app: " + AppName);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to open phone app " + AppName + ": " + ex.Message);
			}
		}

		public void CloseApp()
		{
			try
			{
				if (IsOpen())
				{
					SetAppOpen(open: false);
				}
				Logger.Msg("Closed phone app: " + AppName);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to close phone app " + AppName + ": " + ex.Message);
			}
		}

		private void SetAppOpen(bool open)
		{
			if (open && (Object)(object)Phone.ActiveApp != (Object)null && (Object)(object)Phone.ActiveApp != (Object)(object)_appPanel)
			{
				Logger.Warning(((Object)Phone.ActiveApp).name + " is already open");
				return;
			}
			if (PlayerSingleton<AppsCanvas>.InstanceExists)
			{
				PlayerSingleton<AppsCanvas>.Instance.SetIsOpen(open);
			}
			if (PlayerSingleton<HomeScreen>.InstanceExists)
			{
				PlayerSingleton<HomeScreen>.Instance.SetIsOpen(!open);
			}
			if (open)
			{
				if (Orientation == EOrientation.Horizontal)
				{
					if (PlayerSingleton<Phone>.InstanceExists)
					{
						PlayerSingleton<Phone>.Instance.SetIsHorizontal(true);
						PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(0.6f);
					}
				}
				else if (PlayerSingleton<Phone>.InstanceExists)
				{
					PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(1f);
				}
				Phone.ActiveApp = _appPanel;
				if ((Object)(object)_appPanel != (Object)null)
				{
					Transform val = _appPanel.transform.Find("Container");
					GameObject val2 = (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null);
					if ((Object)(object)val2 != (Object)null)
					{
						val2.SetActive(true);
					}
				}
				return;
			}
			if ((Object)(object)Phone.ActiveApp == (Object)(object)_appPanel)
			{
				Phone.ActiveApp = null;
			}
			if (PlayerSingleton<Phone>.InstanceExists)
			{
				PlayerSingleton<Phone>.Instance.SetIsHorizontal(false);
				PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(1f);
			}
			if ((Object)(object)_appPanel != (Object)null)
			{
				Transform val3 = _appPanel.transform.Find("Container");
				GameObject val4 = (((Object)(object)val3 != (Object)null) ? ((Component)val3).gameObject : null);
				if ((Object)(object)val4 != (Object)null)
				{
					val4.SetActive(false);
				}
			}
		}

		private void SetupExistingAppPanel(GameObject panel)
		{
			Transform val = panel.transform.Find("Container");
			if ((Object)(object)val != (Object)null)
			{
				GameObject gameObject = ((Component)val).gameObject;
				if (gameObject.transform.childCount < 2)
				{
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
			}
			_appCreated = true;
		}

		private void ClearContainer(GameObject container)
		{
			for (int num = container.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)container.transform.GetChild(num)).gameObject);
			}
			container.SetActive(false);
		}

		private bool ChangeAppIconImage(GameObject iconObj, string filename)
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			Transform val = iconObj.transform.Find("Mask/Image");
			Image val2 = ((val != null) ? ((Component)val).GetComponent<Image>() : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Logger.Error("Image component not found in icon.");
				return false;
			}
			string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
			if (!File.Exists(text))
			{
				Logger.Error("Icon file not found: " + text);
				return false;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val3 = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val3, Il2CppStructArray<byte>.op_Implicit(array)))
				{
					val2.sprite = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f));
					return true;
				}
				Object.Destroy((Object)(object)val3);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to load image: " + ex.Message);
			}
			return false;
		}

		public bool SetIconSprite(Sprite sprite)
		{
			if ((Object)(object)sprite == (Object)null)
			{
				return false;
			}
			if ((Object)(object)_iconImage != (Object)null)
			{
				_iconImage.sprite = sprite;
				_iconModified = true;
				_pendingIconSprite = null;
				return true;
			}
			_pendingIconSprite = sprite;
			return true;
		}

		public bool SetIconTexture(Texture2D texture)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)texture == (Object)null)
			{
				return false;
			}
			Sprite iconSprite = Sprite.Create(texture, new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), new Vector2(0.5f, 0.5f));
			return SetIconSprite(iconSprite);
		}
	}
	[RegisterTypeInIl2Cpp]
	internal class PhoneAppButtonHandler : MonoBehaviour
	{
		internal PhoneApp phoneApp;

		private void Update()
		{
			if (phoneApp != null && phoneApp.IsOpen() && PlayerSingleton<Phone>.InstanceExists && PlayerSingleton<Phone>.Instance.IsOpen && IsHoveringButton() && GameInput.GetButtonDown((ButtonCode)0))
			{
				phoneApp.CloseApp();
			}
		}

		private bool IsHoveringButton()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(Singleton<GameplayMenu>.Instance.OverlayCamera.ScreenPointToRay(Input.mousePosition), ref val, 2f, 1 << LayerMask.NameToLayer("Overlay")) && ((Object)((Component)((RaycastHit)(ref val)).collider).gameObject).name == "Button")
			{
				return true;
			}
			return false;
		}
	}
}
namespace S1API.Money
{
	public class CashDefinition : ItemDefinition
	{
		internal CashDefinition S1CashDefinition => CrossType.As<CashDefinition>((object)base.S1ItemDefinition);

		internal CashDefinition(CashDefinition s1ItemDefinition)
			: base((ItemDefinition)(object)s1ItemDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new CashInstance(((ItemDefinition)S1CashDefinition).GetDefaultInstance(quantity));
		}
	}
	public class CashInstance : ItemInstance
	{
		internal CashInstance S1CashInstance => CrossType.As<CashInstance>((object)S1ItemInstance);

		internal CashInstance(ItemInstance itemInstance)
			: base(itemInstance)
		{
		}

		public void AddQuantity(float amount)
		{
			S1CashInstance.SetBalance(Mathf.Clamp(S1CashInstance.Balance + amount, 0f, float.MaxValue), false);
		}

		public void SetQuantity(float newQuantity)
		{
			S1CashInstance.SetBalance(newQuantity, false);
		}
	}
	public static class Money
	{
		private static MoneyManager Internal => NetworkSingleton<MoneyManager>.Instance;

		public static event Action? OnBalanceChanged;

		public static void ChangeCashBalance(float amount, bool visualizeChange = true, bool playCashSound = false)
		{
			MoneyManager @internal = Internal;
			if (@internal != null)
			{
				@internal.ChangeCashBalance(amount, visualizeChange, playCashSound);
			}
			Money.OnBalanceChanged?.Invoke();
		}

		public static void CreateOnlineTransaction(string transactionName, float unitAmount, float quantity, string transactionNote)
		{
			MoneyManager @internal = Internal;
			if (@internal != null)
			{
				@internal.CreateOnlineTransaction(transactionName, unitAmount, quantity, transactionNote);
			}
			Money.OnBalanceChanged?.Invoke();
		}

		public static float GetNetWorth()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.GetNetWorth() : 0f;
		}

		public static float GetCashBalance()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.cashBalance : 0f;
		}

		public static float GetOnlineBalance()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.sync___get_value_onlineBalance() : 0f;
		}

		public static void AddNetworthCalculation(Action<object> callback)
		{
			if ((Object)(object)Internal != (Object)null)
			{
				MoneyManager @internal = Internal;
				@internal.onNetworthCalculation += Action<FloatContainer>.op_Implicit((Action<FloatContainer>)callback);
			}
		}

		public static void RemoveNetworthCalculation(Action<object> callback)
		{
			if ((Object)(object)Internal != (Object)null)
			{
				MoneyManager @internal = Internal;
				@internal.onNetworthCalculation -= Action<FloatContainer>.op_Implicit((Action<FloatContainer>)callback);
			}
		}

		public static CashInstance CreateCashInstance(float amount)
		{
			CashDefinition item = Registry.GetItem<CashDefinition>("cash");
			ItemInstance itemInstance = CrossType.As<ItemInstance>((object)((ItemDefinition)item).GetDefaultInstance(1));
			CashInstance cashInstance = new CashInstance(itemInstance);
			cashInstance.SetQuantity(amount);
			return cashInstance;
		}
	}
}
namespace S1API.Messaging
{
	public class Response
	{
		internal readonly Response S1Response;

		public Action? OnTriggered
		{
			get
			{
				return ((Delegate)(object)S1Response.callback == (Delegate)null) ? null : ((Action)delegate
				{
					S1Response.callback.Invoke();
				});
			}
			set
			{
				S1Response.callback = Action.op_Implicit(value);
			}
		}

		public string Label
		{
			get
			{
				return S1Response.label;
			}
			set
			{
				S1Response.label = value;
			}
		}

		public string Text
		{
			get
			{
				return S1Response.text;
			}
			set
			{
				S1Response.text = value;
			}
		}

		public Response()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			S1Response = new Response();
		}

		internal Response(Response response)
		{
			S1Response = response;
		}
	}
}
namespace S1API.Map
{
	public enum Region
	{
		Northtown,
		Westville,
		Downtown,
		Docks,
		Suburbia,
		Uptown
	}
}
namespace S1API.Logging
{
	public class Log
	{
		private readonly Instance _loggerInstance;

		public Log(string sourceName)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			_loggerInstance = new Instance(sourceName);
		}

		public void Msg(string message)
		{
			_loggerInstance.Msg(message);
		}

		public void Warning(string message)
		{
			_loggerInstance.Warning(message);
		}

		public void Error(string message)
		{
			_loggerInstance.Error(message);
		}

		public void BigError(string message)
		{
			_loggerInstance.BigError(message);
		}
	}
}
namespace S1API.Leveling
{
	public static class LevelManager
	{
		public static Rank Rank = (Rank)NetworkSingleton<LevelManager>.Instance.Rank;
	}
	public enum Rank
	{
		StreetRat,
		Hoodlum,
		Peddler,
		Hustler,
		Bagman,
		Enforcer,
		ShotCaller,
		BlockBoss,
		Underlord,
		Baron,
		Kingpin
	}
}
namespace S1API.Items
{
	public enum ItemCategory
	{
		Product,
		Packaging,
		Growing,
		Tools,
		Furniture,
		Lighting,
		Cash,
		Consumable,
		Equipment,
		Ingredient,
		Decoration,
		Clothing
	}
	public class ItemDefinition : IGUIDReference
	{
		internal ItemDefinition S1ItemDefinition { get; }

		public string ID
		{
			get
			{
				return S1ItemDefinition.ID;
			}
			set
			{
				S1ItemDefinition.ID = value;
			}
		}

		public string Name
		{
			get
			{
				return S1ItemDefinition.Name;
			}
			set
			{
				S1ItemDefinition.Name = value;
			}
		}

		public string Description
		{
			get
			{
				return S1ItemDefinition.Description;
			}
			set
			{
				S1ItemDefinition.Description = value;
			}
		}

		public int StackLimit
		{
			get
			{
				return S1ItemDefinition.StackLimit;
			}
			set
			{
				S1ItemDefinition.StackLimit = value;
			}
		}

		public ItemCategory Category
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (ItemCategory)S1ItemDefinition.Category;
			}
			set
			{
				S1ItemDefinition.Category = (EItemCategory)value;
			}
		}

		public Sprite Icon
		{
			get
			{
				return S1ItemDefinition.Icon;
			}
			set
			{
				S1ItemDefinition.Icon = value;
			}
		}

		public bool AvailableInDemo
		{
			get
			{
				return S1ItemDefinition.AvailableInDemo;
			}
			set
			{
				S1ItemDefinition.AvailableInDemo = value;
			}
		}

		public LegalStatus LegalStatus
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (LegalStatus)S1ItemDefinition.legalStatus;
			}
			set
			{
				S1ItemDefinition.legalStatus = (ELegalStatus)value;
			}
		}

		public Color LabelDisplayColor
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return S1ItemDefinition.LabelDisplayColor;
			}
			set
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				S1ItemDefinition.LabelDisplayColor = value;
			}
		}

		public string[] Keywords
		{
			get
			{
				return Il2CppArrayBase<string>.op_Implicit((Il2CppArrayBase<string>)(object)S1ItemDefinition.Keywords);
			}
			set
			{
				S1ItemDefinition.Keywords = Il2CppStringArray.op_Implicit(value);
			}
		}

		public string GUID => ID;

		internal ItemDefinition(ItemDefinition definition)
		{
			S1ItemDefinition = definition;
		}

		public virtual ItemInstance CreateInstance(int quantity = 1)
		{
			ItemInstance defaultInstance = S1ItemDefinition.GetDefaultInstance(quantity);
			return new ItemInstance(defaultInstance);
		}

		public override bool Equals(object? obj)
		{
			return obj is ItemDefinition itemDefinition && (Object)(object)S1ItemDefinition == (Object)(object)itemDefinition.S1ItemDefinition;
		}

		public override int GetHashCode()
		{
			return ((Object)S1ItemDefinition).GetHashCode();
		}

		public static bool operator ==(ItemDefinition? a, ItemDefinition? b)
		{
			if ((object)a == b)
			{
				return true;
			}
			if ((object)a == null || (object)b == null)
			{
				return false;
			}
			return a.S1ItemDefinition == b.S1ItemDefinition;
		}

		public static bool operator !=(ItemDefinition? a, ItemDefinition? b)
		{
			if ((object)a == b)
			{
				return false;
			}
			if ((object)a == null || (object)b == null)
			{
				return true;
			}
			return a.S1ItemDefinition != b.S1ItemDefinition;
		}
	}
	public enum LegalStatus
	{
		Legal,
		Illegal
	}
	public class ItemInstance
	{
		internal readonly ItemInstance S1ItemInstance;

		public ItemDefinition Definition => new ItemDefinition(S1ItemInstance.Definition);

		public int Quantity
		{
			get
			{
				return S1ItemInstance.Quantity;
			}
			set
			{
				S1ItemInstance.SetQuantity(value);
			}
		}

		public bool IsStackable => Definition.StackLimit > 1;

		internal ItemInstance(ItemInstance itemInstance)
		{
			S1ItemInstance = itemInstance;
		}
	}
	public static class ItemManager
	{
		public static ItemDefinition GetItemDefinition(string itemID)
		{
			ItemDefinition item = Registry.GetItem(itemID);
			if (CrossType.Is<ProductDefinition>((object)item, out ProductDefinition result))
			{
				return new ProductDefinition((ItemDefinition)(object)result);
			}
			if (CrossType.Is<CashDefinition>((object)item, out CashDefinition result2))
			{
				return new CashDefinition(result2);
			}
			return new ItemDefinition(item);
		}
	}
	public class ItemSlotInstance
	{
		internal readonly ItemSlot S1ItemSlot;

		public int Quantity => S1ItemSlot.Quantity;

		public ItemInstance? ItemInstance
		{
			get
			{
				if (CrossType.Is<ProductItemInstance>((object)S1ItemSlot.ItemInstance, out ProductItemInstance result))
				{
					return new ProductInstance(result);
				}
				if (CrossType.Is<CashInstance>((object)S1ItemSlot.ItemInstance, out CashInstance result2))
				{
					return new CashInstance((ItemInstance)(object)result2);
				}
				if (CrossType.Is<ItemInstance>((object)S1ItemSlot.ItemInstance, out ItemInstance result3))
				{
					return new ItemInstance(result3);
				}
				return null;
			}
		}

		internal ItemSlotInstance(ItemSlot itemSlot)
		{
			S1ItemSlot = itemSlot;
		}

		public void AddQuantity(int amount)
		{
			S1ItemSlot.ChangeQuantity(amount, false);
		}
	}
}
namespace S1API.Internal.Utils
{
	public static class ArrayExtensions
	{
		public static T[] AddItemToArray<T>(this T[]? array, T item)
		{
			if (array == null)
			{
				array = Array.Empty<T>();
			}
			Array.Resize(ref array, array.Length + 1);
			array[^1] = item;
			return array;
		}

		public static Il2CppReferenceArray<T> AddItemToArray<T>(this Il2CppReferenceArray<T>? array, params T[]? itemsToAdd) where T : Object
		{
			int num = ((Il2CppArrayBase<T>)(object)array)?.Length ?? 0;
			int num2 = ((itemsToAdd != null) ? itemsToAdd.Length : 0);
			int num3 = num + num2;
			Il2CppReferenceArray<T> val = new Il2CppReferenceArray<T>((long)num3);
			for (int i = 0; i < num; i++)
			{
				((Il2CppArrayBase<T>)(object)val)[i] = ((Il2CppArrayBase<T>)(object)array)[i];
			}
			for (int j = 0; j < num2; j++)
			{
				((Il2CppArrayBase<T>)(object)val)[num + j] = itemsToAdd[j];
			}
			return val;
		}
	}
	public static class ButtonUtils
	{
		public static void AddListener(Button button, Action action)
		{
			if (!((Object)(object)button == (Object)null) && action != null)
			{
				EventHelper.AddListener(action, (UnityEvent)(object)button.onClick);
			}
		}

		public static void RemoveListener(Button button, Action action)
		{
			if (!((Object)(object)button == (Object)null) && action != null)
			{
				EventHelper.RemoveListener(action, (UnityEvent)(object)button.onClick);
			}
		}

		public static void ClearListeners(Button button)
		{
			if (!((Object)(object)button == (Object)null))
			{
				((UnityEventBase)button.onClick).RemoveAllListeners();
			}
		}

		public static void Enable(Button button, Text? label = null, string? text = null)
		{
			if ((Object)(object)button != (Object)null)
			{
				((Selectable)button).interactable = true;
			}
			if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
			{
				label.text = text;
			}
		}

		public static void Disable(Button button, Text? label = null, string? text = null)
		{
			if ((Object)(object)button != (Object)null)
			{
				((Selectable)button).interactable = false;
			}
			if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
			{
				label.text = text;
			}
		}

		public static void SetLabel(Text label, string text)
		{
			if ((Object)(object)label != (Object)null)
			{
				label.text = text;
			}
		}

		public static void SetStyle(Button button, Text label, string text, Color bg)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)button == (Object)null) && !((Object)(object)label == (Object)null))
			{
				label.text = text;
				((Graphic)((Selectable)button).image).color = bg;
			}
		}
	}
	public static class ColorUtils
	{
		public static Color ToColor(this uint hexColor)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return ToColorInternal(hexColor);
		}

		private static Color ToColorInternal(uint hexColor)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)((hexColor >> 24) & 0xFFu) / 255f;
			float num2 = (float)((hexColor >> 16) & 0xFFu) / 255f;
			float num3 = (float)((hexColor >> 8) & 0xFFu) / 255f;
			float num4 = (float)(hexColor & 0xFFu) / 255f;
			return new Color(num2, num3, num4, num);
		}
	}
	internal static class CrossType
	{
		internal static Type Of<T>()
		{
			return Il2CppType.Of<T>();
		}

		internal static bool Is<T>(object obj, out T result) where T : Il2CppObjectBase
		{
			Object val = (Object)((obj is Object) ? obj : null);
			if (val != null)
			{
				Type val2 = Il2CppType.Of<T>();
				if (val2.IsAssignableFrom(val.GetIl2CppType()))
				{
					result = ((Il2CppObjectBase)val).TryCast<T>();
					return true;
				}
			}
			result = default(T);
			return false;
		}

		internal static T As<T>(object obj) where T : Il2CppObjectBase
		{
			Object val = (Object)((obj is Object) ? obj : null);
			return (val != null) ? ((Il2CppObjectBase)val).Cast<T>() : default(T);
		}
	}
	public static class ImageUtils
	{
		private static readonly Log _loggerInstance = new Log("ImageUtils");

		public static Sprite? LoadImage(string fileName)
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, fileName);
			if (!File.Exists(text))
			{
				_loggerInstance.Error("❌ Icon file not found: " + text);
				return null;
			}
			try
			{
				byte[] data = File.ReadAllBytes(text);
				return LoadImageRaw(data);
			}
			catch (Exception ex)
			{
				_loggerInstance.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}

		public static Sprite? LoadImageRaw(byte[] data)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(data)))
				{
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
			}
			catch (Exception ex)
			{
				_loggerInstance.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}
	}
	public static class RandomUtils
	{
		private static readonly Random SystemRng = new Random();

		public static T PickOne<T>(this IList<T> list)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			return list[Random.Range(0, list.Count)];
		}

		public static T PickUnique<T>(this IList<T> list, Func<T, bool> isDuplicate, int maxTries = 10)
		{
			if (list.Count == 0)
			{
				return default(T);
			}
			for (int i = 0; i < maxTries; i++)
			{
				T val = list.PickOne();
				if (!isDuplicate(val))
				{
					return val;
				}
			}
			return default(T);
		}

		public static List<T> PickMany<T>(this IList<T> list, int count)
		{
			if (list.Count == 0)
			{
				return new List<T>();
			}
			List<T> list2 = new List<T>(list);
			List<T> list3 = new List<T>();
			for (int i = 0; i < count; i++)
			{
				if (list2.Count <= 0)
				{
					break;
				}
				int index = Random.Range(0, list2.Count);
				list3.Add(list2[index]);
				list2.RemoveAt(index);
			}
			return list3;
		}

		public static int RangeInt(int minInclusive, int maxExclusive)
		{
			return SystemRng.Next(minInclusive, maxExclusive);
		}
	}
	internal static class ReflectionUtils
	{
		private static readonly HashSet<Type> _valueTupleTypes = new HashSet<Type>
		{
			typeof(ValueTuple<>),
			typeof(ValueTuple<, >),
			typeof(ValueTuple<, , >),
			typeof(ValueTuple<, , , >),
			typeof(ValueTuple<, , , , >),
			typeof(ValueTuple<, , , , , >),
			typeof(ValueTuple<, , , , , , >),
			typeof(ValueTuple<, , , , , , , >)
		};

		internal static List<Type> GetDerivedClasses<TBaseClass>()
		{
			List<Type> list = new List<Type>();
			Assembly[] array = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
				where !ShouldSkipAssembly(assembly)
				select assembly).ToArray();
			Assembly[] array2 = array;
			foreach (Assembly asm in array2)
			{
				foreach (Type item in SafeGetTypes(asm))
				{
					try
					{
						if (!(item == null) && typeof(TBaseClass).IsAssignableFrom(item) && item != typeof(TBaseClass) && !item.IsAbstract)
						{
							list.Add(item);
						}
					}
					catch (TypeLoadException)
					{
					}
					catch (Exception)
					{
					}
				}
			}
			return list;
		}

		internal static Type? GetTypeByName(string typeName)
		{
			try
			{
				Type type = Type.GetType(typeName, throwOnError: false, ignoreCase: false);
				if (type != null)
				{
					return type;
				}
			}
			catch
			{
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly item in assemblies.Where((Assembly a) => !ShouldSkipAssembly(a)))
			{
				foreach (Type item2 in SafeGetTypes(item))
		

Mods/S1API.Mono.MelonLoader.dll

Decompiled 16 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using FishNet;
using FishNet.Connection;
using FishNet.Managing;
using FishNet.Object;
using HarmonyLib;
using MelonLoader;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API;
using S1API.Conditions;
using S1API.Console;
using S1API.Entities;
using S1API.Entities.Appearances.AccessoryFields;
using S1API.Entities.Appearances.Base;
using S1API.Entities.Appearances.BodyLayerFields;
using S1API.Entities.Appearances.CustomizationFields;
using S1API.Entities.Appearances.FaceLayerFields;
using S1API.Entities.Interfaces;
using S1API.Internal.Abstraction;
using S1API.Internal.Patches;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Logging;
using S1API.Map;
using S1API.Messaging;
using S1API.Money;
using S1API.PhoneApp;
using S1API.PhoneCalls;
using S1API.PhoneCalls.Constants;
using S1API.Products;
using S1API.Properties;
using S1API.Properties.Interfaces;
using S1API.Quests;
using S1API.Quests.Constants;
using S1API.Saveables;
using S1API.Storages;
using S1API.Vehicles;
using ScheduleOne;
using ScheduleOne.AvatarFramework;
using ScheduleOne.Calling;
using ScheduleOne.DevUtilities;
using ScheduleOne.Dialogue;
using ScheduleOne.Economy;
using ScheduleOne.GameTime;
using ScheduleOne.Growing;
using ScheduleOne.Interaction;
using ScheduleOne.ItemFramework;
using ScheduleOne.Levelling;
using ScheduleOne.Map;
using ScheduleOne.Messaging;
using ScheduleOne.Money;
using ScheduleOne.NPCs;
using ScheduleOne.NPCs.Behaviour;
using ScheduleOne.NPCs.Relation;
using ScheduleOne.NPCs.Responses;
using ScheduleOne.NPCs.Schedules;
using ScheduleOne.Noise;
using ScheduleOne.Persistence;
using ScheduleOne.Persistence.Datas;
using ScheduleOne.Persistence.Loaders;
using ScheduleOne.PlayerScripts;
using ScheduleOne.PlayerScripts.Health;
using ScheduleOne.Product;
using ScheduleOne.Product.Packaging;
using ScheduleOne.Properties;
using ScheduleOne.Property;
using ScheduleOne.Quests;
using ScheduleOne.ScriptableObjects;
using ScheduleOne.Storage;
using ScheduleOne.UI;
using ScheduleOne.UI.Phone;
using ScheduleOne.UI.Phone.ContactsApp;
using ScheduleOne.UI.Phone.ProductManagerApp;
using ScheduleOne.UI.WorldspacePopup;
using ScheduleOne.Variables;
using ScheduleOne.Vehicles;
using ScheduleOne.Vehicles.Modification;
using ScheduleOne.Vision;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1API.S1API), "S1API (Forked by Bars)", "1.8.1", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ifBars")]
[assembly: AssemblyConfiguration("MonoMelon")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer (Forked from the original S1API by Kabooma)")]
[assembly: AssemblyFileVersion("1.8.1.0")]
[assembly: AssemblyInformationalVersion("1.8.1+b394d85a199fa3b13ecc9b8a4d3cd9d66db58d85")]
[assembly: AssemblyProduct("S1API")]
[assembly: AssemblyTitle("S1API")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/ifBars/S1API")]
[assembly: AssemblyVersion("1.8.1.0")]
[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.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;
		}
	}
}
public class ClickHandler
{
	private readonly UnityAction _callback;

	public ClickHandler(UnityAction callback)
	{
		_callback = callback;
	}

	public void OnClick()
	{
		_callback.Invoke();
	}
}
namespace S1API
{
	public class S1API : MelonMod
	{
	}
}
namespace S1API.Vehicles
{
	public class LandVehicle
	{
		internal LandVehicle S1LandVehicle = null;

		private static readonly Log _logger = new Log("S1API.LandVehicle");

		private static readonly FieldInfo? VehiclePriceField = typeof(LandVehicle).GetField("vehiclePrice", BindingFlags.NonPublic);

		private NetworkConnection? _conn;

		public float VehiclePrice
		{
			get
			{
				return S1LandVehicle.VehiclePrice;
			}
			set
			{
				VehiclePriceField?.SetValue(S1LandVehicle, value);
			}
		}

		public float TopSpeed
		{
			get
			{
				return S1LandVehicle.TopSpeed;
			}
			set
			{
				S1LandVehicle.TopSpeed = value;
			}
		}

		public bool IsPlayerOwned
		{
			get
			{
				return S1LandVehicle.IsPlayerOwned;
			}
			set
			{
				SetIsPlayerOwned(value);
			}
		}

		public VehicleColor Color
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (VehicleColor)S1LandVehicle.OwnedColor;
			}
			set
			{
				SetColor(value);
			}
		}

		public LandVehicle(string vehicleCode)
		{
			LandVehicle vehiclePrefab = NetworkSingleton<VehicleManager>.Instance.GetVehiclePrefab(vehicleCode);
			if ((Object)(object)vehiclePrefab == (Object)null)
			{
				_logger.Error("SpawnVehicle: '" + vehicleCode + "' is not a valid vehicle code!");
				return;
			}
			LandVehicle component = Object.Instantiate<GameObject>(((Component)vehiclePrefab).gameObject).GetComponent<LandVehicle>();
			component.SetGUID(GUIDManager.GenerateUniqueGUID());
			NetworkSingleton<VehicleManager>.Instance.AllVehicles.Add(component);
			S1LandVehicle = component;
			SetConnection();
		}

		public void Spawn(Vector3 position, Quaternion rotation)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			if (!InstanceFinder.IsServer)
			{
				_logger.Warning("Spawn can only be called on the server!");
				return;
			}
			if ((Object)(object)S1LandVehicle == (Object)null)
			{
				throw new Exception("Unable to spawn vehicle, S1LandVehicle is null!");
			}
			((Component)S1LandVehicle).transform.position = position;
			((Component)S1LandVehicle).transform.rotation = rotation;
			((NetworkBehaviour)NetworkSingleton<VehicleManager>.Instance).Spawn(((Component)S1LandVehicle).gameObject, (NetworkConnection)null, default(Scene));
		}

		internal LandVehicle(LandVehicle landVehicle)
		{
			S1LandVehicle = landVehicle;
			SetConnection();
		}

		private void SetConnection()
		{
			NetworkManager networkManager = InstanceFinder.NetworkManager;
			if (networkManager.IsClientOnly)
			{
				NetworkConnection connection = InstanceFinder.ClientManager.Connection;
				if (connection != (NetworkConnection)null && connection.IsValid)
				{
					_conn = connection;
				}
			}
			else if (networkManager.IsServerOnly || (networkManager.IsServer && !networkManager.IsClient))
			{
				NetworkConnection owner = ((NetworkBehaviour)S1LandVehicle).Owner;
				if (owner != (NetworkConnection)null && owner.IsValid)
				{
					_conn = owner;
				}
			}
		}

		private void SetIsPlayerOwned(bool isPlayerOwned)
		{
			S1LandVehicle.SetIsPlayerOwned(_conn, isPlayerOwned);
			if (isPlayerOwned)
			{
				NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Add(S1LandVehicle);
			}
			else
			{
				NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Remove(S1LandVehicle);
			}
		}

		private void SetColor(VehicleColor color)
		{
			MethodInfo method = typeof(LandVehicle).GetMethod("SetOwnedColor", BindingFlags.Instance | BindingFlags.NonPublic);
			if (method == null)
			{
				_logger.Error("SetOwnedColor method not found!");
				return;
			}
			method.Invoke(S1LandVehicle, new object[2]
			{
				_conn,
				(object)(EVehicleColor)color
			});
		}
	}
	public enum VehicleColor
	{
		Black,
		DarkGrey,
		LightGrey,
		White,
		Yellow,
		Orange,
		Red,
		DullRed,
		Pink,
		Purple,
		Navy,
		DarkBlue,
		LightBlue,
		Cyan,
		LightGreen,
		DarkGreen,
		Custom
	}
}
namespace S1API.UI
{
	public static class UIFactory
	{
		private static Sprite roundedSprite;

		public static GameObject Panel(string name, Transform parent, Color bgColor, Vector2? anchorMin = null, Vector2? anchorMax = null, bool fullAnchor = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0025: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			if (fullAnchor)
			{
				val2.anchorMin = Vector2.zero;
				val2.anchorMax = Vector2.one;
				val2.offsetMin = Vector2.zero;
				val2.offsetMax = Vector2.zero;
			}
			else
			{
				val2.anchorMin = (Vector2)(((??)anchorMin) ?? new Vector2(0.5f, 0.5f));
				val2.anchorMax = (Vector2)(((??)anchorMax) ?? new Vector2(0.5f, 0.5f));
			}
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			return val;
		}

		public static Text Text(string name, string content, Transform parent, int fontSize = 14, TextAnchor anchor = 0, FontStyle style = 0)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			Text val3 = val.AddComponent<Text>();
			val3.text = content;
			val3.fontSize = fontSize;
			val3.alignment = anchor;
			val3.fontStyle = style;
			val3.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			((Graphic)val3).color = Color.white;
			val3.horizontalOverflow = (HorizontalWrapMode)0;
			val3.verticalOverflow = (VerticalWrapMode)1;
			return val3;
		}

		public static RectTransform ScrollableVerticalList(string name, Transform parent, out ScrollRect scrollRect)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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_00fa: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			scrollRect = val.AddComponent<ScrollRect>();
			scrollRect.horizontal = false;
			GameObject val3 = new GameObject("Viewport");
			val3.transform.SetParent(val.transform, false);
			RectTransform val4 = val3.AddComponent<RectTransform>();
			val4.anchorMin = Vector2.zero;
			val4.anchorMax = Vector2.one;
			val4.offsetMin = Vector2.zero;
			val4.offsetMax = Vector2.zero;
			((Graphic)val3.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.05f);
			val3.AddComponent<Mask>().showMaskGraphic = false;
			scrollRect.viewport = val4;
			GameObject val5 = new GameObject("Content");
			val5.transform.SetParent(val3.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = new Vector2(0f, 1f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.pivot = new Vector2(0.5f, 1f);
			VerticalLayoutGroup val7 = val5.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val7).spacing = 10f;
			((LayoutGroup)val7).padding = new RectOffset(10, 10, 10, 10);
			((HorizontalOrVerticalLayoutGroup)val7).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val7).childForceExpandHeight = false;
			val5.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			scrollRect.content = val6;
			return val6;
		}

		public static void FitContentHeight(RectTransform content)
		{
			ContentSizeFitter val = ((Component)content).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)content).gameObject.AddComponent<ContentSizeFitter>();
			}
			val.verticalFit = (FitMode)2;
		}

		public static (GameObject, Button, Text) RoundedButtonWithLabel(string name, string label, Transform parent, Color bgColor, float width, float height, int fontSize, Color textColor)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_002c: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Expected O, but got Unknown
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: 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_01aa: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name + "_RoundedMask");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(width, height);
			LayoutElement val3 = val.AddComponent<LayoutElement>();
			val3.preferredWidth = width;
			val3.preferredHeight = height;
			Image val4 = val.AddComponent<Image>();
			val4.sprite = GetRoundedSprite();
			val4.type = (Type)1;
			((Graphic)val4).color = Color.white;
			Mask val5 = val.AddComponent<Mask>();
			val5.showMaskGraphic = true;
			GameObject val6 = new GameObject(name);
			val6.transform.SetParent(val.transform, false);
			RectTransform val7 = val6.AddComponent<RectTransform>();
			val7.anchorMin = Vector2.zero;
			val7.anchorMax = Vector2.one;
			val7.offsetMin = Vector2.zero;
			val7.offsetMax = Vector2.zero;
			Image val8 = val6.AddComponent<Image>();
			((Graphic)val8).color = bgColor;
			val8.sprite = GetRoundedSprite();
			val8.type = (Type)1;
			Button val9 = val6.AddComponent<Button>();
			((Selectable)val9).targetGraphic = (Graphic)(object)val8;
			GameObject val10 = new GameObject("Label");
			val10.transform.SetParent(val6.transform, false);
			RectTransform val11 = val10.AddComponent<RectTransform>();
			val11.anchorMin = Vector2.zero;
			val11.anchorMax = Vector2.one;
			val11.offsetMin = Vector2.zero;
			val11.offsetMax = Vector2.zero;
			Text val12 = val10.AddComponent<Text>();
			val12.text = label;
			val12.alignment = (TextAnchor)4;
			val12.fontSize = fontSize;
			val12.fontStyle = (FontStyle)1;
			((Graphic)val12).color = textColor;
			val12.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val9, val12);
		}

		private static Sprite GetRoundedSprite()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: 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_0179: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)roundedSprite != (Object)null)
			{
				return roundedSprite;
			}
			int num = 32;
			Texture2D val = new Texture2D(num, num, (TextureFormat)5, false);
			Color32 val2 = default(Color32);
			((Color32)(ref val2))..ctor((byte)0, (byte)0, (byte)0, (byte)0);
			Color32 val3 = default(Color32);
			((Color32)(ref val3))..ctor(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
			float num2 = 6f;
			for (int i = 0; i < num; i++)
			{
				for (int j = 0; j < num; j++)
				{
					bool flag = ((float)j < num2 && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, num2)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i < num2 && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, num2)) > num2) || ((float)j < num2 && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num2, (float)num - num2 - 1f)) > num2) || ((float)j > (float)num - num2 - 1f && (float)i > (float)num - num2 - 1f && Vector2.Distance(new Vector2((float)j, (float)i), new Vector2((float)num - num2 - 1f, (float)num - num2 - 1f)) > num2);
					val.SetPixel(j, i, Color32.op_Implicit(flag ? val2 : val3));
				}
			}
			val.Apply();
			Vector4 val4 = default(Vector4);
			((Vector4)(ref val4))..ctor(8f, 8f, 8f, 8f);
			roundedSprite = Sprite.Create(val, new Rect(0f, 0f, (float)num, (float)num), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0, val4);
			return roundedSprite;
		}

		public static GameObject ButtonRow(string name, Transform parent, float spacing = 12f, TextAnchor alignment = 4)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val3).spacing = spacing;
			((LayoutGroup)val3).childAlignment = alignment;
			((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = false;
			((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = false;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
			return val;
		}

		public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor, float Width, float Height)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_0070: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(Height, Width);
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			val3.sprite = Resources.GetBuiltinResource<Sprite>("UI/Skin/UISprite.psd");
			val3.type = (Type)1;
			Button val4 = val.AddComponent<Button>();
			((Selectable)val4).targetGraphic = (Graphic)(object)val3;
			GameObject val5 = new GameObject("Label");
			val5.transform.SetParent(val.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = Vector2.zero;
			val6.anchorMax = Vector2.one;
			val6.offsetMin = Vector2.zero;
			val6.offsetMax = Vector2.zero;
			Text val7 = val5.AddComponent<Text>();
			val7.text = label;
			val7.alignment = (TextAnchor)4;
			val7.fontSize = 16;
			val7.fontStyle = (FontStyle)1;
			((Graphic)val7).color = Color.white;
			val7.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val4, val7);
		}

		public static void SetIcon(Sprite sprite, Transform parent)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0022: 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)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Icon");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			Image val3 = val.AddComponent<Image>();
			val3.sprite = sprite;
			val3.preserveAspect = true;
		}

		public static void CreateTextBlock(Transform parent, string title, string subtitle, bool isCompleted)
		{
			Text(((Object)parent).name + "Title", title, parent, 16, (TextAnchor)3, (FontStyle)1);
			Text(((Object)parent).name + "Subtitle", subtitle, parent, 14, (TextAnchor)0, (FontStyle)0);
			if (isCompleted)
			{
				Text("CompletedLabel", "<color=#888888><i>Already Delivered</i></color>", parent, 12, (TextAnchor)0, (FontStyle)0);
			}
		}

		public static void CreateRowButton(GameObject go, UnityAction clickHandler, bool enabled)
		{
			Button val = go.AddComponent<Button>();
			Image component = go.GetComponent<Image>();
			((Selectable)val).targetGraphic = (Graphic)(object)component;
			((Selectable)val).interactable = enabled;
			((UnityEvent)val.onClick).AddListener(clickHandler);
		}

		public static void ClearChildren(Transform parent)
		{
			for (int num = parent.childCount - 1; num >= 0; num--)
			{
				Transform child = parent.GetChild(num);
				Object.Destroy((Object)(object)((Component)child).gameObject);
			}
		}

		public static void VerticalLayoutOnGO(GameObject go, int spacing = 10, RectOffset? padding = null)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			VerticalLayoutGroup val = go.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset(10, 10, 10, 10)));
		}

		public static GameObject CreateQuestRow(string name, Transform parent, out GameObject iconPanel, out GameObject textPanel)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Row_" + name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(0f, 90f);
			val.AddComponent<LayoutElement>().minHeight = 50f;
			((Shadow)val.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.2f);
			GameObject val3 = Panel("Separator", val.transform, new Color(1f, 1f, 1f, 0.05f));
			val3.GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 1f);
			Image val4 = val.AddComponent<Image>();
			((Graphic)val4).color = new Color(0.12f, 0.12f, 0.12f);
			Button val5 = val.AddComponent<Button>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4;
			HorizontalLayoutGroup val6 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val6).spacing = 20f;
			((LayoutGroup)val6).padding = new RectOffset(75, 10, 10, 10);
			((LayoutGroup)val6).childAlignment = (TextAnchor)3;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandHeight = false;
			LayoutElement val7 = val.AddComponent<LayoutElement>();
			val7.minHeight = 90f;
			val7.flexibleWidth = 1f;
			iconPanel = Panel("IconPanel", val.transform, new Color(0.12f, 0.12f, 0.12f));
			RectTransform component = iconPanel.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(80f, 80f);
			LayoutElement val8 = iconPanel.AddComponent<LayoutElement>();
			val8.preferredWidth = 80f;
			val8.preferredHeight = 80f;
			textPanel = Panel("TextPanel", val.transform, Color.clear);
			VerticalLayoutOnGO(textPanel, 2);
			LayoutElement val9 = textPanel.AddComponent<LayoutElement>();
			val9.minWidth = 200f;
			val9.flexibleWidth = 1f;
			return val;
		}

		public static GameObject TopBar(string name, Transform parent, string title, float topbarSize, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom)
		{
			//IL_0012: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			GameObject val = Panel(name, parent, new Color(0.15f, 0.15f, 0.15f), (Vector2?)new Vector2(0f, topbarSize), (Vector2?)new Vector2(1f, 1f), fullAnchor: false);
			HorizontalLayoutGroup val2 = val.AddComponent<HorizontalLayoutGroup>();
			((LayoutGroup)val2).padding = new RectOffset(paddingLeft, paddingRight, paddingTop, paddingBottom);
			((HorizontalOrVerticalLayoutGroup)val2).spacing = 20f;
			((LayoutGroup)val2).childAlignment = (TextAnchor)4;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val2).childForceExpandHeight = true;
			Text val3 = Text("TopBarTitle", title, val.transform, 26, (TextAnchor)3, (FontStyle)1);
			LayoutElement val4 = ((Component)val3).gameObject.AddComponent<LayoutElement>();
			val4.minWidth = 300f;
			val4.flexibleWidth = 1f;
			return val;
		}

		public static void HorizontalLayoutOnGO(GameObject go, int spacing = 10, int padLeft = 0, int padRight = 0, int padTop = 0, int padBottom = 0, TextAnchor alignment = 4)
		{
			//IL_0012: 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_003b: Expected O, but got Unknown
			HorizontalLayoutGroup val = go.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).childAlignment = alignment;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val).childForceExpandHeight = false;
			((LayoutGroup)val).padding = new RectOffset(padLeft, padRight, padTop, padBottom);
		}

		public static void SetLayoutGroupPadding(LayoutGroup layoutGroup, int left, int right, int top, int bottom)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			layoutGroup.padding = new RectOffset(left, right, top, bottom);
		}

		public static void BindAcceptButton(Button btn, Text label, string text, UnityAction callback)
		{
			label.text = text;
			((UnityEventBase)btn.onClick).RemoveAllListeners();
			((UnityEvent)btn.onClick).AddListener(callback);
		}
	}
}
namespace S1API.Storages
{
	public class StorageInstance
	{
		internal readonly StorageEntity S1Storage;

		public ItemSlotInstance[] Slots => (from itemSlot in S1Storage.ItemSlots.ToArray()
			select new ItemSlotInstance(itemSlot)).ToArray();

		public event Action OnOpened
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onOpened);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onOpened);
			}
		}

		public event Action OnClosed
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onClosed);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onClosed);
			}
		}

		internal StorageInstance(StorageEntity storage)
		{
			S1Storage = storage;
		}

		public bool CanItemFit(ItemInstance itemInstance, int quantity = 1)
		{
			return S1Storage.CanItemFit(itemInstance.S1ItemInstance, quantity);
		}

		public void AddItem(ItemInstance itemInstance)
		{
			S1Storage.InsertItem(itemInstance.S1ItemInstance, true);
		}
	}
}
namespace S1API.Saveables
{
	[Obsolete("Manual registration is no longer required. Classes that directly inherit from Saveable are automatically discovered. Remove calls to ModSaveableRegistry.Register() and simply inherit from Saveable.")]
	public static class ModSaveableRegistry
	{
		internal class Entry
		{
			public Saveable Saveable;

			public string? FolderName;
		}

		internal static readonly List<Entry> Registered = new List<Entry>();

		[Obsolete("Manual registration is no longer required. Classes that directly inherit from Saveable are automatically discovered.")]
		public static void Register(Saveable saveable, string? folderName = null)
		{
			if (saveable != null)
			{
				MelonLogger.Warning("ModSaveableRegistry.Register() is deprecated! The saveable '" + saveable.GetType().Name + "' will be automatically discovered. Mod users can safely ignore this warning - their saves will continue to work normally. Mod developers should remove ModSaveableRegistry.Register() calls and simply inherit from Saveable.");
				Registered.Add(new Entry
				{
					Saveable = saveable,
					FolderName = folderName
				});
			}
		}
	}
	internal static class SaveableAutoRegistry
	{
		[CompilerGenerated]
		private sealed class <GetOrCreateInstances>d__7 : IEnumerable<Saveable>, IEnumerable, IEnumerator<Saveable>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private Saveable <>2__current;

			private int <>l__initialThreadId;

			private List<Type>.Enumerator <>s__1;

			private Type <saveableType>5__2;

			private Saveable <instance>5__3;

			Saveable IEnumerator<Saveable>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetOrCreateInstances>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<>s__1 = default(List<Type>.Enumerator);
				<saveableType>5__2 = null;
				<instance>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					int num = <>1__state;
					if (num != 0)
					{
						if (num != 1)
						{
							return false;
						}
						<>1__state = -3;
						goto IL_00eb;
					}
					<>1__state = -1;
					<>s__1 = _discoveredSaveableTypes.GetEnumerator();
					<>1__state = -3;
					goto IL_00fa;
					IL_00eb:
					<instance>5__3 = null;
					<saveableType>5__2 = null;
					goto IL_00fa;
					IL_00fa:
					if (<>s__1.MoveNext())
					{
						<saveableType>5__2 = <>s__1.Current;
						if (!_instances.TryGetValue(<saveableType>5__2, out <instance>5__3))
						{
							try
							{
								<instance>5__3 = (Saveable)Activator.CreateInstance(<saveableType>5__2, nonPublic: true);
								if (<instance>5__3 != null)
								{
									_instances[<saveableType>5__2] = <instance>5__3;
								}
							}
							catch
							{
							}
						}
						if (<instance>5__3 != null)
						{
							<>2__current = <instance>5__3;
							<>1__state = 1;
							return true;
						}
						goto IL_00eb;
					}
					<>m__Finally1();
					<>s__1 = default(List<Type>.Enumerator);
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				((IDisposable)<>s__1).Dispose();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<Saveable> IEnumerable<Saveable>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <GetOrCreateInstances>d__7(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<Saveable>)this).GetEnumerator();
			}
		}

		private static readonly List<Type> _discoveredSaveableTypes = new List<Type>();

		private static readonly Dictionary<Type, Saveable> _instances = new Dictionary<Type, Saveable>();

		private static bool _discoveryPerformed = false;

		private static readonly object _lock = new object();

		public static IEnumerable<Saveable> GetRegisteredSaveables()
		{
			lock (_lock)
			{
				if (!_discoveryPerformed)
				{
					DiscoverSaveableTypes();
					_discoveryPerformed = true;
				}
				return GetOrCreateInstances();
			}
		}

		private static void DiscoverSaveableTypes()
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				try
				{
					if (assembly == executingAssembly)
					{
						continue;
					}
					string? fullName = assembly.FullName;
					if (fullName != null && fullName.StartsWith("System"))
					{
						continue;
					}
					string? fullName2 = assembly.FullName;
					if (fullName2 != null && fullName2.StartsWith("Unity"))
					{
						continue;
					}
					string? fullName3 = assembly.FullName;
					if (fullName3 != null && fullName3.StartsWith("mscorlib"))
					{
						continue;
					}
					string? fullName4 = assembly.FullName;
					if (fullName4 != null && fullName4.StartsWith("netstandard"))
					{
						continue;
					}
					Type[] types = assembly.GetTypes();
					Type[] array = types;
					foreach (Type type in array)
					{
						try
						{
							if (IsDirectSaveableInheritor(type))
							{
								_discoveredSaveableTypes.Add(type);
							}
						}
						catch
						{
						}
					}
				}
				catch
				{
				}
			}
		}

		private static bool IsDirectSaveableInheritor(Type type)
		{
			if (!typeof(Saveable).IsAssignableFrom(type))
			{
				return false;
			}
			if (type.IsAbstract || type.IsInterface)
			{
				return false;
			}
			Type baseType = type.BaseType;
			return baseType == typeof(Saveable);
		}

		[IteratorStateMachine(typeof(<GetOrCreateInstances>d__7))]
		private static IEnumerable<Saveable> GetOrCreateInstances()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetOrCreateInstances>d__7(-2);
		}

		internal static void ClearCache()
		{
			lock (_lock)
			{
				_discoveredSaveableTypes.Clear();
				_instances.Clear();
				_discoveryPerformed = false;
			}
		}
	}
	[AttributeUsage(AttributeTargets.Field)]
	public class SaveableField : Attribute
	{
		internal string SaveName { get; }

		public SaveableField(string saveName)
		{
			SaveName = saveName;
		}
	}
}
namespace S1API.Quests
{
	public abstract class Quest : Saveable
	{
		protected readonly List<QuestEntry> QuestEntries = new List<QuestEntry>();

		[SaveableField("QuestData")]
		private readonly QuestData _questData;

		internal readonly Quest S1Quest;

		private readonly GameObject _gameObject;

		protected abstract string Title { get; }

		protected abstract string Description { get; }

		protected virtual bool AutoBegin => true;

		protected QuestState QuestState => (QuestState)S1Quest.State;

		internal string? SaveFolder => S1Quest.SaveFolderName;

		protected virtual Sprite? QuestIcon => null;

		public Quest()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Expected O, but got Unknown
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Expected O, but got Unknown
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Expected O, but got Unknown
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Expected O, but got Unknown
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Expected O, but got Unknown
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			_questData = new QuestData(GetType().Name);
			_gameObject = new GameObject("Quest");
			S1Quest = _gameObject.AddComponent<Quest>();
			S1Quest.StaticGUID = string.Empty;
			FieldInfo fieldInfo = AccessTools.Field(typeof(Quest), "title");
			fieldInfo.SetValue(S1Quest, Title);
			S1Quest.onActiveState = new UnityEvent();
			S1Quest.onComplete = new UnityEvent();
			S1Quest.onInitialComplete = new UnityEvent();
			S1Quest.onQuestBegin = new UnityEvent();
			S1Quest.onQuestEnd = new UnityEvent<EQuestState>();
			S1Quest.onTrackChange = new UnityEvent<bool>();
			S1Quest.TrackOnBegin = true;
			S1Quest.AutoCompleteOnAllEntriesComplete = true;
			FieldInfo fieldInfo2 = AccessTools.Field(typeof(Quest), "autoInitialize");
			fieldInfo2.SetValue(S1Quest, false);
			GameObject val = new GameObject("IconPrefab", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val.transform.SetParent(_gameObject.transform);
			Image component = val.GetComponent<Image>();
			component.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1Quest.IconPrefab = val.GetComponent<RectTransform>();
			GameObject val2 = new GameObject("PoIUIPrefab", new Type[4]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<EventTrigger>(),
				CrossType.Of<Button>()
			});
			val2.transform.SetParent(_gameObject.transform);
			GameObject val3 = new GameObject("MainLabel", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Text>()
			});
			val3.transform.SetParent(val2.transform);
			GameObject val4 = new GameObject("IconContainer", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val4.transform.SetParent(val2.transform);
			Image component2 = val4.GetComponent<Image>();
			component2.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			RectTransform component3 = ((Component)component2).GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(20f, 20f);
			GameObject val5 = new GameObject("POIPrefab");
			val5.SetActive(false);
			val5.transform.SetParent(_gameObject.transform);
			POI val6 = val5.AddComponent<POI>();
			val6.DefaultMainText = "Did it work?";
			FieldInfo fieldInfo3 = AccessTools.Field(typeof(POI), "UIPrefab");
			fieldInfo3.SetValue(val6, val2);
			S1Quest.PoIPrefab = val5;
			S1Quest.onQuestEnd.AddListener((UnityAction<EQuestState>)OnQuestEnded);
		}

		internal override void CreateInternal()
		{
			base.CreateInternal();
			S1Quest.InitializeQuest(Title, Description, Array.Empty<QuestEntryData>(), S1Quest?.StaticGUID);
			if (AutoBegin)
			{
				Quest s1Quest = S1Quest;
				if (s1Quest != null)
				{
					s1Quest.Begin(true);
				}
			}
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string text = Path.Combine(folderPath, S1Quest.SaveFolderName);
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			base.SaveInternal(text, ref extraSaveables);
		}

		internal void OnQuestEnded(EQuestState questState)
		{
			Quest.Quests.Remove(S1Quest);
			QuestManager.Quests.Remove(this);
		}

		protected QuestEntry AddEntry(string title, Vector3? poiPosition = null)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0072: 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)
			GameObject val = new GameObject("QuestEntry");
			Transform transform = val.transform;
			GameObject gameObject = _gameObject;
			transform.SetParent((gameObject != null) ? gameObject.transform : null);
			QuestEntry val2 = val.AddComponent<QuestEntry>();
			val2.PoILocation = val.transform;
			S1Quest.Entries.Add(val2);
			QuestEntry questEntry = new QuestEntry(val2)
			{
				Title = title,
				POIPosition = (Vector3)(((??)poiPosition) ?? Vector3.zero)
			};
			QuestEntries.Add(questEntry);
			return questEntry;
		}

		public void Begin()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Begin(true);
			}
		}

		public void Cancel()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Cancel(true);
			}
		}

		public void Expire()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Expire(true);
			}
		}

		public void Fail()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Fail(true);
			}
		}

		public void Complete()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Complete(true);
			}
		}

		public void End()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.End();
			}
		}
	}
	public class QuestData
	{
		public readonly string ClassName;

		public QuestData(string className)
		{
			ClassName = className;
		}
	}
	public class QuestEntry
	{
		internal readonly QuestEntry S1QuestEntry;

		public QuestState State => (QuestState)S1QuestEntry.State;

		public string Title
		{
			get
			{
				return S1QuestEntry.Title;
			}
			set
			{
				S1QuestEntry.SetEntryTitle(value);
			}
		}

		public Vector3 POIPosition
		{
			get
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				return S1QuestEntry.PoILocation.position;
			}
			set
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				S1QuestEntry.PoILocation.position = value;
			}
		}

		public event Action OnComplete
		{
			add
			{
				EventHelper.AddListener(value, S1QuestEntry.onComplete);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1QuestEntry.onComplete);
			}
		}

		internal QuestEntry(QuestEntry questEntry)
		{
			S1QuestEntry = questEntry;
		}

		public void Begin()
		{
			S1QuestEntry.Begin();
		}

		public void Complete()
		{
			S1QuestEntry.Complete();
		}

		public void SetState(QuestState questState)
		{
			S1QuestEntry.SetState((EQuestState)questState, true);
		}
	}
	public static class QuestManager
	{
		internal static readonly List<Quest> Quests = new List<Quest>();

		public static Quest CreateQuest<T>(string? guid = null) where T : Quest
		{
			return CreateQuest(typeof(T), guid);
		}

		public static Quest CreateQuest(Type questType, string? guid = null)
		{
			Quest quest = (Quest)Activator.CreateInstance(questType);
			if (quest == null)
			{
				throw new Exception("Unable to create quest instance of " + questType.FullName + "!");
			}
			Quests.Add(quest);
			return quest;
		}

		public static Quest? GetQuestByGuid(string guid)
		{
			string guid2 = guid;
			return Quests.FirstOrDefault((Quest x) => x.S1Quest.StaticGUID == guid2);
		}

		public static Quest? GetQuestByName(string questName)
		{
			string questName2 = questName;
			return Quests.FirstOrDefault((Quest x) => x.S1Quest.Title == questName2);
		}
	}
}
namespace S1API.Quests.Constants
{
	public enum QuestAction
	{
		Begin,
		Success,
		Fail,
		Expire,
		Cancel
	}
	public enum QuestState
	{
		Inactive,
		Active,
		Completed,
		Failed,
		Expired,
		Cancelled
	}
}
namespace S1API.Property
{
	public abstract class BaseProperty
	{
		public abstract string PropertyName { get; }

		public abstract string PropertyCode { get; }

		public abstract float Price { get; }

		public abstract bool IsOwned { get; }

		public abstract int EmployeeCapacity { get; set; }

		public abstract void SetOwned();

		public abstract bool IsPointInside(Vector3 point);
	}
	public static class PropertyManager
	{
		public static List<PropertyWrapper> GetAllProperties()
		{
			List<PropertyWrapper> list = new List<PropertyWrapper>();
			foreach (Property property in Property.Properties)
			{
				list.Add(new PropertyWrapper(property));
			}
			return list;
		}

		public static List<PropertyWrapper> GetOwnedProperties()
		{
			List<PropertyWrapper> list = new List<PropertyWrapper>();
			foreach (Property ownedProperty in Property.OwnedProperties)
			{
				list.Add(new PropertyWrapper(ownedProperty));
			}
			return list;
		}

		public static PropertyWrapper FindPropertyByName(string name)
		{
			foreach (Property property in Property.Properties)
			{
				if (property.PropertyName == name)
				{
					return new PropertyWrapper(property);
				}
			}
			return null;
		}
	}
	public class PropertyWrapper : BaseProperty
	{
		internal readonly Property InnerProperty;

		public override string PropertyName => InnerProperty.PropertyName;

		public override string PropertyCode => InnerProperty.PropertyCode;

		public override float Price => InnerProperty.Price;

		public override bool IsOwned => InnerProperty.IsOwned;

		public override int EmployeeCapacity
		{
			get
			{
				return InnerProperty.EmployeeCapacity;
			}
			set
			{
				InnerProperty.EmployeeCapacity = value;
			}
		}

		public PropertyWrapper(Property property)
		{
			InnerProperty = property;
		}

		public override void SetOwned()
		{
			InnerProperty.SetOwned();
		}

		public override bool IsPointInside(Vector3 point)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return InnerProperty.DoBoundsContainPoint(point);
		}
	}
}
namespace S1API.Properties
{
	public class ProductPropertyWrapper : PropertyBase
	{
		private readonly Property _innerProperty;

		public override string ID => _innerProperty.ID;

		public override string Name => _innerProperty.Name;

		public override string name => ((Object)_innerProperty).name;

		public override string Description => _innerProperty.Description;

		public override int Tier => _innerProperty.Tier;

		public override float Addictiveness => _innerProperty.Addictiveness;

		internal Property InnerProperty => _innerProperty;

		internal ProductPropertyWrapper(Property property)
		{
			_innerProperty = property;
		}
	}
}
namespace S1API.Properties.Interfaces
{
	public abstract class PropertyBase
	{
		public abstract string ID { get; }

		public abstract string Name { get; }

		public abstract string name { get; }

		public abstract string Description { get; }

		public abstract int Tier { get; }

		public abstract float Addictiveness { get; }
	}
}
namespace S1API.Products
{
	public class CocaineDefinition : ProductDefinition
	{
		internal CocaineDefinition S1CocaineDefinition => CrossType.As<CocaineDefinition>(base.S1ItemDefinition);

		internal CocaineDefinition(CocaineDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1CocaineDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			List<Property> list2 = ((PropertyItemDefinition)(S1CocaineDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(list2[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			List<Property> list2 = ((PropertyItemDefinition)(S1CocaineDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(list2[i]);
				}
			}
			return list;
		}
	}
	public class MethDefinition : ProductDefinition
	{
		internal MethDefinition S1MethDefinition => CrossType.As<MethDefinition>(base.S1ItemDefinition);

		internal MethDefinition(MethDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1MethDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			List<Property> list2 = ((PropertyItemDefinition)(S1MethDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(list2[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			List<Property> list2 = ((PropertyItemDefinition)(S1MethDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(list2[i]);
				}
			}
			return list;
		}
	}
	public class PackagingDefinition : ItemDefinition
	{
		internal PackagingDefinition S1PackagingDefinition => CrossType.As<PackagingDefinition>(base.S1ItemDefinition);

		public int Quantity => S1PackagingDefinition.Quantity;

		internal PackagingDefinition(ItemDefinition s1ItemDefinition)
			: base(s1ItemDefinition)
		{
		}
	}
	public class ProductDefinition : ItemDefinition
	{
		internal ProductDefinition S1ProductDefinition => CrossType.As<ProductDefinition>(base.S1ItemDefinition);

		public float Price => S1ProductDefinition.Price;

		public float BasePrice => S1ProductDefinition.BasePrice;

		public float MarketValue => S1ProductDefinition.MarketValue;

		public new Sprite Icon => ((ItemDefinition)S1ProductDefinition).Icon;

		public IReadOnlyList<PropertyBase> Properties
		{
			get
			{
				List<Property> properties = ((PropertyItemDefinition)S1ProductDefinition).Properties;
				List<PropertyBase> list = new List<PropertyBase>(properties.Count);
				for (int i = 0; i < properties.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(properties[i]));
				}
				return list.AsReadOnly();
			}
		}

		public List<DrugTypeContainer> DrugTypes => S1ProductDefinition.DrugTypes;

		public EDrugType DrugType => S1ProductDefinition.DrugType;

		internal ProductDefinition(ItemDefinition productDefinition)
			: base(productDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1ProductDefinition).GetDefaultInstance(quantity)));
		}
	}
	public static class ProductDefinitionWrapper
	{
		public static ProductDefinition Wrap(ProductDefinition def)
		{
			ItemDefinition s1ItemDefinition = def.S1ItemDefinition;
			if (CrossType.Is<WeedDefinition>(s1ItemDefinition, out var result))
			{
				return new WeedDefinition(result);
			}
			if (CrossType.Is<MethDefinition>(s1ItemDefinition, out var result2))
			{
				return new MethDefinition(result2);
			}
			if (CrossType.Is<CocaineDefinition>(s1ItemDefinition, out var result3))
			{
				return new CocaineDefinition(result3);
			}
			return def;
		}
	}
	public class ProductInstance : ItemInstance
	{
		internal ProductItemInstance S1ProductInstance => CrossType.As<ProductItemInstance>(S1ItemInstance);

		public bool IsPackaged => Object.op_Implicit((Object)(object)S1ProductInstance.AppliedPackaging);

		public PackagingDefinition AppliedPackaging => new PackagingDefinition((ItemDefinition)(object)S1ProductInstance.AppliedPackaging);

		public Quality Quality => ((QualityItemInstance)S1ProductInstance).Quality.ToAPI();

		public new ProductDefinition Definition => new ProductDefinition(((ItemInstance)S1ProductInstance).Definition);

		public IReadOnlyList<PropertyBase> Properties => Definition.Properties;

		internal ProductInstance(ProductItemInstance productInstance)
			: base((ItemInstance)(object)productInstance)
		{
		}
	}
	public static class ProductManager
	{
		public static ProductDefinition[] DiscoveredProducts => (from productDefinition in ProductManager.DiscoveredProducts.ToArray()
			select ProductDefinitionWrapper.Wrap(new ProductDefinition((ItemDefinition)(object)productDefinition))).ToArray();
	}
	public enum Quality
	{
		Trash,
		Poor,
		Standard,
		Premium,
		Heavenly
	}
	internal static class QualityExtensions
	{
		internal static Quality ToAPI(this EQuality quality)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected I4, but got Unknown
			if (1 == 0)
			{
			}
			Quality result = (int)quality switch
			{
				0 => Quality.Trash, 
				1 => Quality.Poor, 
				2 => Quality.Standard, 
				3 => Quality.Premium, 
				4 => Quality.Heavenly, 
				_ => Quality.Trash, 
			};
			if (1 == 0)
			{
			}
			return result;
		}

		internal static EQuality ToInternal(this Quality quality)
		{
			//IL_0022: 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_002a: 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)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (1 == 0)
			{
			}
			EQuality result = (EQuality)(quality switch
			{
				Quality.Trash => 0, 
				Quality.Poor => 1, 
				Quality.Standard => 2, 
				Quality.Premium => 3, 
				Quality.Heavenly => 4, 
				_ => 0, 
			});
			if (1 == 0)
			{
			}
			return result;
		}
	}
	public class WeedDefinition : ProductDefinition
	{
		internal WeedDefinition S1WeedDefinition => CrossType.As<WeedDefinition>(base.S1ItemDefinition);

		internal WeedDefinition(WeedDefinition definition)
			: base((ItemDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1WeedDefinition).GetDefaultInstance(quantity)));
		}

		public List<PropertyBase> GetProperties()
		{
			List<PropertyBase> list = new List<PropertyBase>();
			List<Property> list2 = ((PropertyItemDefinition)(S1WeedDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(new ProductPropertyWrapper(list2[i]));
				}
			}
			return list;
		}

		[Obsolete("Use GetProperties() instead for IL2CPP compatibility")]
		public List<Property> GetRawProperties()
		{
			List<Property> list = new List<Property>();
			List<Property> list2 = ((PropertyItemDefinition)(S1WeedDefinition?)).Properties;
			if (list2 != null)
			{
				for (int i = 0; i < list2.Count; i++)
				{
					list.Add(list2[i]);
				}
			}
			return list;
		}
	}
}
namespace S1API.PhoneCalls
{
	public class CallerDefinition
	{
		internal readonly CallerID S1CallerIDEntry;

		public string Name
		{
			get
			{
				return S1CallerIDEntry.Name;
			}
			set
			{
				S1CallerIDEntry.Name = value;
			}
		}

		public Sprite? ProfilePicture
		{
			get
			{
				return S1CallerIDEntry.ProfilePicture;
			}
			set
			{
				S1CallerIDEntry.ProfilePicture = value;
			}
		}

		internal CallerDefinition(CallerID s1CallerID)
		{
			S1CallerIDEntry = s1CallerID;
		}
	}
	public static class CallManager
	{
		private static readonly Queue<PhoneCallData> PendingCalls = new Queue<PhoneCallData>();

		private static bool subscribedToCallCompleted;

		internal static bool IsDispatchingToGameQueue;

		public static int PendingCount => PendingCalls.Count;

		public static void QueueCall(PhoneCallDefinition phoneCallDefinition)
		{
			if (phoneCallDefinition == null)
			{
				throw new ArgumentNullException("phoneCallDefinition");
			}
			PendingCalls.Enqueue(phoneCallDefinition.S1PhoneCallData);
			EnsureSubscribed();
			TryProcessQueue();
		}

		internal static void QueueCall(PhoneCallData phoneCallData)
		{
			if ((Object)(object)phoneCallData == (Object)null)
			{
				throw new ArgumentNullException("phoneCallData");
			}
			PendingCalls.Enqueue(phoneCallData);
			EnsureSubscribed();
			TryProcessQueue();
		}

		public static void ClearPendingQueue()
		{
			PendingCalls.Clear();
		}

		private static void EnsureSubscribed()
		{
			if (!subscribedToCallCompleted)
			{
				CallInterface instance = Singleton<CallInterface>.Instance;
				if (!((Object)(object)instance == (Object)null))
				{
					instance.CallCompleted = (Action<PhoneCallData>)Delegate.Combine(instance.CallCompleted, new Action<PhoneCallData>(OnCallCompleted));
					subscribedToCallCompleted = true;
				}
			}
		}

		private static void OnCallCompleted(PhoneCallData _)
		{
			TryProcessQueue();
		}

		private static void TryProcessQueue()
		{
			CallManager instance = Singleton<CallManager>.Instance;
			if ((Object)(object)instance == (Object)null || (Object)(object)instance.QueuedCallData != (Object)null || PendingCalls.Count == 0)
			{
				return;
			}
			PhoneCallData val = PendingCalls.Dequeue();
			IsDispatchingToGameQueue = true;
			try
			{
				instance.QueueCall(val);
			}
			finally
			{
				IsDispatchingToGameQueue = false;
			}
		}
	}
	public class CallStageEntry
	{
		internal readonly Stage S1Stage;

		protected readonly List<SystemTriggerEntry> StartTriggerEntries = new List<SystemTriggerEntry>();

		protected readonly List<SystemTriggerEntry> DoneTriggerEntries = new List<SystemTriggerEntry>();

		public string Text
		{
			get
			{
				return S1Stage.Text;
			}
			set
			{
				S1Stage.Text = value;
			}
		}

		internal CallStageEntry(Stage stage)
		{
			S1Stage = stage;
		}

		public SystemTriggerEntry AddSystemTrigger(SystemTriggerType triggerType)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			SystemTrigger val = new SystemTrigger();
			SystemTriggerEntry systemTriggerEntry = new SystemTriggerEntry(val);
			switch (triggerType)
			{
			case SystemTriggerType.StartTrigger:
				S1Stage.OnStartTriggers = S1Stage.OnStartTriggers.AddItemToArray(val);
				StartTriggerEntries.Add(systemTriggerEntry);
				break;
			case SystemTriggerType.DoneTrigger:
				S1Stage.OnDoneTriggers = S1Stage.OnDoneTriggers.AddItemToArray(val);
				DoneTriggerEntries.Add(systemTriggerEntry);
				break;
			}
			return systemTriggerEntry;
		}
	}
	public abstract class PhoneCallDefinition
	{
		public CallerDefinition? Caller;

		public readonly PhoneCallData S1PhoneCallData;

		protected readonly List<CallStageEntry> StageEntries = new List<CallStageEntry>();

		protected PhoneCallDefinition(string name, Sprite? profilePicture = null)
		{
			S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
			PhoneCallData s1PhoneCallData = S1PhoneCallData;
			if (s1PhoneCallData.Stages == null)
			{
				s1PhoneCallData.Stages = Array.Empty<Stage>();
			}
			AddCallerID(name, profilePicture);
		}

		protected PhoneCallDefinition(NPC? npcCallerID)
		{
			S1PhoneCallData = ScriptableObject.CreateInstance<PhoneCallData>();
			PhoneCallData s1PhoneCallData = S1PhoneCallData;
			if (s1PhoneCallData.Stages == null)
			{
				s1PhoneCallData.Stages = Array.Empty<Stage>();
			}
			AddCallerID(npcCallerID);
		}

		protected CallerDefinition AddCallerID(string name, Sprite? profilePicture = null)
		{
			CallerID val = ScriptableObject.CreateInstance<CallerID>();
			val.Name = name;
			val.ProfilePicture = profilePicture;
			S1PhoneCallData.CallerID = val;
			Caller = new CallerDefinition(val)
			{
				Name = name,
				ProfilePicture = profilePicture
			};
			return Caller;
		}

		protected CallerDefinition AddCallerID(NPC? npc)
		{
			CallerID val = ScriptableObject.CreateInstance<CallerID>();
			val.Name = npc?.FullName ?? "Unknown Caller";
			val.ProfilePicture = npc?.Icon;
			S1PhoneCallData.CallerID = val;
			Caller = new CallerDefinition(val)
			{
				Name = (npc?.FullName ?? "Unknown Caller"),
				ProfilePicture = npc?.Icon
			};
			return Caller;
		}

		protected CallStageEntry AddStage(string text)
		{
			//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_000e: Expected O, but got Unknown
			Stage val = new Stage
			{
				Text = text
			};
			S1PhoneCallData.Stages = S1PhoneCallData.Stages.AddItemToArray(val);
			CallStageEntry callStageEntry = new CallStageEntry(val)
			{
				Text = text
			};
			StageEntries.Add(callStageEntry);
			return callStageEntry;
		}

		public void Completed()
		{
			S1PhoneCallData.Completed();
		}
	}
}
namespace S1API.PhoneCalls.Constants
{
	public enum EvaluationType
	{
		PassOnTrue,
		PassOnFalse
	}
	public enum SystemTriggerType
	{
		StartTrigger,
		DoneTrigger
	}
}
namespace S1API.PhoneApp
{
	public abstract class PhoneApp : Registerable
	{
		public enum EOrientation
		{
			Horizontal,
			Vertical
		}

		protected static readonly Log Logger = new Log("PhoneApp");

		private GameObject? _appPanel;

		private bool _appCreated;

		private bool _iconModified;

		private Image? _iconImage;

		private Sprite? _pendingIconSprite;

		private HomeScreen? _homeScreenInstance;

		private Action? _closeAppAction;

		private ExitDelegate? _exitDelegate;

		private Action? _onPhoneClosedAction;

		protected abstract string AppName { get; }

		protected abstract string AppTitle { get; }

		protected abstract string IconLabel { get; }

		protected abstract string IconFileName { get; }

		protected virtual Sprite? IconSprite => null;

		protected virtual EOrientation Orientation => EOrientation.Horizontal;

		protected abstract void OnCreatedUI(GameObject container);

		protected override void OnCreated()
		{
			PhoneAppRegistry.Register(this);
		}

		protected override void OnDestroyed()
		{
			if ((Object)(object)_appPanel != (Object)null)
			{
				Object.Destroy((Object)(object)_appPanel);
				_appPanel = null;
			}
			_appCreated = false;
			_iconModified = false;
			_iconImage = null;
			_pendingIconSprite = null;
			if (PlayerSingleton<Phone>.InstanceExists && _closeAppAction != null)
			{
				Phone instance = PlayerSingleton<Phone>.Instance;
				instance.closeApps = (Action)Delegate.Remove(instance.closeApps, _closeAppAction);
				_closeAppAction = null;
			}
			if (_exitDelegate != null)
			{
				GameInput.DeregisterExitListener(_exitDelegate);
				_exitDelegate = null;
			}
			if (PlayerSingleton<Phone>.InstanceExists && _onPhoneClosedAction != null)
			{
				Phone instance2 = PlayerSingleton<Phone>.Instance;
				instance2.onPhoneClosed = (Action)Delegate.Remove(instance2.onPhoneClosed, _onPhoneClosedAction);
				_onPhoneClosedAction = null;
			}
		}

		public virtual void Exit(ExitAction exit)
		{
			if (!exit.Used && IsOpen() && PlayerSingleton<Phone>.InstanceExists && PlayerSingleton<Phone>.Instance.IsOpen)
			{
				exit.Used = true;
				CloseApp();
			}
		}

		protected virtual void OnPhoneClosed()
		{
		}

		public bool IsOpen()
		{
			return (Object)(object)_appPanel != (Object)null && _appPanel.activeInHierarchy && (Object)(object)Phone.ActiveApp == (Object)(object)_appPanel;
		}

		internal void SpawnUI(HomeScreen homeScreenInstance)
		{
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Expected O, but got Unknown
			_homeScreenInstance = homeScreenInstance;
			Transform obj = ((Component)homeScreenInstance).transform.parent.Find("AppsCanvas");
			GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
			if ((Object)(object)val == (Object)null)
			{
				Logger.Error("AppsCanvas not found.");
				return;
			}
			Transform val2 = val.transform.Find(AppName);
			if ((Object)(object)val2 != (Object)null)
			{
				_appPanel = ((Component)val2).gameObject;
				SetupExistingAppPanel(_appPanel);
			}
			else
			{
				Transform val3 = val.transform.Find("ProductManagerApp");
				if ((Object)(object)val3 == (Object)null)
				{
					Logger.Error("Template ProductManagerApp not found.");
					return;
				}
				_appPanel = Object.Instantiate<GameObject>(((Component)val3).gameObject, val.transform);
				((Object)_appPanel).name = AppName;
				Transform val4 = _appPanel.transform.Find("Container");
				if ((Object)(object)val4 != (Object)null)
				{
					GameObject gameObject = ((Component)val4).gameObject;
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
				_appCreated = true;
			}
			_appPanel.SetActive(true);
			if ((Object)(object)_appPanel.GetComponent<PhoneAppButtonHandler>() == (Object)null)
			{
				PhoneAppButtonHandler phoneAppButtonHandler = _appPanel.AddComponent<PhoneAppButtonHandler>();
				phoneAppButtonHandler.phoneApp = this;
			}
			if (PlayerSingleton<Phone>.InstanceExists)
			{
				_closeAppAction = CloseApp;
				Phone instance = PlayerSingleton<Phone>.Instance;
				instance.closeApps = (Action)Delegate.Combine(instance.closeApps, _closeAppAction);
				_exitDelegate = new ExitDelegate(Exit);
				GameInput.RegisterExitListener(_exitDelegate, 1);
				_onPhoneClosedAction = OnPhoneClosed;
				Phone instance2 = PlayerSingleton<Phone>.Instance;
				instance2.onPhoneClosed = (Action)Delegate.Combine(instance2.onPhoneClosed, _onPhoneClosedAction);
			}
		}

		internal void SpawnIcon(HomeScreen homeScreenInstance)
		{
			if (_iconModified)
			{
				return;
			}
			Transform obj = ((Component)homeScreenInstance).transform.Find("AppIcons");
			GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
			if ((Object)(object)val == (Object)null)
			{
				Logger.Error("AppIcons not found under HomeScreen.");
				return;
			}
			Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Logger.Error("No icons found in AppIcons.");
				return;
			}
			GameObject gameObject = ((Component)val2).gameObject;
			((Object)gameObject).name = AppName;
			Transform val3 = gameObject.transform.Find("Mask/Image");
			_iconImage = (((Object)(object)val3 != (Object)null) ? ((Component)val3).GetComponent<Image>() : null);
			Transform val4 = gameObject.transform.Find("Label");
			Text val5 = ((val4 != null) ? ((Component)val4).GetComponent<Text>() : null);
			if ((Object)(object)val5 != (Object)null)
			{
				val5.text = IconLabel;
			}
			if ((Object)(object)_iconImage != (Object)null)
			{
				Sprite val6 = (((Object)(object)_pendingIconSprite != (Object)null) ? _pendingIconSprite : IconSprite);
				if ((Object)(object)val6 != (Object)null)
				{
					_iconImage.sprite = val6;
					_iconModified = true;
					_pendingIconSprite = null;
				}
				else
				{
					_iconModified = ChangeAppIconImage(gameObject, IconFileName);
				}
			}
			else
			{
				_iconModified = ChangeAppIconImage(gameObject, IconFileName);
			}
			Button component = gameObject.GetComponent<Button>();
			if ((Object)(object)component != (Object)null)
			{
				((UnityEventBase)component.onClick).RemoveAllListeners();
				EventHelper.AddListener(OpenApp, (UnityEvent)(object)component.onClick);
			}
		}

		public void OpenApp()
		{
			try
			{
				if ((Object)(object)Phone.ActiveApp != (Object)null && (Object)(object)Phone.ActiveApp != (Object)(object)_appPanel)
				{
					PlayerSingleton<Phone>.Instance.RequestCloseApp();
				}
				SetAppOpen(open: true);
				Logger.Msg("Opened phone app: " + AppName);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to open phone app " + AppName + ": " + ex.Message);
			}
		}

		public void CloseApp()
		{
			try
			{
				if (IsOpen())
				{
					SetAppOpen(open: false);
				}
				Logger.Msg("Closed phone app: " + AppName);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to close phone app " + AppName + ": " + ex.Message);
			}
		}

		private void SetAppOpen(bool open)
		{
			if (open && (Object)(object)Phone.ActiveApp != (Object)null && (Object)(object)Phone.ActiveApp != (Object)(object)_appPanel)
			{
				Logger.Warning(((Object)Phone.ActiveApp).name + " is already open");
				return;
			}
			if (PlayerSingleton<AppsCanvas>.InstanceExists)
			{
				PlayerSingleton<AppsCanvas>.Instance.SetIsOpen(open);
			}
			if (PlayerSingleton<HomeScreen>.InstanceExists)
			{
				PlayerSingleton<HomeScreen>.Instance.SetIsOpen(!open);
			}
			if (open)
			{
				if (Orientation == EOrientation.Horizontal)
				{
					if (PlayerSingleton<Phone>.InstanceExists)
					{
						PlayerSingleton<Phone>.Instance.SetIsHorizontal(true);
						PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(0.6f);
					}
				}
				else if (PlayerSingleton<Phone>.InstanceExists)
				{
					PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(1f);
				}
				Phone.ActiveApp = _appPanel;
				if ((Object)(object)_appPanel != (Object)null)
				{
					Transform val = _appPanel.transform.Find("Container");
					GameObject val2 = (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null);
					if ((Object)(object)val2 != (Object)null)
					{
						val2.SetActive(true);
					}
				}
				return;
			}
			if ((Object)(object)Phone.ActiveApp == (Object)(object)_appPanel)
			{
				Phone.ActiveApp = null;
			}
			if (PlayerSingleton<Phone>.InstanceExists)
			{
				PlayerSingleton<Phone>.Instance.SetIsHorizontal(false);
				PlayerSingleton<Phone>.Instance.SetLookOffsetMultiplier(1f);
			}
			if ((Object)(object)_appPanel != (Object)null)
			{
				Transform val3 = _appPanel.transform.Find("Container");
				GameObject val4 = (((Object)(object)val3 != (Object)null) ? ((Component)val3).gameObject : null);
				if ((Object)(object)val4 != (Object)null)
				{
					val4.SetActive(false);
				}
			}
		}

		private void SetupExistingAppPanel(GameObject panel)
		{
			Transform val = panel.transform.Find("Container");
			if ((Object)(object)val != (Object)null)
			{
				GameObject gameObject = ((Component)val).gameObject;
				if (gameObject.transform.childCount < 2)
				{
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
			}
			_appCreated = true;
		}

		private void ClearContainer(GameObject container)
		{
			for (int num = container.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)container.transform.GetChild(num)).gameObject);
			}
			container.SetActive(false);
		}

		private bool ChangeAppIconImage(GameObject iconObj, string filename)
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			Transform val = iconObj.transform.Find("Mask/Image");
			Image val2 = ((val != null) ? ((Component)val).GetComponent<Image>() : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Logger.Error("Image component not found in icon.");
				return false;
			}
			string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
			if (!File.Exists(text))
			{
				Logger.Error("Icon file not found: " + text);
				return false;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val3 = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val3, array))
				{
					val2.sprite = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f));
					return true;
				}
				Object.Destroy((Object)(object)val3);
			}
			catch (Exception ex)
			{
				Logger.Error("Failed to load image: " + ex.Message);
			}
			return false;
		}

		public bool SetIconSprite(Sprite sprite)
		{
			if ((Object)(object)sprite == (Object)null)
			{
				return false;
			}
			if ((Object)(object)_iconImage != (Object)null)
			{
				_iconImage.sprite = sprite;
				_iconModified = true;
				_pendingIconSprite = null;
				return true;
			}
			_pendingIconSprite = sprite;
			return true;
		}

		public bool SetIconTexture(Texture2D texture)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)texture == (Object)null)
			{
				return false;
			}
			Sprite iconSprite = Sprite.Create(texture, new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), new Vector2(0.5f, 0.5f));
			return SetIconSprite(iconSprite);
		}
	}
	internal class PhoneAppButtonHandler : MonoBehaviour
	{
		internal PhoneApp phoneApp;

		private void Update()
		{
			if (phoneApp != null && phoneApp.IsOpen() && PlayerSingleton<Phone>.InstanceExists && PlayerSingleton<Phone>.Instance.IsOpen && IsHoveringButton() && GameInput.GetButtonDown((ButtonCode)0))
			{
				phoneApp.CloseApp();
			}
		}

		private bool IsHoveringButton()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(Singleton<GameplayMenu>.Instance.OverlayCamera.ScreenPointToRay(Input.mousePosition), ref val, 2f, 1 << LayerMask.NameToLayer("Overlay")) && ((Object)((Component)((RaycastHit)(ref val)).collider).gameObject).name == "Button")
			{
				return true;
			}
			return false;
		}
	}
}
namespace S1API.Money
{
	public class CashDefinition : ItemDefinition
	{
		internal CashDefinition S1CashDefinition => CrossType.As<CashDefinition>(base.S1ItemDefinition);

		internal CashDefinition(CashDefinition s1ItemDefinition)
			: base((ItemDefinition)(object)s1ItemDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new CashInstance(((ItemDefinition)S1CashDefinition).GetDefaultInstance(quantity));
		}
	}
	public class CashInstance : ItemInstance
	{
		internal CashInstance S1CashInstance => CrossType.As<CashInstance>(S1ItemInstance);

		internal CashInstance(ItemInstance itemInstance)
			: base(itemInstance)
		{
		}

		public void AddQuantity(float amount)
		{
			S1CashInstance.SetBalance(Mathf.Clamp(S1CashInstance.Balance + amount, 0f, float.MaxValue), false);
		}

		public void SetQuantity(float newQuantity)
		{
			S1CashInstance.SetBalance(newQuantity, false);
		}
	}
	public static class Money
	{
		private static MoneyManager Internal => NetworkSingleton<MoneyManager>.Instance;

		public static event Action? OnBalanceChanged;

		public static void ChangeCashBalance(float amount, bool visualizeChange = true, bool playCashSound = false)
		{
			MoneyManager @internal = Internal;
			if (@internal != null)
			{
				@internal.ChangeCashBalance(amount, visualizeChange, playCashSound);
			}
			Money.OnBalanceChanged?.Invoke();
		}

		public static void CreateOnlineTransaction(string transactionName, float unitAmount, float quantity, string transactionNote)
		{
			MoneyManager @internal = Internal;
			if (@internal != null)
			{
				@internal.CreateOnlineTransaction(transactionName, unitAmount, quantity, transactionNote);
			}
			Money.OnBalanceChanged?.Invoke();
		}

		public static float GetNetWorth()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.GetNetWorth() : 0f;
		}

		public static float GetCashBalance()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.cashBalance : 0f;
		}

		public static float GetOnlineBalance()
		{
			return ((Object)(object)Internal != (Object)null) ? Internal.sync___get_value_onlineBalance() : 0f;
		}

		public static void AddNetworthCalculation(Action<object> callback)
		{
			if ((Object)(object)Internal != (Object)null)
			{
				MoneyManager @internal = Internal;
				@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Combine(@internal.onNetworthCalculation, callback);
			}
		}

		public static void RemoveNetworthCalculation(Action<object> callback)
		{
			if ((Object)(object)Internal != (Object)null)
			{
				MoneyManager @internal = Internal;
				@internal.onNetworthCalculation = (Action<FloatContainer>)Delegate.Remove(@internal.onNetworthCalculation, callback);
			}
		}

		public static CashInstance CreateCashInstance(float amount)
		{
			CashDefinition item = Registry.GetItem<CashDefinition>("cash");
			ItemInstance itemInstance = CrossType.As<ItemInstance>(((ItemDefinition)item).GetDefaultInstance(1));
			CashInstance cashInstance = new CashInstance(itemInstance);
			cashInstance.SetQuantity(amount);
			return cashInstance;
		}
	}
}
namespace S1API.Messaging
{
	public class Response
	{
		internal readonly Response S1Response;

		public Action? OnTriggered
		{
			get
			{
				return (S1Response.callback == null) ? null : ((Action)delegate
				{
					S1Response.callback();
				});
			}
			set
			{
				S1Response.callback = value;
			}
		}

		public string Label
		{
			get
			{
				return S1Response.label;
			}
			set
			{
				S1Response.label = value;
			}
		}

		public string Text
		{
			get
			{
				return S1Response.text;
			}
			set
			{
				S1Response.text = value;
			}
		}

		public Response()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			S1Response = new Response();
		}

		internal Response(Response response)
		{
			S1Response = response;
		}
	}
}
namespace S1API.Map
{
	public enum Region
	{
		Northtown,
		Westville,
		Downtown,
		Docks,
		Suburbia,
		Uptown
	}
}
namespace S1API.Logging
{
	public class Log
	{
		private readonly Instance _loggerInstance;

		public Log(string sourceName)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			_loggerInstance = new Instance(sourceName);
		}

		public void Msg(string message)
		{
			_loggerInstance.Msg(message);
		}

		public void Warning(string message)
		{
			_loggerInstance.Warning(message);
		}

		public void Error(string message)
		{
			_loggerInstance.Error(message);
		}

		public void BigError(string message)
		{
			_loggerInstance.BigError(message);
		}
	}
}
namespace S1API.Leveling
{
	public static class LevelManager
	{
		public static Rank Rank = (Rank)NetworkSingleton<LevelManager>.Instance.Rank;
	}
	public enum Rank
	{
		StreetRat,
		Hoodlum,
		Peddler,
		Hustler,
		Bagman,
		Enforcer,
		ShotCaller,
		BlockBoss,
		Underlord,
		Baron,
		Kingpin
	}
}
namespace S1API.Items
{
	public enum ItemCategory
	{
		Product,
		Packaging,
		Growing,
		Tools,
		Furniture,
		Lighting,
		Cash,
		Consumable,
		Equipment,
		Ingredient,
		Decoration,
		Clothing
	}
	public class ItemDefinition : IGUIDReference
	{
		internal ItemDefinition S1ItemDefinition { get; }

		public string ID
		{
			get
			{
				return S1ItemDefinition.ID;
			}
			set
			{
				S1ItemDefinition.ID = value;
			}
		}

		public string Name
		{
			get
			{
				return S1ItemDefinition.Name;
			}
			set
			{
				S1ItemDefinition.Name = value;
			}
		}

		public string Description
		{
			get
			{
				return S1ItemDefinition.Description;
			}
			set
			{
				S1ItemDefinition.Description = value;
			}
		}

		public int StackLimit
		{
			get
			{
				return S1ItemDefinition.StackLimit;
			}
			set
			{
				S1ItemDefinition.StackLimit = value;
			}
		}

		public ItemCategory Category
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (ItemCategory)S1ItemDefinition.Category;
			}
			set
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				S1ItemDefinition.Category = (EItemCategory)value;
			}
		}

		public Sprite Icon
		{
			get
			{
				return S1ItemDefinition.Icon;
			}
			set
			{
				S1ItemDefinition.Icon = value;
			}
		}

		public bool AvailableInDemo
		{
			get
			{
				return S1ItemDefinition.AvailableInDemo;
			}
			set
			{
				S1ItemDefinition.AvailableInDemo = value;
			}
		}

		public LegalStatus LegalStatus
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected I4, but got Unknown
				return (LegalStatus)S1ItemDefinition.legalStatus;
			}
			set
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				S1ItemDefinition.legalStatus = (ELegalStatus)value;
			}
		}

		public Color LabelDisplayColor
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				return S1ItemDefinition.LabelDisplayColor;
			}
			set
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				S1ItemDefinition.LabelDisplayColor = value;
			}
		}

		public string[] Keywords
		{
			get
			{
				return S1ItemDefinition.Keywords;
			}
			set
			{
				S1ItemDefinition.Keywords = value;
			}
		}

		public string GUID => ID;

		internal ItemDefinition(ItemDefinition definition)
		{
			S1ItemDefinition = definition;
		}

		public virtual ItemInstance CreateInstance(int quantity = 1)
		{
			ItemInstance defaultInstance = S1ItemDefinition.GetDefaultInstance(quantity);
			return new ItemInstance(defaultInstance);
		}

		public override bool Equals(object? obj)
		{
			return obj is ItemDefinition itemDefinition && (Object)(object)S1ItemDefinition == (Object)(object)itemDefinition.S1ItemDefinition;
		}

		public override int GetHashCode()
		{
			return ((object)S1ItemDefinition).GetHashCode();
		}

		public static bool operator ==(ItemDefinition? a, ItemDefinition? b)
		{
			if ((object)a == b)
			{
				return true;
			}
			if ((object)a == null || (object)b == null)
			{
				return false;
			}
			return a.S1ItemDefinition == b.S1ItemDefinition;
		}

		public static bool operator !=(ItemDefinition? a, ItemDefinition? b)
		{
			if ((object)a == b)
			{
				return false;
			}
			if ((object)a == null || (object)b == null)
			{
				return true;
			}
			return a.S1ItemDefinition != b.S1ItemDefinition;
		}
	}
	public enum LegalStatus
	{
		Legal,
		Illegal
	}
	public class ItemInstance
	{
		internal readonly ItemInstance S1ItemInstance;

		public ItemDefinition Definition => new ItemDefinition(S1ItemInstance.Definition);

		public int Quantity
		{
			get
			{
				return S1ItemInstance.Quantity;
			}
			set
			{
				S1ItemInstance.SetQuantity(value);
			}
		}

		public bool IsStackable => Definition.StackLimit > 1;

		internal ItemInstance(ItemInstance itemInstance)
		{
			S1ItemInstance = itemInstance;
		}
	}
	public static class ItemManager
	{
		public static ItemDefinition GetItemDefinition(string itemID)
		{
			ItemDefinition item = Registry.GetItem(itemID);
			if (CrossType.Is<ProductDefinition>(item, out var result))
			{
				return new ProductDefinition((ItemDefinition)(object)result);
			}
			if (CrossType.Is<CashDefinition>(item, out var result2))
			{
				return new CashDefinition(result2);
			}
			return new ItemDefinition(item);
		}
	}
	public class ItemSlotInstance
	{
		internal readonly ItemSlot S1ItemSlot;

		public int Quantity => S1ItemSlot.Quantity;

		public ItemInstance? ItemInstance
		{
			get
			{
				if (CrossType.Is<ProductItemInstance>(S1ItemSlot.ItemInstance, out var result))
				{
					return new ProductInstance(result);
				}
				if (CrossType.Is<CashInstance>(S1ItemSlot.ItemInstance, out var result2))
				{
					return new CashInstance((ItemInstance)(object)result2);
				}
				if (CrossType.Is<ItemInstance>(S1ItemSlot.ItemInstance, out var result3))
				{
					return new ItemInstance(result3);
				}
				return null;
			}
		}

		internal ItemSlotInstance(ItemSlot itemSlot)
		{
			S1ItemSlot = itemSlot;
		}

		public void AddQuantity(int amount)
		{
			S1ItemSlot.ChangeQuantity(amount, false);
		}
	}
}
namespace S1API.Internal.Utils
{
	public static class ArrayExtensions
	{
		public static T[] AddItemToArray<T>(this T[]? array, T item)
		{
			if (array == null)
			{
				array = Array.Empty<T>();
			}
			Array.Resize(ref array, array.Length + 1);
			array[^1] = item;
			return array;
		}
	}
	public static class ButtonUtils
	{
		public static void AddListener(Button button, Action action)
		{
			if (!((Object)(object)button == (Object)null) && action != null)
			{
				EventHelper.AddListener(action, (UnityEvent)(object)button.onClick);
			}
		}

		public static void RemoveListener(Button button, Action action)
		{
			if (!((Object)(object)button == (Object)null) && action != null)
			{
				EventHelper.RemoveListener(action, (UnityEvent)(object)button.onClick);
			}
		}

		public static void ClearListeners(Button button)
		{
			if (!((Object)(object)button == (Object)null))
			{
				((UnityEventBase)button.onClick).RemoveAllListeners();
			}
		}

		public static void Enable(Button button, Text? label = null, string? text = null)
		{
			if ((Object)(object)button != (Object)null)
			{
				((Selectable)button).interactable = true;
			}
			if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
			{
				label.text = text;
			}
		}

		public static void Disable(Button button, Text? label = null, string? text = null)
		{
			if ((Object)(object)button != (Object)null)
			{
				((Selectable)button).interactable = false;
			}
			if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
			{
				label.text = text;
			}
		}

		public static void SetLabel(Text label, string text)
		{
			if ((Object)(object)label != (Object)null)
			{
				label.text = text;
			}
		}

		public static void SetStyle(Button button, Text label, string text, Color bg)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)button == (Object)null) && !((Object)(object)label == (Object)null))
			{
				label.text = text;
				((Graphic)((Selectable)button).image).color = bg;
			}
		}
	}
	public static class ColorUtils
	{
		public static Color ToColor(this uint hexColor)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return ToColorInternal(hexColor);
		}

		private static Color ToColorInternal(uint hexColor)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)((hexColor >> 24) & 0xFFu) / 255f;
			float num2 = (float)((hexColor >> 16) & 0xFFu) / 255f;
			float num3 = (float)((hexColor >> 8) & 0xFFu) / 255f;
			float num4 = (float)(hexColor & 0xFFu) / 255f;
			return new Color(num2, num3, num4, num);
		}
	}
	internal static class CrossType
	{
		internal static Type Of<T>()
		{
			return typeof(T);
		}

		internal static bool Is<T>(object obj, out T result) where T : class
		{
			if (obj is T val)
			{
				result = val;
				return true;
			}
			result = null;
			return false;
		}

		internal static T As<T>(object obj) where T : class
		{
			return (T)obj;
		}
	}
	public static class ImageUtils
	{
		private static readonly Log _loggerInstance = new Log("ImageUtils");

		public static Sprite? LoadImage(string fileName)
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, fileName);
			if (!File.Exists(text))
			{
				_loggerInstance.Error("❌ Icon file not found: " + text);
				return null;
			}
			try
			{
				byte[] data = File.ReadAllBytes(text);
				return LoadImageRaw(data);
			}
			catch (Exception ex)
			{
				_loggerInstance.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}

		public static Sprite? LoadImageRaw(byte[] data)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, data))
				{
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
			}
			catch (Exception ex)
			{
				_loggerInstance.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}
	}
	public static class RandomUtils
	{
		private static readonly Random SystemRng = new Random();

		public static T PickOne<T>(this IList<T> list)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			return list[Random.Range(0, list.Count)];
		}

		public static T PickUnique<T>(this IList<T> list, Func<T, bool> isDuplicate, int maxTries = 10)
		{
			if (list.Count == 0)
			{
				return default(T);
			}
			for (int i = 0; i < maxTries; i++)
			{
				T val = list.PickOne();
				if (!isDuplicate(val))
				{
					return val;
				}
			}
			return default(T);
		}

		public static List<T> PickMany<T>(this IList<T> list, int count)
		{
			if (list.Count == 0)
			{
				return new List<T>();
			}
			List<T> list2 = new List<T>(list);
			List<T> list3 = new List<T>();
			for (int i = 0; i < count; i++)
			{
				if (list2.Count <= 0)
				{
					break;
				}
				int index = Random.Range(0, list2.Count);
				list3.Add(list2[index]);
				list2.RemoveAt(index);
			}
			return list3;
		}

		public static int RangeInt(int minInclusive, int maxExclusive)
		{
			return SystemRng.Next(minInclusive, maxExclusive);
		}
	}
	internal static class ReflectionUtils
	{
		private static readonly HashSet<Type> _valueTupleTypes = new HashSet<Type>
		{
			typeof(ValueTuple<>),
			typeof(ValueTuple<, >),
			typeof(ValueTuple<, , >),
			typeof(ValueTuple<, , , >),
			typeof(ValueTuple<, , , , >),
			typeof(ValueTuple<, , , , , >),
			typeof(ValueTuple<, , , , , , >),
			typeof(ValueTuple<, , , , , , , >)
		};

		internal static List<Type> GetDerivedClasses<TBaseClass>()
		{
			List<Type> list = new List<Type>();
			Assembly[] array = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
				where !ShouldSkipAssembly(assembly)
				select assembly).ToArray();
			Assembly[] array2 = array;
			foreach (Assembly asm in array2)
			{
				foreach (Type item in SafeGetTypes(asm))
				{
					try
					{
						if (!(item == null) && typeof(TBaseClass).IsAssignableFrom(item) && item != typeof(TBaseClass) && !item.IsAbstract)
						{
							list.Add(item);
						}
					}
					catch (TypeLoadException)
					{
					}
					catch (Exception)
					{
					}
				}
			}
			return list;
		}

		internal static Type? GetTypeByName(string typeName)
		{
			try
			{
				Type type = Type.GetType(typeName, throwOnError: false, ignoreCase: false);
				if (type != null)
				{
					return type;
				}
			}
			catch
			{
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly item in assemblies.Where((Assembly a) => !ShouldSkipAssembly(a)))
			{
				foreach (Type item2 in SafeGetTypes(item))
				{
					if (item2 == null || (!(item2.Name == typeName) && !(item2.FullName == typeName)))
					{
						continue;
					}
					return item2;
				}
			}
			Assembly[] array = assemblies;
			foreach (Assembly asm in array)
			{
				foreach (Type item3 in SafeGetTypes(asm))
				{
					if (item3 == null || (!(item3.Name == typeName) && !(item3.FullName == typeName) && (item3.FullName == null || !item3.FullName.EndsWith("." + typeName))))
					{
						continue;
					}
					return item3;
				}
			}
			return null;
		}

		internal static bool ShouldSkipAssembly(Assembly assembly)
		{
			string fullName = assembly.FullName;
			if (string.IsNullOrEmpty(fullName))
			{
				return false;
			}
			return fullName.StartsWith("System") || fullName.StartsWith("Unity") || fullName.StartsWith("Il2Cpp") || fullName.StartsWith("mscorlib") || fullName.StartsWith("Mono.") || fullName.StartsWith("netstandard") || fullName.StartsWith("com.rlabrecque") || fullName.StartsWith("__Generated");
		}

		internal static IEnumerable<Type> SafeGetTypes(Assembly asm)
		{
			try
			{
				return asm.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type t) => t != null).Cast<Type>();
			}
			catch
			{
				return Array.Empty<Type>();
			}
		}

		internal static FieldInfo[] GetAllFields(Type? type, BindingFlags bindingFlags)
		{
			List<FieldInfo> list = new List<FieldInfo>();
			while (type != null && type != typeof(object))
			{
				list.AddRange(type.GetFields(bindingFlags));
				type = type.BaseType;
			}
			return list.ToArray();
		}

		public static MethodInfo? GetMethod(Type? type, string methodName, BindingFlags bindingFlags)
		{
			while (type != null && type != typeof(object))
			{
				MethodInfo method = type.GetMethod(methodName, bindingFlags);
				if (method != null)
				{
					return method;
				}
				type = type.BaseType;
			}
			return null;
		}

		public static bool IsValueTuple(this object obj)
		{
			if (obj == null)
			{
				return false;
			}
			Type type = obj.GetType();
			if (!type.IsValueType || !type.IsGenericType)
			{
				return false;
			}
			Type genericTypeDefinition = type.GetGenericTypeDefinition();
			return _valueTupleTypes.Contains(genericTypeDefinition);
		}

		public static object[]? GetValueTupleItems(this object obj)
		{
			object obj2 = obj;
			if (!obj2.IsValueTuple())
			{
				return null;
			}
			FieldInfo[] allFields = GetAllFields(obj2.GetType(), BindingFlags.Instance | BindingFlags.Public);
			if (allFields == null || allFields.Length == 0)
			{
				return null;
			}
			return allFields.Select((FieldInfo f) => f.GetValue(obj2)).ToArray();
		}
	}
	public static class ToggleUtils
	{
		private static FieldInfo? _onValueChangedField;

		private static PropertyInfo? _onValueChangedProperty;

		private static FieldInfo? _graphicField;

		private static PropertyInfo? _graphicProperty;

		public static void AddListener(Toggle toggle, Action<bool> listener)
		{
			if (!((Object)(object)toggle == (Object)null) && listener != null && TryGetOnValueChanged(toggle, out UnityEvent<bool> evt) && evt != null)
			{
				EventHelper.AddListener(listener, evt);
			}
		}

		public static void RemoveListener(Toggle toggle, Action<bool> listener)
		{
			if (!((Object)(object)toggle == (Object)null) && listener != null && TryGetOnValueChanged(toggle, out UnityEvent<bool> evt) && evt != null)
			{
				EventHelper.RemoveListener(listener, evt);
			}
		}

		public static void ClearListeners(Toggle toggle)
		{
			if (TryGetOnValueChanged(toggle, out UnityEvent<bool> evt) && evt != null)
			{
				((UnityEventBase)evt).RemoveAllListeners();
			}
		}

		private static bool TryGetOnValueChanged(Toggle toggle, out UnityEvent<bool>? evt)
		{
			evt = null;
			if ((object)_onValueChangedField == null)
			{
				_onValueChangedField = typeof(Toggle).GetField("onValueChanged", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			}
			if (_onValueChangedField != null && _onValueChangedField.GetValue(toggle) is UnityEvent<bool> val)
			{
				evt = val;
				return true;
			}
			if ((object)_onValueChangedProperty == null)