Decompiled source of PeakTuner v0.1.5

plugins/PeakTuner/PeakTuner.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PEAKLib.UI;
using PEAKLib.UI.Elements;
using PeakTuner.Cheats;
using PeakTuner.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("PeakTuner")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.5")]
[assembly: AssemblyInformationalVersion("0.1.5+029d865737c354ab85dcaa916ce81b7379421984")]
[assembly: AssemblyProduct("PeakTuner")]
[assembly: AssemblyTitle("PeakTuner")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.5.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BepInEx
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class BepInAutoPluginAttribute : Attribute
	{
		public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace BepInEx.Preloader.Core.Patching
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	[Conditional("CodeGeneration")]
	internal sealed class PatcherAutoPluginAttribute : Attribute
	{
		public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
		{
		}
	}
}
namespace PeakTuner
{
	public sealed class ModConfig
	{
		public ConfigEntry<bool> InfiniteStamina { get; }

		public ConfigEntry<bool> NoFallDamage { get; }

		public ConfigEntry<bool> DisableCold { get; }

		public ConfigEntry<bool> DisablePoison { get; }

		public ConfigEntry<bool> DisableHot { get; }

		public ConfigEntry<bool> DisableHunger { get; }

		public ConfigEntry<bool> GodMode { get; }

		public ConfigEntry<bool> MinimapEnabled { get; }

		public ConfigEntry<float> SpeedMultiplier { get; }

		public ModConfig(ConfigFile cfg)
		{
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			InfiniteStamina = cfg.Bind<bool>("Cheats", "InfiniteStamina", false, "Prevents stamina from decreasing.");
			NoFallDamage = cfg.Bind<bool>("Cheats", "NoFallDamage", false, "Disables fall damage.");
			DisableCold = cfg.Bind<bool>("Cheats", "DisableCold", false, "Continuously clears Cold if present.");
			DisablePoison = cfg.Bind<bool>("Cheats", "DisablePoison", false, "Continuously clears Poison if present.");
			DisableHot = cfg.Bind<bool>("Cheats", "DisableHot", false, "Continuously clears Hot if present.");
			DisableHunger = cfg.Bind<bool>("Cheats", "DisableHunger", false, "Continuously clears Hunger if present.");
			GodMode = cfg.Bind<bool>("Cheats", "GodMode", false, "Invincible while enabled.");
			MinimapEnabled = cfg.Bind<bool>("UI", "MinimapEnabled", false, "Show the minimap.");
			SpeedMultiplier = cfg.Bind<float>("Cheats", "SpeedMultiplier", 1f, new ConfigDescription("Movement speed multiplier (1, 2, or 4).", (AcceptableValueBase)(object)new AcceptableValueList<float>(new float[6] { 1f, 2f, 4f, 8f, 16f, 32f }), Array.Empty<object>()));
		}
	}
	[BepInPlugin("com.cbein.peaktuner", "PeakTuner", "0.1.5")]
	public class Plugin : BaseUnityPlugin
	{
		private ModConfig _cfg;

		private CheatsService _cheats;

		private float _nextApplyTime;

		private DebugOverlay? _overlay;

		internal static ManualLogSource Log { get; private set; }

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			_cfg = new ModConfig(((BaseUnityPlugin)this).Config);
			ResetCheatsToDefaults();
			ReflectionCache r = new ReflectionCache(Log);
			StatusApi status = new StatusApi(Log, r);
			_cheats = new CheatsService(Log, r, status, _cfg);
			_overlay = new DebugOverlay("PeakTuner", "0.1.5");
			SpeedController.Install(Log, _cfg);
			PauseMenuCheatsUi.Install(Log, _cfg, _cheats);
			MinimapUi.Install(Log);
			_cfg.MinimapEnabled.Value = false;
			MinimapUi.SetEnabled(_cfg.MinimapEnabled.Value);
			Log.LogInfo((object)"[PeakTuner] Loaded v0.1.5 (pause menu integration).");
		}

		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)289))
			{
				_overlay?.Toggle();
				Log.LogInfo((object)"[PeakTuner] Debug overlay toggled (F8).");
			}
			_overlay?.Update();
			if (IsGameplayReady() && Time.time >= _nextApplyTime)
			{
				_nextApplyTime = Time.time + 0.1f;
				_cheats.ApplyCheats();
			}
		}

		private void OnGUI()
		{
			_overlay?.OnGUI();
		}

		private static bool IsGameplayReady()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			Character localCharacter = Character.localCharacter;
			return (Object)localCharacter != (Object)null;
		}

		private void ResetCheatsToDefaults()
		{
			_cfg.InfiniteStamina.Value = false;
			_cfg.NoFallDamage.Value = false;
			_cfg.DisableCold.Value = false;
			_cfg.DisablePoison.Value = false;
			_cfg.DisableHot.Value = false;
			_cfg.DisableHunger.Value = false;
			_cfg.GodMode.Value = false;
			_cfg.SpeedMultiplier.Value = 1f;
		}
	}
	internal static class VersionInfo
	{
		public const string Guid = "com.cbein.peaktuner";

		public const string Name = "PeakTuner";

		public const string Version = "0.1.5";
	}
}
namespace PeakTuner.UI
{
	public sealed class CursorController
	{
		private bool _prevVisible;

		private CursorLockMode _prevLock;

		public bool IsCaptured { get; private set; }

		public void Capture()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (!IsCaptured)
			{
				_prevVisible = Cursor.visible;
				_prevLock = Cursor.lockState;
				ForceUnlockedCursor();
				IsCaptured = true;
			}
		}

		public void CaptureFrame()
		{
			if (!IsCaptured)
			{
				Capture();
			}
			else
			{
				ForceUnlockedCursor();
			}
		}

		public void Release()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (IsCaptured)
			{
				Cursor.visible = _prevVisible;
				Cursor.lockState = _prevLock;
				IsCaptured = false;
			}
		}

		private static void ForceUnlockedCursor()
		{
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)0;
		}
	}
	public sealed class DebugOverlay
	{
		private readonly string _modName;

		private readonly string _version;

		private bool _visible = true;

		private readonly float _startTime;

		private float _fps;

		private float _fpsAccum;

		private int _fpsFrames;

		private float _fpsNextTime;

		private GUIStyle? _style;

		public DebugOverlay(string modName, string version)
		{
			_modName = modName;
			_version = version;
			_startTime = Time.unscaledTime;
			_fpsNextTime = Time.unscaledTime + 0.5f;
		}

		public void Toggle()
		{
			_visible = !_visible;
		}

		public void Update()
		{
			float unscaledTime = Time.unscaledTime;
			_fpsAccum += Time.unscaledDeltaTime;
			_fpsFrames++;
			if (unscaledTime >= _fpsNextTime)
			{
				float num = ((_fpsFrames > 0) ? (_fpsAccum / (float)_fpsFrames) : 0f);
				_fps = ((num > 1E-06f) ? (1f / num) : 0f);
				_fpsAccum = 0f;
				_fpsFrames = 0;
				_fpsNextTime = unscaledTime + 0.5f;
			}
		}

		public void OnGUI()
		{
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			if (_visible)
			{
				EnsureStyle();
				float num = Mathf.Max(0f, Time.unscaledTime - _startTime);
				TimeSpan timeSpan = TimeSpan.FromSeconds(num);
				string text = ((timeSpan.TotalHours >= 1.0) ? $"{(int)timeSpan.TotalHours:00}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}" : $"{timeSpan.Minutes:00}:{timeSpan.Seconds:00}");
				string text2 = $"{_modName} v{_version}  |  FPS: {_fps:0}  |  Up: {text}";
				float num2 = 520f;
				float num3 = 22f;
				Rect val = default(Rect);
				((Rect)(ref val))..ctor((float)Screen.width - num2 - 10f, 10f, num2, num3);
				GUI.Label(val, text2, _style);
			}
		}

		private void EnsureStyle()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			if (_style == null)
			{
				_style = new GUIStyle(GUI.skin.label)
				{
					fontSize = 13,
					alignment = (TextAnchor)2,
					richText = false,
					wordWrap = false
				};
				_style.normal.textColor = Color.white;
			}
		}
	}
	public static class MinimapUi
	{
		private sealed class MinimapController : MonoBehaviour
		{
			private const int MinimapTextureSize = 256;

			private const float MinimapWorldHeight = 80f;

			private const float MinimapUiSize = 220f;

			private const float MinimapMargin = 18f;

			private const float HudWidth = 120f;

			private Camera? _cam;

			private RenderTexture? _rt;

			private RawImage? _mapImage;

			private RectTransform? _mapRoot;

			private TMP_Text? _debugText;

			private bool _enabled;

			public void Initialize(ManualLogSource log)
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				//IL_000b: Expected O, but got Unknown
				//IL_008b: 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_00b9: Expected O, but got Unknown
				GameObject val = new GameObject("MinimapCamera");
				val.transform.SetParent(((Component)this).transform, false);
				_cam = val.AddComponent<Camera>();
				_cam.orthographic = true;
				_cam.orthographicSize = Zoom;
				_cam.nearClipPlane = 0.1f;
				_cam.farClipPlane = 500f;
				_cam.clearFlags = (CameraClearFlags)2;
				_cam.backgroundColor = new Color(0f, 0f, 0f, 0f);
				_cam.cullingMask = -1;
				_rt = new RenderTexture(256, 256, 16, (RenderTextureFormat)0);
				((Object)_rt).name = "PeakTuner_MinimapRT";
				_rt.Create();
				_cam.targetTexture = _rt;
				BuildUi();
				SetEnabled(Enabled);
			}

			public void SetEnabled(bool enabled)
			{
				_enabled = enabled;
				if ((Object)(object)_mapRoot != (Object)null)
				{
					((Component)_mapRoot).gameObject.SetActive(_enabled);
				}
			}

			private void BuildUi()
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				//IL_000b: Expected O, but got Unknown
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Expected O, but got Unknown
				//IL_007a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0094: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ae: 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_00e2: 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)
				//IL_00f8: Expected O, but got Unknown
				//IL_0120: Unknown result type (might be due to invalid IL or missing references)
				//IL_0136: Unknown result type (might be due to invalid IL or missing references)
				//IL_014c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0158: Unknown result type (might be due to invalid IL or missing references)
				//IL_016e: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c1: Expected O, but got Unknown
				//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
				//IL_020b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0221: Unknown result type (might be due to invalid IL or missing references)
				//IL_0237: Unknown result type (might be due to invalid IL or missing references)
				//IL_024d: Unknown result type (might be due to invalid IL or missing references)
				//IL_027e: Unknown result type (might be due to invalid IL or missing references)
				//IL_029e: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a5: Expected O, but got Unknown
				//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
				//IL_032a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0339: Unknown result type (might be due to invalid IL or missing references)
				//IL_0340: Expected O, but got Unknown
				//IL_0368: 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_0394: Unknown result type (might be due to invalid IL or missing references)
				//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_03cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d6: Expected O, but got Unknown
				//IL_040b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0421: Unknown result type (might be due to invalid IL or missing references)
				//IL_042d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0439: Unknown result type (might be due to invalid IL or missing references)
				//IL_047e: Unknown result type (might be due to invalid IL or missing references)
				//IL_04bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_051b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0520: Unknown result type (might be due to invalid IL or missing references)
				//IL_0549: Unknown result type (might be due to invalid IL or missing references)
				//IL_055f: Unknown result type (might be due to invalid IL or missing references)
				GameObject val = new GameObject("MinimapCanvas");
				val.transform.SetParent(((Component)this).transform, false);
				Canvas val2 = val.AddComponent<Canvas>();
				val2.renderMode = (RenderMode)0;
				val2.sortingOrder = 50;
				CanvasScaler val3 = val.AddComponent<CanvasScaler>();
				val3.uiScaleMode = (ScaleMode)0;
				GameObject val4 = new GameObject("MinimapRoot");
				val4.transform.SetParent(val.transform, false);
				_mapRoot = val4.AddComponent<RectTransform>();
				_mapRoot.anchorMin = new Vector2(0f, 1f);
				_mapRoot.anchorMax = new Vector2(0f, 1f);
				_mapRoot.pivot = new Vector2(0f, 1f);
				_mapRoot.anchoredPosition = new Vector2(18f, -18f);
				_mapRoot.sizeDelta = new Vector2(340f, 220f);
				GameObject val5 = new GameObject("MinimapMask");
				val5.transform.SetParent(val4.transform, false);
				RectTransform val6 = val5.AddComponent<RectTransform>();
				val6.anchorMin = new Vector2(0f, 1f);
				val6.anchorMax = new Vector2(0f, 1f);
				val6.pivot = new Vector2(0f, 1f);
				val6.anchoredPosition = Vector2.zero;
				val6.sizeDelta = new Vector2(210f, 210f);
				Image val7 = val5.AddComponent<Image>();
				val7.sprite = GetCircleSprite();
				val7.type = (Type)1;
				((Graphic)val7).color = new Color(0f, 0f, 0f, 0.35f);
				GameObject val8 = new GameObject("MinimapBorder");
				val8.transform.SetParent(val4.transform, false);
				val8.transform.SetAsLastSibling();
				RectTransform val9 = val8.AddComponent<RectTransform>();
				val9.anchorMin = new Vector2(0f, 1f);
				val9.anchorMax = new Vector2(0f, 1f);
				val9.pivot = new Vector2(0f, 1f);
				val9.anchoredPosition = new Vector2(-10f, 10f);
				val9.sizeDelta = new Vector2(232f, 232f);
				Image val10 = val8.AddComponent<Image>();
				val10.sprite = GetCircleRingSprite();
				val10.type = (Type)0;
				((Graphic)val10).raycastTarget = false;
				((Graphic)val10).color = Color.white;
				Mask val11 = val5.AddComponent<Mask>();
				val11.showMaskGraphic = true;
				GameObject val12 = new GameObject("MinimapImage");
				val12.transform.SetParent(val5.transform, false);
				RectTransform val13 = val12.AddComponent<RectTransform>();
				val13.anchorMin = new Vector2(0f, 0f);
				val13.anchorMax = new Vector2(1f, 1f);
				val13.offsetMin = Vector2.zero;
				val13.offsetMax = Vector2.zero;
				_mapImage = val12.AddComponent<RawImage>();
				_mapImage.texture = (Texture)(object)_rt;
				((Graphic)_mapImage).color = Color.white;
				GameObject val14 = new GameObject("MinimapDebugText");
				val14.transform.SetParent(val4.transform, false);
				RectTransform val15 = val14.AddComponent<RectTransform>();
				val15.anchorMin = new Vector2(0f, 0f);
				val15.anchorMax = new Vector2(0f, 0f);
				val15.pivot = new Vector2(0f, 0f);
				val15.anchoredPosition = new Vector2(0f, -34f);
				val15.sizeDelta = new Vector2(220f, 30f);
				GameObject val16 = new GameObject("MinimapDebugBg");
				val16.transform.SetParent(val14.transform, false);
				val16.transform.SetAsFirstSibling();
				RectTransform val17 = val16.AddComponent<RectTransform>();
				val17.anchorMin = new Vector2(0f, 0f);
				val17.anchorMax = new Vector2(1f, 1f);
				val17.offsetMin = Vector2.zero;
				val17.offsetMax = Vector2.zero;
				Image val18 = val16.AddComponent<Image>();
				val18.sprite = GetSolidSprite();
				val18.type = (Type)1;
				((Graphic)val18).raycastTarget = false;
				((Graphic)val18).color = new Color(0f, 0f, 0f, 0f);
				_debugText = (TMP_Text?)(object)val14.AddComponent<TextMeshProUGUI>();
				_debugText.fontSize = 15f;
				((Graphic)_debugText).color = new Color(1f, 1f, 1f, 0.95f);
				_debugText.alignment = (TextAlignmentOptions)514;
				((Graphic)_debugText).raycastTarget = false;
				_debugText.enableWordWrapping = false;
				_debugText.outlineWidth = 0.18f;
				_debugText.outlineColor = Color32.op_Implicit(new Color(0f, 0f, 0f, 0.75f));
				Shadow val19 = val14.AddComponent<Shadow>();
				val19.effectColor = new Color(0f, 0f, 0f, 0.55f);
				val19.effectDistance = new Vector2(1f, -1f);
			}

			private void LateUpdate()
			{
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Expected O, but got Unknown
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_007a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0080: Unknown result type (might be due to invalid IL or missing references)
				//IL_008c: 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_00b6: 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_0112: Unknown result type (might be due to invalid IL or missing references)
				//IL_011d: Unknown result type (might be due to invalid IL or missing references)
				if (!_enabled)
				{
					SetVisible(visible: false);
					return;
				}
				Character localCharacter = Character.localCharacter;
				if ((Object)localCharacter == (Object)null)
				{
					SetVisible(visible: false);
					return;
				}
				SetVisible(visible: true);
				Transform transform = ((Component)localCharacter).transform;
				Vector3 playerPosition = GetPlayerPosition(localCharacter);
				if ((Object)(object)_cam != (Object)null)
				{
					((Component)_cam).gameObject.SetActive(true);
					((Behaviour)_cam).enabled = true;
					((Component)_cam).transform.position = new Vector3(playerPosition.x, playerPosition.y + 80f, playerPosition.z);
					((Component)_cam).transform.rotation = Quaternion.Euler(90f, 0f, 0f);
					_cam.orthographicSize = Mathf.Max(1f, Zoom * 0.5f);
				}
				if ((Object)(object)_debugText != (Object)null && (Object)(object)_cam != (Object)null)
				{
					_debugText.text = $"{playerPosition.x:0.0}, {playerPosition.y:0.0}, {playerPosition.z:0.0}";
					((Component)_debugText).gameObject.SetActive(true);
				}
				if (Input.GetKeyDown((KeyCode)91))
				{
					Zoom = Mathf.Max(5f, Zoom - 5f);
				}
				if (Input.GetKeyDown((KeyCode)93))
				{
					Zoom = Mathf.Min(200f, Zoom + 5f);
				}
			}

			private static Vector3 GetPlayerPosition(Character player)
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				Rigidbody component = ((Component)player).GetComponent<Rigidbody>();
				if ((Object)(object)component != (Object)null)
				{
					return component.position;
				}
				component = ((Component)player).GetComponentInChildren<Rigidbody>();
				if ((Object)(object)component != (Object)null)
				{
					return component.position;
				}
				Renderer componentInChildren = ((Component)player).GetComponentInChildren<Renderer>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					Bounds bounds = componentInChildren.bounds;
					return ((Bounds)(ref bounds)).center;
				}
				return ((Component)player).transform.position;
			}

			private void SetVisible(bool visible)
			{
				if ((Object)(object)_mapRoot != (Object)null)
				{
					((Component)_mapRoot).gameObject.SetActive(visible);
				}
			}
		}

		private static ManualLogSource _log = null;

		private static MinimapController? _controller;

		public static float Zoom = 25f;

		private static Sprite? _solidSprite;

		private static Sprite? _circleSprite;

		private static Sprite? _circleRingSprite;

		public static bool Enabled { get; private set; } = false;


		public static void Install(ManualLogSource log)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			_log = log;
			if (!((Object)(object)_controller != (Object)null))
			{
				GameObject val = new GameObject("PeakTuner_Minimap");
				Object.DontDestroyOnLoad((Object)(object)val);
				_controller = val.AddComponent<MinimapController>();
				_controller.Initialize(_log);
				_log.LogInfo((object)"[PeakTuner] Minimap initialized.");
			}
		}

		public static void SetEnabled(bool enabled)
		{
			Enabled = enabled;
			_controller?.SetEnabled(enabled);
		}

		private static Sprite GetSolidSprite()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			if ((Object)(object)_solidSprite != (Object)null)
			{
				return _solidSprite;
			}
			Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false);
			val.SetPixel(0, 0, Color.white);
			val.Apply(false, true);
			_solidSprite = Sprite.Create(val, new Rect(0f, 0f, 1f, 1f), new Vector2(0.5f, 0.5f), 100f);
			return _solidSprite;
		}

		private static Sprite GetCircleSprite()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: 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)
			if ((Object)(object)_circleSprite != (Object)null)
			{
				return _circleSprite;
			}
			Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			float num = 63f;
			float num2 = 63.5f;
			float num3 = 63.5f;
			float num4 = num * num;
			for (int i = 0; i < 128; i++)
			{
				for (int j = 0; j < 128; j++)
				{
					float num5 = (float)j - num2;
					float num6 = (float)i - num3;
					float num7 = num5 * num5 + num6 * num6;
					float num8 = ((num7 <= num4) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num8));
				}
			}
			val.Apply(false, true);
			_circleSprite = Sprite.Create(val, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 100f);
			return _circleSprite;
		}

		private static Sprite GetCircleRingSprite()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_circleRingSprite != (Object)null)
			{
				return _circleRingSprite;
			}
			Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			float num = 63f;
			float num2 = num - 8f;
			float num3 = 63.5f;
			float num4 = 63.5f;
			for (int i = 0; i < 128; i++)
			{
				for (int j = 0; j < 128; j++)
				{
					float num5 = (float)j - num3;
					float num6 = (float)i - num4;
					float num7 = Mathf.Sqrt(num5 * num5 + num6 * num6);
					float num8 = ((num7 <= num && num7 >= num2) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num8));
				}
			}
			val.Apply(false, true);
			_circleRingSprite = Sprite.Create(val, new Rect(0f, 0f, 128f, 128f), new Vector2(0.5f, 0.5f), 100f);
			return _circleRingSprite;
		}
	}
	public static class PauseMenuCheatsUi
	{
		private sealed class UiHost : MonoBehaviour
		{
		}

		private sealed class ToggleRow
		{
			public string Label { get; }

			public ConfigEntry<bool> Entry { get; }

			public PeakMenuButton Button { get; }

			public Color BaseTint { get; }

			public ToggleRow(string label, ConfigEntry<bool> entry, PeakMenuButton button, Color baseTint)
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				Label = label;
				Entry = entry;
				Button = button;
				BaseTint = baseTint;
			}
		}

		private static class CheatColor
		{
			public static readonly Color StaminaGreen = new Color(0.2f, 0.7f, 0.2f, 1f);

			public static readonly Color FallPink = new Color(0.9f, 0.35f, 0.7f, 1f);

			public static readonly Color ColdBlue = new Color(0.2f, 0.55f, 0.95f, 1f);

			public static readonly Color PoisonPurple = new Color(0.6f, 0.3f, 0.85f, 1f);

			public static readonly Color HotRed = new Color(0.9f, 0.25f, 0.25f, 1f);

			public static readonly Color HungerYellow = new Color(0.95f, 0.8f, 0.2f, 1f);

			public static readonly Color GodOrange = new Color(0.95f, 0.55f, 0.15f, 1f);

			public static readonly Color UiTeal = new Color(0.25f, 0.75f, 0.75f, 1f);

			public static readonly Color NeutralClose = new Color(0.55f, 0.55f, 0.55f, 1f);

			public static readonly Color SpeedSelected = new Color(0.2f, 0.85f, 0.55f, 1f);

			public static readonly Color SpeedUnselected = new Color(0.35f, 0.35f, 0.4f, 1f);
		}

		[CompilerGenerated]
		private static class <>O
		{
			public static BuilderDelegate <0>__BuildIntoPauseMenu;
		}

		[CompilerGenerated]
		private sealed class <BuildCheatContentNextFrame>d__29 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public PeakScrollableContent scrollContent;

			public GameObject panelGo;

			public RectTransform panelRt;

			public GameObject scrollGo;

			public ScrollRect scrollRect;

			public PeakMenuButton openBtn;

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

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

			[DebuggerHidden]
			public <BuildCheatContentNextFrame>d__29(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if ((Object)(object)scrollContent.Content == (Object)null)
					{
						<>2__current = null;
						<>1__state = 2;
						return true;
					}
					goto IL_0067;
				case 2:
					<>1__state = -1;
					goto IL_0067;
				case 3:
					{
						<>1__state = -1;
						break;
					}
					IL_0067:
					if ((Object)(object)scrollContent.Content == (Object)null)
					{
						<>2__current = null;
						<>1__state = 3;
						return true;
					}
					break;
				}
				if ((Object)(object)scrollContent.Content == (Object)null)
				{
					_log.LogError((object)"[PeakTuner] Scroll content was not initialized. Cheats panel build aborted.");
					return false;
				}
				BuildCheatContent(panelGo, panelRt, scrollGo, scrollContent, scrollRect, openBtn);
				return false;
			}

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

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

		[CompilerGenerated]
		private sealed class <RunUiActionNextFrame>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Action action;

			public string name;

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

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

			[DebuggerHidden]
			public <RunUiActionNextFrame>d__11(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					try
					{
						action();
					}
					catch (Exception arg)
					{
						_log.LogError((object)$"[PeakTuner] UI action '{name}' crashed: {arg}");
					}
					finally
					{
						_uiBusy = false;
					}
					return false;
				}
			}

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

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

		[CompilerGenerated]
		private sealed class <SyncRowHeightsNextFrame>d__39 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public PeakMenuButton reference;

			public List<PeakMenuButton> rows;

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

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

			[DebuggerHidden]
			public <SyncRowHeightsNextFrame>d__39(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0062: 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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 2;
					return true;
				case 2:
				{
					<>1__state = -1;
					RectTransform component = ((Component)reference.Button).GetComponent<RectTransform>();
					Rect rect = component.rect;
					float height = ((Rect)(ref rect)).height;
					if (height <= 0.1f)
					{
						return false;
					}
					for (int i = 0; i < rows.Count; i++)
					{
						SetRowHeight(rows[i], height);
					}
					return false;
				}
				}
			}

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

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

		private static ManualLogSource _log = null;

		private static ModConfig _cfg = null;

		private static CheatsService _cheats = null;

		private static bool _registered;

		private static Sprite? _solidSprite;

		private static UiHost? _uiHost;

		private static bool _uiBusy;

		private static float _nextAllowedClickTime;

		private const float PanelWidth = 780f;

		private const float PanelHeight = 840f;

		private const float PanelSpacing = 6f;

		private const float RowHeight = 44f;

		private const float HeaderFontSize = 38f;

		private const float SectionFontSize = 26f;

		private const int ScrollbarRightPadding = 24;

		private const float CloseBarHeight = 52f;

		private const float CloseBarTopGap = 10f;

		private const float CloseTextFontSize = 28f;

		private static readonly Color CloseBarNormal = new Color(0.09f, 0.09f, 0.11f, 0.96f);

		private static readonly Color CloseBarHover = new Color(0.12f, 0.12f, 0.15f, 0.96f);

		private static readonly Color CloseBarPress = new Color(0.07f, 0.07f, 0.09f, 0.96f);

		private static readonly Color CloseBarText = Color.white;

		private static readonly Color PanelBgColor = new Color(0.08f, 0.08f, 0.1f, 0.98f);

		private static UiHost EnsureUiHost()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			if ((Object)(object)_uiHost != (Object)null)
			{
				return _uiHost;
			}
			GameObject val = new GameObject("PeakTuner_UiHost");
			Object.DontDestroyOnLoad((Object)(object)val);
			_uiHost = val.AddComponent<UiHost>();
			return _uiHost;
		}

		private static void RunUiActionThrottled(string name, Action action, float cooldownSeconds = 0.2f)
		{
			if (!_uiBusy && !(Time.unscaledTime < _nextAllowedClickTime))
			{
				_uiBusy = true;
				_nextAllowedClickTime = Time.unscaledTime + cooldownSeconds;
				((MonoBehaviour)EnsureUiHost()).StartCoroutine(RunUiActionNextFrame(name, action));
			}
		}

		[IteratorStateMachine(typeof(<RunUiActionNextFrame>d__11))]
		private static IEnumerator RunUiActionNextFrame(string name, Action action)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <RunUiActionNextFrame>d__11(0)
			{
				name = name,
				action = action
			};
		}

		public static void Install(ManualLogSource log, ModConfig cfg, CheatsService cheats)
		{
			//IL_0030: 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_003b: Expected O, but got Unknown
			_log = log;
			_cfg = cfg;
			_cheats = cheats;
			if (!_registered)
			{
				_registered = true;
				object obj = <>O.<0>__BuildIntoPauseMenu;
				if (obj == null)
				{
					BuilderDelegate val = BuildIntoPauseMenu;
					<>O.<0>__BuildIntoPauseMenu = val;
					obj = (object)val;
				}
				MenuAPI.AddToPauseMenu((BuilderDelegate)obj);
				_log.LogInfo((object)"[PeakTuner] Registered pause-menu UI builder.");
			}
		}

		private static void BuildIntoPauseMenu(Transform pauseMenuMainPageTransform)
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Expected O, but got Unknown
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Expected O, but got Unknown
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Expected O, but got Unknown
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!IsGameplayReady() || (Object)(object)pauseMenuMainPageTransform.Find("PeakTuner_CheatsPanel") != (Object)null)
				{
					return;
				}
				Transform val = FindPauseMenuButtonListParent(pauseMenuMainPageTransform);
				PeakMenuButton val2 = MenuAPI.CreatePauseMenuButton("Cheats");
				ElementExtensions.ParentTo<PeakMenuButton>(val2, val);
				SetButtonText(val2, "Cheats");
				((Component)val2.Button).transform.SetSiblingIndex(0);
				GameObject val3 = new GameObject("PeakTuner_CheatsPanel");
				val3.transform.SetParent(pauseMenuMainPageTransform, false);
				CanvasGroup val4 = val3.AddComponent<CanvasGroup>();
				val4.alpha = 0f;
				val4.interactable = false;
				val4.blocksRaycasts = false;
				_log.LogInfo((object)"[PeakTuner] Cheats panel created.");
				RectTransform val5 = val3.AddComponent<RectTransform>();
				val5.anchorMin = new Vector2(0.5f, 0.5f);
				val5.anchorMax = new Vector2(0.5f, 0.5f);
				val5.pivot = new Vector2(0.5f, 0.5f);
				val5.sizeDelta = new Vector2(780f, 840f);
				val5.anchoredPosition = Vector2.zero;
				Image bg = val3.AddComponent<Image>();
				ApplySolidPanelBackground(bg);
				VerticalLayoutGroup val6 = val3.AddComponent<VerticalLayoutGroup>();
				((LayoutGroup)val6).childAlignment = (TextAnchor)1;
				((HorizontalOrVerticalLayoutGroup)val6).spacing = 6f;
				((LayoutGroup)val6).padding = new RectOffset(18, 18, 18, 18);
				((HorizontalOrVerticalLayoutGroup)val6).childControlWidth = true;
				((HorizontalOrVerticalLayoutGroup)val6).childControlHeight = true;
				((HorizontalOrVerticalLayoutGroup)val6).childForceExpandWidth = true;
				((HorizontalOrVerticalLayoutGroup)val6).childForceExpandHeight = false;
				AddPlainHeaderText("CHEATS", val3.transform, 38f);
				ScrollRect val7 = null;
				GameObject val8 = new GameObject("PeakTuner_CheatsScroll");
				val8.transform.SetParent(val3.transform, false);
				LayoutElement val9 = val8.AddComponent<LayoutElement>();
				val9.flexibleWidth = 1f;
				val9.flexibleHeight = 1f;
				val9.minHeight = 320f;
				val9.preferredHeight = 0f;
				RectTransform val10 = val8.GetComponent<RectTransform>() ?? val8.AddComponent<RectTransform>();
				if ((Object)(object)val10 == (Object)null)
				{
					_log.LogError((object)"[PeakTuner] Failed to create ScrollRect RectTransform.");
					return;
				}
				val10.anchorMin = new Vector2(0f, 0f);
				val10.anchorMax = new Vector2(1f, 1f);
				val10.pivot = new Vector2(0.5f, 0.5f);
				val10.offsetMin = Vector2.zero;
				val10.offsetMax = Vector2.zero;
				PeakScrollableContent scrollContent = val8.AddComponent<PeakScrollableContent>();
				val7 = val8.GetComponent<ScrollRect>();
				if ((Object)(object)val7 != (Object)null)
				{
					AddScrollBar(val8, val7);
				}
				((MonoBehaviour)EnsureUiHost()).StartCoroutine(BuildCheatContentNextFrame(val3, val5, val8, scrollContent, val7, val2));
				val3.SetActive(false);
			}
			catch (Exception arg)
			{
				_log.LogError((object)$"[PeakTuner] BuildIntoPauseMenu failed: {arg}");
			}
		}

		[IteratorStateMachine(typeof(<BuildCheatContentNextFrame>d__29))]
		private static IEnumerator BuildCheatContentNextFrame(GameObject panelGo, RectTransform panelRt, GameObject scrollGo, PeakScrollableContent scrollContent, ScrollRect? scrollRect, PeakMenuButton openBtn)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <BuildCheatContentNextFrame>d__29(0)
			{
				panelGo = panelGo,
				panelRt = panelRt,
				scrollGo = scrollGo,
				scrollContent = scrollContent,
				scrollRect = scrollRect,
				openBtn = openBtn
			};
		}

		private static void BuildCheatContent(GameObject panelGo, RectTransform panelRt, GameObject scrollGo, PeakScrollableContent scrollContent, ScrollRect? scrollRect, PeakMenuButton openBtn)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Expected O, but got Unknown
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ef: Expected O, but got Unknown
			//IL_0406: Unknown result type (might be due to invalid IL or missing references)
			//IL_0410: Expected O, but got Unknown
			//IL_0427: Unknown result type (might be due to invalid IL or missing references)
			//IL_0431: Expected O, but got Unknown
			//IL_0448: Unknown result type (might be due to invalid IL or missing references)
			//IL_0452: Expected O, but got Unknown
			//IL_0469: Unknown result type (might be due to invalid IL or missing references)
			//IL_0473: Expected O, but got Unknown
			//IL_048a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0494: Expected O, but got Unknown
			//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_050f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0536: Unknown result type (might be due to invalid IL or missing references)
			//IL_057d: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_061c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0653: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ca: Expected O, but got Unknown
			GameObject panelGo2 = panelGo;
			PeakMenuButton openBtn2 = openBtn;
			ScrollRect scrollRect2 = scrollRect;
			RectTransform panelRt2 = panelRt;
			GameObject scrollGo2 = scrollGo;
			PeakScrollableContent scrollContent2 = scrollContent;
			Transform transform = ((Component)scrollContent2.Content).transform;
			VerticalLayoutGroup component = ((Component)scrollContent2.Content).GetComponent<VerticalLayoutGroup>();
			((LayoutGroup)component).childAlignment = (TextAnchor)1;
			((HorizontalOrVerticalLayoutGroup)component).spacing = 6f;
			((LayoutGroup)component).padding = new RectOffset(24, 24, 0, 0);
			((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true;
			((HorizontalOrVerticalLayoutGroup)component).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
			((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false;
			List<ToggleRow> toggles = new List<ToggleRow>();
			List<PeakMenuButton> panelRows = new List<PeakMenuButton>();
			AddPlainHeaderText("GAMEPLAY", transform, 26f);
			AddCheatToggleButton("Infinite Stamina", _cfg.InfiniteStamina, transform, toggles, panelRows, CheatColor.StaminaGreen);
			AddCheatToggleButton("No Fall Damage", _cfg.NoFallDamage, transform, toggles, panelRows, CheatColor.FallPink);
			AddCheatToggleButton("God Mode", _cfg.GodMode, transform, toggles, panelRows, CheatColor.GodOrange);
			AddPlainHeaderText("SPEED", transform, 26f);
			GameObject val = new GameObject("PeakTuner_SpeedRow");
			val.transform.SetParent(transform, false);
			LayoutElement val2 = val.AddComponent<LayoutElement>();
			val2.flexibleWidth = 1f;
			val2.minHeight = 44f;
			val2.preferredHeight = 44f;
			val2.flexibleHeight = 0f;
			HorizontalLayoutGroup val3 = val.AddComponent<HorizontalLayoutGroup>();
			((LayoutGroup)val3).childAlignment = (TextAnchor)4;
			((HorizontalOrVerticalLayoutGroup)val3).spacing = 6f;
			((LayoutGroup)val3).padding = new RectOffset(0, 0, 0, 0);
			((HorizontalOrVerticalLayoutGroup)val3).childControlWidth = true;
			((HorizontalOrVerticalLayoutGroup)val3).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandWidth = true;
			((HorizontalOrVerticalLayoutGroup)val3).childForceExpandHeight = false;
			PeakMenuButton b1 = MenuAPI.CreatePauseMenuButton("1x");
			ElementExtensions.ParentTo<PeakMenuButton>(b1, val.transform);
			SetButtonText(b1, "1x");
			MakePanelRow(b1, 44f);
			panelRows.Add(b1);
			PeakMenuButton b3 = MenuAPI.CreatePauseMenuButton("2x");
			ElementExtensions.ParentTo<PeakMenuButton>(b3, val.transform);
			SetButtonText(b3, "2x");
			MakePanelRow(b3, 44f);
			panelRows.Add(b3);
			PeakMenuButton b5 = MenuAPI.CreatePauseMenuButton("4x");
			ElementExtensions.ParentTo<PeakMenuButton>(b5, val.transform);
			SetButtonText(b5, "4x");
			MakePanelRow(b5, 44f);
			panelRows.Add(b5);
			PeakMenuButton b6 = MenuAPI.CreatePauseMenuButton("8x");
			ElementExtensions.ParentTo<PeakMenuButton>(b6, val.transform);
			SetButtonText(b6, "8x");
			MakePanelRow(b6, 44f);
			panelRows.Add(b6);
			PeakMenuButton b2 = MenuAPI.CreatePauseMenuButton("16x");
			ElementExtensions.ParentTo<PeakMenuButton>(b2, val.transform);
			SetButtonText(b2, "16x");
			MakePanelRow(b2, 44f);
			panelRows.Add(b2);
			PeakMenuButton b4 = MenuAPI.CreatePauseMenuButton("32x");
			ElementExtensions.ParentTo<PeakMenuButton>(b4, val.transform);
			SetButtonText(b4, "32x");
			MakePanelRow(b4, 44f);
			panelRows.Add(b4);
			((UnityEvent)b1.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 1x", delegate
				{
					_cfg.SpeedMultiplier.Value = 1f;
					RefreshSpeedButtonTints();
				});
			});
			((UnityEvent)b3.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 2x", delegate
				{
					_cfg.SpeedMultiplier.Value = 2f;
					RefreshSpeedButtonTints();
				});
			});
			((UnityEvent)b5.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 4x", delegate
				{
					_cfg.SpeedMultiplier.Value = 4f;
					RefreshSpeedButtonTints();
				});
			});
			((UnityEvent)b6.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 8x", delegate
				{
					_cfg.SpeedMultiplier.Value = 8f;
					RefreshSpeedButtonTints();
				});
			});
			((UnityEvent)b2.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 16x", delegate
				{
					_cfg.SpeedMultiplier.Value = 16f;
					RefreshSpeedButtonTints();
				});
			});
			((UnityEvent)b4.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Speed 32x", delegate
				{
					_cfg.SpeedMultiplier.Value = 32f;
					RefreshSpeedButtonTints();
				});
			});
			AddPlainHeaderText("STATUS TOGGLES", transform, 26f);
			AddCheatToggleButton("Disable Poison", _cfg.DisablePoison, transform, toggles, panelRows, CheatColor.PoisonPurple);
			AddCheatToggleButton("Disable Cold", _cfg.DisableCold, transform, toggles, panelRows, CheatColor.ColdBlue);
			AddCheatToggleButton("Disable Hot", _cfg.DisableHot, transform, toggles, panelRows, CheatColor.HotRed);
			AddCheatToggleButton("Disable Hunger", _cfg.DisableHunger, transform, toggles, panelRows, CheatColor.HungerYellow);
			AddPlainHeaderText("STATUS APPLY", transform, 26f);
			AddActionButton("Apply Poison", transform, panelRows, delegate
			{
				_cheats.ApplyStatus(PeakStatus.Poison, 1f);
			}, CheatColor.PoisonPurple);
			AddActionButton("Apply Cold", transform, panelRows, delegate
			{
				_cheats.ApplyStatus(PeakStatus.Cold, 1f);
			}, CheatColor.ColdBlue);
			AddActionButton("Apply Hot", transform, panelRows, delegate
			{
				_cheats.ApplyStatus(PeakStatus.Hot, 1f);
			}, CheatColor.HotRed);
			AddActionButton("Apply Hunger", transform, panelRows, delegate
			{
				_cheats.ApplyStatus(PeakStatus.Hunger, 1f);
			}, CheatColor.HungerYellow);
			AddPlainHeaderText("UI", transform, 26f);
			AddCheatToggleButton("Minimap", _cfg.MinimapEnabled, transform, toggles, panelRows, CheatColor.UiTeal, delegate(bool enabled)
			{
				MinimapUi.SetEnabled(enabled);
			});
			AddHeaderStyleCloseBar("CLOSE", panelGo2.transform, delegate
			{
				CanvasGroup component5 = panelGo2.GetComponent<CanvasGroup>();
				if ((Object)(object)component5 != (Object)null)
				{
					component5.alpha = 0f;
					component5.interactable = false;
					component5.blocksRaycasts = false;
				}
				panelGo2.SetActive(false);
			});
			panelGo2.SetActive(false);
			((UnityEvent)openBtn2.Button.onClick).AddListener((UnityAction)delegate
			{
				//IL_0117: Unknown result type (might be due to invalid IL or missing references)
				//IL_011c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0120: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_0147: Unknown result type (might be due to invalid IL or missing references)
				//IL_014b: Unknown result type (might be due to invalid IL or missing references)
				//IL_015e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0163: Unknown result type (might be due to invalid IL or missing references)
				//IL_0167: Unknown result type (might be due to invalid IL or missing references)
				_log.LogInfo((object)$"[PeakTuner] Cheats button clicked. panelActive={panelGo2.activeSelf}");
				RefreshToggleLabels(toggles);
				RefreshSpeedButtonTints();
				QueueRowHeightSync(openBtn2, panelRows);
				panelGo2.SetActive(true);
				panelGo2.transform.SetAsLastSibling();
				CanvasGroup component2 = panelGo2.GetComponent<CanvasGroup>();
				if ((Object)(object)component2 != (Object)null)
				{
					component2.alpha = 1f;
					component2.interactable = true;
					component2.blocksRaycasts = true;
				}
				if ((Object)(object)scrollRect2 != (Object)null)
				{
					Canvas.ForceUpdateCanvases();
					scrollRect2.verticalNormalizedPosition = 1f;
				}
				LayoutRebuilder.ForceRebuildLayoutImmediate(panelRt2);
				RectTransform component3 = panelGo2.GetComponent<RectTransform>();
				RectTransform component4 = scrollGo2.GetComponent<RectTransform>();
				RectTransform content = scrollContent2.Content;
				ManualLogSource log = _log;
				object[] obj = new object[4] { panelGo2.activeSelf, null, null, null };
				Vector2? obj2;
				Rect rect;
				if (component3 == null)
				{
					obj2 = null;
				}
				else
				{
					rect = component3.rect;
					obj2 = ((Rect)(ref rect)).size;
				}
				obj[1] = obj2;
				Vector2? obj3;
				if (component4 == null)
				{
					obj3 = null;
				}
				else
				{
					rect = component4.rect;
					obj3 = ((Rect)(ref rect)).size;
				}
				obj[2] = obj3;
				rect = content.rect;
				obj[3] = ((Rect)(ref rect)).size;
				log.LogInfo((object)string.Format("[PeakTuner] Cheats panel shown. panelActive={0} panelSize={1} scrollSize={2} contentSize={3}", obj));
			});
			void RefreshSpeedButtonTints()
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: 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_00ae: 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)
				//IL_00d8: 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)
				//IL_0102: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
				float value = _cfg.SpeedMultiplier.Value;
				ApplyButtonTint(b1, (Mathf.Abs(value - 1f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
				ApplyButtonTint(b3, (Mathf.Abs(value - 2f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
				ApplyButtonTint(b5, (Mathf.Abs(value - 4f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
				ApplyButtonTint(b6, (Mathf.Abs(value - 8f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
				ApplyButtonTint(b2, (Mathf.Abs(value - 16f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
				ApplyButtonTint(b4, (Mathf.Abs(value - 32f) < 0.001f) ? CheatColor.SpeedSelected : CheatColor.SpeedUnselected);
			}
		}

		private static void AddScrollBar(GameObject scrollGo, ScrollRect scrollRect)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("PeakTuner_Scrollbar");
			val.transform.SetParent(scrollGo.transform, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = new Vector2(1f, 0f);
			val2.anchorMax = new Vector2(1f, 1f);
			val2.pivot = new Vector2(1f, 0.5f);
			val2.sizeDelta = new Vector2(10f, 0f);
			val2.anchoredPosition = new Vector2(-6f, 0f);
			Image val3 = val.AddComponent<Image>();
			val3.sprite = GetSolidSprite();
			val3.type = (Type)1;
			((Graphic)val3).material = null;
			((Graphic)val3).raycastTarget = false;
			((MaskableGraphic)val3).maskable = false;
			((Graphic)val3).color = new Color(1f, 1f, 1f, 0.08f);
			Scrollbar val4 = val.AddComponent<Scrollbar>();
			val4.direction = (Direction)2;
			GameObject val5 = new GameObject("Handle");
			val5.transform.SetParent(val.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = new Vector2(0f, 0f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.offsetMin = new Vector2(2f, 2f);
			val6.offsetMax = new Vector2(-2f, -2f);
			Image val7 = val5.AddComponent<Image>();
			val7.sprite = GetSolidSprite();
			val7.type = (Type)1;
			((Graphic)val7).material = null;
			((Graphic)val7).raycastTarget = true;
			((MaskableGraphic)val7).maskable = false;
			((Graphic)val7).color = new Color(1f, 1f, 1f, 0.35f);
			val4.handleRect = val6;
			((Selectable)val4).targetGraphic = (Graphic)(object)val7;
			scrollRect.verticalScrollbar = val4;
			scrollRect.verticalScrollbarVisibility = (ScrollbarVisibility)2;
			scrollRect.verticalScrollbarSpacing = -2f;
		}

		private static void AddCheatToggleButton(string label, ConfigEntry<bool> entry, Transform parent, List<ToggleRow> stash, List<PeakMenuButton> panelRows, Color tint, Action<bool>? onChanged = null)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			string label2 = label;
			ConfigEntry<bool> entry2 = entry;
			Action<bool> onChanged2 = onChanged;
			PeakMenuButton btn = MenuAPI.CreatePauseMenuButton(BuildToggleLabel(label2, entry2.Value));
			ElementExtensions.ParentTo<PeakMenuButton>(btn, parent);
			SetButtonText(btn, BuildToggleLabel(label2, entry2.Value));
			MakePanelRow(btn, 44f);
			ApplyToggleTint(btn, tint, entry2.Value);
			panelRows.Add(btn);
			((UnityEvent)btn.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled(label2, delegate
				{
					//IL_0046: Unknown result type (might be due to invalid IL or missing references)
					entry2.Value = !entry2.Value;
					((PeakLocalizableElement)btn).Text.text = BuildToggleLabel(label2, entry2.Value);
					ApplyToggleTint(btn, tint, entry2.Value);
					onChanged2?.Invoke(entry2.Value);
				});
			});
			stash.Add(new ToggleRow(label2, entry2, btn, tint));
		}

		private static void AddActionButton(string text, Transform parent, Action action, Color tint)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			AddActionButton(text, parent, null, action, tint);
		}

		private static void AddActionButton(string text, Transform parent, List<PeakMenuButton>? panelRows, Action action, Color tint)
		{
			//IL_0040: 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_006d: Expected O, but got Unknown
			string text2 = text;
			Action action2 = action;
			PeakMenuButton val = MenuAPI.CreatePauseMenuButton(text2);
			ElementExtensions.ParentTo<PeakMenuButton>(val, parent);
			SetButtonText(val, text2);
			MakePanelRow(val, 44f);
			ApplyButtonTint(val, tint);
			panelRows?.Add(val);
			((UnityEvent)val.Button.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled(text2, delegate
				{
					action2();
				});
			});
		}

		private static TMP_Text AddPlainHeaderText(string text, Transform parent, float fontSize)
		{
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			PeakText val = MenuAPI.CreateText(text, "PeakTuner_hdr_" + Guid.NewGuid().ToString("N"));
			ElementExtensions.ParentTo<PeakText>(val, parent);
			TMP_Text text2 = ((PeakLocalizableElement)val).Text;
			text2.text = text;
			text2.fontSize = fontSize;
			text2.alignment = (TextAlignmentOptions)514;
			text2.textWrappingMode = (TextWrappingModes)0;
			LayoutElement val2 = ((Component)text2).gameObject.GetComponent<LayoutElement>();
			if ((Object)(object)val2 == (Object)null)
			{
				val2 = ((Component)text2).gameObject.AddComponent<LayoutElement>();
			}
			val2.flexibleWidth = 1f;
			val2.minHeight = fontSize + 10f;
			val2.preferredHeight = fontSize + 10f;
			((Graphic)text2).color = Color.white;
			return text2;
		}

		private static void MakePanelRow(PeakMenuButton btn, float height)
		{
			try
			{
				GameObject gameObject = ((Component)btn.Button).gameObject;
				LayoutElement val = gameObject.GetComponent<LayoutElement>();
				if ((Object)(object)val == (Object)null)
				{
					val = gameObject.AddComponent<LayoutElement>();
				}
				val.flexibleWidth = 1f;
				val.minHeight = height;
				val.preferredHeight = height;
				val.flexibleHeight = 0f;
			}
			catch
			{
			}
		}

		private static void ApplyButtonTint(PeakMenuButton btn, Color tint)
		{
			//IL_0001: 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)
			try
			{
				btn.SetColor(tint, true);
				if ((Object)(object)((PeakLocalizableElement)btn).Text != (Object)null)
				{
					((Graphic)((PeakLocalizableElement)btn).Text).color = Color.white;
				}
				if ((Object)(object)btn.Button != (Object)null)
				{
					((Selectable)btn.Button).transition = (Transition)0;
				}
			}
			catch
			{
			}
		}

		private static void QueueRowHeightSync(PeakMenuButton reference, List<PeakMenuButton> rows)
		{
			((MonoBehaviour)EnsureUiHost()).StartCoroutine(SyncRowHeightsNextFrame(reference, rows));
		}

		[IteratorStateMachine(typeof(<SyncRowHeightsNextFrame>d__39))]
		private static IEnumerator SyncRowHeightsNextFrame(PeakMenuButton reference, List<PeakMenuButton> rows)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SyncRowHeightsNextFrame>d__39(0)
			{
				reference = reference,
				rows = rows
			};
		}

		private static void SetRowHeight(PeakMenuButton btn, float height)
		{
			try
			{
				GameObject gameObject = ((Component)btn.Button).gameObject;
				LayoutElement val = gameObject.GetComponent<LayoutElement>();
				if ((Object)(object)val == (Object)null)
				{
					val = gameObject.AddComponent<LayoutElement>();
				}
				val.flexibleWidth = 1f;
				val.minHeight = height;
				val.preferredHeight = height;
				val.flexibleHeight = 0f;
			}
			catch
			{
			}
		}

		private static void ApplyToggleTint(PeakMenuButton btn, Color baseTint, bool enabled)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			ApplyButtonTint(btn, enabled ? baseTint : Muted(baseTint));
		}

		private static Color Muted(Color c)
		{
			//IL_001b: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: 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)
			Color val = default(Color);
			((Color)(ref val))..ctor(0.45f, 0.45f, 0.45f, 1f);
			Color val2 = Color.Lerp(c, val, 0.5f);
			return new Color(val2.r * 0.75f, val2.g * 0.75f, val2.b * 0.75f, c.a);
		}

		private static void RefreshToggleLabels(List<ToggleRow> rows)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			foreach (ToggleRow row in rows)
			{
				ApplyToggleTint(row.Button, row.BaseTint, row.Entry.Value);
			}
			foreach (ToggleRow row2 in rows)
			{
				((PeakLocalizableElement)row2.Button).Text.text = BuildToggleLabel(row2.Label, row2.Entry.Value);
			}
		}

		private static string BuildToggleLabel(string label, bool enabled)
		{
			if (!enabled)
			{
				return label + ": OFF";
			}
			return label + ": ON";
		}

		private static bool IsGameplayReady()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			Character localCharacter = Character.localCharacter;
			return (Object)localCharacter != (Object)null;
		}

		private static Transform FindPauseMenuButtonListParent(Transform root)
		{
			Transform val = FindButtonParentByText(root, "BACK");
			if ((Object)(object)val != (Object)null)
			{
				return val;
			}
			string[] array = new string[6] { "Resume", "Continue", "Options", "Settings", "Quit", "Exit" };
			for (int i = 0; i < array.Length; i++)
			{
				Transform val2 = FindButtonParentByText(root, array[i]);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return root;
		}

		private static Transform? FindButtonParentByText(Transform root, string needle)
		{
			Button[] componentsInChildren = ((Component)root).GetComponentsInChildren<Button>(true);
			Button[] array = componentsInChildren;
			foreach (Button val in array)
			{
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				TMP_Text componentInChildren = ((Component)val).GetComponentInChildren<TMP_Text>(true);
				if (!((Object)(object)componentInChildren == (Object)null))
				{
					string a = (componentInChildren.text ?? "").Trim();
					if (string.Equals(a, needle, StringComparison.OrdinalIgnoreCase))
					{
						return ((Component)val).transform.parent;
					}
				}
			}
			return null;
		}

		private static void ApplySolidPanelBackground(Image bg)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			bg.sprite = GetSolidSprite();
			bg.type = (Type)1;
			((Graphic)bg).material = null;
			((Graphic)bg).raycastTarget = true;
			((Graphic)bg).color = PanelBgColor;
		}

		private static Sprite GetSolidSprite()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			if ((Object)(object)_solidSprite != (Object)null)
			{
				return _solidSprite;
			}
			Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false);
			val.SetPixel(0, 0, Color.white);
			val.Apply(false, true);
			_solidSprite = Sprite.Create(val, new Rect(0f, 0f, 1f, 1f), new Vector2(0.5f, 0.5f), 100f);
			return _solidSprite;
		}

		private static void SetButtonText(PeakMenuButton btn, string text)
		{
			try
			{
				if ((Object)(object)((PeakLocalizableElement)btn).Text != (Object)null)
				{
					((PeakLocalizableElement)btn).Text.text = text;
				}
			}
			catch
			{
			}
		}

		private static void AddHeaderStyleCloseBar(string text, Transform parent, Action onClick)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: 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_0113: 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_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_0331: Expected O, but got Unknown
			Action onClick2 = onClick;
			GameObject val = new GameObject("PeakTuner_CloseSpacer");
			val.transform.SetParent(parent, false);
			LayoutElement val2 = val.AddComponent<LayoutElement>();
			val2.flexibleWidth = 1f;
			float preferredHeight = (val2.minHeight = 18f);
			val2.preferredHeight = preferredHeight;
			val2.flexibleHeight = 0f;
			GameObject val3 = new GameObject("PeakTuner_CloseBar");
			val3.transform.SetParent(parent, false);
			LayoutElement val4 = val3.AddComponent<LayoutElement>();
			val4.flexibleWidth = 1f;
			val4.minHeight = 52f;
			val4.preferredHeight = 52f;
			val4.flexibleHeight = 0f;
			Image val5 = val3.AddComponent<Image>();
			val5.sprite = GetSolidSprite();
			val5.type = (Type)1;
			((Graphic)val5).material = null;
			((Graphic)val5).raycastTarget = true;
			Button val6 = val3.AddComponent<Button>();
			((Selectable)val6).targetGraphic = (Graphic)(object)val5;
			((Selectable)val6).transition = (Transition)1;
			ColorBlock colors = ((Selectable)val6).colors;
			((ColorBlock)(ref colors)).normalColor = CloseBarNormal;
			((ColorBlock)(ref colors)).highlightedColor = CloseBarHover;
			((ColorBlock)(ref colors)).pressedColor = CloseBarPress;
			((ColorBlock)(ref colors)).selectedColor = CloseBarHover;
			((ColorBlock)(ref colors)).disabledColor = new Color(CloseBarNormal.r, CloseBarNormal.g, CloseBarNormal.b, 0.35f);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			((ColorBlock)(ref colors)).fadeDuration = 0.08f;
			((Selectable)val6).colors = colors;
			PeakText val7 = MenuAPI.CreateText(text, "PeakTuner_close_txt_" + Guid.NewGuid().ToString("N"));
			ElementExtensions.ParentTo<PeakText>(val7, val3.transform);
			RectTransform component = ((Component)val7).gameObject.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 1f);
			component.pivot = new Vector2(0.5f, 0.5f);
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
			component.anchoredPosition = Vector2.zero;
			ContentSizeFitter component2 = ((Component)val7).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)component2 != (Object)null)
			{
				((Behaviour)component2).enabled = false;
			}
			TMP_Text text2 = ((PeakLocalizableElement)val7).Text;
			text2.text = text;
			text2.fontSize = 28f;
			text2.alignment = (TextAlignmentOptions)514;
			text2.textWrappingMode = (TextWrappingModes)0;
			((Graphic)text2).color = CloseBarText;
			text2.margin = Vector4.zero;
			RectTransform component3 = ((Component)text2).GetComponent<RectTransform>();
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			component3.pivot = new Vector2(0.5f, 0.5f);
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			component3.anchoredPosition = Vector2.zero;
			ContentSizeFitter component4 = ((Component)text2).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)component4 != (Object)null)
			{
				((Behaviour)component4).enabled = false;
			}
			((UnityEvent)val6.onClick).AddListener((UnityAction)delegate
			{
				RunUiActionThrottled("Close", delegate
				{
					onClick2();
				});
			});
		}
	}
	public sealed class PeakMenuSkin
	{
		private readonly ManualLogSource _log;

		public Rect MenuRect = new Rect(24f, 80f, 520f, 520f);

		public string WindowTitle = "";

		private static readonly Color32 CWindow = new Color32((byte)22, (byte)22, (byte)26, byte.MaxValue);

		private static readonly Color32 CPanel = new Color32((byte)30, (byte)30, (byte)36, byte.MaxValue);

		private static readonly Color32 CBorder = new Color32((byte)70, (byte)70, (byte)84, byte.MaxValue);

		private static readonly Color32 CText = new Color32((byte)235, (byte)235, (byte)240, byte.MaxValue);

		private static readonly Color32 CTextDim = new Color32((byte)190, (byte)190, (byte)200, byte.MaxValue);

		private static readonly Color32 CBtn = new Color32((byte)48, (byte)48, (byte)58, byte.MaxValue);

		private static readonly Color32 CBtnHover = new Color32((byte)62, (byte)62, (byte)76, byte.MaxValue);

		private static readonly Color32 CBtnActive = new Color32((byte)80, (byte)80, (byte)98, byte.MaxValue);

		private bool _ready;

		private Font? _uiFont;

		private Texture2D? _texWindow;

		private Texture2D? _texPanel;

		private Texture2D? _texBtn;

		private Texture2D? _texBtnHover;

		private Texture2D? _texBtnActive;

		private GUIStyle? _windowStyle;

		private GUIStyle? _panelStyle;

		private GUIStyle? _labelStyle;

		private GUIStyle? _labelDimStyle;

		private GUIStyle? _toggleStyle;

		private GUIStyle? _buttonStyle;

		private GUIStyle? _smallButtonStyle;

		private GUIStyle? _sectionHeaderStyle;

		public GUIStyle WindowStyle => _windowStyle;

		public GUIStyle PanelStyle => _panelStyle;

		public GUIStyle LabelStyle => _labelStyle;

		public GUIStyle LabelDimStyle => _labelDimStyle;

		public GUIStyle ToggleStyle => _toggleStyle;

		public GUIStyle ButtonStyle => _buttonStyle;

		public GUIStyle SmallButtonStyle => _smallButtonStyle;

		public GUIStyle SectionHeaderStyle => _sectionHeaderStyle;

		public PeakMenuSkin(ManualLogSource log)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			_log = log;
		}

		public void EnsureStyles()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: 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_00f6: Expected O, but got Unknown
			//IL_00fb: Expected O, but got Unknown
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Expected O, but got Unknown
			//IL_011a: 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_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Expected O, but got Unknown
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Expected O, but got Unknown
			//IL_0180: Expected O, but got Unknown
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: 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)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Expected O, but got Unknown
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Expected O, but got Unknown
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Expected O, but got Unknown
			//IL_0228: Expected O, but got Unknown
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0263: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: 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_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Expected O, but got Unknown
			//IL_02c7: Expected O, but got Unknown
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Expected O, but got Unknown
			//IL_02f1: Expected O, but got Unknown
			//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0301: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0315: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0320: Unknown result type (might be due to invalid IL or missing references)
			//IL_032a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0330: Unknown result type (might be due to invalid IL or missing references)
			//IL_0335: Unknown result type (might be due to invalid IL or missing references)
			//IL_033f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			//IL_034f: Expected O, but got Unknown
			//IL_0354: Expected O, but got Unknown
			if (!_ready)
			{
				_uiFont = TryFindNiceFont();
				_texWindow = MakeSolid(Color32.op_Implicit(CWindow));
				_texPanel = MakeSolid(Color32.op_Implicit(CPanel));
				_texBtn = MakeSolid(Color32.op_Implicit(CBtn));
				_texBtnHover = MakeSolid(Color32.op_Implicit(CBtnHover));
				_texBtnActive = MakeSolid(Color32.op_Implicit(CBtnActive));
				GUIStyle val = new GUIStyle(GUI.skin.window)
				{
					font = _uiFont,
					fontSize = 16
				};
				val.normal.background = _texWindow;
				val.normal.textColor = Color.white;
				val.onNormal.background = _texWindow;
				val.onNormal.textColor = Color.white;
				val.padding = new RectOffset(14, 14, 12, 12);
				_windowStyle = val;
				_windowStyle.border = new RectOffset(6, 6, 6, 6);
				GUIStyle val2 = new GUIStyle(GUI.skin.box)
				{
					font = _uiFont,
					fontSize = 14
				};
				val2.normal.background = _texPanel;
				val2.normal.textColor = ToColor(CText);
				val2.padding = new RectOffset(14, 14, 12, 12);
				val2.margin = new RectOffset(0, 0, 0, 0);
				_panelStyle = val2;
				GUIStyle val3 = new GUIStyle(GUI.skin.label)
				{
					font = _uiFont,
					fontSize = 14
				};
				val3.normal.textColor = ToColor(CText);
				_labelStyle = val3;
				GUIStyle val4 = new GUIStyle(_labelStyle);
				val4.normal.textColor = ToColor(CTextDim);
				_labelDimStyle = val4;
				GUIStyle val5 = new GUIStyle(_labelStyle)
				{
					fontSize = 12,
					fontStyle = (FontStyle)1
				};
				val5.normal.textColor = ToColor(CTextDim);
				val5.margin = new RectOffset(0, 0, 8, 2);
				_sectionHeaderStyle = val5;
				GUIStyle val6 = new GUIStyle(GUI.skin.button)
				{
					font = _uiFont,
					fontSize = 14
				};
				val6.normal.background = _texBtn;
				val6.normal.textColor = Color.white;
				val6.hover.background = _texBtnHover;
				val6.hover.textColor = Color.white;
				val6.active.background = _texBtnActive;
				val6.active.textColor = Color.white;
				val6.padding = new RectOffset(12, 12, 9, 9);
				_buttonStyle = val6;
				_smallButtonStyle = new GUIStyle(_buttonStyle)
				{
					fontSize = 13,
					padding = new RectOffset(10, 10, 7, 7)
				};
				GUIStyle val7 = new GUIStyle(GUI.skin.toggle)
				{
					font = _uiFont,
					fontSize = 14
				};
				val7.normal.textColor = ToColor(CText);
				val7.onNormal.textColor = ToColor(CText);
				val7.padding = new RectOffset(20, 0, 0, 0);
				_toggleStyle = val7;
				_ready = true;
				_log.LogInfo((object)$"[PeakMenuSkin] IMGUI styles ready. Using customFont={(Object)(object)_uiFont != (Object)null}");
			}
		}

		public void DrawBorderedBox(Rect r)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: 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)
			Texture2D val = MakeSolid(Color32.op_Implicit(CBorder));
			GUI.DrawTexture(new Rect(((Rect)(ref r)).x - 1f, ((Rect)(ref r)).y - 1f, ((Rect)(ref r)).width + 2f, 1f), (Texture)(object)val);
			GUI.DrawTexture(new Rect(((Rect)(ref r)).x - 1f, ((Rect)(ref r)).y + ((Rect)(ref r)).height, ((Rect)(ref r)).width + 2f, 1f), (Texture)(object)val);
			GUI.DrawTexture(new Rect(((Rect)(ref r)).x - 1f, ((Rect)(ref r)).y, 1f, ((Rect)(ref r)).height), (Texture)(object)val);
			GUI.DrawTexture(new Rect(((Rect)(ref r)).x + ((Rect)(ref r)).width, ((Rect)(ref r)).y, 1f, ((Rect)(ref r)).height), (Texture)(object)val);
		}

		private static Texture2D MakeSolid(Color c)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false);
			val.SetPixel(0, 0, c);
			val.Apply(false, true);
			return val;
		}

		private static Color ToColor(Color32 c)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: 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)
			return new Color((float)(int)c.r / 255f, (float)(int)c.g / 255f, (float)(int)c.b / 255f, (float)(int)c.a / 255f);
		}

		private static Font? TryFindNiceFont()
		{
			try
			{
				Font[] array = Resources.FindObjectsOfTypeAll<Font>();
				if (array == null || array.Length == 0)
				{
					return null;
				}
				Font result = null;
				int num = int.MinValue;
				Font[] array2 = array;
				foreach (Font val in array2)
				{
					if (!((Object)(object)val == (Object)null))
					{
						string text = ((Object)val).name ?? "";
						int num2 = 0;
						if (text.IndexOf("Arial", StringComparison.OrdinalIgnoreCase) >= 0)
						{
							num2 -= 50;
						}
						if (text.IndexOf("UI", StringComparison.OrdinalIgnoreCase) >= 0)
						{
							num2 += 30;
						}
						if (text.IndexOf("Menu", StringComparison.OrdinalIgnoreCase) >= 0)
						{
							num2 += 15;
						}
						if (text.IndexOf("Bold", StringComparison.OrdinalIgnoreCase) >= 0)
						{
							num2 += 5;
						}
						if (!val.dynamic)
						{
							num2 += 5;
						}
						if (num2 > num)
						{
							num = num2;
							result = val;
						}
					}
				}
				return result;
			}
			catch
			{
				return null;
			}
		}
	}
	public sealed class PeakMenuView
	{
		public readonly struct Actions
		{
			public readonly Action onClose;

			public readonly Action onApplyPoison;

			public readonly Action onApplyCold;

			public readonly Action onApplyHot;

			public readonly Action onApplyHunger;

			public Actions(Action onClose, Action onApplyPoison, Action onApplyCold, Action onApplyHot, Action onApplyHunger)
			{
				this.onClose = onClose;
				this.onApplyPoison = onApplyPoison;
				this.onApplyCold = onApplyCold;
				this.onApplyHot = onApplyHot;
				this.onApplyHunger = onApplyHunger;
			}
		}

		private readonly PeakMenuSkin _skin;

		private readonly ModConfig _cfg;

		private readonly Actions _a;

		private Vector2 _scroll;

		private readonly int _windowId;

		public PeakMenuView(PeakMenuSkin skin, ModConfig cfg, Actions actions)
		{
			//IL_002c: 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)
			_skin = skin;
			_cfg = cfg;
			_a = actions;
			_windowId = "PeakTuner.Window".GetHashCode();
			_scroll = Vector2.zero;
		}

		public void Draw()
		{
			//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_0021: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			_skin.EnsureStyles();
			_skin.MenuRect = ClampToScreen(_skin.MenuRect);
			GUI.Window(_windowId, _skin.MenuRect, new WindowFunction(DrawWindowContents), _skin.WindowTitle, _skin.WindowStyle);
		}

		private void DrawWindowContents(int id)
		{
			//IL_0043: 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_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(10f, 28f, ((Rect)(ref _skin.MenuRect)).width - 20f, ((Rect)(ref _skin.MenuRect)).height - 38f);
			_skin.DrawBorderedBox(val);
			GUILayout.BeginArea(val);
			_scroll = GUILayout.BeginScrollView(_scroll, false, true, Array.Empty<GUILayoutOption>());
			GUILayout.BeginVertical(_skin.PanelStyle, Array.Empty<GUILayoutOption>());
			ToggleEntry(_cfg.InfiniteStamina, "Infinite Stamina");
			ToggleEntry(_cfg.NoFallDamage, "No Fall Damage");
			ToggleEntry(_cfg.DisableCold, "Disable Cold");
			ToggleEntry(_cfg.DisablePoison, "Disable Poison");
			ToggleEntry(_cfg.DisableHot, "Disable Hot");
			ToggleEntry(_cfg.DisableHunger, "Disable Hunger");
			ToggleEntry(_cfg.GodMode, "God Mode");
			GUILayout.Space(12f);
			GUILayout.Label("Status effects", _skin.SectionHeaderStyle, Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Apply Poison", _skin.ButtonStyle, Array.Empty<GUILayoutOption>()))
			{
				_a.onApplyPoison();
			}
			if (GUILayout.Button("Apply Cold", _skin.ButtonStyle, Array.Empty<GUILayoutOption>()))
			{
				_a.onApplyCold();
			}
			if (GUILayout.Button("Apply Hot", _skin.ButtonStyle, Array.Empty<GUILayoutOption>()))
			{
				_a.onApplyHot();
			}
			if (GUILayout.Button("Apply Hunger", _skin.ButtonStyle, Array.Empty<GUILayoutOption>()))
			{
				_a.onApplyHunger();
			}
			GUILayout.EndVertical();
			GUILayout.EndScrollView();
			GUILayout.EndArea();
			GUI.DragWindow(new Rect(0f, 0f, 10000f, 24f));
		}

		private void ToggleEntry(ConfigEntry<bool> entry, string label)
		{
			bool value = entry.Value;
			bool flag = GUILayout.Toggle(value, label, _skin.ToggleStyle, Array.Empty<GUILayoutOption>());
			if (flag != value)
			{
				entry.Value = flag;
			}
		}

		private static Rect ClampToScreen(Rect r)
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Clamp(((Rect)(ref r)).x, 0f, Mathf.Max(0f, (float)Screen.width - ((Rect)(ref r)).width));
			float num2 = Mathf.Clamp(((Rect)(ref r)).y, 0f, Mathf.Max(0f, (float)Screen.height - ((Rect)(ref r)).height));
			return new Rect(num, num2, ((Rect)(ref r)).width, ((Rect)(ref r)).height);
		}
	}
}
namespace PeakTuner.Cheats
{
	public sealed class CheatsService
	{
		private sealed class SpeedTargets
		{
			private readonly struct Candidate
			{
				public readonly Component Component;

				public readonly MemberInfo Member;

				public readonly int Score;

				public readonly bool IsMultiplier;

				public readonly bool IsClimb;

				public readonly float BaseValue;

				public static Candidate None => new Candidate(null, null, int.MinValue, isMultiplier: false, isClimb: false, 1f);

				public Candidate(Component component, MemberInfo member, int score, bool isMultiplier, bool isClimb, float baseValue)
				{
					Component = component;
					Member = member;
					Score = score;
					IsMultiplier = isMultiplier;
					IsClimb = isClimb;
					BaseValue = baseValue;
				}

				public CachedTarget ToCachedTarget()
				{
					if (Member == null)
					{
						return default(CachedTarget);
					}
					string text = (((Object)(object)Component != (Object)null) ? (((object)Component).GetType().Name ?? "<?>") : "<?>");
					string text2 = ((Member != null) ? (Member.Name ?? "<?>") : "<?>");
					CachedTarget result = default(CachedTarget);
					result.Component = Component;
					result.Member = Member;
					result.IsMultiplier = IsMultiplier;
					result.BaseValue = (IsMultiplier ? 1f : BaseValue);
					result.LastSetValue = float.NaN;
					result.DebugLabel = text + "." + text2;
					return result;
				}
			}

			private struct CachedTarget
			{
				public Component? Component;

				public MemberInfo? Member;

				public bool IsMultiplier;

				public float BaseValue;

				public float LastSetValue;

				public string DebugLabel;
			}

			public float NextProbeTime;

			private CachedTarget _move;

			private CachedTarget _climb;

			private bool _loggedNotFound;

			public bool Ready
			{
				get
				{
					if (!(_move.Member != null))
					{
						return _climb.Member != null;
					}
					return true;
				}
			}

			public void TryCache(ManualLogSource log, Character c)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected O, but got Unknown
				//IL_0059: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Expected O, but got Unknown
				try
				{
					if ((Object)c == (Object)null)
					{
						_move = default(CachedTarget);
						_climb = default(CachedTarget);
						return;
					}
					Component[] componentsInChildren = ((Component)c).GetComponentsInChildren<Component>(true);
					if (componentsInChildren == null || componentsInChildren.Length == 0)
					{
						return;
					}
					Candidate bestMove = Candidate.None;
					Candidate bestClimb = Candidate.None;
					foreach (Component val in componentsInChildren)
					{
						if ((Object)val == (Object)null)
						{
							continue;
						}
						Type type = ((object)val).GetType();
						string text = (type.Name ?? "").ToLowerInvariant();
						if (type == typeof(Transform) || type == typeof(RectTransform))
						{
							continue;
						}
						int num = 0;
						if (text.Contains("speed"))
						{
							num += 25;
						}
						if (text.Contains("movement"))
						{
							num += 18;
						}
						if (text.Contains("motor"))
						{
							num += 18;
						}
						if (text.Contains("controller"))
						{
							num += 10;
						}
						if (text.Contains("camera") || text.Contains("look") || text.Contains("aim"))
						{
							num -= 60;
						}
						FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
						foreach (FieldInfo fieldInfo in fields)
						{
							if (!(fieldInfo.FieldType != typeof(float)))
							{
								float? num2 = TryReadFloat(fieldInfo, val);
								if (num2.HasValue)
								{
									ScoreAndMaybeTake(val, fieldInfo, fieldInfo.Name, num2.Value, num, ref bestMove, ref bestClimb);
								}
							}
						}
						PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
						foreach (PropertyInfo propertyInfo in properties)
						{
							if (!(propertyInfo.PropertyType != typeof(float)) && propertyInfo.CanWrite && (propertyInfo.GetIndexParameters() == null || propertyInfo.GetIndexParameters().Length == 0))
							{
								float? num3 = TryReadFloat(propertyInfo, val);
								if (num3.HasValue)
								{
									ScoreAndMaybeTake(val, propertyInfo, propertyInfo.Name, num3.Value, num, ref bestMove, ref bestClimb);
								}
							}
						}
					}
					_move = bestMove.ToCachedTarget();
					_climb = bestClimb.ToCachedTarget();
					if (!Ready)
					{
						if (!_loggedNotFound)
						{
							_loggedNotFound = true;
							log.LogInfo((object)"[PeakTuner] Speed: could not locate any plausible speed member on the player (will keep retrying).");
						}
					}
					else
					{
						log.LogInfo((object)("[PeakTuner] Speed: cached move=" + _move.DebugLabel + " climb=" + _climb.DebugLabel));
					}
				}
				catch (Exception ex)
				{
					log.LogError((object)("[PeakTuner] Speed: cache scan failed: " + ex.GetType().Name));
				}
			}

			public void Apply(ManualLogSource log, Character c, float multiplier)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Expected O, but got Unknown
				try
				{
					if (!((Object)c == (Object)null))
					{
						if (_move.Member != null)
						{
							ApplyOne(log, c, ref _move, multiplier);
						}
						if (_climb.Member != null)
						{
							ApplyOne(log, c, ref _climb, multiplier);
						}
					}
				}
				catch
				{
				}
			}

			private static void ApplyOne(ManualLogSource log, Character c, ref CachedTarget tgt, float m)
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Expected O, but got Unknown
				if ((Object)(object)tgt.Component == (Object)null)
				{
					return;
				}
				Object component = (Object)(object)tgt.Component;
				if (component != null && component == (Object)null)
				{
					return;
				}
				float num = (tgt.IsMultiplier ? m : (tgt.BaseValue * m));
				if (Mathf.Abs(num - tgt.LastSetValue) < 0.0001f)
				{
					return;
				}
				try
				{
					if (tgt.Member is FieldInfo fieldInfo)
					{
						fieldInfo.SetValue(tgt.Component, num);
						tgt.LastSetValue = num;
					}
					else if (tgt.Member is PropertyInfo propertyInfo)
					{
						propertyInfo.SetValue(tgt.Component, num, null);
						tgt.LastSetValue = num;
					}
				}
				catch (Exception ex)