Decompiled source of SaveSlotsPlus v2.1.0

SaveSlotsPlus/SaveSlotsPlus.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SaveSlotsPlus")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("raddude")]
[assembly: AssemblyProduct("SaveSlotsPlus")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(true)]
[assembly: Guid("071994df-c696-4ece-ad36-48d4036214b5")]
[assembly: AssemblyFileVersion("2.1.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.1.0.0")]
[module: UnverifiableCode]
namespace SaveSlotsPlus;

internal class Configs
{
	internal static ConfigEntry<int> numPages;

	internal static ConfigEntry<KeyCode> altClickKey;

	internal static void InitializeConfigs()
	{
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Expected O, but got Unknown
		ConfigFile config = ((BaseUnityPlugin)SSP_Plugin.Instance).Config;
		numPages = config.Bind<int>("Settings", "Number of save slot pages<br>(must restart game)", 3, new ConfigDescription("The number of pages of save slots. Each page has 6 slots.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
		altClickKey = config.Bind<KeyCode>("Settings", "Alt Click Key", (KeyCode)324, "Key to click on a save slot to open the file menu.");
	}
}
internal static class Extensions
{
	public static T GetPrivateField<T>(this object obj, string field)
	{
		return (T)Traverse.Create(obj).Field(field).GetValue();
	}

	public static void SetPrivateField(this object obj, string field, object value)
	{
		Traverse.Create(obj).Field(field).SetValue(value);
	}

	public static void SetPrivateField<T>(string field, object value)
	{
		Traverse.Create(typeof(T)).Field(field).SetValue(value);
	}

	public static object InvokePrivateMethod(this object obj, string method, params object[] parameters)
	{
		return AccessTools.Method(obj.GetType(), method, (Type[])null, (Type[])null).Invoke(obj, parameters);
	}
}
internal class FileMenu
{
	private static int _showingListFor = -1;

	private static int _copySlotNum = -1;

	private static bool _awaitingDeleteConfirm = false;

	internal static SaveNameInput SaveNameInputText { get; set; }

	internal static void SetShowingListFor(int slotNum)
	{
		_showingListFor = slotNum;
	}

	internal static void RenameButtonClicked()
	{
		SSP_Plugin.LogDebug($"Rename button clicked for slot {_showingListFor}");
		if (SaveSlots.slotsActive[_showingListFor])
		{
			SaveSlotsUI.ShowRenameInput();
			SSP_Plugin.LogDebug($"Showing rename input for slot {_showingListFor}");
		}
	}

	internal static void ConfirmRenameButtonClicked()
	{
		SSP_Plugin.LogDebug($"Confirm rename button clicked for slot {_showingListFor}");
		SaveNameInputText.SaveName(_showingListFor);
		Paginator.RefreshSlot(_showingListFor);
		SaveSlotsUI.HideRenameInput();
		SSP_Plugin.LogInfo($"Renamed slot {_showingListFor}");
	}

	internal static void CopyButtonClicked()
	{
		SSP_Plugin.LogDebug($"Copy button clicked for slot {_showingListFor}");
		if (SaveSlots.slotsActive[_showingListFor])
		{
			_copySlotNum = _showingListFor;
			SaveSlotsUI.HideFileMenu();
			SSP_Plugin.LogInfo($"Set slot {_copySlotNum} to be copied");
		}
	}

	internal static void PasteButtonClicked()
	{
		SSP_Plugin.LogDebug($"Paste button clicked for slot {_showingListFor} with copy slot {_copySlotNum}");
		if (File.Exists(SlotPath.SlotSavePath(_showingListFor)) || _copySlotNum <= -1)
		{
			return;
		}
		TryCopy(SlotPath.SlotSavePath(_copySlotNum), SlotPath.SlotSavePath(_showingListFor));
		TryCopy(SlotPath.SlotScreenshotPath(_copySlotNum), SlotPath.SlotScreenshotPath(_showingListFor));
		TryCopy(SlotPath.SlotMetaPath(_copySlotNum), SlotPath.SlotMetaPath(_showingListFor));
		for (int i = 1; i <= 5; i++)
		{
			TryCopy(SlotPath.SlotBackupPath(_copySlotNum, i), SlotPath.SlotBackupPath(_showingListFor, i));
		}
		string path = SlotPath.SlotModSavesDirPath(_copySlotNum);
		string text = SlotPath.SlotModSavesDirPath(_showingListFor);
		if (Directory.Exists(path))
		{
			Directory.CreateDirectory(text);
			string[] files = Directory.GetFiles(path);
			foreach (string text2 in files)
			{
				string destFileName = Path.Combine(text, Path.GetFileName(text2));
				File.Copy(text2, destFileName, overwrite: true);
			}
		}
		SaveSlots.slotsActive[_showingListFor] = true;
		SaveSlots.activeSlotsCount = Array.FindAll(SaveSlots.slotsActive, (bool s) => s).Length;
		Paginator.RefreshSlot(_showingListFor);
		SaveSlotsUI.CopyMaterial(_copySlotNum, _showingListFor);
		SaveSlotsUI.HideFileMenu();
		SSP_Plugin.LogInfo($"Copied slot {_copySlotNum} to slot {_showingListFor}");
	}

	internal static void DeleteButtonClicked()
	{
		SSP_Plugin.LogDebug($"Delete button clicked for slot {_showingListFor}");
		if (SaveSlots.slotsActive[_showingListFor])
		{
			if (!_awaitingDeleteConfirm)
			{
				_awaitingDeleteConfirm = true;
			}
			SaveSlotsUI.EnableConfirmDeleteButton();
			SSP_Plugin.LogDebug($"Enabled confirm delete button for slot {_showingListFor}");
		}
	}

	internal static void DeleteButtonConfirmClicked()
	{
		SSP_Plugin.LogDebug($"Confirm delete button clicked for slot {_showingListFor}");
		if (_awaitingDeleteConfirm)
		{
			TryDelete(SlotPath.SlotSavePath(_showingListFor));
			TryDelete(SlotPath.SlotScreenshotPath(_showingListFor));
			TryDelete(SlotPath.SlotMetaPath(_showingListFor));
			for (int i = 1; i <= 5; i++)
			{
				TryDelete(SlotPath.SlotBackupPath(_showingListFor, i));
			}
			string path = SlotPath.SlotModSavesDirPath(_showingListFor);
			if (Directory.Exists(path))
			{
				Directory.Delete(path, recursive: true);
			}
			SaveSlots.slotsActive[_showingListFor] = false;
			SaveSlots.activeSlotsCount = Array.FindAll(SaveSlots.slotsActive, (bool s) => s).Length;
			Paginator.RefreshSlot(_showingListFor);
			SaveSlotsUI.ResetMaterial(_showingListFor);
			SaveSlotsUI.HideFileMenu();
			SSP_Plugin.LogInfo($"Deleted slot {_showingListFor}");
		}
	}

	private static void TryCopy(string from, string to)
	{
		if (File.Exists(from))
		{
			File.Copy(from, to, overwrite: true);
		}
	}

	private static void TryDelete(string path)
	{
		if (File.Exists(path))
		{
			File.Delete(path);
		}
	}

	internal static void ClearAwaitingDeleteConfirm()
	{
		_awaitingDeleteConfirm = false;
	}

	internal static void ResetCopySlotNum()
	{
		_copySlotNum = -1;
	}
}
[BepInPlugin("com.raddude82.saveslotsplus", "SaveSlotsPlus", "2.1.0")]
public class SSP_Plugin : BaseUnityPlugin
{
	public const string PLUGIN_GUID = "com.raddude82.saveslotsplus";

	public const string PLUGIN_NAME = "SaveSlotsPlus";

	public const string PLUGIN_VERSION = "2.1.0";

	private static ManualLogSource _logger;

	internal static SSP_Plugin Instance { get; private set; }

	internal static void LogDebug(string message)
	{
		_logger.LogDebug((object)message);
	}

	internal static void LogInfo(string message)
	{
		_logger.LogInfo((object)message);
	}

	internal static void LogWarning(string message)
	{
		_logger.LogWarning((object)message);
	}

	internal static void LogError(string message)
	{
		_logger.LogError((object)message);
	}

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
			return;
		}
		Instance = this;
		_logger = ((BaseUnityPlugin)this).Logger;
		Configs.InitializeConfigs();
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.raddude82.saveslotsplus");
	}
}
internal class NewGamePatches
{
	[HarmonyPatch(typeof(StartMenu))]
	private class StartMenuNewGamePatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void OnShowChooseIslandUI(GameObject ___chooseIslandUI)
		{
			NewGameUI.InitializeUI(___chooseIslandUI.transform);
		}

		[HarmonyPrefix]
		[HarmonyPatch("ButtonClick", new Type[] { typeof(StartMenuButtonType) })]
		public static bool ButtonClickPatch(StartMenuButtonType button)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			if ((int)button == 0)
			{
				SaveGameInputText.Activate();
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("StartNewGame")]
		public static bool StartNewGame(GameObject ___chooseIslandUI)
		{
			SaveNameInput componentInChildren = ___chooseIslandUI.GetComponentInChildren<SaveNameInput>();
			componentInChildren.SaveName(SaveSlots.currentSlot);
			return true;
		}
	}

	internal static SaveNameInput SaveGameInputText { get; set; }
}
internal class NewGameUI
{
	internal static void InitializeUI(Transform chooseIslandUI)
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: 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_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
		Transform child = chooseIslandUI.GetChild(0);
		child.localPosition = new Vector3(0f, -0.449f, 0.07f);
		child.localScale = new Vector3(1.32f, 1.32f, 1.38f);
		chooseIslandUI.GetChild(2).localPosition = new Vector3(-0.005f, -0.361f, 0.037f);
		chooseIslandUI.GetChild(4).localPosition = new Vector3(-0.7f, -0.361f, 0.038f);
		chooseIslandUI.GetChild(6).localPosition = new Vector3(0.7f, -0.361f, 0.038f);
		chooseIslandUI.GetChild(5).localPosition = new Vector3(-0.005f, -0.716f, 0.037f);
		Transform child2 = chooseIslandUI.GetChild(3);
		child2.localPosition = new Vector3(-0.022f, -0.119f, 0.037f);
		Transform child3 = chooseIslandUI.GetChild(7);
		Transform val = Object.Instantiate<Transform>(child2, child3);
		((Object)val).name = "label";
		((Component)val).transform.localPosition = new Vector3(0f, 0f, 0.1f);
		((Component)val).transform.localEulerAngles = new Vector3(0f, 270f, 270f);
		((Component)val).transform.localScale = new Vector3(0.0194f, 0.0354f, 0.0194f);
		TextMesh component = ((Component)val).GetComponent<TextMesh>();
		component.text = "name your save:";
		component.anchor = (TextAnchor)4;
		component.alignment = (TextAlignment)1;
		Transform val2 = Object.Instantiate<Transform>(child2, child3);
		((Object)val2).name = "input text";
		((Component)val2).transform.localPosition = new Vector3(0f, 0f, -0.1f);
		((Component)val2).transform.localEulerAngles = new Vector3(0f, 270f, 270f);
		((Component)val2).transform.localScale = new Vector3(0.0194f, 0.0354f, 0.0194f);
		TextMesh component2 = ((Component)val2).GetComponent<TextMesh>();
		component2.text = "";
		component2.anchor = (TextAnchor)4;
		component2.alignment = (TextAlignment)1;
		component2.fontStyle = (FontStyle)0;
		NewGamePatches.SaveGameInputText = ((Component)child3).gameObject.AddComponent<SaveNameInput>();
		NewGamePatches.SaveGameInputText.displayMesh = component2;
	}
}
internal class Paginator
{
	internal const int SLOTS_PER_PAGE = 6;

	private static int _currentPage = 0;

	private static readonly List<GameObject> _allSlotRoots = new List<GameObject>();

	private static BackupSavesListUI _backUpSavesListUI;

	public static void AddMoreSaveSlots(BackupSavesListUI backupSavesListUI, StartMenuButton[] existingButtons)
	{
		_backUpSavesListUI = backupSavesListUI;
		List<StartMenuButton> list = (from b in existingButtons
			where (int)b.GetPrivateField<StartMenuButtonType>("type") == 8
			orderby b.saveSlot
			select b).ToList();
		foreach (StartMenuButton item in list)
		{
			_allSlotRoots.Add(((Component)((Component)item).transform.parent).gameObject);
		}
		for (int num = 6; num < 6 * Configs.numPages.Value; num++)
		{
			int index = num % 6;
			GameObject val = _allSlotRoots[index];
			GameObject val2 = Object.Instantiate<GameObject>(val, val.transform.parent);
			((Object)val2).name = $"SaveSlot_{num}";
			StartMenuButton componentInChildren = val2.GetComponentInChildren<StartMenuButton>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				componentInChildren.saveSlot = num;
			}
			val2.SetActive(false);
			_allSlotRoots.Add(val2);
		}
	}

	public static void RefreshSlotText(StartMenuButton btn)
	{
		if (SaveSlots.slotsActive != null && btn.saveSlot < SaveSlots.slotsActive.Length && SaveSlots.slotsActive[btn.saveSlot])
		{
			string text = ((Component)((Component)btn).transform.parent.GetChild(1)).GetComponent<TextMesh>().text;
			string text2 = SaveNameInput.LoadName(btn.saveSlot);
			string buttonText = ((text2 != null) ? (text2 + "\n" + text) : text);
			btn.SetButtonText(buttonText);
		}
		else
		{
			btn.SetButtonText("(empty)");
		}
	}

	public static void PreviousButtonClicked()
	{
		SaveSlotsUI.HideFileMenu();
		SaveSlotsUI.HideRenameInput();
		_backUpSavesListUI.HideList();
		_currentPage = Mathf.Max(0, _currentPage - 1);
		SaveSlotsUI.SetChangePageTextColor((StartMenuButtonType)13, isActive: true, changeBoth: true);
		if (_currentPage == 0)
		{
			SaveSlotsUI.SetChangePageTextColor((StartMenuButtonType)13, isActive: false);
		}
		SaveSlotsUI.UpdatePageNumText(_currentPage);
		ShowPage(_currentPage);
		SSP_Plugin.LogDebug($"Previous button clicked, showing page {_currentPage + 1}");
	}

	public static void NextButtonClicked()
	{
		SaveSlotsUI.HideFileMenu();
		SaveSlotsUI.HideRenameInput();
		_backUpSavesListUI.HideList();
		_currentPage = Mathf.Min(Configs.numPages.Value - 1, _currentPage + 1);
		SaveSlotsUI.SetChangePageTextColor((StartMenuButtonType)14, isActive: true, changeBoth: true);
		if (_currentPage == Configs.numPages.Value - 1)
		{
			SaveSlotsUI.SetChangePageTextColor((StartMenuButtonType)14, isActive: false);
		}
		SaveSlotsUI.UpdatePageNumText(_currentPage);
		ShowPage(_currentPage);
		SSP_Plugin.LogDebug($"Next button clicked, showing page {_currentPage + 1}");
	}

	private static void ShowPage(int page)
	{
		foreach (GameObject allSlotRoot in _allSlotRoots)
		{
			allSlotRoot.SetActive(false);
		}
		_currentPage = page;
		int num = page * 6;
		int num2 = Mathf.Min(num + 6, 6 * Configs.numPages.Value);
		for (int i = num; i < num2; i++)
		{
			_allSlotRoots[i].SetActive(true);
		}
	}

	internal static void RefreshSlot(int slot)
	{
		StartMenuButton startMenuButtonForSlot = GetStartMenuButtonForSlot(slot);
		if ((Object)(object)startMenuButtonForSlot != (Object)null)
		{
			DateTime lastWriteTime = File.GetLastWriteTime(SaveSlots.GetSlotSavePath(slot));
			string buttonText = $"{lastWriteTime:t}\n{lastWriteTime:d}";
			startMenuButtonForSlot.SetButtonText(buttonText);
		}
		RefreshSlotText(startMenuButtonForSlot);
	}

	internal static StartMenuButton GetStartMenuButtonForSlot(int slot)
	{
		if (slot < _allSlotRoots.Count)
		{
			return _allSlotRoots[slot].GetComponentInChildren<StartMenuButton>();
		}
		return null;
	}
}
internal class SaveMenuPatches
{
	[HarmonyPatch(typeof(SaveSlots), "Awake")]
	private class SaveSlotsPatches
	{
		public static bool Prefix()
		{
			SaveSlots.slotsActive = new bool[6 * Configs.numPages.Value];
			for (int i = 0; i < SaveSlots.slotsActive.Length; i++)
			{
				SaveSlots.currentSlot = i;
				if (File.Exists(SaveSlots.GetCurrentSavePath()))
				{
					SaveSlots.slotsActive[i] = true;
					SaveSlots.activeSlotsCount++;
				}
			}
			SSP_Plugin.LogDebug("SaveSlots: activeSlotsCount is " + SaveSlots.activeSlotsCount);
			return false;
		}
	}

	[HarmonyPatch(typeof(StartMenu))]
	private class StartMenuPatches
	{
		[HarmonyBefore(new string[] { "com.nandbrew.nandtweaks" })]
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void InitializeSaveSlotsUI(StartMenu __instance, GameObject ___saveSlotUI)
		{
			SaveSlotsUI.InitializeUI(___saveSlotUI, __instance.backupSavesUI);
			Paginator.AddMoreSaveSlots(__instance.backupSavesUI, ___saveSlotUI.GetComponentsInChildren<StartMenuButton>(true));
		}

		[HarmonyPostfix]
		[HarmonyPatch("EnableSlotMenu")]
		public static void GetLabelText(GameObject ___saveSlotUI)
		{
			if ((Object)(object)_nandTweaksLabelText == (Object)null)
			{
				_nandTweaksLabelText = ((Component)___saveSlotUI.transform.Find("label text")).GetComponent<TextMesh>();
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("ButtonClick", new Type[] { typeof(StartMenuButtonType) })]
		public static bool ButtonClickPatch(StartMenuButtonType button, GameObject ___saveSlotUI)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Invalid comparison between Unknown and I4
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Invalid comparison between Unknown and I4
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Invalid comparison between Unknown and I4
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Invalid comparison between Unknown and I4
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Invalid comparison between Unknown and I4
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Invalid comparison between Unknown and I4
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Invalid comparison between Unknown and I4
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Invalid comparison between Unknown and I4
			if ((int)button == 13)
			{
				Paginator.PreviousButtonClicked();
			}
			else if ((int)button == 14)
			{
				Paginator.NextButtonClicked();
			}
			else if ((int)button == 15)
			{
				FileMenu.RenameButtonClicked();
			}
			else if ((int)button == 17)
			{
				FileMenu.CopyButtonClicked();
				SaveSlotsUI.CopyButtonClicked();
			}
			else if ((int)button == 18)
			{
				FileMenu.PasteButtonClicked();
			}
			else if ((int)button == 19)
			{
				FileMenu.DeleteButtonClicked();
			}
			else if ((int)button == 20)
			{
				FileMenu.DeleteButtonConfirmClicked();
			}
			else
			{
				if ((int)button != 16)
				{
					if ((int)button == 3)
					{
						FileMenu.ClearAwaitingDeleteConfirm();
						FileMenu.ResetCopySlotNum();
						SaveSlotsUI.ClearCopyClicked();
						SaveSlotsUI.HideFileMenu();
						SaveSlotsUI.HideRenameInput();
						return true;
					}
					return true;
				}
				FileMenu.ConfirmRenameButtonClicked();
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(StartMenuButton))]
	private class StartMenuButtonPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		public static void AwakePatch(StartMenuButton __instance, StartMenuButtonType ___type)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			if ((int)___type == 8)
			{
				Paginator.RefreshSlotText(__instance);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("ExtraLateUpdate")]
		public static void ExtraLateUpdatePatch(StartMenuButton __instance)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Invalid comparison between Unknown and I4
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			if ((int)__instance.GetPrivateField<StartMenuButtonType>("type") == 8 && __instance.GetPrivateField<bool>("isLookedAt") && Input.GetKeyDown(Configs.altClickKey.Value))
			{
				SaveSlotsUI.ToggleFileMenu(__instance);
			}
		}
	}

	[HarmonyPatch(typeof(BackupSavesListUI))]
	private class BackupSavesListUIPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("ShowList")]
		public static bool ShowList(StartMenuButton parentSlotButton, BackupSavesListUI __instance, ref int ___showingListFor)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			if (___showingListFor == parentSlotButton.saveSlot)
			{
				return false;
			}
			SaveSlotsUI.HideFileMenu();
			SaveSlotsUI.HideRenameInput();
			FileMenu.ClearAwaitingDeleteConfirm();
			FileMenu.SetShowingListFor(parentSlotButton.saveSlot);
			___showingListFor = parentSlotButton.saveSlot;
			bool active = false;
			((Component)__instance).transform.position = ((Component)parentSlotButton).transform.parent.position;
			if (parentSlotButton.saveSlot % 6 <= 2)
			{
				((Component)__instance).transform.Translate(Vector3.up * __instance.topRowOffset);
			}
			StartMenuButton[] buttons = __instance.buttons;
			StartMenuButton[] array = buttons;
			foreach (StartMenuButton val in array)
			{
				string backupPath = SaveSlots.GetBackupPath(parentSlotButton.saveSlot, val.saveSlot);
				if (File.Exists(backupPath))
				{
					active = true;
					DateTime lastWriteTime = File.GetLastWriteTime(backupPath);
					string buttonText = lastWriteTime.ToShortTimeString() + "\n" + lastWriteTime.ToShortDateString();
					val.SetButtonText(buttonText);
					((Component)((Component)val).transform.parent).gameObject.SetActive(true);
				}
				else
				{
					((Component)((Component)val).transform.parent).gameObject.SetActive(false);
				}
			}
			((Component)__instance.list).gameObject.SetActive(active);
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch("Update")]
		public static bool Update(BackupSavesListUI __instance, int ___showingListFor, Vector3 ___backButtonInitialPos, Vector3 ___backButtonAltPos)
		{
			//IL_007d: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: 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)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance.currentLookedAtSlot == (Object)null))
			{
				__instance.ShowList(__instance.currentLookedAtSlot);
			}
			Vector3 val;
			if (___showingListFor % 6 == 4 && (((Component)__instance.list).gameObject.activeInHierarchy || ((Component)SaveSlotsUI.FileMenuList).gameObject.activeInHierarchy))
			{
				((Component)SaveSlotsUI.PageNumTextMesh).gameObject.SetActive(false);
				val = ___backButtonAltPos;
			}
			else
			{
				((Component)SaveSlotsUI.PageNumTextMesh).gameObject.SetActive(true);
				val = ___backButtonInitialPos;
			}
			__instance.backButton.parent.localPosition = Vector3.Lerp(__instance.backButton.parent.localPosition, val, Time.deltaTime * 8f);
			if (___showingListFor % 6 == 1 && (((Component)__instance.list).gameObject.activeInHierarchy || ((Component)SaveSlotsUI.FileMenuList).gameObject.activeInHierarchy))
			{
				__instance.chooseSlotText.SetActive(false);
				if ((Object)(object)_nandTweaksLabelText != (Object)null && _nandTweaksLabelText.text != "")
				{
					_nandTweaksLabelText.text = "";
				}
			}
			else
			{
				__instance.chooseSlotText.SetActive(true);
				if ((Object)(object)_nandTweaksLabelText != (Object)null && _nandTweaksLabelText.text != "Continue")
				{
					_nandTweaksLabelText.text = "Continue";
				}
			}
			return false;
		}
	}

	private static TextMesh _nandTweaksLabelText;
}
internal class SaveNameInput : MonoBehaviour
{
	private const int MAX_LENGTH = 13;

	private const float CURSOR_BLINK_RATE = 0.5f;

	internal TextMesh displayMesh;

	private string _currentText = "";

	private int _cursorPos = 0;

	private float _cursorTimer = 0f;

	private bool _showCursor = true;

	private bool _isActive = false;

	private void Update()
	{
		if (!_isActive)
		{
			return;
		}
		if (Input.GetKeyDown((KeyCode)276))
		{
			_cursorPos = Mathf.Max(0, _cursorPos - 1);
			ResetCursorBlink();
		}
		else if (Input.GetKeyDown((KeyCode)275))
		{
			_cursorPos = Mathf.Min(_currentText.Length, _cursorPos + 1);
			ResetCursorBlink();
		}
		string inputString = Input.inputString;
		for (int i = 0; i < inputString.Length; i++)
		{
			char c = inputString[i];
			if (c == '\b')
			{
				if (_cursorPos > 0)
				{
					_currentText = _currentText.Remove(_cursorPos - 1, 1);
					_cursorPos--;
					ResetCursorBlink();
				}
			}
			else if (_currentText.Length < 13)
			{
				_currentText = _currentText.Insert(_cursorPos, c.ToString());
				_cursorPos++;
				ResetCursorBlink();
			}
		}
		_cursorTimer += Time.deltaTime;
		if (_cursorTimer >= 0.5f)
		{
			_showCursor = !_showCursor;
			_cursorTimer = 0f;
		}
		UpdateDisplay();
	}

	private void UpdateDisplay()
	{
		if (!((Object)(object)displayMesh == (Object)null) && _isActive)
		{
			string text = _currentText.Substring(0, _cursorPos);
			string text2 = _currentText.Substring(_cursorPos);
			displayMesh.text = text + (_showCursor ? "|" : " ") + text2;
		}
	}

	private void ResetCursorBlink()
	{
		_showCursor = true;
		_cursorTimer = 0f;
		UpdateDisplay();
	}

	internal void Activate()
	{
		_currentText = "";
		_isActive = true;
		_showCursor = true;
		_cursorTimer = 0f;
		_cursorPos = 0;
		if ((Object)(object)displayMesh != (Object)null)
		{
			displayMesh.text = _currentText;
		}
	}

	internal void Deactivate()
	{
		_isActive = false;
		_showCursor = false;
	}

	internal void SaveName(int slot)
	{
		string text = _currentText.Trim();
		if (!string.IsNullOrWhiteSpace(text))
		{
			File.WriteAllText(SlotPath.SlotMetaPath(slot), text.Trim());
			SSP_Plugin.LogInfo($"Saved name '{text}' for slot {slot}");
		}
	}

	internal static string LoadName(int slot)
	{
		string path = SlotPath.SlotMetaPath(slot);
		if (File.Exists(path))
		{
			return File.ReadAllText(path).Trim();
		}
		return null;
	}
}
internal class SaveSlotsUI
{
	internal const StartMenuButtonType PREVIOUS_BUTTON = (StartMenuButtonType)13;

	internal const StartMenuButtonType NEXT_BUTTON = (StartMenuButtonType)14;

	internal const StartMenuButtonType RENAME_BUTTON = (StartMenuButtonType)15;

	internal const StartMenuButtonType CONFIRM_RENAME_BUTTON = (StartMenuButtonType)16;

	internal const StartMenuButtonType COPY_BUTTON = (StartMenuButtonType)17;

	internal const StartMenuButtonType PASTE_BUTTON = (StartMenuButtonType)18;

	internal const StartMenuButtonType DELETE_BUTTON = (StartMenuButtonType)19;

	internal const StartMenuButtonType CONFIRM_DELETE_BUTTON = (StartMenuButtonType)20;

	private static Transform _renameScroll;

	private static Transform _confirmRenameButton;

	private static Transform _previousButton;

	private static Transform _nextButton;

	private static bool _fileMenuShowing = false;

	private static Transform _list = null;

	private static bool _listWasInactive = false;

	private static bool _copyClicked = false;

	private static readonly Color32 ACTIVE_COLOR = new Color32((byte)17, (byte)17, (byte)19, byte.MaxValue);

	private static readonly Color32 INACTIVE_COLOR = new Color32((byte)17, (byte)17, (byte)19, (byte)102);

	private static Material _originalSlotButtonMaterial;

	private const int ORIGINAL_FONT_SIZE = 50;

	private static readonly Vector3 ORIGINAL_FONT_POSITION = new Vector3(0f, 0.0225f, 0.004f);

	internal static TextMesh PageNumTextMesh { get; private set; }

	internal static Transform FileMenuList { get; private set; }

	internal static void InitializeUI(GameObject saveSlotUI, BackupSavesListUI backupSavesUI)
	{
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0176: Unknown result type (might be due to invalid IL or missing references)
		//IL_0195: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_0277: Unknown result type (might be due to invalid IL or missing references)
		//IL_0296: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_037e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0399: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0420: Unknown result type (might be due to invalid IL or missing references)
		//IL_0444: Unknown result type (might be due to invalid IL or missing references)
		//IL_047f: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0524: Unknown result type (might be due to invalid IL or missing references)
		//IL_0545: Unknown result type (might be due to invalid IL or missing references)
		//IL_0566: Unknown result type (might be due to invalid IL or missing references)
		_originalSlotButtonMaterial = ((Renderer)((Component)saveSlotUI.transform.GetChild(2).GetChild(0)).GetComponent<MeshRenderer>()).material;
		saveSlotUI.transform.GetChild(12).localPosition = new Vector3(1.157f, 1.12f, 0.033f);
		_previousButton = Object.Instantiate<Transform>(saveSlotUI.transform.GetChild(10), saveSlotUI.transform);
		((Object)_previousButton).name = "previous button";
		_previousButton.localPosition = new Vector3(-1.45f, 0.5f, 0f);
		_previousButton.localEulerAngles = new Vector3(0f, 180f, 0f);
		_previousButton.localScale = new Vector3(1f, 1f, 1f);
		((Component)_previousButton.GetChild(1)).GetComponent<TextMesh>().text = "previous";
		((Component)_previousButton.GetChild(2)).GetComponent<TextMesh>().text = "←";
		((Component)_previousButton.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)13);
		SetChangePageTextColor((StartMenuButtonType)13, isActive: false);
		_nextButton = Object.Instantiate<Transform>(saveSlotUI.transform.GetChild(10), saveSlotUI.transform);
		((Object)_nextButton).name = "next button";
		_nextButton.localPosition = new Vector3(1.45f, 0.5f, 0f);
		_nextButton.localEulerAngles = new Vector3(0f, 180f, 0f);
		_nextButton.localScale = new Vector3(1f, 1f, 1f);
		((Component)_nextButton.GetChild(1)).GetComponent<TextMesh>().text = "next";
		((Component)_nextButton.GetChild(2)).GetComponent<TextMesh>().text = "→";
		((Component)_nextButton.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)14);
		_confirmRenameButton = Object.Instantiate<Transform>(saveSlotUI.transform.GetChild(10), saveSlotUI.transform);
		((Object)_confirmRenameButton).name = "confirm rename button";
		_confirmRenameButton.localPosition = new Vector3(0f, -0.2f, 0f);
		_confirmRenameButton.localEulerAngles = new Vector3(0f, 180f, 0f);
		_confirmRenameButton.localScale = new Vector3(0.9f, 0.9f, 0.9f);
		Transform child = _confirmRenameButton.GetChild(2);
		child.localScale = new Vector3(0.0135f, 0.0135f, 0.0135f);
		child.localPosition = new Vector3(0.0028f, 0.025f, 0.0009f);
		TextMesh component = ((Component)child).GetComponent<TextMesh>();
		component.text = "confirm\nrename";
		component.fontSize = 60;
		((Component)_confirmRenameButton.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)16);
		Object.Destroy((Object)(object)((Component)_confirmRenameButton.GetChild(1)).gameObject);
		((Component)_confirmRenameButton).gameObject.SetActive(false);
		Transform child2 = saveSlotUI.transform.GetChild(3);
		Transform val = Object.Instantiate<Transform>(child2, saveSlotUI.transform);
		((Object)val).name = "page num text";
		val.localPosition = new Vector3(0f, 0.5f, 0f);
		val.localEulerAngles = new Vector3(0f, 0f, 0f);
		val.localScale = new Vector3(0.0165f, 0.0177f, 0.0177f);
		PageNumTextMesh = ((Component)val).GetComponent<TextMesh>();
		PageNumTextMesh.text = "page 1";
		_renameScroll = Object.Instantiate<Transform>(saveSlotUI.transform.GetChild(0), saveSlotUI.transform);
		((Object)_renameScroll).name = "bg rename";
		((Component)_renameScroll).transform.localScale = new Vector3(0.6f, 4f, 0.42f);
		((Component)_renameScroll).transform.localPosition = new Vector3(0.15f, 0.087f, 0.06f);
		Transform val2 = Object.Instantiate<Transform>(child2, _renameScroll);
		((Object)val2).name = "label";
		((Component)val2).transform.localPosition = new Vector3(-0.17f, 0.04f, 0.1f);
		((Component)val2).transform.localEulerAngles = new Vector3(0f, 180f, 270f);
		((Component)val2).transform.localScale = new Vector3(0.004f, 0.035f, 0.0194f);
		TextMesh component2 = ((Component)val2).GetComponent<TextMesh>();
		component2.text = "name your save:";
		component2.anchor = (TextAnchor)4;
		component2.alignment = (TextAlignment)1;
		Transform val3 = Object.Instantiate<Transform>(child2, _renameScroll);
		((Object)val3).name = "input text";
		((Component)val3).transform.localPosition = new Vector3(0.05f, 0.04f, 0.1f);
		((Component)val3).transform.localEulerAngles = new Vector3(0f, 180f, 270f);
		((Component)val3).transform.localScale = new Vector3(0.005f, 0.035f, 0.0194f);
		TextMesh component3 = ((Component)val3).GetComponent<TextMesh>();
		component3.text = "";
		component3.anchor = (TextAnchor)4;
		component3.alignment = (TextAlignment)1;
		component3.fontStyle = (FontStyle)0;
		FileMenu.SaveNameInputText = ((Component)_renameScroll).gameObject.AddComponent<SaveNameInput>();
		FileMenu.SaveNameInputText.displayMesh = component3;
		((Component)_renameScroll).gameObject.SetActive(false);
		FileMenuList = Object.Instantiate<Transform>(backupSavesUI.list, backupSavesUI.list.parent);
		((Object)FileMenuList).name = "file menu list";
		((Component)FileMenuList.GetChild(6)).GetComponent<TextMesh>().text = "file menu";
		Transform child3 = FileMenuList.GetChild(0);
		((Object)child3).name = "rename button";
		((Component)child3.GetChild(1)).GetComponent<TextMesh>().text = "rename";
		((Component)child3.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)15);
		Transform child4 = FileMenuList.GetChild(1);
		((Object)child4).name = "copy button";
		((Component)child4.GetChild(1)).GetComponent<TextMesh>().text = "copy";
		((Component)child4.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)17);
		Transform child5 = FileMenuList.GetChild(2);
		((Object)child5).name = "paste button";
		((Component)child5.GetChild(1)).GetComponent<TextMesh>().text = "paste";
		((Component)child5.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)18);
		Transform child6 = FileMenuList.GetChild(3);
		((Object)child6).name = "delete button";
		((Component)child6.GetChild(1)).GetComponent<TextMesh>().text = "delete";
		((Component)child6.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)19);
		Transform child7 = FileMenuList.GetChild(4);
		((Object)child7).name = "confirm delete button";
		((Component)child7.GetChild(1)).GetComponent<TextMesh>().text = "confirm\ndelete";
		((Component)child7.GetChild(0)).GetComponent<StartMenuButton>().SetPrivateField("type", (object)(StartMenuButtonType)20);
	}

	internal static void ShowRenameInput()
	{
		((Component)_renameScroll).gameObject.SetActive(true);
		FileMenu.SaveNameInputText.Activate();
		((Component)_confirmRenameButton).gameObject.SetActive(true);
		HideFileMenu();
	}

	internal static void HideRenameInput()
	{
		((Component)_renameScroll).gameObject.SetActive(false);
		FileMenu.SaveNameInputText.Deactivate();
		((Component)_confirmRenameButton).gameObject.SetActive(false);
	}

	internal static void HideFileMenu()
	{
		_fileMenuShowing = false;
		_listWasInactive = false;
		((Component)FileMenuList).gameObject.SetActive(false);
	}

	internal static void ToggleFileMenu(StartMenuButton startMenuButton)
	{
		SSP_Plugin.LogDebug("Toggling file menu");
		if ((Object)(object)_list == (Object)null)
		{
			_list = ((Component)startMenuButton.GetPrivateField<StartMenu>("menu").backupSavesUI).transform.GetChild(0);
		}
		if (!_fileMenuShowing)
		{
			_fileMenuShowing = true;
			((Component)FileMenuList).gameObject.SetActive(true);
			if (SaveSlots.slotsActive[startMenuButton.saveSlot])
			{
				SetActiveSaveSlotTextColors();
			}
			else
			{
				SetNotActiveSaveSlotColors();
			}
			if (!((Component)_list).gameObject.activeInHierarchy)
			{
				_listWasInactive = true;
			}
			else
			{
				((Component)_list).gameObject.SetActive(false);
			}
		}
		else
		{
			_fileMenuShowing = false;
			((Component)FileMenuList).gameObject.SetActive(false);
			if (_listWasInactive)
			{
				((Component)_list).gameObject.SetActive(false);
				_listWasInactive = false;
			}
			else
			{
				((Component)_list).gameObject.SetActive(true);
			}
		}
	}

	private static void SetActiveSaveSlotTextColors()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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_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_0068: 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_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		((Component)FileMenuList.GetChild(0).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(ACTIVE_COLOR);
		((Component)FileMenuList.GetChild(1).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(ACTIVE_COLOR);
		((Component)FileMenuList.GetChild(2).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
		((Component)FileMenuList.GetChild(3).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(ACTIVE_COLOR);
		((Component)FileMenuList.GetChild(4).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
	}

	private static void SetNotActiveSaveSlotColors()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: 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)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: 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_00bd: 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)
		((Component)FileMenuList.GetChild(0).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
		((Component)FileMenuList.GetChild(1).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
		((Component)FileMenuList.GetChild(2).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(_copyClicked ? ACTIVE_COLOR : INACTIVE_COLOR);
		((Component)FileMenuList.GetChild(3).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
		((Component)FileMenuList.GetChild(4).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(INACTIVE_COLOR);
	}

	internal static void SetChangePageTextColor(StartMenuButtonType type, bool isActive, bool changeBoth = false)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0004: Invalid comparison between Unknown and I4
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		Transform val = (((int)type == 13) ? _previousButton : _nextButton);
		Color32 val2 = (isActive ? ACTIVE_COLOR : INACTIVE_COLOR);
		if (!changeBoth)
		{
			TextMesh[] componentsInChildren = ((Component)val).GetComponentsInChildren<TextMesh>();
			foreach (TextMesh val3 in componentsInChildren)
			{
				val3.color = Color32.op_Implicit(val2);
			}
			return;
		}
		TextMesh[] componentsInChildren2 = ((Component)_previousButton).GetComponentsInChildren<TextMesh>();
		foreach (TextMesh val4 in componentsInChildren2)
		{
			val4.color = Color32.op_Implicit(val2);
		}
		TextMesh[] componentsInChildren3 = ((Component)_nextButton).GetComponentsInChildren<TextMesh>();
		foreach (TextMesh val5 in componentsInChildren3)
		{
			val5.color = Color32.op_Implicit(val2);
		}
	}

	internal static void EnableConfirmDeleteButton()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		((Component)FileMenuList.GetChild(4).GetChild(1)).GetComponent<TextMesh>().color = Color32.op_Implicit(ACTIVE_COLOR);
	}

	internal static void UpdatePageNumText(int pageNum)
	{
		PageNumTextMesh.text = $"page {pageNum + 1}";
	}

	internal static void CopyButtonClicked()
	{
		_copyClicked = true;
	}

	internal static void ClearCopyClicked()
	{
		_copyClicked = false;
	}

	internal static void CopyMaterial(int fromSlot, int toSlot)
	{
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: 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_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		string path = SlotPath.SlotScreenshotPath(fromSlot);
		StartMenuButton startMenuButtonForSlot = Paginator.GetStartMenuButtonForSlot(fromSlot);
		StartMenuButton startMenuButtonForSlot2 = Paginator.GetStartMenuButtonForSlot(toSlot);
		MeshRenderer component = ((Component)startMenuButtonForSlot2).GetComponent<MeshRenderer>();
		TextMesh componentInChildren = ((Component)((Component)startMenuButtonForSlot2).transform.parent).GetComponentInChildren<TextMesh>();
		if (File.Exists(path))
		{
			((Renderer)component).material = ((Renderer)((Component)startMenuButtonForSlot).GetComponent<MeshRenderer>()).material;
			componentInChildren.color = new Color(1f, 0.8f, 0.6f);
			componentInChildren.fontSize = 45;
			((Component)componentInChildren).transform.localPosition = new Vector3(0f, -0.1f, 0.04f);
		}
		else
		{
			((Renderer)((Component)startMenuButtonForSlot2).GetComponent<MeshRenderer>()).material = _originalSlotButtonMaterial;
			componentInChildren.color = Color32.op_Implicit(ACTIVE_COLOR);
			componentInChildren.fontSize = 50;
			((Component)componentInChildren).transform.localPosition = ORIGINAL_FONT_POSITION;
		}
	}

	internal static void ResetMaterial(int slot)
	{
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		StartMenuButton startMenuButtonForSlot = Paginator.GetStartMenuButtonForSlot(slot);
		((Renderer)((Component)startMenuButtonForSlot).GetComponent<MeshRenderer>()).material = _originalSlotButtonMaterial;
		TextMesh componentInChildren = ((Component)((Component)startMenuButtonForSlot).transform.parent).GetComponentInChildren<TextMesh>();
		componentInChildren.color = Color32.op_Implicit(ACTIVE_COLOR);
		componentInChildren.fontSize = 50;
		((Component)componentInChildren).transform.localPosition = ORIGINAL_FONT_POSITION;
	}
}
internal class SlotPath
{
	internal static string SlotSavePath(int slot)
	{
		return $"{Application.persistentDataPath}/slot{slot}.save";
	}

	internal static string SlotBackupPath(int slot, int backupNum)
	{
		return $"{Application.persistentDataPath}/slot{slot}_backup{backupNum}.save";
	}

	internal static string SlotMetaPath(int slot)
	{
		return $"{Application.persistentDataPath}/slot{slot}.save.meta";
	}

	internal static string SlotScreenshotPath(int slot)
	{
		return $"{Application.persistentDataPath}/slot{slot}.save.png";
	}

	internal static string SlotModSavesDirPath(int slot)
	{
		return $"{Application.persistentDataPath}/slot{slot}";
	}
}