Decompiled source of FishermanMastery v1.0.2

FishermanMastery.dll

Decompiled 4 hours ago
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.Video;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace FishermanMastery;

[BepInPlugin("com.max.fishermanmastery", "FishermanMastery", "1.0.2")]
public class FishermanMasteryPlugin : BaseUnityPlugin
{
	public struct LevelReward
	{
		public int level;

		public string rank;

		public string buffLine;
	}

	[Serializable]
	public class SaveSlotData
	{
		public string saveName = "Default";

		public int level = 1;

		public int exp = 0;
	}

	[Serializable]
	public class MultiSaveContainer
	{
		public List<SaveSlotData> slots = new List<SaveSlotData>();
	}

	public const string MOD_GUID = "com.max.fishermanmastery";

	public const string MOD_NAME = "FishermanMastery";

	public const string MOD_VERSION = "1.0.2";

	public static FishermanMasteryPlugin Instance;

	public static ManualLogSource ModLogger;

	private Harmony harmony;

	private static AudioSource sfxSource;

	private static AudioClip sndLevelUp;

	private static AudioClip sndCatch;

	public static bool showLevelTable = false;

	private Rect tableRect = new Rect(0f, 0f, 740f, 620f);

	private Vector2 scrollPos = Vector2.zero;

	private bool wasTableOpen = false;

	public static int currentLevel = 1;

	public static int currentExp = 0;

	private static float displayedExp = 0f;

	public static int recentExpGain = 0;

	public static float recentExpTimer = 0f;

	public static bool showLevelUpBanner = false;

	public static float levelUpBannerTimer = 0f;

	public static int newLevel = 1;

	public static string savePath;

	private static string iconsDir;

	public static readonly HashSet<int> ProcessedFishIds = new HashSet<int>();

	public static readonly LevelReward[] Rewards = new LevelReward[20]
	{
		new LevelReward
		{
			level = 1,
			rank = "Deckhand",
			buffLine = "Start — welcome aboard!"
		},
		new LevelReward
		{
			level = 2,
			rank = "Deckhand",
			buffLine = "+10% Food Fullness"
		},
		new LevelReward
		{
			level = 3,
			rank = "Sailor",
			buffLine = "+10% Reel Speed"
		},
		new LevelReward
		{
			level = 4,
			rank = "Sailor",
			buffLine = "+10% Cast Distance"
		},
		new LevelReward
		{
			level = 5,
			rank = "Sailor",
			buffLine = "+10% Fish Sell Price"
		},
		new LevelReward
		{
			level = 6,
			rank = "Bosun",
			buffLine = "+15% Oxygen Time"
		},
		new LevelReward
		{
			level = 7,
			rank = "Bosun",
			buffLine = "5% Shop Discount"
		},
		new LevelReward
		{
			level = 8,
			rank = "Bosun",
			buffLine = "+20% Reel Speed (cumulative)"
		},
		new LevelReward
		{
			level = 9,
			rank = "Skipper",
			buffLine = "+10% Fish Sell Price (cumulative)"
		},
		new LevelReward
		{
			level = 10,
			rank = "Skipper",
			buffLine = "+10% Boat Speed"
		},
		new LevelReward
		{
			level = 11,
			rank = "Skipper",
			buffLine = "+30% Oxygen Time (cumulative)"
		},
		new LevelReward
		{
			level = 12,
			rank = "Skipper",
			buffLine = "+10% Cast Distance (cumulative)"
		},
		new LevelReward
		{
			level = 13,
			rank = "Captain",
			buffLine = "10% Shop Discount (cumulative)"
		},
		new LevelReward
		{
			level = 14,
			rank = "Captain",
			buffLine = "+20% Fish Sell Price (cumulative)"
		},
		new LevelReward
		{
			level = 15,
			rank = "Captain",
			buffLine = "+20% Boat Speed (cumulative)"
		},
		new LevelReward
		{
			level = 16,
			rank = "Sea Wolf",
			buffLine = "+20% Food Fullness (cumulative)"
		},
		new LevelReward
		{
			level = 17,
			rank = "Sea Wolf",
			buffLine = "15% Shop Discount (cumulative)"
		},
		new LevelReward
		{
			level = 18,
			rank = "Sea Wolf",
			buffLine = "5% Treasure Find Chance (fishing)"
		},
		new LevelReward
		{
			level = 19,
			rank = "Legend",
			buffLine = "+30% Fish Sell Price (cumulative)"
		},
		new LevelReward
		{
			level = 20,
			rank = "Legend of the Seas",
			buffLine = "ULTIMATE — All bonuses x1.5!"
		}
	};

	private bool uiInit = false;

	private Font uiFont;

	private Texture2D txHudFrame;

	private Texture2D txHudHex;

	private Texture2D txHudBarBg;

	private Texture2D txHudBarFill;

	private Texture2D txLevelupArrow;

	private Texture2D txWindowBg;

	private Texture2D txExpBg;

	private Texture2D txExpFill;

	private Texture2D txBadgeBg;

	private Texture2D txRowUnlocked;

	private Texture2D txRowLocked;

	private Texture2D txRowCurrent;

	private Texture2D txBtnDark;

	private Texture2D txBtnHover;

	private Texture2D txSummaryBg;

	private Texture2D txCardCurrent;

	private Texture2D txCardUnlocked;

	private Texture2D txCardLocked;

	private Texture2D txPillCurrent;

	private Texture2D txPillUnlocked;

	private Texture2D txPillLocked;

	private Texture2D txSummaryRibbon;

	private GUIStyle stWindow;

	private GUIStyle stTitle;

	private GUIStyle stSub;

	private GUIStyle stExpLabel;

	private GUIStyle stLvlBadge;

	private GUIStyle stRankBadge;

	private GUIStyle stRowUnlocked;

	private GUIStyle stRowLocked;

	private GUIStyle stRowCurrent;

	private GUIStyle stBtnClose;

	private GUIStyle stColBuff;

	private GUIStyle stColLvl;

	private GUIStyle stColRank;

	private GUIStyle stMuted;

	private GUIStyle stGold;

	private GUIStyle stSummaryBox;

	private GUIStyle stActiveBuff;

	private GUIStyle stHudBarText;

	private GUIStyle stHudGain;

	private GUIStyle stPillText;

	private GUIStyle stCardRank;

	private GUIStyle stCardReward;

	private GUIStyle stBtnDiscord;

	private static VideoPlayer menuVideoPlayer;

	private static RenderTexture menuVideoTexture;

	private static GameObject menuCanvasGo;

	private static RawImage menuRawImage;

	public static float GetSellBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 5 || i == 9 || i == 14 || i == 19)
			{
				num += 0.1f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetReelBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 3)
			{
				num += 0.1f;
			}
			if (i == 8)
			{
				num += 0.2f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetCastBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 4 || i == 12)
			{
				num += 0.1f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetOxyBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 6)
			{
				num += 0.15f;
			}
			if (i == 11)
			{
				num += 0.3f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetDiscountBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 7)
			{
				num += 0.05f;
			}
			if (i == 13)
			{
				num += 0.1f;
			}
			if (i == 17)
			{
				num += 0.15f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetBoatBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 10)
			{
				num += 0.1f;
			}
			if (i == 15)
			{
				num += 0.2f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static float GetFoodBonus()
	{
		float num = 0f;
		for (int i = 1; i <= currentLevel && i <= 20; i++)
		{
			if (i == 2)
			{
				num += 0.1f;
			}
			if (i == 16)
			{
				num += 0.2f;
			}
		}
		if (currentLevel >= 20)
		{
			num *= 1.5f;
		}
		return num;
	}

	public static bool HasTreasureFind()
	{
		return currentLevel >= 18;
	}

	public static int ExpRequired(int lvl)
	{
		return 300 + lvl * 220 + lvl * lvl * 60;
	}

	public static string GetRank(int lvl)
	{
		if (lvl >= 20)
		{
			return "Legend of the Seas";
		}
		if (lvl >= 18)
		{
			return "Legend";
		}
		if (lvl >= 15)
		{
			return "Sea Wolf";
		}
		if (lvl >= 12)
		{
			return "Captain";
		}
		if (lvl >= 9)
		{
			return "Skipper";
		}
		if (lvl >= 6)
		{
			return "Bosun";
		}
		if (lvl >= 3)
		{
			return "Sailor";
		}
		return "Deckhand";
	}

	private void Awake()
	{
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Expected O, but got Unknown
		Instance = this;
		ModLogger = ((BaseUnityPlugin)this).Logger;
		savePath = Path.Combine(Paths.ConfigPath, "FishermanMastery_Save.json");
		string directoryName = Path.GetDirectoryName(typeof(FishermanMasteryPlugin).Assembly.Location);
		iconsDir = Path.Combine(directoryName, "icons");
		if (!Directory.Exists(iconsDir))
		{
			iconsDir = Path.Combine(Paths.PluginPath, "417-FishermanMastery", "icons");
		}
		if (!Directory.Exists(iconsDir))
		{
			iconsDir = Path.Combine(Paths.PluginPath, "FishermanMastery", "icons");
		}
		InitAudio();
		LoadProgress();
		try
		{
			harmony = new Harmony("com.max.fishermanmastery");
			harmony.PatchAll();
		}
		catch (Exception ex)
		{
			ModLogger.LogError((object)("Harmony: " + ex));
		}
		ModLogger.LogInfo((object)"FishermanMastery v1.0.2 loaded.");
	}

	private void InitAudio()
	{
		try
		{
			sfxSource = ((Component)this).gameObject.AddComponent<AudioSource>();
			sfxSource.playOnAwake = false;
			sfxSource.volume = 0.7f;
			sndLevelUp = CreateArpeggioClip(new float[4] { 523.25f, 659.25f, 783.99f, 1046.5f }, 0.12f);
			sndCatch = CreateArpeggioClip(new float[2] { 659.25f, 987.77f }, 0.08f);
		}
		catch
		{
		}
	}

	private static AudioClip CreateArpeggioClip(float[] freqs, float noteLen)
	{
		int num = 44100;
		int num2 = (int)((float)freqs.Length * noteLen * (float)num);
		float[] array = new float[num2];
		for (int i = 0; i < freqs.Length; i++)
		{
			float num3 = freqs[i];
			int num4 = (int)((float)i * noteLen * (float)num);
			int num5 = (int)((float)(i + 1) * noteLen * (float)num);
			for (int j = num4; j < num5 && j < num2; j++)
			{
				float num6 = (float)(j - num4) / (float)num;
				float num7 = 1f - (float)(j - num4) / (float)(num5 - num4);
				array[j] = Mathf.Sin((float)Math.PI * 2f * num3 * num6) * num7 * 0.45f;
			}
		}
		AudioClip val = AudioClip.Create("sfx_rpg", num2, 1, num, false);
		val.SetData(array, 0);
		return val;
	}

	public static void PlaySfx(AudioClip clip)
	{
		if ((Object)(object)sfxSource != (Object)null && (Object)(object)clip != (Object)null)
		{
			sfxSource.PlayOneShot(clip);
		}
	}

	private Texture2D LoadPng(string filename, Texture2D fallback)
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Expected O, but got Unknown
		try
		{
			string path = Path.Combine(iconsDir, filename);
			if (File.Exists(path))
			{
				byte[] array = File.ReadAllBytes(path);
				Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
				if (ImageConversion.LoadImage(val, array))
				{
					return val;
				}
			}
		}
		catch
		{
		}
		return fallback;
	}

	public void SetupMenuVideo()
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Expected O, but got Unknown
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Expected O, but got Unknown
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Expected O, but got Unknown
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: 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_01b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Expected O, but got Unknown
		try
		{
			string text = Path.Combine(Paths.PluginPath, "FishermanMastery", "mopsik_menu.mp4");
			if (!File.Exists(text))
			{
				text = Path.Combine(Paths.GameRootPath, "mopsik_menu.mp4");
			}
			if (!File.Exists(text))
			{
				return;
			}
			if ((Object)(object)menuVideoTexture == (Object)null)
			{
				menuVideoTexture = new RenderTexture(1920, 1080, 0, (RenderTextureFormat)0);
				((Texture)menuVideoTexture).wrapMode = (TextureWrapMode)1;
				menuVideoTexture.Create();
			}
			if ((Object)(object)menuCanvasGo == (Object)null)
			{
				menuCanvasGo = new GameObject("MopsikVideoCanvas");
				Object.DontDestroyOnLoad((Object)(object)menuCanvasGo);
				Canvas val = menuCanvasGo.AddComponent<Canvas>();
				val.renderMode = (RenderMode)0;
				val.sortingOrder = -100;
				CanvasScaler val2 = menuCanvasGo.AddComponent<CanvasScaler>();
				val2.uiScaleMode = (ScaleMode)1;
				val2.referenceResolution = new Vector2(1920f, 1080f);
				val2.matchWidthOrHeight = 0.5f;
				GameObject val3 = new GameObject("MopsikVideoImage");
				val3.transform.SetParent(menuCanvasGo.transform, false);
				menuRawImage = val3.AddComponent<RawImage>();
				menuRawImage.texture = (Texture)(object)menuVideoTexture;
				((Graphic)menuRawImage).rectTransform.anchorMin = Vector2.zero;
				((Graphic)menuRawImage).rectTransform.anchorMax = Vector2.one;
				((Graphic)menuRawImage).rectTransform.sizeDelta = Vector2.zero;
				((Graphic)menuRawImage).rectTransform.anchoredPosition = Vector2.zero;
			}
			if ((Object)(object)menuVideoPlayer == (Object)null)
			{
				GameObject val4 = new GameObject("MopsikVideoPlayer");
				Object.DontDestroyOnLoad((Object)(object)val4);
				menuVideoPlayer = val4.AddComponent<VideoPlayer>();
				menuVideoPlayer.playOnAwake = false;
				menuVideoPlayer.renderMode = (VideoRenderMode)2;
				menuVideoPlayer.targetTexture = menuVideoTexture;
				menuVideoPlayer.isLooping = true;
				menuVideoPlayer.url = text;
				menuVideoPlayer.audioOutputMode = (VideoAudioOutputMode)0;
				menuVideoPlayer.aspectRatio = (VideoAspectRatio)4;
			}
			if (!IsInGame())
			{
				if ((Object)(object)menuCanvasGo != (Object)null)
				{
					menuCanvasGo.SetActive(true);
				}
				if ((Object)(object)menuVideoPlayer != (Object)null && !menuVideoPlayer.isPlaying)
				{
					menuVideoPlayer.Play();
				}
			}
		}
		catch
		{
		}
	}

	private static bool IsInGame()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		Scene activeScene = SceneManager.GetActiveScene();
		string name = ((Scene)(ref activeScene)).name;
		if (name.IndexOf("Menu", StringComparison.OrdinalIgnoreCase) >= 0)
		{
			return false;
		}
		if (name.IndexOf("Loading", StringComparison.OrdinalIgnoreCase) >= 0)
		{
			return false;
		}
		try
		{
			return PlayerManager.AlivePlayers != null && PlayerManager.AlivePlayers.Count > 0;
		}
		catch
		{
			return false;
		}
	}

	private void Update()
	{
		bool flag = false;
		if (Input.GetKeyDown((KeyCode)108))
		{
			showLevelTable = !showLevelTable;
			if (!showLevelTable)
			{
				flag = true;
			}
		}
		if (showLevelTable && Input.GetKeyDown((KeyCode)27))
		{
			showLevelTable = false;
			flag = true;
		}
		if (flag && IsInGame())
		{
			Cursor.lockState = (CursorLockMode)1;
			Cursor.visible = false;
		}
		displayedExp = Mathf.MoveTowards(displayedExp, (float)currentExp, Time.deltaTime * Mathf.Max(60f, Mathf.Abs((float)currentExp - displayedExp) * 6f));
		if (recentExpTimer > 0f)
		{
			recentExpTimer -= Time.deltaTime;
		}
		if (showLevelUpBanner)
		{
			levelUpBannerTimer -= Time.deltaTime;
			if (levelUpBannerTimer <= 0f)
			{
				showLevelUpBanner = false;
			}
		}
		if (IsInGame())
		{
			if ((Object)(object)menuCanvasGo != (Object)null && menuCanvasGo.activeSelf)
			{
				menuCanvasGo.SetActive(false);
			}
			if ((Object)(object)menuVideoPlayer != (Object)null && menuVideoPlayer.isPlaying)
			{
				menuVideoPlayer.Pause();
			}
			if (GetBoatBonus() > 0f && Input.GetKey((KeyCode)119))
			{
				ApplyBoatPassive();
			}
			return;
		}
		if ((Object)(object)menuCanvasGo == (Object)null || (Object)(object)menuVideoPlayer == (Object)null)
		{
			SetupMenuVideo();
		}
		else
		{
			if (!menuCanvasGo.activeSelf)
			{
				menuCanvasGo.SetActive(true);
			}
			if (!menuVideoPlayer.isPlaying)
			{
				menuVideoPlayer.Play();
			}
		}
		try
		{
			MainMenuManager val = Object.FindObjectOfType<MainMenuManager>();
			if ((Object)(object)val != (Object)null)
			{
				Traverse.Create((object)val).Method("HideBoat", new object[0]).GetValue();
			}
		}
		catch
		{
		}
	}

	private void ApplyBoatPassive()
	{
		//IL_0043: 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_005d: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			Boat[] array = Object.FindObjectsOfType<Boat>();
			if (array.Length > 0 && (Object)(object)array[0] != (Object)null)
			{
				Rigidbody componentInChildren = ((Component)array[0]).GetComponentInChildren<Rigidbody>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					componentInChildren.AddForce(((Component)array[0]).transform.forward * (GetBoatBonus() * 18000f) * Time.deltaTime, (ForceMode)5);
				}
			}
		}
		catch
		{
		}
	}

	public static void AddExp(int amount)
	{
		if (amount > 0)
		{
			currentExp += amount;
			recentExpGain = amount;
			recentExpTimer = 3.5f;
			while (currentLevel < 20 && currentExp >= ExpRequired(currentLevel))
			{
				currentExp -= ExpRequired(currentLevel);
				displayedExp = 0f;
				currentLevel++;
				newLevel = currentLevel;
				showLevelUpBanner = true;
				levelUpBannerTimer = 5.5f;
				PlaySfx(sndLevelUp);
				ModLogger.LogInfo((object)("Level Up: " + currentLevel + " (" + GetRank(currentLevel) + ")"));
			}
			SaveProgress();
		}
	}

	public static void ProcessCaughtItem(Item item, string source)
	{
		if ((Object)(object)item == (Object)null)
		{
			return;
		}
		try
		{
			int instanceID = ((Object)item).GetInstanceID();
			if (!ProcessedFishIds.Contains(instanceID) && ((Object)(object)item.Creature != (Object)null || (Object)(object)item.Fish != (Object)null || item is Creature || item is Fish))
			{
				ProcessedFishIds.Add(instanceID);
				float randomizedWeight = item.RandomizedWeight;
				int totalWorth = item.TotalWorth;
				int num;
				string text;
				if (randomizedWeight >= 20f || totalWorth >= 250)
				{
					num = Random.Range(350, 450);
					text = "LEGENDARY";
				}
				else if (randomizedWeight >= 10f || totalWorth >= 100)
				{
					num = Random.Range(160, 220);
					text = "EPIC";
				}
				else if (randomizedWeight >= 4f || totalWorth >= 40)
				{
					num = Random.Range(70, 95);
					text = "RARE";
				}
				else if (randomizedWeight >= 1.5f || totalWorth >= 15)
				{
					num = Random.Range(28, 42);
					text = "UNCOMMON";
				}
				else
				{
					num = Random.Range(12, 18);
					text = "COMMON";
				}
				PlaySfx(sndCatch);
				AddExp(num);
				ModLogger.LogInfo((object)("[Catch] " + text + " (" + randomizedWeight.ToString("F1") + "kg / $" + totalWorth + ") -> +" + num + " EXP"));
			}
		}
		catch (Exception ex)
		{
			ModLogger.LogWarning((object)("ProcessCaughtItem error: " + ex.Message));
		}
	}

	public static string GetCurrentSaveName()
	{
		try
		{
			if (SaveManager.CurServerSave != null && !string.IsNullOrEmpty(SaveManager.CurServerSave.Name))
			{
				return SaveManager.CurServerSave.Name;
			}
		}
		catch
		{
		}
		return "Default";
	}

	public static void SaveProgress()
	{
		try
		{
			string curName = GetCurrentSaveName();
			MultiSaveContainer multiSaveContainer = new MultiSaveContainer();
			if (File.Exists(savePath))
			{
				try
				{
					multiSaveContainer = JsonUtility.FromJson<MultiSaveContainer>(File.ReadAllText(savePath)) ?? new MultiSaveContainer();
				}
				catch
				{
				}
			}
			if (multiSaveContainer.slots == null)
			{
				multiSaveContainer.slots = new List<SaveSlotData>();
			}
			SaveSlotData saveSlotData = multiSaveContainer.slots.Find((SaveSlotData s) => s.saveName == curName);
			if (saveSlotData == null)
			{
				SaveSlotData saveSlotData2 = new SaveSlotData();
				saveSlotData2.saveName = curName;
				saveSlotData = saveSlotData2;
				multiSaveContainer.slots.Add(saveSlotData);
			}
			saveSlotData.level = currentLevel;
			saveSlotData.exp = currentExp;
			File.WriteAllText(savePath, JsonUtility.ToJson((object)multiSaveContainer, true));
		}
		catch
		{
		}
	}

	public static void LoadProgress()
	{
		try
		{
			string curName = GetCurrentSaveName();
			if (File.Exists(savePath))
			{
				MultiSaveContainer multiSaveContainer = JsonUtility.FromJson<MultiSaveContainer>(File.ReadAllText(savePath));
				if (multiSaveContainer != null && multiSaveContainer.slots != null)
				{
					SaveSlotData saveSlotData = multiSaveContainer.slots.Find((SaveSlotData s) => s.saveName == curName);
					if (saveSlotData != null)
					{
						currentLevel = Mathf.Max(1, saveSlotData.level);
						currentExp = Mathf.Max(0, saveSlotData.exp);
						displayedExp = currentExp;
						return;
					}
				}
			}
			currentLevel = 1;
			currentExp = 0;
			displayedExp = 0f;
		}
		catch
		{
		}
	}

	private Texture2D MakeSolid(Color c)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Expected O, but got Unknown
		//IL_0018: 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_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: 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_0040: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = new Texture2D(2, 2);
		val.SetPixels((Color[])(object)new Color[4] { c, c, c, c });
		val.Apply();
		return val;
	}

	private Texture2D MakeBorder(Color bg, Color br, int bw)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		int num = 16;
		Texture2D val = new Texture2D(num, num);
		Color[] array = (Color[])(object)new Color[num * num];
		for (int i = 0; i < num; i++)
		{
			for (int j = 0; j < num; j++)
			{
				array[i * num + j] = ((j < bw || j >= num - bw || i < bw || i >= num - bw) ? br : bg);
			}
		}
		val.SetPixels(array);
		val.Apply();
		return val;
	}

	private static Texture2D CreateHexagonTexture(int size, Color fill, Color border, float borderWidth)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = new Texture2D(size, size, (TextureFormat)4, false);
		Color[] array = (Color[])(object)new Color[size * size];
		float num = (float)(size - 1) / 2f;
		float num2 = (float)(size - 1) / 2f;
		float num3 = (float)(size - 4) / 2f;
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				float num4 = Mathf.Abs((float)j - num);
				float num5 = Mathf.Abs((float)i - num2);
				float num6 = num4 * 0.866025f + num5 * 0.5f;
				float num7 = Mathf.Max(num5, num6);
				if (num7 <= num3 - borderWidth)
				{
					array[i * size + j] = fill;
					continue;
				}
				if (num7 <= num3)
				{
					array[i * size + j] = border;
					continue;
				}
				ref Color reference = ref array[i * size + j];
				reference = Color.clear;
			}
		}
		val.SetPixels(array);
		val.Apply();
		return val;
	}

	private GUIStyle MakeLabel(int size, Color col, FontStyle fs)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_003a: 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_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Expected O, but got Unknown
		GUIStyle val = new GUIStyle(GUI.skin.label);
		if ((Object)(object)uiFont != (Object)null)
		{
			val.font = uiFont;
		}
		val.fontSize = size;
		val.fontStyle = fs;
		val.normal.textColor = col;
		val.clipping = (TextClipping)0;
		val.padding = new RectOffset(0, 0, 0, 0);
		return val;
	}

	private GUIStyle MakeBox(Texture2D bg, int pad)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Expected O, but got Unknown
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Expected O, but got Unknown
		GUIStyle val = new GUIStyle(GUI.skin.box);
		if ((Object)(object)uiFont != (Object)null)
		{
			val.font = uiFont;
		}
		val.normal.background = bg;
		val.padding = new RectOffset(pad, pad, pad, pad);
		val.margin = new RectOffset(0, 0, 2, 2);
		return val;
	}

	private void InitGUI()
	{
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fe: 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_0226: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Unknown result type (might be due to invalid IL or missing references)
		//IL_024e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_0276: 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_0292: Unknown result type (might be due to invalid IL or missing references)
		//IL_0294: 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_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_030f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0319: Expected O, but got Unknown
		//IL_037c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0386: Expected O, but got Unknown
		//IL_0391: Unknown result type (might be due to invalid IL or missing references)
		//IL_039b: Expected O, but got Unknown
		//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0406: Unknown result type (might be due to invalid IL or missing references)
		//IL_0424: Unknown result type (might be due to invalid IL or missing references)
		//IL_048f: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_04cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0524: Unknown result type (might be due to invalid IL or missing references)
		//IL_052e: Expected O, but got Unknown
		//IL_058e: Unknown result type (might be due to invalid IL or missing references)
		//IL_05bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c5: Expected O, but got Unknown
		//IL_05ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_05db: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_0611: Unknown result type (might be due to invalid IL or missing references)
		//IL_061b: Expected O, but got Unknown
		//IL_0662: Unknown result type (might be due to invalid IL or missing references)
		//IL_0692: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_06f4: Expected O, but got Unknown
		if (!uiInit)
		{
			try
			{
				uiFont = Font.CreateDynamicFontFromOSFont(new string[3] { "Segoe UI", "Arial", "Tahoma" }, 14);
			}
			catch
			{
			}
			Color bg = default(Color);
			((Color)(ref bg))..ctor(0.06f, 0.08f, 0.13f, 0.98f);
			Color br = default(Color);
			((Color)(ref br))..ctor(0.15f, 0.22f, 0.35f, 0.95f);
			Color c = default(Color);
			((Color)(ref c))..ctor(0.04f, 0.05f, 0.09f, 0.95f);
			Color c2 = default(Color);
			((Color)(ref c2))..ctor(0f, 0.62f, 1f, 0.95f);
			Color fill = default(Color);
			((Color)(ref fill))..ctor(0.06f, 0.12f, 0.22f, 0.95f);
			Color border = default(Color);
			((Color)(ref border))..ctor(0f, 0.68f, 1f, 0.95f);
			Color bg2 = default(Color);
			((Color)(ref bg2))..ctor(0.08f, 0.14f, 0.22f, 0.9f);
			Color bg3 = default(Color);
			((Color)(ref bg3))..ctor(0.07f, 0.09f, 0.14f, 0.85f);
			Color bg4 = default(Color);
			((Color)(ref bg4))..ctor(0f, 0.28f, 0.5f, 0.9f);
			Color c3 = default(Color);
			((Color)(ref c3))..ctor(0.13f, 0.17f, 0.25f, 0.9f);
			Color c4 = default(Color);
			((Color)(ref c4))..ctor(0.2f, 0.27f, 0.4f, 0.95f);
			Color bg5 = default(Color);
			((Color)(ref bg5))..ctor(0.04f, 0.1f, 0.18f, 0.92f);
			Color br2 = default(Color);
			((Color)(ref br2))..ctor(0f, 0.68f, 1f, 0.6f);
			txWindowBg = MakeBorder(bg, br, 2);
			txExpBg = MakeSolid(c);
			txExpFill = MakeSolid(c2);
			txBadgeBg = CreateHexagonTexture(64, fill, border, 3f);
			txRowUnlocked = MakeBorder(bg2, new Color(0.1f, 0.6f, 1f, 0.4f), 1);
			txRowLocked = MakeBorder(bg3, new Color(0.18f, 0.22f, 0.32f, 0.5f), 1);
			txRowCurrent = MakeBorder(bg4, new Color(0f, 0.85f, 1f, 0.9f), 2);
			txBtnDark = MakeSolid(c3);
			txBtnHover = MakeSolid(c4);
			txSummaryBg = MakeBorder(bg5, br2, 1);
			Color col = default(Color);
			((Color)(ref col))..ctor(0f, 0.85f, 1f);
			Color white = Color.white;
			Color col2 = default(Color);
			((Color)(ref col2))..ctor(0.6f, 0.7f, 0.8f);
			Color col3 = default(Color);
			((Color)(ref col3))..ctor(1f, 0.82f, 0.15f);
			Color col4 = default(Color);
			((Color)(ref col4))..ctor(0.25f, 1f, 0.6f);
			stWindow = new GUIStyle(GUI.skin.window);
			if ((Object)(object)uiFont != (Object)null)
			{
				stWindow.font = uiFont;
			}
			stWindow.normal.background = txWindowBg;
			stWindow.onNormal.background = txWindowBg;
			stWindow.padding = new RectOffset(18, 18, 14, 14);
			stWindow.border = new RectOffset(4, 4, 4, 4);
			stTitle = MakeLabel(18, white, (FontStyle)1);
			stSub = MakeLabel(12, col2, (FontStyle)0);
			stExpLabel = MakeLabel(13, col, (FontStyle)1);
			stGold = MakeLabel(14, col3, (FontStyle)1);
			stMuted = MakeLabel(12, col2, (FontStyle)0);
			stActiveBuff = MakeLabel(13, col4, (FontStyle)1);
			stLvlBadge = MakeLabel(16, white, (FontStyle)1);
			stLvlBadge.alignment = (TextAnchor)4;
			stRankBadge = MakeLabel(11, col, (FontStyle)0);
			stRankBadge.alignment = (TextAnchor)4;
			stRowUnlocked = MakeBox(txRowUnlocked, 6);
			stRowLocked = MakeBox(txRowLocked, 6);
			stRowCurrent = MakeBox(txRowCurrent, 6);
			stSummaryBox = MakeBox(txSummaryBg, 10);
			stColLvl = MakeLabel(14, white, (FontStyle)1);
			stColLvl.alignment = (TextAnchor)4;
			stColRank = MakeLabel(13, col, (FontStyle)0);
			stColBuff = MakeLabel(13, new Color(0.88f, 0.94f, 1f), (FontStyle)0);
			stHudBarText = MakeLabel(13, white, (FontStyle)1);
			stHudBarText.alignment = (TextAnchor)4;
			stHudGain = MakeLabel(14, col3, (FontStyle)1);
			stHudGain.alignment = (TextAnchor)3;
			stBtnClose = new GUIStyle(GUI.skin.button);
			if ((Object)(object)uiFont != (Object)null)
			{
				stBtnClose.font = uiFont;
			}
			stBtnClose.normal.background = txBtnDark;
			stBtnClose.hover.background = txBtnHover;
			stBtnClose.normal.textColor = white;
			stBtnClose.fontStyle = (FontStyle)1;
			stBtnClose.fontSize = 14;
			stBtnClose.padding = new RectOffset(8, 8, 4, 4);
			stCardRank = MakeLabel(11, col, (FontStyle)1);
			stCardReward = MakeLabel(13, white, (FontStyle)1);
			stPillText = MakeLabel(11, white, (FontStyle)1);
			stPillText.alignment = (TextAnchor)4;
			stBtnDiscord = new GUIStyle(GUI.skin.button);
			if ((Object)(object)uiFont != (Object)null)
			{
				stBtnDiscord.font = uiFont;
			}
			stBtnDiscord.normal.background = MakeSolid(new Color(0.345f, 0.396f, 0.949f, 0.95f));
			stBtnDiscord.hover.background = MakeSolid(new Color(0.278f, 0.322f, 0.769f, 0.98f));
			stBtnDiscord.normal.textColor = Color.white;
			stBtnDiscord.fontStyle = (FontStyle)1;
			stBtnDiscord.fontSize = 12;
			stBtnDiscord.alignment = (TextAnchor)4;
			stBtnDiscord.padding = new RectOffset(6, 6, 2, 2);
			txHudFrame = LoadPng("hud_frame.png", txWindowBg);
			txHudHex = LoadPng("hud_hex_badge.png", txBadgeBg);
			txHudBarBg = LoadPng("hud_bar_bg.png", txExpBg);
			txHudBarFill = LoadPng("hud_bar_fill.png", txExpFill);
			txLevelupArrow = LoadPng("levelup_arrow.png", null);
			txCardCurrent = LoadPng("card_current.png", txRowCurrent);
			txCardUnlocked = LoadPng("card_unlocked.png", txRowUnlocked);
			txCardLocked = LoadPng("card_locked.png", txRowLocked);
			txPillCurrent = LoadPng("pill_current.png", null);
			txPillUnlocked = LoadPng("pill_unlocked.png", null);
			txPillLocked = LoadPng("pill_locked.png", null);
			txSummaryRibbon = LoadPng("summary_ribbon.png", txSummaryBg);
			uiInit = true;
		}
	}

	private void OnGUI()
	{
		//IL_0008: 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_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_019f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0149: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: 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)
		//IL_017c: Expected O, but got Unknown
		//IL_0177: Unknown result type (might be due to invalid IL or missing references)
		//IL_017c: Unknown result type (might be due to invalid IL or missing references)
		InitGUI();
		Color color = GUI.color;
		Color backgroundColor = GUI.backgroundColor;
		Color contentColor = GUI.contentColor;
		try
		{
			if (!IsInGame())
			{
				Rect val = default(Rect);
				((Rect)(ref val))..ctor(20f, (float)Screen.height - 46f, 190f, 32f);
				if (GUI.Button(val, "\ud83d\udcac Discord Community", stBtnDiscord))
				{
					Application.OpenURL("https://discord.gg/4bmDYANzGj");
				}
				return;
			}
			DrawExpHUD();
			if (showLevelUpBanner)
			{
				DrawLevelUpBanner();
			}
			if (showLevelTable)
			{
				Cursor.lockState = (CursorLockMode)0;
				Cursor.visible = true;
				if (!wasTableOpen || ((Rect)(ref tableRect)).width != 740f)
				{
					((Rect)(ref tableRect)).width = 740f;
					((Rect)(ref tableRect)).height = 620f;
					((Rect)(ref tableRect)).x = ((float)Screen.width - ((Rect)(ref tableRect)).width) / 2f;
					((Rect)(ref tableRect)).y = ((float)Screen.height - ((Rect)(ref tableRect)).height) / 2f;
					wasTableOpen = true;
				}
				GUI.backgroundColor = Color.white;
				tableRect = GUI.Window(7001, tableRect, new WindowFunction(DrawTable), "", stWindow);
			}
			else
			{
				wasTableOpen = false;
			}
		}
		finally
		{
			GUI.color = color;
			GUI.backgroundColor = backgroundColor;
			GUI.contentColor = contentColor;
		}
	}

	private void DrawOutlinedLabel(Rect rect, string text, GUIStyle style, Color textColor, Color outlineColor, int outlineDist = 1)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_000e: 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_0093: Expected O, but got Unknown
		//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_0058: Unknown result type (might be due to invalid IL or missing references)
		GUIStyle val = new GUIStyle(style);
		val.normal.textColor = outlineColor;
		for (int i = -outlineDist; i <= outlineDist; i++)
		{
			for (int j = -outlineDist; j <= outlineDist; j++)
			{
				if (i != 0 || j != 0)
				{
					GUI.Label(new Rect(((Rect)(ref rect)).x + (float)i, ((Rect)(ref rect)).y + (float)j, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height), text, val);
				}
			}
		}
		GUIStyle val2 = new GUIStyle(style);
		val2.normal.textColor = textColor;
		GUI.Label(rect, text, val2);
	}

	private void DrawExpHUD()
	{
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: 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)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_0255: Unknown result type (might be due to invalid IL or missing references)
		//IL_0279: Unknown result type (might be due to invalid IL or missing references)
		//IL_027b: Unknown result type (might be due to invalid IL or missing references)
		float num = 54f;
		float num2 = 380f;
		float num3 = 30f;
		float num4 = 8f;
		float num5 = num + num4 + num2;
		float num6 = 24f;
		float num7 = 16f;
		float num8 = (float)Screen.width - num5 - num6;
		float num9 = num7;
		Rect val = default(Rect);
		((Rect)(ref val))..ctor(num8, num9, num, num);
		if ((Object)(object)txHudHex != (Object)null)
		{
			GUI.DrawTexture(val, (Texture)(object)txHudHex, (ScaleMode)2);
		}
		DrawOutlinedLabel(val, currentLevel.ToString(), stLvlBadge, Color.white, new Color(0f, 0f, 0f, 0.95f));
		float num10 = num8 + num + num4;
		float num11 = num9 + (num - num3) / 2f;
		Rect val2 = default(Rect);
		((Rect)(ref val2))..ctor(num10, num11, num2, num3);
		if ((Object)(object)txHudBarBg != (Object)null)
		{
			GUI.DrawTexture(val2, (Texture)(object)txHudBarBg, (ScaleMode)0);
		}
		int num12 = ExpRequired(currentLevel);
		float num13 = ((currentLevel >= 20) ? 1f : Mathf.Clamp01(displayedExp / (float)num12));
		if (num13 > 0.001f && (Object)(object)txHudBarFill != (Object)null)
		{
			GUI.DrawTexture(new Rect(num10 + 3f, num11 + 3f, (num2 - 6f) * num13, num3 - 6f), (Texture)(object)txHudBarFill, (ScaleMode)0);
		}
		string text = ((currentLevel >= 20) ? "MAX LEVEL" : (currentExp.ToString("N0") + " / " + num12.ToString("N0") + " XP"));
		DrawOutlinedLabel(val2, text, stHudBarText, Color.white, new Color(0f, 0.05f, 0.15f, 0.95f));
		if (recentExpTimer > 0f)
		{
			float num14 = Mathf.Clamp01(recentExpTimer);
			Color textColor = default(Color);
			((Color)(ref textColor))..ctor(1f, 0.85f, 0.2f, num14);
			Color outlineColor = default(Color);
			((Color)(ref outlineColor))..ctor(0f, 0f, 0f, num14 * 0.9f);
			DrawOutlinedLabel(new Rect(num8 - 95f, num11, 90f, num3), "+" + recentExpGain + " EXP", stHudGain, textColor, outlineColor);
		}
	}

	private void DrawLevelUpBanner()
	{
		//IL_007d: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Expected O, but got Unknown
		//IL_012e: 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_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_020d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Unknown result type (might be due to invalid IL or missing references)
		//IL_0269: Unknown result type (might be due to invalid IL or missing references)
		//IL_027f: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: 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)
		float num = 500f;
		float num2 = 92f;
		float num3 = ((float)Screen.width - num) / 2f;
		float num4 = (float)Screen.height - num2 - 200f;
		float num5 = Mathf.Clamp01(levelUpBannerTimer / 0.8f);
		if (levelUpBannerTimer > 4.5f)
		{
			num5 = Mathf.Clamp01((5.5f - levelUpBannerTimer) / 1f);
		}
		GUI.color = new Color(1f, 1f, 1f, num5);
		GUI.DrawTexture(new Rect(num3, num4, num, num2), (Texture)(object)(((Object)(object)txHudFrame != (Object)null) ? txHudFrame : txWindowBg));
		if ((Object)(object)txLevelupArrow != (Object)null)
		{
			GUI.DrawTexture(new Rect(num3 + 16f, num4 + 18f, 56f, 56f), (Texture)(object)txLevelupArrow, (ScaleMode)2);
		}
		GUIStyle val = new GUIStyle(stGold);
		val.fontSize = 19;
		val.fontStyle = (FontStyle)1;
		DrawOutlinedLabel(new Rect(num3 + 84f, num4 + 10f, 400f, 26f), "LEVEL UP!", val, new Color(1f, 0.82f, 0.15f, num5), new Color(0f, 0f, 0f, num5));
		int num6 = Mathf.Clamp(newLevel - 1, 0, Rewards.Length - 1);
		DrawOutlinedLabel(new Rect(num3 + 84f, num4 + 36f, 400f, 22f), "Level " + newLevel + " — " + GetRank(newLevel), stColRank, new Color(1f, 1f, 1f, num5), new Color(0f, 0f, 0f, num5));
		DrawOutlinedLabel(new Rect(num3 + 84f, num4 + 58f, 400f, 24f), "Unlocked: " + Rewards[num6].buffLine, stActiveBuff, new Color(0.25f, 1f, 0.6f, num5), new Color(0f, 0f, 0f, num5));
		GUI.color = Color.white;
	}

	private void DrawTable(int id)
	{
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: 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_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_0505: Unknown result type (might be due to invalid IL or missing references)
		//IL_050a: Unknown result type (might be due to invalid IL or missing references)
		//IL_09bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_059e: Unknown result type (might be due to invalid IL or missing references)
		//IL_05a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0689: Unknown result type (might be due to invalid IL or missing references)
		//IL_06d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0661: Unknown result type (might be due to invalid IL or missing references)
		//IL_06db: Unknown result type (might be due to invalid IL or missing references)
		//IL_06be: Unknown result type (might be due to invalid IL or missing references)
		//IL_06b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_066d: Unknown result type (might be due to invalid IL or missing references)
		//IL_067c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0645: Unknown result type (might be due to invalid IL or missing references)
		//IL_062a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0748: Unknown result type (might be due to invalid IL or missing references)
		//IL_074e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0731: Unknown result type (might be due to invalid IL or missing references)
		//IL_071b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0784: Unknown result type (might be due to invalid IL or missing references)
		//IL_078a: Unknown result type (might be due to invalid IL or missing references)
		//IL_07a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_07ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_07bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_07df: Unknown result type (might be due to invalid IL or missing references)
		//IL_07f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_07f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_077c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0766: Unknown result type (might be due to invalid IL or missing references)
		//IL_0866: Unknown result type (might be due to invalid IL or missing references)
		//IL_08d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_08d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_08dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_08e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_08e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_08bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_08a6: Unknown result type (might be due to invalid IL or missing references)
		GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(520f) });
		if ((Object)(object)txHudHex != (Object)null)
		{
			Rect rect = GUILayoutUtility.GetRect(44f, 44f, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(44f),
				GUILayout.Height(44f)
			});
			GUI.DrawTexture(rect, (Texture)(object)txHudHex, (ScaleMode)2);
			DrawOutlinedLabel(rect, currentLevel.ToString(), stLvlBadge, Color.white, Color.black);
		}
		GUILayout.Space(8f);
		GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.Label("FISHERMAN MASTERY ROADMAP", stTitle, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.Label("Rank: " + GetRank(currentLevel).ToUpper() + "  •  Level " + currentLevel + " / 20  •  [L] or [ESC] to close", stSub, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.EndVertical();
		GUILayout.EndHorizontal();
		GUILayout.FlexibleSpace();
		if (GUILayout.Button("✕", stBtnClose, (GUILayoutOption[])(object)new GUILayoutOption[2]
		{
			GUILayout.Width(34f),
			GUILayout.Height(30f)
		}))
		{
			showLevelTable = false;
		}
		GUILayout.EndHorizontal();
		GUILayout.Space(8f);
		GUILayout.BeginVertical(stSummaryBox, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.Label("CURRENT ACTIVE BONUSES — Level " + currentLevel + " (" + GetRank(currentLevel) + ")", stExpLabel, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.Space(4f);
		string text = "";
		if (GetSellBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[PRICE +", Mathf.RoundToInt(GetSellBonus() * 100f), "%]   ");
		}
		if (GetReelBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[REEL +", Mathf.RoundToInt(GetReelBonus() * 100f), "%]   ");
		}
		if (GetCastBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[CAST +", Mathf.RoundToInt(GetCastBonus() * 100f), "%]   ");
		}
		if (GetOxyBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[OXYGEN +", Mathf.RoundToInt(GetOxyBonus() * 100f), "%]   ");
		}
		if (GetDiscountBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[SHOP -", Mathf.RoundToInt(GetDiscountBonus() * 100f), "%]   ");
		}
		if (GetBoatBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[BOAT SPEED +", Mathf.RoundToInt(GetBoatBonus() * 100f), "%]   ");
		}
		if (GetFoodBonus() > 0f)
		{
			object obj = text;
			text = string.Concat(obj, "[FOOD +", Mathf.RoundToInt(GetFoodBonus() * 100f), "%]   ");
		}
		if (HasTreasureFind())
		{
			text += "[TREASURE 5%]   ";
		}
		if (text.Length == 0)
		{
			text = "No perks unlocked yet — catch fish to start leveling up!";
		}
		GUILayout.Label(text, stActiveBuff, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.EndVertical();
		GUILayout.Space(6f);
		scrollPos = GUILayout.BeginScrollView(scrollPos, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandHeight(true) });
		LevelReward[] rewards = Rewards;
		Rect val2 = default(Rect);
		Rect val3 = default(Rect);
		for (int i = 0; i < rewards.Length; i++)
		{
			LevelReward levelReward = rewards[i];
			bool flag = levelReward.level == currentLevel;
			bool flag2 = levelReward.level <= currentLevel;
			Texture2D val = (flag ? txCardCurrent : (flag2 ? txCardUnlocked : txCardLocked));
			Rect rect2 = GUILayoutUtility.GetRect(670f, 58f, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.ExpandWidth(true),
				GUILayout.Height(58f)
			});
			if ((Object)(object)val != (Object)null)
			{
				GUI.DrawTexture(rect2, (Texture)(object)val, (ScaleMode)0);
			}
			float num = 38f;
			((Rect)(ref val2))..ctor(((Rect)(ref rect2)).x + 10f, ((Rect)(ref rect2)).y + (58f - num) / 2f, num, num);
			if ((Object)(object)txHudHex != (Object)null)
			{
				GUI.color = (flag ? new Color(1f, 0.82f, 0.15f, 1f) : (flag2 ? new Color(0f, 0.85f, 1f, 0.9f) : new Color(0.4f, 0.5f, 0.6f, 0.5f)));
				GUI.DrawTexture(val2, (Texture)(object)txHudHex, (ScaleMode)2);
				GUI.color = Color.white;
			}
			Rect rect3 = val2;
			int level = levelReward.level;
			DrawOutlinedLabel(rect3, level.ToString(), stLvlBadge, (Color)(flag ? new Color(1f, 0.9f, 0.2f) : (flag2 ? Color.white : new Color(0.6f, 0.65f, 0.7f))), Color.black);
			float num2 = ((Rect)(ref rect2)).x + 56f;
			float num3 = ((Rect)(ref rect2)).width - 175f;
			Color textColor = (flag ? new Color(1f, 0.85f, 0.2f) : (flag2 ? new Color(0f, 0.85f, 1f) : new Color(0.5f, 0.55f, 0.65f)));
			Color textColor2 = (Color)(flag ? Color.white : (flag2 ? new Color(0.92f, 0.96f, 1f) : new Color(0.45f, 0.5f, 0.58f)));
			DrawOutlinedLabel(new Rect(num2, ((Rect)(ref rect2)).y + 7f, num3, 20f), levelReward.rank.ToUpper(), stCardRank, textColor, Color.black);
			DrawOutlinedLabel(new Rect(num2, ((Rect)(ref rect2)).y + 28f, num3, 24f), levelReward.buffLine, stCardReward, textColor2, Color.black);
			((Rect)(ref val3))..ctor(((Rect)(ref rect2)).x + ((Rect)(ref rect2)).width - 110f, ((Rect)(ref rect2)).y + 16f, 100f, 26f);
			Texture2D val4 = (flag ? txPillCurrent : (flag2 ? txPillUnlocked : txPillLocked));
			if ((Object)(object)val4 != (Object)null)
			{
				GUI.DrawTexture(val3, (Texture)(object)val4, (ScaleMode)0);
			}
			string text2 = (flag ? "★ CURRENT" : (flag2 ? "✓ UNLOCKED" : "LOCKED"));
			Color textColor3 = (flag ? new Color(1f, 0.85f, 0.2f) : (flag2 ? new Color(0.2f, 1f, 0.6f) : new Color(0.5f, 0.55f, 0.65f)));
			DrawOutlinedLabel(val3, text2, stPillText, textColor3, Color.black);
			GUILayout.Space(4f);
		}
		GUILayout.EndScrollView();
		GUILayout.Space(6f);
		GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.Label("EXP: Catch fish • Sea bosses • Sell haul • Exploration", stMuted, (GUILayoutOption[])(object)new GUILayoutOption[0]);
		GUILayout.FlexibleSpace();
		if (GUILayout.Button("\ud83d\udcac Discord Community", stBtnDiscord, (GUILayoutOption[])(object)new GUILayoutOption[2]
		{
			GUILayout.Width(170f),
			GUILayout.Height(24f)
		}))
		{
			Application.OpenURL("https://discord.gg/4bmDYANzGj");
		}
		GUILayout.EndHorizontal();
		GUILayout.EndVertical();
		GUI.DragWindow(new Rect(0f, 0f, 10000f, 40f));
	}
}
[HarmonyPatch(typeof(MoneyManager), "SellItem")]
internal static class PatchMoneySell
{
	private static void Prefix(Item item)
	{
		//IL_0067: 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)
		if ((Object)(object)item == (Object)null)
		{
			return;
		}
		try
		{
			int totalWorth = item.TotalWorth;
			if (totalWorth <= 0)
			{
				return;
			}
			float sellBonus = FishermanMasteryPlugin.GetSellBonus();
			if (sellBonus > 0f)
			{
				int num = Mathf.RoundToInt((float)totalWorth * sellBonus);
				if (num > 0)
				{
					MoneyManager.AddMoney(num, ((Component)item).transform.position);
					FishermanMasteryPlugin.ModLogger.LogInfo((object)("[Sell Bonus] +$" + num + " (" + Mathf.RoundToInt(sellBonus * 100f) + "%)"));
				}
			}
			int amount = Mathf.Clamp(totalWorth / 3, 8, 300);
			FishermanMasteryPlugin.AddExp(amount);
			if (FishermanMasteryPlugin.HasTreasureFind() && Random.value < 0.05f)
			{
				int num2 = Random.Range(25, 100);
				MoneyManager.AddMoney(num2, ((Component)item).transform.position);
				FishermanMasteryPlugin.ModLogger.LogInfo((object)("[Treasure] +$" + num2));
			}
		}
		catch (Exception ex)
		{
			FishermanMasteryPlugin.ModLogger.LogWarning((object)("PatchMoneySell error: " + ex.Message));
		}
	}
}
[HarmonyPatch(typeof(PlayerEating), "FinishEating")]
internal static class PatchFood
{
	private static void Postfix(PlayerEating __instance)
	{
		if ((Object)(object)__instance == (Object)null)
		{
			return;
		}
		try
		{
			float foodBonus = FishermanMasteryPlugin.GetFoodBonus();
			if (foodBonus > 0f)
			{
				Player value = Traverse.Create((object)__instance).Field("_player").GetValue<Player>();
				if ((Object)(object)value != (Object)null && (Object)(object)value.Vitals != (Object)null)
				{
					int num = Mathf.Max(5, Mathf.RoundToInt(25f * foodBonus));
					value.Vitals.RestoreFullness(num);
				}
			}
		}
		catch
		{
		}
	}
}
[HarmonyPatch(typeof(Purchasable), "Hover")]
internal static class PatchShopHover
{
	public static readonly Dictionary<int, int> BaseItemCosts = new Dictionary<int, int>();

	private static void Prefix(Purchasable __instance)
	{
		if ((Object)(object)__instance == (Object)null)
		{
			return;
		}
		try
		{
			int instanceID = ((Object)__instance).GetInstanceID();
			int value = Traverse.Create((object)__instance).Field("_customCost").GetValue<int>();
			if (!BaseItemCosts.ContainsKey(instanceID) && value > 0)
			{
				BaseItemCosts[instanceID] = value;
			}
			if (BaseItemCosts.TryGetValue(instanceID, out var value2))
			{
				float discountBonus = FishermanMasteryPlugin.GetDiscountBonus();
				if (discountBonus > 0f)
				{
					int num = Mathf.Max(1, Mathf.RoundToInt((float)value2 * (1f - discountBonus)));
					Traverse.Create((object)__instance).Field("_customCost").SetValue((object)num);
				}
				else
				{
					Traverse.Create((object)__instance).Field("_customCost").SetValue((object)value2);
				}
			}
		}
		catch
		{
		}
	}
}
[HarmonyPatch(typeof(FishingRod), "PrimaryInput")]
internal static class PatchCast
{
	public static readonly Dictionary<int, float> BaseThrowSpeeds = new Dictionary<int, float>();

	private static void Prefix(FishingRod __instance)
	{
		if ((Object)(object)__instance == (Object)null)
		{
			return;
		}
		try
		{
			int instanceID = ((Object)__instance).GetInstanceID();
			float value = Traverse.Create((object)__instance).Field("_lineThrowSpeed").GetValue<float>();
			if (!BaseThrowSpeeds.ContainsKey(instanceID) && value > 0f)
			{
				BaseThrowSpeeds[instanceID] = value;
			}
			if (BaseThrowSpeeds.TryGetValue(instanceID, out var value2))
			{
				float castBonus = FishermanMasteryPlugin.GetCastBonus();
				Traverse.Create((object)__instance).Field("_lineThrowSpeed").SetValue((object)(value2 * (1f + castBonus)));
			}
		}
		catch
		{
		}
	}
}
[HarmonyPatch(typeof(FishingRod), "DecreaseLineLength")]
internal static class PatchReelSpeed
{
	private static void Prefix(ref int amount)
	{
		float reelBonus = FishermanMasteryPlugin.GetReelBonus();
		if (reelBonus > 0f)
		{
			amount = Mathf.RoundToInt((float)amount * (1f + reelBonus));
		}
	}
}
[HarmonyPatch(typeof(FishingRod), "ReleaseItem")]
internal static class PatchFishingRodRelease
{
	private static void Prefix(Item item)
	{
		FishermanMasteryPlugin.ProcessCaughtItem(item, "FishingRod.ReleaseItem");
	}
}
[HarmonyPatch(typeof(Item), "PickUp")]
internal static class PatchItemPickUp
{
	private static void Prefix(Item __instance)
	{
		FishermanMasteryPlugin.ProcessCaughtItem(__instance, "Item.PickUp");
	}
}
[HarmonyPatch(typeof(Item), "OnPickUp")]
internal static class PatchItemOnPickUp
{
	private static void Prefix(Item __instance)
	{
		FishermanMasteryPlugin.ProcessCaughtItem(__instance, "Item.OnPickUp");
	}
}
[HarmonyPatch(typeof(Item), "PutInInventory")]
internal static class PatchItemPutInInventory
{
	private static void Prefix(Item __instance)
	{
		FishermanMasteryPlugin.ProcessCaughtItem(__instance, "Item.PutInInventory");
	}
}
[HarmonyPatch(typeof(Creature), "OnDeath")]
internal static class PatchCreatureDeath
{
	private static void Postfix(Creature __instance)
	{
		if ((Object)(object)__instance == (Object)null)
		{
			return;
		}
		try
		{
			string name = ((Object)__instance).name;
			if (name.IndexOf("Clam", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("Shell", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("Barnacle", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("Plant", StringComparison.OrdinalIgnoreCase) < 0 && !(Time.timeSinceLevelLoad < 4f))
			{
				if (__instance is BowheadWhale || __instance is Spidercrab || name.IndexOf("Boss", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Whale", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Spider", StringComparison.OrdinalIgnoreCase) >= 0)
				{
					int num = Random.Range(400, 600);
					FishermanMasteryPlugin.AddExp(num);
					FishermanMasteryPlugin.ModLogger.LogInfo((object)("[Boss Defeated] " + name + " -> +" + num + " EXP"));
				}
				else
				{
					int num2 = Random.Range(25, 45);
					FishermanMasteryPlugin.AddExp(num2);
					FishermanMasteryPlugin.ModLogger.LogInfo((object)("[Predator Defeated] " + name + " -> +" + num2 + " EXP"));
				}
			}
		}
		catch (Exception ex)
		{
			FishermanMasteryPlugin.ModLogger.LogWarning((object)("PatchCreatureDeath error: " + ex.Message));
		}
	}
}
[HarmonyPatch(typeof(MainMenuManager), "Start")]
internal static class PatchMainMenuStart
{
	private static void Postfix(MainMenuManager __instance)
	{
		try
		{
			if ((Object)(object)__instance != (Object)null)
			{
				Traverse.Create((object)__instance).Method("HideBoat", new object[0]).GetValue();
			}
			if ((Object)(object)FishermanMasteryPlugin.Instance != (Object)null)
			{
				FishermanMasteryPlugin.Instance.SetupMenuVideo();
			}
		}
		catch
		{
		}
	}
}
[HarmonyPatch(typeof(SaveManager), "OnServerLoaded")]
internal static class PatchSaveLoaded
{
	private static void Postfix()
	{
		FishermanMasteryPlugin.LoadProgress();
		FishermanMasteryPlugin.ModLogger.LogInfo((object)("Loaded progress for: " + FishermanMasteryPlugin.GetCurrentSaveName() + " (Level " + FishermanMasteryPlugin.currentLevel + ")"));
	}
}
[HarmonyPatch(typeof(SaveManager), "CreateServer")]
internal static class PatchSaveCreated
{
	private static void Postfix()
	{
		FishermanMasteryPlugin.currentLevel = 1;
		FishermanMasteryPlugin.currentExp = 0;
		FishermanMasteryPlugin.SaveProgress();
		FishermanMasteryPlugin.ModLogger.LogInfo((object)("Created progress for new save: " + FishermanMasteryPlugin.GetCurrentSaveName()));
	}
}
[HarmonyPatch(typeof(SaveManager), "DeleteServer")]
internal static class PatchSaveDeleted
{
	private static void Prefix()
	{
		try
		{
			string curName = FishermanMasteryPlugin.GetCurrentSaveName();
			if (!File.Exists(FishermanMasteryPlugin.savePath))
			{
				return;
			}
			FishermanMasteryPlugin.MultiSaveContainer multiSaveContainer = JsonUtility.FromJson<FishermanMasteryPlugin.MultiSaveContainer>(File.ReadAllText(FishermanMasteryPlugin.savePath));
			if (multiSaveContainer != null && multiSaveContainer.slots != null)
			{
				multiSaveContainer.slots.RemoveAll((FishermanMasteryPlugin.SaveSlotData s) => s.saveName == curName);
				File.WriteAllText(FishermanMasteryPlugin.savePath, JsonUtility.ToJson((object)multiSaveContainer, true));
			}
		}
		catch
		{
		}
	}
}
[HarmonyPatch(typeof(PlayerCamera), "MouseMovement")]
internal static class PatchCameraMouseMovement
{
	private static bool Prefix()
	{
		if (FishermanMasteryPlugin.showLevelTable)
		{
			return false;
		}
		return true;
	}
}
[HarmonyPatch(typeof(PlayerCamera), "MouseInput")]
internal static class PatchCameraMouseInput
{
	private static bool Prefix()
	{
		if (FishermanMasteryPlugin.showLevelTable)
		{
			return false;
		}
		return true;
	}
}