Decompiled source of Mystic Assistant Redux v0.1.3
plugins/MysticAssistantRedux.dll
Decompiled a month ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using I2.Loc; using Lamb.UI; using Lamb.UI.Assets; using Lamb.UI.BuildMenu; using MMTools; using Microsoft.CodeAnalysis; using MonoMod.Utils; using MysticAssistantRedux.Patches; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using src.Alerts; using src.Extensions; using src.UINavigator; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")] [assembly: AssemblyCompany("p1xel8ted")] [assembly: AssemblyConfiguration("Release-Thunderstore")] [assembly: AssemblyDescription("MysticAssistantRedux")] [assembly: AssemblyFileVersion("0.1.3.0")] [assembly: AssemblyInformationalVersion("0.1.3+e35e833636d7456e4e44557b3f0922af19478aaa")] [assembly: AssemblyProduct("MysticAssistantRedux")] [assembly: AssemblyTitle("MysticAssistantRedux")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.3.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } internal sealed class ConfigurationManagerAttributes { public delegate void CustomHotkeyDrawerFunc(ConfigEntryBase setting, ref bool isCurrentlyAcceptingInput); public bool? ShowRangeAsPercent; public Action<ConfigEntryBase> CustomDrawer; public CustomHotkeyDrawerFunc CustomHotkeyDrawer; public bool? Browsable; public string Category; public object DefaultValue; public bool? HideDefaultButton; public bool? HideSettingName; public string Description; public string DispName; public int? Order; public bool? ReadOnly; public bool? IsAdvanced; public Func<object, string> ObjToStr; public Func<string, object> StrToObj; } internal class PopupManager : MonoBehaviour { internal bool ShowPopup; private string _title = ""; private string _popupMessage = ""; private Rect _popupRect = new Rect((float)Screen.width / 2f - 250f, (float)Screen.height / 2f - 100f, 500f, 300f); private GUIStyle _messageStyle; private GUIStyle _windowStyle; private GUIStyle _titleStyle; private bool _dontShowAgainThisSession; private bool _ignoreDontShow; private bool _isConfirmation; private Action _onConfirm; internal string Title { get; set; } = ""; private void Start() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_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_0031: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_0062: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00a7: Expected O, but got Unknown GUIStyle val = new GUIStyle { alignment = (TextAnchor)4, wordWrap = true, fontSize = 22 }; val.normal.textColor = Color.black; _titleStyle = val; GUIStyle val2 = new GUIStyle { alignment = (TextAnchor)4, wordWrap = true, fontSize = 20 }; val2.normal.textColor = Color.black; _messageStyle = val2; GUIStyle val3 = new GUIStyle(); val3.normal.background = Texture2D.whiteTexture; val3.normal.textColor = Color.black; val3.richText = true; val3.padding = new RectOffset(10, 10, 10, 10); _windowStyle = val3; } private void OnGUI() { //IL_000b: 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_002c: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (ShowPopup) { _popupRect = GUI.ModalWindow(0, _popupRect, new WindowFunction(DrawPopup), string.Empty, _windowStyle); } } private void DrawPopup(int windowID) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) GUILayout.FlexibleSpace(); GUI.Label(new Rect(10f, 10f, ((Rect)(ref _popupRect)).width - 20f, 30f), _title, _titleStyle); GUILayout.FlexibleSpace(); GUILayout.Label(_popupMessage, _messageStyle, Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); if (_isConfirmation) { if (GUILayout.Button("Confirm", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(120f), GUILayout.Height(40f) })) { ShowPopup = false; _onConfirm?.Invoke(); _onConfirm = null; } if (GUILayout.Button("Cancel", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(120f), GUILayout.Height(40f) })) { ShowPopup = false; _onConfirm = null; } } else { if (GUILayout.Button("OK", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(100f), GUILayout.Height(40f) })) { ShowPopup = false; } if (!_ignoreDontShow && GUILayout.Button("Close & Don't Show Again This Session", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(250f), GUILayout.Height(40f) })) { _dontShowAgainThisSession = true; ShowPopup = false; } } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.FlexibleSpace(); } public void ShowPopupDlg(string message, bool showCloseAndDontShowAgain) { ShowPopupDlg(Title, message, showCloseAndDontShowAgain); } public void ShowPopupDlg(string title, string message, bool showCloseAndDontShowAgain) { _ignoreDontShow = !showCloseAndDontShowAgain; if (!(_dontShowAgainThisSession && showCloseAndDontShowAgain)) { _title = title; _popupMessage = message; _isConfirmation = false; _onConfirm = null; ShowPopup = true; } } public void ShowConfirmation(string title, string message, Action onConfirm) { _title = title; _popupMessage = message; _isConfirmation = true; _onConfirm = onConfirm; ShowPopup = true; } } namespace MysticAssistantRedux { internal static class ExclusiveContent { public static readonly (string SkinName, bool HasPcAssets)[] AppleSkins = new(string, bool)[5] { ("Orangutan", true), ("Robin", true), ("Trout", true), ("Beaver", true), ("Lobster", true) }; public static readonly FollowerClothingType[] AppleClothing = (FollowerClothingType[])(object)new FollowerClothingType[2] { (FollowerClothingType)56, (FollowerClothingType)57 }; public static readonly TYPES[] AppleDecorations; public static readonly Dictionary<TYPES, string> AppleDecorationPrefabPaths; public const int AppleFleece = 680; public static readonly string[] BossSkins; public static readonly string[] QuestSkins; static ExclusiveContent() { TYPES[] array = new TYPES[5]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); AppleDecorations = (TYPES[])(object)array; AppleDecorationPrefabPaths = new Dictionary<TYPES, string> { { (TYPES)500, "Prefabs/Structures/Buildings/Decoration Apple Bush" }, { (TYPES)501, "Prefabs/Structures/Buildings/Decoration Apple Lantern" }, { (TYPES)502, "Prefabs/Structures/Buildings/Decoration Apple Statue" }, { (TYPES)503, "Prefabs/Structures/Buildings/Decoration Apple Vase" }, { (TYPES)504, "Prefabs/Structures/Buildings/Decoration Apple Well" } }; BossSkins = new string[31] { "Boss Mama Worm", "Boss Mama Maggot", "Boss Flying Burp Frog", "Boss Egg Hopper", "Boss Burrow Worm", "Boss Mortar Hopper", "Boss Scuttle Turret", "Boss Spiker", "Boss Charger", "Boss Beholder 1", "Boss Beholder 2", "Boss Beholder 3", "Boss Beholder 4", "Boss Beholder 5", "Boss Beholder 6", "Boss Spider Jump", "Boss Millipede Poisoner", "Boss Scorpion", "Boss Death Cat", "Boss Aym", "Boss Baal", "Boss Dog 1", "Boss Dog 2", "Boss Dog 3", "Boss Dog 4", "Boss Dog 5", "Boss Dog 6", "Boss Rot 1", "Boss Rot 2", "Boss Rot 3", "Boss Rot 4" }; QuestSkins = new string[2] { "Nightwolf", "Snail" }; } } internal static class InventoryInfo { private const int MaxCountDarkNecklace = 1; private const int MaxCountLightNecklace = 1; private const int MaxCountTalismanPieces = 12; public static string GetShopLabelByItemType(ITEM_TYPE itemType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0029: 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_0041: Expected I4, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if ((int)itemType <= 42) { if ((int)itemType == 27) { return Localization.ShopLabelRelic; } if ((int)itemType == 40) { return Localization.ShopLabelDecoApple; } if ((int)itemType == 42) { return Localization.ShopLabelSkinApple; } } else { if ((int)itemType == 138) { return Localization.ShopLabelOutfitApple; } if ((int)itemType == 164) { return LocalizationManager.GetTranslation($"Inventory/{(object)(ITEM_TYPE)40}", true, 0, true, false, (GameObject)null, (string)null, true); } switch (itemType - 221) { case 0: return LocalizationManager.GetTranslation("TarotCards/Fleece680/Name", true, 0, true, false, (GameObject)null, (string)null, true); case 1: return Localization.ShopLabelSkinBoss; case 2: return Localization.ShopLabelSkinQuest; } } return LocalizationManager.GetTranslation($"Inventory/{itemType}", true, 0, true, false, (GameObject)null, (string)null, true); } public static string CheckForPurchaseWarning(TraderTrackerItems chosenItem) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Invalid comparison between Unknown and I4 //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 ITEM_TYPE itemForTrade = chosenItem.itemForTrade; if ((int)itemForTrade <= 124) { if ((int)itemForTrade != 114) { if ((int)itemForTrade == 124 && (DataManager.Instance.HasAymSkin || Inventory.GetItemQuantity((ITEM_TYPE)124) >= 1 || DataManager.Instance.Followers.Exists((FollowerInfo f) => (int)f.Necklace == 124))) { return Localization.OverbuyWarning; } } else if (DataManager.Instance.TalismanPiecesReceivedFromMysticShop >= 12) { return Localization.OverbuyWarning; } } else if ((int)itemForTrade != 125) { if ((int)itemForTrade == 222) { return Localization.BossBypassWarning; } if ((int)itemForTrade == 223) { return Localization.QuestBypassWarning; } } else if (DataManager.Instance.HasBaalSkin || Inventory.GetItemQuantity((ITEM_TYPE)125) >= 1 || DataManager.Instance.Followers.Exists((FollowerInfo f) => (int)f.Necklace == 125)) { return Localization.OverbuyWarning; } return null; } public static List<TraderTrackerItems> GetShopItemTypeList() { List<TraderTrackerItems> list = new List<TraderTrackerItems> { CreateTraderItem((ITEM_TYPE)127), CreateTraderItem((ITEM_TYPE)123), CreateTraderItem((ITEM_TYPE)122), CreateTraderItem((ITEM_TYPE)126), CreateTraderItem((ITEM_TYPE)125), CreateTraderItem((ITEM_TYPE)124) }; if (Plugin.EnableDlcNecklaces.Value && DataManager.Instance.MAJOR_DLC) { list.Add(CreateTraderItem((ITEM_TYPE)180)); list.Add(CreateTraderItem((ITEM_TYPE)181)); list.Add(CreateTraderItem((ITEM_TYPE)182)); list.Add(CreateTraderItem((ITEM_TYPE)184)); list.Add(CreateTraderItem((ITEM_TYPE)183)); } list.AddRange((IEnumerable<TraderTrackerItems>)(object)new TraderTrackerItems[7] { CreateTraderItem((ITEM_TYPE)121), CreateTraderItem((ITEM_TYPE)114), CreateTraderItem((ITEM_TYPE)52), CreateTraderItem((ITEM_TYPE)164), CreateTraderItem((ITEM_TYPE)26), CreateTraderItem((ITEM_TYPE)27), CreateTraderItem((ITEM_TYPE)20) }); list.Add(CreateTraderItem((ITEM_TYPE)42)); list.Add(CreateTraderItem((ITEM_TYPE)40)); list.Add(CreateTraderItem((ITEM_TYPE)138)); list.Add(CreateTraderItem((ITEM_TYPE)221)); if (Plugin.EnableBossSkins.Value) { list.Add(CreateTraderItem((ITEM_TYPE)222)); } if (Plugin.EnableQuestSkins.Value) { list.Add(CreateTraderItem((ITEM_TYPE)223)); } return list; } private static TraderTrackerItems CreateTraderItem(ITEM_TYPE itemType) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0012: 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_0020: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown int effectiveCost = Plugin.GetEffectiveCost(); return new TraderTrackerItems { itemForTrade = itemType, BuyPrice = effectiveCost, BuyOffset = 0, SellPrice = effectiveCost, SellOffset = 0, LastDayChecked = TimeManager.CurrentDay }; } } internal class InventoryManager { public const ITEM_TYPE AppleSkinType = 42; public const ITEM_TYPE AppleDecorationType = 40; public const ITEM_TYPE AppleClothingType = 138; public const ITEM_TYPE AppleFleeceType = 221; public const ITEM_TYPE PalworldSkinType = 41; public const ITEM_TYPE BossSkinType = 222; public const ITEM_TYPE QuestSkinType = 223; private readonly List<InventoryItem> _shopInventory = new List<InventoryItem>(); private readonly List<ITEM_TYPE> _limitedStockTypes = new List<ITEM_TYPE>(); private readonly List<string> _followerSkinsAvailable = new List<string>(); private readonly List<TYPES> _decorationsAvailable = new List<TYPES>(); private readonly List<Card> _tarotCardsAvailable = new List<Card>(); private readonly List<RelicType> _relicsAvailable = new List<RelicType>(); private readonly List<string> _appleSkinsAvailable = new List<string>(); private readonly List<TYPES> _appleDecorationsAvailable = new List<TYPES>(); private readonly List<FollowerClothingType> _appleClothingAvailable = new List<FollowerClothingType>(); private readonly List<int> _appleFleecesAvailable = new List<int>(); private readonly List<string> _palworldSkinsAvailable = new List<string>(); private readonly List<string> _bossSkinsAvailable = new List<string>(); private readonly List<string> _questSkinsAvailable = new List<string>(); private readonly int _maxCrystalDoctrineStones; public bool BoughtKeyPiece { get; private set; } public bool BoughtCrystalDoctrineStone { get; private set; } public bool BoughtFollowerSkin { get; private set; } public bool BoughtDecoration { get; private set; } public bool BoughtTarotCard { get; private set; } public bool BoughtRelic { get; private set; } public bool BoughtAppleSkin { get; private set; } public bool BoughtAppleDecoration { get; private set; } public bool BoughtAppleClothing { get; private set; } public bool BoughtAppleFleece { get; private set; } public bool BoughtPalworldSkin { get; private set; } public bool BoughtBossSkin { get; private set; } public bool BoughtQuestSkin { get; private set; } public InventoryManager(Interaction_MysticShop instance) { _maxCrystalDoctrineStones = 24 + (DataManager.Instance.MAJOR_DLC ? 4 : 0); FixAymBaalFlags(); PopulateShopInventory(); } private static void FixAymBaalFlags() { bool hasAymSkin = DataManager.Instance.Followers.Exists((FollowerInfo f) => f.Name == "Aym") || DataManager.Instance.Followers_Dead.Exists((FollowerInfo f) => f.Name == "Aym") || DataManager.Instance.HasReturnedAym || DataManager.Instance.HasReturnedBoth; DataManager.Instance.HasAymSkin = hasAymSkin; bool hasBaalSkin = DataManager.Instance.Followers.Exists((FollowerInfo f) => f.Name == "Baal") || DataManager.Instance.Followers_Dead.Exists((FollowerInfo f) => f.Name == "Baal") || DataManager.Instance.HasReturnedBaal || DataManager.Instance.HasReturnedBoth; DataManager.Instance.HasBaalSkin = hasBaalSkin; } public List<InventoryItem> GetShopInventory() { return _shopInventory; } public void ChangeShopStockByQuantity(ITEM_TYPE itemType, int quantity) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) InventoryItem val = _shopInventory.First((InventoryItem s) => s.type == (int)itemType); val.quantity = Math.Max(0, val.quantity + quantity); } public int GetItemListCountByItemType(ITEM_TYPE itemType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Invalid comparison between Unknown and I4 //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected I4, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Invalid comparison between Unknown and I4 //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Invalid comparison between Unknown and I4 //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 if ((int)itemType <= 42) { if ((int)itemType <= 27) { if ((int)itemType == 26) { return _tarotCardsAvailable.Count; } if ((int)itemType == 27) { return _relicsAvailable.Count; } } else { if ((int)itemType == 40) { return _appleDecorationsAvailable.Count; } if ((int)itemType == 42) { return _appleSkinsAvailable.Count; } } } else if ((int)itemType <= 138) { if ((int)itemType == 52) { return _followerSkinsAvailable.Count; } if ((int)itemType == 138) { return _appleClothingAvailable.Count; } } else { if ((int)itemType == 164) { return _decorationsAvailable.Count; } switch (itemType - 221) { case 0: return _appleFleecesAvailable.Count; case 1: return _bossSkinsAvailable.Count; case 2: return _questSkinsAvailable.Count; } } return 0; } public void RemoveItemFromListByTypeAndIndex(ITEM_TYPE itemType, int index) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Invalid comparison between Unknown and I4 //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Invalid comparison between Unknown and I4 //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_003e: 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_0056: Expected I4, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 if ((int)itemType <= 42) { if ((int)itemType <= 27) { if ((int)itemType != 26) { if ((int)itemType == 27) { _relicsAvailable.RemoveAt(index); } } else { _tarotCardsAvailable.RemoveAt(index); } } else if ((int)itemType != 40) { if ((int)itemType == 42) { _appleSkinsAvailable.RemoveAt(index); } } else { _appleDecorationsAvailable.RemoveAt(index); } } else if ((int)itemType <= 138) { if ((int)itemType != 52) { if ((int)itemType == 138) { _appleClothingAvailable.RemoveAt(index); } } else { _followerSkinsAvailable.RemoveAt(index); } } else if ((int)itemType != 164) { switch (itemType - 221) { case 0: _appleFleecesAvailable.RemoveAt(index); break; case 1: _bossSkinsAvailable.RemoveAt(index); break; case 2: _questSkinsAvailable.RemoveAt(index); break; } } else { _decorationsAvailable.RemoveAt(index); } } public string GetFollowerSkinNameByIndex(int index) { return _followerSkinsAvailable[index]; } public TYPES GetDecorationByIndex(int index) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return _decorationsAvailable[index]; } public Card GetTarotCardByIndex(int index) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return _tarotCardsAvailable[index]; } public RelicType GetRelicByIndex(int index) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return _relicsAvailable[index]; } public string GetAppleSkinNameByIndex(int index) { return _appleSkinsAvailable[index]; } public TYPES GetAppleDecorationByIndex(int index) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return _appleDecorationsAvailable[index]; } public FollowerClothingType GetAppleClothingByIndex(int index) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return _appleClothingAvailable[index]; } public int GetAppleFleeceByIndex(int index) { return _appleFleecesAvailable[index]; } public void SetBoughtKeyPieceFlag(bool value) { BoughtKeyPiece = value; } public void SetBoughtCrystalDoctrineStoneFlag(bool value) { BoughtCrystalDoctrineStone = value; } public void SetBoughtFollowerSkinFlag(bool value) { BoughtFollowerSkin = value; } public void SetBoughtDecorationFlag(bool value) { BoughtDecoration = value; } public void SetBoughtTarotCardFlag(bool value) { BoughtTarotCard = value; } public void SetBoughtRelicFlag(bool value) { BoughtRelic = value; } public void SetBoughtAppleSkinFlag(bool value) { BoughtAppleSkin = value; } public void SetBoughtAppleDecorationFlag(bool value) { BoughtAppleDecoration = value; } public void SetBoughtAppleClothingFlag(bool value) { BoughtAppleClothing = value; } public void SetBoughtAppleFleeceFlag(bool value) { BoughtAppleFleece = value; } public string GetPalworldSkinNameByIndex(int index) { return _palworldSkinsAvailable[index]; } public string GetBossSkinNameByIndex(int index) { return _bossSkinsAvailable[index]; } public string GetQuestSkinNameByIndex(int index) { return _questSkinsAvailable[index]; } public void SetBoughtPalworldSkinFlag(bool value) { BoughtPalworldSkin = value; } public void SetBoughtBossSkinFlag(bool value) { BoughtBossSkin = value; } public void SetBoughtQuestSkinFlag(bool value) { BoughtQuestSkin = value; } private void PopulateShopInventory() { //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Invalid comparison between Unknown and I4 //IL_0168: 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) //IL_01ba: Invalid comparison between Unknown and I4 //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Expected O, but got Unknown //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: 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_0203: 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_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Expected O, but got Unknown PopulateFollowerSkins(); PopulateDecorations(); PopulateTarotCards(); PopulateRelics(); PopulateAppleSkins(); PopulateAppleDecorations(); PopulateAppleClothing(); PopulateAppleFleeces(); PopulateBossSkins(); PopulateQuestSkins(); Plugin.Log.LogInfo((object)($"[InventoryManager] Shop stock: Skins={_followerSkinsAvailable.Count}, Decorations={_decorationsAvailable.Count}, " + $"TarotCards={_tarotCardsAvailable.Count}, Relics={_relicsAvailable.Count}, " + $"AppleSkins={_appleSkinsAvailable.Count}, AppleDecos={_appleDecorationsAvailable.Count}, " + $"AppleClothing={_appleClothingAvailable.Count}, AppleFleeces={_appleFleecesAvailable.Count}, " + $"BossSkins={_bossSkinsAvailable.Count}, QuestSkins={_questSkinsAvailable.Count}")); List<ITEM_TYPE> list = new List<ITEM_TYPE>(); foreach (TraderTrackerItems shopItemType in InventoryInfo.GetShopItemTypeList()) { int num = 99; if (_limitedStockTypes.Contains(shopItemType.itemForTrade)) { num = GetItemListCountByItemType(shopItemType.itemForTrade); if (num == 0) { list.Add(shopItemType.itemForTrade); continue; } } else if ((int)shopItemType.itemForTrade == 121) { num = _maxCrystalDoctrineStones - DataManager.Instance.CrystalDoctrinesReceivedFromMysticShop; if (num <= 0) { list.Add(shopItemType.itemForTrade); continue; } } else if ((int)shopItemType.itemForTrade == 20) { num = 100; } _shopInventory.Add(new InventoryItem(shopItemType.itemForTrade, num)); } foreach (ITEM_TYPE item in list) { _shopInventory.Add(new InventoryItem(item, 0)); } } private void PopulateFollowerSkins() { Plugin.Log.LogInfo((object)$"[InventoryManager] Checking {DataManager.MysticShopKeeperSkins.Length} skins from MysticShopKeeperSkins"); foreach (string item in DataManager.MysticShopKeeperSkins.ToList()) { bool followerSkinUnlocked = DataManager.GetFollowerSkinUnlocked(item); Plugin.Log.LogInfo((object)$"[InventoryManager] Skin '{item}': unlocked={followerSkinUnlocked}"); if (!followerSkinUnlocked) { _followerSkinsAvailable.Add(item); } } _limitedStockTypes.Add((ITEM_TYPE)52); } private void PopulateDecorations() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Plugin.Log.LogInfo((object)$"[InventoryManager] Checking {DataManager.MysticShopKeeperDecorations.Length} decorations from MysticShopKeeperDecorations"); foreach (TYPES item in DataManager.MysticShopKeeperDecorations.ToList()) { bool flag = DataManager.Instance.UnlockedStructures.Contains(item); Plugin.Log.LogInfo((object)$"[InventoryManager] Decoration '{item}': unlocked={flag}"); if (!flag) { _decorationsAvailable.Add(item); } } _limitedStockTypes.Add((ITEM_TYPE)164); } private void PopulateTarotCards() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) Plugin.Log.LogInfo((object)$"[InventoryManager] Checking {TarotCards.MysticCards.Length} cards from TarotCards.MysticCards"); Card[] mysticCards = TarotCards.MysticCards; foreach (Card val in mysticCards) { bool flag = DataManager.Instance.PlayerFoundTrinkets.Contains(val); Plugin.Log.LogInfo((object)$"[InventoryManager] Tarot card '{val}': unlocked={flag}"); if (!flag) { _tarotCardsAvailable.Add(val); } } _limitedStockTypes.Add((ITEM_TYPE)26); } private void PopulateRelics() { Plugin.Log.LogInfo((object)"[InventoryManager] Checking 2 hardcoded relics"); bool flag = DataManager.Instance.PlayerFoundRelics.Contains((RelicType)59); Plugin.Log.LogInfo((object)$"[InventoryManager] Relic 'SpawnBlackGoop': unlocked={flag}"); if (!flag) { _relicsAvailable.Add((RelicType)59); } bool flag2 = DataManager.Instance.PlayerFoundRelics.Contains((RelicType)61); Plugin.Log.LogInfo((object)$"[InventoryManager] Relic 'UnlimitedFervour': unlocked={flag2}"); if (!flag2) { _relicsAvailable.Add((RelicType)61); } _limitedStockTypes.Add((ITEM_TYPE)27); } private void PopulateAppleSkins() { MysticShopPatches.ValidateAppleSkins(); (string, bool)[] appleSkins = ExclusiveContent.AppleSkins; for (int i = 0; i < appleSkins.Length; i++) { (string, bool) tuple = appleSkins[i]; var (text, _) = tuple; if (!tuple.Item2) { Plugin.Log.LogInfo((object)("[InventoryManager] Skipping Apple skin '" + text + "' - no PC assets")); } else if (!DataManager.GetFollowerSkinUnlocked(text)) { _appleSkinsAvailable.Add(text); } } _limitedStockTypes.Add((ITEM_TYPE)42); } private void PopulateAppleDecorations() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) Plugin.Log.LogInfo((object)$"[InventoryManager] Checking {ExclusiveContent.AppleDecorations.Length} Apple decorations"); TYPES[] appleDecorations = ExclusiveContent.AppleDecorations; foreach (TYPES val in appleDecorations) { bool flag = DataManager.Instance.UnlockedStructures.Contains(val); Plugin.Log.LogInfo((object)$"[InventoryManager] Apple Decoration '{val}': unlocked={flag}"); if (!flag) { _appleDecorationsAvailable.Add(val); } } _limitedStockTypes.Add((ITEM_TYPE)40); } private void PopulateAppleClothing() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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) FollowerClothingType[] appleClothing = ExclusiveContent.AppleClothing; foreach (FollowerClothingType item in appleClothing) { if (!DataManager.Instance.UnlockedClothing.Contains(item)) { _appleClothingAvailable.Add(item); } } _limitedStockTypes.Add((ITEM_TYPE)138); } private void PopulateAppleFleeces() { if (!DataManager.Instance.UnlockedFleeces.Contains(680)) { _appleFleecesAvailable.Add(680); } _limitedStockTypes.Add((ITEM_TYPE)221); } private void PopulateBossSkins() { if (!Plugin.EnableBossSkins.Value) { return; } string[] bossSkins = ExclusiveContent.BossSkins; foreach (string text in bossSkins) { if (WorshipperData.Instance.GetCharacters(text) == null) { Plugin.Log.LogWarning((object)("[BossSkins] '" + text + "': NOT FOUND in WorshipperData")); } if (!DataManager.GetFollowerSkinUnlocked(text)) { _bossSkinsAvailable.Add(text); } } _limitedStockTypes.Add((ITEM_TYPE)222); } private void PopulateQuestSkins() { if (!Plugin.EnableQuestSkins.Value) { return; } string[] questSkins = ExclusiveContent.QuestSkins; foreach (string text in questSkins) { if (!DataManager.GetFollowerSkinUnlocked(text)) { _questSkinsAvailable.Add(text); } } _limitedStockTypes.Add((ITEM_TYPE)223); } } internal static class Localization { private static readonly Dictionary<string, Dictionary<string, string>> Strings = new Dictionary<string, Dictionary<string, string>> { { "English", new Dictionary<string, string> { { "MysticAssistantLabel", "Mystic Assistant" }, { "ShopLabelRelic", "Relic" }, { "ShopLabelSkinApple", "Follower Skin (Apple)" }, { "ShopLabelDecoApple", "Decoration (Apple)" }, { "ShopLabelOutfitApple", "Outfit (Apple)" }, { "ShopLabelSkinBoss", "Follower Skin (Boss)" }, { "DLCNecklacesName", "DLC Necklaces" }, { "DLCNecklacesDesc", "Add Woolhaven DLC necklaces to the shop. These are normally obtained through DLC gameplay. Re-open the shop for changes to take effect." }, { "BossSkinsName", "Boss Skins" }, { "BossSkinsDesc", "Add boss follower skins to the shop. These are normally obtained by defeating bosses. Re-open the shop for changes to take effect." }, { "ShopLabelSkinQuest", "Follower Skin (Quest)" }, { "QuestSkinsName", "Quest Skins" }, { "QuestSkinsDesc", "Add quest-locked follower skins to the shop. These are normally obtained through specific quests (fox questline, snail statues). Re-open the shop for changes to take effect." }, { "GodTearCostName", "God Tear Cost" }, { "GodTearCostDesc", "God Tears per item. Cost can be increased but not decreased per save." }, { "CostRequiresSave", "Please load a save before changing the God Tear cost." }, { "CostIncreaseConfirm", "Increase cost from {0} to {1} God Tears per item for save slot {2}?\n\nThis cannot be reversed." }, { "CostSetConfirm", "Set cost to {0} God Tears per item for save slot {1}?\n\nCost can only be increased after this, not decreased." }, { "OverbuyWarning", "You are buying more of this than the game normally allows. Click again to confirm." }, { "BossBypassWarning", "This skin is normally earned by defeating a boss. Click again to confirm." }, { "QuestBypassWarning", "This skin is normally earned through a quest. Click again to confirm." } } }, { "Japanese", new Dictionary<string, string> { { "MysticAssistantLabel", "ミスティックアシスタント" }, { "ShopLabelRelic", "レリック" }, { "ShopLabelSkinApple", "フォロワースキン (Apple)" }, { "ShopLabelDecoApple", "デコレーション (Apple)" }, { "ShopLabelOutfitApple", "衣装 (Apple)" }, { "ShopLabelSkinBoss", "フォロワースキン (ボス)" }, { "DLCNecklacesName", "DLCネックレス" }, { "DLCNecklacesDesc", "ウールヘイブンDLCのネックレスをショップに追加します。通常はDLCのゲームプレイで入手できます。変更を反映するにはショップを開き直してください。" }, { "BossSkinsName", "ボススキン" }, { "BossSkinsDesc", "ボスのフォロワースキンをショップに追加します。通常はボスを倒すと入手できます。変更を反映するにはショップを開き直してください。" }, { "ShopLabelSkinQuest", "フォロワースキン (クエスト)" }, { "QuestSkinsName", "クエストスキン" }, { "QuestSkinsDesc", "クエスト限定のフォロワースキンをショップに追加します。通常は特定のクエスト(キツネのクエスト、カタツムリの像)で入手できます。変更を反映するにはショップを開き直してください。" }, { "GodTearCostName", "神の涙コスト" }, { "GodTearCostDesc", "アイテムごとの神の涙数。セーブごとにコストは増やせますが、減らせません。" }, { "CostRequiresSave", "神の涙コストを変更するには、セーブデータをロードしてください。" }, { "CostIncreaseConfirm", "セーブスロット{2}のアイテムあたりのコストを{0}から{1}神の涙に増やしますか?\n\nこの操作は元に戻せません。" }, { "CostSetConfirm", "セーブスロット{1}のアイテムあたりのコストを{0}神の涙に設定しますか?\n\n設定後はコストの増加のみ可能で、減少はできません。" }, { "OverbuyWarning", "通常の上限を超えて購入しようとしています。もう一度クリックして確認してください。" }, { "BossBypassWarning", "このスキンは通常ボスを倒すと入手します。もう一度クリックして確認してください。" }, { "QuestBypassWarning", "このスキンは通常クエストで入手します。もう一度クリックして確認してください。" } } }, { "Russian", new Dictionary<string, string> { { "MysticAssistantLabel", "Мистический помощник" }, { "ShopLabelRelic", "Реликвия" }, { "ShopLabelSkinApple", "Облик последователя (Apple)" }, { "ShopLabelDecoApple", "Украшение (Apple)" }, { "ShopLabelOutfitApple", "Наряд (Apple)" }, { "ShopLabelSkinBoss", "Облик последователя (Босс)" }, { "DLCNecklacesName", "Ожерелья DLC" }, { "DLCNecklacesDesc", "Добавить ожерелья DLC Вулхейвен в магазин. Обычно получаются в ходе DLC. Переоткройте магазин для применения изменений." }, { "BossSkinsName", "Скины боссов" }, { "BossSkinsDesc", "Добавить скины боссов-последователей в магазин. Обычно получаются за победу над боссами. Переоткройте магазин для применения изменений." }, { "ShopLabelSkinQuest", "Облик последователя (Квест)" }, { "QuestSkinsName", "Скины заданий" }, { "QuestSkinsDesc", "Добавить скины заданий-последователей в магазин. Обычно получаются через определённые задания (линейка лисы, статуи улиток). Переоткройте магазин для применения изменений." }, { "GodTearCostName", "Стоимость Слезы Бога" }, { "GodTearCostDesc", "Слёз Бога за предмет. Стоимость можно повысить, но не понизить для сохранения." }, { "CostRequiresSave", "Пожалуйста, загрузите сохранение перед изменением стоимости Слёз Бога." }, { "CostIncreaseConfirm", "Увеличить стоимость с {0} до {1} Слёз Бога за предмет для слота {2}?\n\nЭто действие необратимо." }, { "CostSetConfirm", "Установить стоимость {0} Слёз Бога за предмет для слота {1}?\n\nПосле установки стоимость можно только повысить, но не понизить." }, { "OverbuyWarning", "Вы покупаете больше, чем обычно позволяет игра. Нажмите ещё раз для подтверждения." }, { "BossBypassWarning", "Этот облик обычно получают за победу над боссом. Нажмите ещё раз для подтверждения." }, { "QuestBypassWarning", "Этот облик обычно получают через задание. Нажмите ещё раз для подтверждения." } } }, { "French", new Dictionary<string, string> { { "MysticAssistantLabel", "Assistant mystique" }, { "ShopLabelRelic", "Relique" }, { "ShopLabelSkinApple", "Apparence de suiveur (Apple)" }, { "ShopLabelDecoApple", "Décoration (Apple)" }, { "ShopLabelOutfitApple", "Tenue (Apple)" }, { "ShopLabelSkinBoss", "Apparence de suiveur (Boss)" }, { "DLCNecklacesName", "Colliers DLC" }, { "DLCNecklacesDesc", "Ajouter les colliers du DLC Woolhaven à la boutique. Normalement obtenus via le gameplay du DLC. Rouvrez la boutique pour appliquer les changements." }, { "BossSkinsName", "Skins de boss" }, { "BossSkinsDesc", "Ajouter les skins de boss au shop. Normalement obtenus en battant les boss. Rouvrez la boutique pour appliquer les changements." }, { "ShopLabelSkinQuest", "Apparence de suiveur (Quête)" }, { "QuestSkinsName", "Skins de quête" }, { "QuestSkinsDesc", "Ajouter les skins de quête au shop. Normalement obtenus via des quêtes spécifiques (quête du renard, statues d'escargot). Rouvrez la boutique pour appliquer les changements." }, { "GodTearCostName", "Coût en Larmes Divines" }, { "GodTearCostDesc", "Larmes Divines par objet. Le coût peut être augmenté mais pas diminué par sauvegarde." }, { "CostRequiresSave", "Veuillez charger une sauvegarde avant de modifier le coût en Larmes Divines." }, { "CostIncreaseConfirm", "Augmenter le coût de {0} à {1} Larmes Divines par objet pour le slot {2} ?\n\nCette action est irréversible." }, { "CostSetConfirm", "Définir le coût à {0} Larmes Divines par objet pour le slot {1} ?\n\nLe coût ne pourra qu'être augmenté après cela, pas diminué." }, { "OverbuyWarning", "Vous achetez plus que ce que le jeu permet normalement. Cliquez à nouveau pour confirmer." }, { "BossBypassWarning", "Cette apparence s'obtient normalement en battant un boss. Cliquez à nouveau pour confirmer." }, { "QuestBypassWarning", "Cette apparence s'obtient normalement via une quête. Cliquez à nouveau pour confirmer." } } }, { "German", new Dictionary<string, string> { { "MysticAssistantLabel", "Mystischer Assistent" }, { "ShopLabelRelic", "Relikt" }, { "ShopLabelSkinApple", "Anhänger-Skin (Apple)" }, { "ShopLabelDecoApple", "Dekoration (Apple)" }, { "ShopLabelOutfitApple", "Outfit (Apple)" }, { "ShopLabelSkinBoss", "Anhänger-Skin (Boss)" }, { "DLCNecklacesName", "DLC-Halsketten" }, { "DLCNecklacesDesc", "Woolhaven-DLC-Halsketten zum Shop hinzufügen. Werden normalerweise im DLC-Gameplay erhalten. Shop erneut öffnen, damit Änderungen wirksam werden." }, { "BossSkinsName", "Boss-Skins" }, { "BossSkinsDesc", "Boss-Anhänger-Skins zum Shop hinzufügen. Werden normalerweise durch Besiegen von Bossen erhalten. Shop erneut öffnen, damit Änderungen wirksam werden." }, { "ShopLabelSkinQuest", "Anhänger-Skin (Quest)" }, { "QuestSkinsName", "Quest-Skins" }, { "QuestSkinsDesc", "Quest-gesperrte Anhänger-Skins zum Shop hinzufügen. Werden normalerweise durch bestimmte Quests erhalten (Fuchs-Questreihe, Schneckenstatuen). Shop erneut öffnen, damit Änderungen wirksam werden." }, { "GodTearCostName", "Gottestränen-Kosten" }, { "GodTearCostDesc", "Gottestränen pro Gegenstand. Kosten können pro Speicherstand erhöht, aber nicht gesenkt werden." }, { "CostRequiresSave", "Bitte laden Sie einen Spielstand, bevor Sie die Gottestränen-Kosten ändern." }, { "CostIncreaseConfirm", "Kosten von {0} auf {1} Gottestränen pro Gegenstand für Speicherplatz {2} erhöhen?\n\nDies kann nicht rückgängig gemacht werden." }, { "CostSetConfirm", "Kosten auf {0} Gottestränen pro Gegenstand für Speicherplatz {1} festlegen?\n\nDanach können die Kosten nur erhöht, nicht gesenkt werden." }, { "OverbuyWarning", "Sie kaufen mehr davon, als das Spiel normalerweise erlaubt. Erneut klicken zum Bestätigen." }, { "BossBypassWarning", "Dieser Skin wird normalerweise durch das Besiegen eines Bosses verdient. Erneut klicken zum Bestätigen." }, { "QuestBypassWarning", "Dieser Skin wird normalerweise durch eine Quest verdient. Erneut klicken zum Bestätigen." } } }, { "Spanish", new Dictionary<string, string> { { "MysticAssistantLabel", "Asistente místico" }, { "ShopLabelRelic", "Reliquia" }, { "ShopLabelSkinApple", "Aspecto de seguidor (Apple)" }, { "ShopLabelDecoApple", "Decoración (Apple)" }, { "ShopLabelOutfitApple", "Atuendo (Apple)" }, { "ShopLabelSkinBoss", "Aspecto de seguidor (Jefe)" }, { "DLCNecklacesName", "Collares DLC" }, { "DLCNecklacesDesc", "Añadir collares del DLC Woolhaven a la tienda. Normalmente se obtienen jugando al DLC. Reabre la tienda para aplicar los cambios." }, { "BossSkinsName", "Skins de jefes" }, { "BossSkinsDesc", "Añadir skins de jefes seguidores a la tienda. Normalmente se obtienen al derrotar jefes. Reabre la tienda para aplicar los cambios." }, { "ShopLabelSkinQuest", "Aspecto de seguidor (Misión)" }, { "QuestSkinsName", "Skins de misión" }, { "QuestSkinsDesc", "Añadir skins de misión de seguidores a la tienda. Normalmente se obtienen a través de misiones específicas (misión del zorro, estatuas de caracol). Reabre la tienda para aplicar los cambios." }, { "GodTearCostName", "Coste en Lágrimas Divinas" }, { "GodTearCostDesc", "Lágrimas Divinas por objeto. El coste puede aumentarse pero no reducirse por partida guardada." }, { "CostRequiresSave", "Por favor, cargue una partida antes de cambiar el coste en Lágrimas Divinas." }, { "CostIncreaseConfirm", "¿Aumentar el coste de {0} a {1} Lágrimas Divinas por objeto para la ranura {2}?\n\nEsto no se puede revertir." }, { "CostSetConfirm", "¿Establecer el coste en {0} Lágrimas Divinas por objeto para la ranura {1}?\n\nDespués de esto, el coste solo puede aumentarse, no reducirse." }, { "OverbuyWarning", "Estás comprando más de lo que el juego permite normalmente. Haz clic de nuevo para confirmar." }, { "BossBypassWarning", "Este aspecto normalmente se obtiene al derrotar a un jefe. Haz clic de nuevo para confirmar." }, { "QuestBypassWarning", "Este aspecto normalmente se obtiene mediante una misión. Haz clic de nuevo para confirmar." } } }, { "Portuguese (Brazil)", new Dictionary<string, string> { { "MysticAssistantLabel", "Assistente místico" }, { "ShopLabelRelic", "Relíquia" }, { "ShopLabelSkinApple", "Aparência de seguidor (Apple)" }, { "ShopLabelDecoApple", "Decoração (Apple)" }, { "ShopLabelOutfitApple", "Traje (Apple)" }, { "ShopLabelSkinBoss", "Aparência de seguidor (Chefe)" }, { "DLCNecklacesName", "Colares DLC" }, { "DLCNecklacesDesc", "Adicionar colares do DLC Woolhaven à loja. Normalmente obtidos no gameplay do DLC. Reabra a loja para aplicar as alterações." }, { "BossSkinsName", "Skins de chefes" }, { "BossSkinsDesc", "Adicionar skins de chefes seguidores à loja. Normalmente obtidas ao derrotar chefes. Reabra a loja para aplicar as alterações." }, { "ShopLabelSkinQuest", "Aparência de seguidor (Missão)" }, { "QuestSkinsName", "Skins de missão" }, { "QuestSkinsDesc", "Adicionar skins de missão de seguidores à loja. Normalmente obtidas através de missões específicas (missão da raposa, estátuas de caracol). Reabra a loja para aplicar as alterações." }, { "GodTearCostName", "Custo em Lágrimas Divinas" }, { "GodTearCostDesc", "Lágrimas Divinas por item. O custo pode ser aumentado, mas não diminuído por save." }, { "CostRequiresSave", "Por favor, carregue um save antes de alterar o custo em Lágrimas Divinas." }, { "CostIncreaseConfirm", "Aumentar o custo de {0} para {1} Lágrimas Divinas por item para o slot {2}?\n\nIsso não pode ser revertido." }, { "CostSetConfirm", "Definir o custo em {0} Lágrimas Divinas por item para o slot {1}?\n\nApós isso, o custo só pode ser aumentado, não diminuído." }, { "OverbuyWarning", "Você está comprando mais do que o jogo normalmente permite. Clique novamente para confirmar." }, { "BossBypassWarning", "Esta aparência normalmente é obtida ao derrotar um chefe. Clique novamente para confirmar." }, { "QuestBypassWarning", "Esta aparência normalmente é obtida através de uma missão. Clique novamente para confirmar." } } }, { "Chinese (Simplified)", new Dictionary<string, string> { { "MysticAssistantLabel", "神秘助手" }, { "ShopLabelRelic", "遗物" }, { "ShopLabelSkinApple", "追随者皮肤 (Apple)" }, { "ShopLabelDecoApple", "装饰 (Apple)" }, { "ShopLabelOutfitApple", "服装 (Apple)" }, { "ShopLabelSkinBoss", "追随者皮肤 (Boss)" }, { "DLCNecklacesName", "DLC项链" }, { "DLCNecklacesDesc", "将羊毛港DLC项链添加到商店。通常通过DLC游戏获得。重新打开商店以使更改生效。" }, { "BossSkinsName", "Boss皮肤" }, { "BossSkinsDesc", "将Boss追随者皮肤添加到商店。通常通过击败Boss获得。重新打开商店以使更改生效。" }, { "ShopLabelSkinQuest", "追随者皮肤 (任务)" }, { "QuestSkinsName", "任务皮肤" }, { "QuestSkinsDesc", "将任务锁定的追随者皮肤添加到商店。通常通过特定任务获得(狐狸任务线、蜗牛雕像)。重新打开商店以使更改生效。" }, { "GodTearCostName", "神之泪花费" }, { "GodTearCostDesc", "每件物品需要的神之泪数量。每个存档只能增加花费,不能减少。" }, { "CostRequiresSave", "请先加载存档再更改神之泪花费。" }, { "CostIncreaseConfirm", "将存档位{2}的每件物品花费从{0}增加到{1}神之泪?\n\n此操作无法撤销。" }, { "CostSetConfirm", "将存档位{1}的每件物品花费设置为{0}神之泪?\n\n设置后只能增加花费,不能减少。" }, { "OverbuyWarning", "您购买的数量超过了游戏通常允许的上限。再次点击确认。" }, { "BossBypassWarning", "此皮肤通常通过击败Boss获得。再次点击确认。" }, { "QuestBypassWarning", "此皮肤通常通过任务获得。再次点击确认。" } } }, { "Chinese (Traditional)", new Dictionary<string, string> { { "MysticAssistantLabel", "神秘助手" }, { "ShopLabelRelic", "遺物" }, { "ShopLabelSkinApple", "追隨者皮膚 (Apple)" }, { "ShopLabelDecoApple", "裝飾 (Apple)" }, { "ShopLabelOutfitApple", "服裝 (Apple)" }, { "ShopLabelSkinBoss", "追隨者皮膚 (Boss)" }, { "DLCNecklacesName", "DLC項鏈" }, { "DLCNecklacesDesc", "將羊毛港DLC項鏈新增至商店。通常透過DLC遊戲獲得。重新開啟商店以使變更生效。" }, { "BossSkinsName", "Boss皮膚" }, { "BossSkinsDesc", "將Boss追隨者皮膚新增至商店。通常透過擊敗Boss獲得。重新開啟商店以使變更生效。" }, { "ShopLabelSkinQuest", "追隨者皮膚 (任務)" }, { "QuestSkinsName", "任務皮膚" }, { "QuestSkinsDesc", "將任務鎖定的追隨者皮膚新增至商店。通常透過特定任務獲得(狐狸任務線、蝸牛雕像)。重新開啟商店以使變更生效。" }, { "GodTearCostName", "神之淚花費" }, { "GodTearCostDesc", "每件物品需要的神之淚數量。每個存檔只能增加花費,不能減少。" }, { "CostRequiresSave", "請先載入存檔再更改神之淚花費。" }, { "CostIncreaseConfirm", "將存檔位{2}的每件物品花費從{0}增加到{1}神之淚?\n\n此操作無法撤銷。" }, { "CostSetConfirm", "將存檔位{1}的每件物品花費設置為{0}神之淚?\n\n設置後只能增加花費,不能減少。" }, { "OverbuyWarning", "您購買的數量超過了遊戲通常允許的上限。再次點擊確認。" }, { "BossBypassWarning", "此皮膚通常透過擊敗Boss獲得。再次點擊確認。" }, { "QuestBypassWarning", "此皮膚通常透過任務獲得。再次點擊確認。" } } }, { "Korean", new Dictionary<string, string> { { "MysticAssistantLabel", "미스틱 어시스턴트" }, { "ShopLabelRelic", "유물" }, { "ShopLabelSkinApple", "추종자 스킨 (Apple)" }, { "ShopLabelDecoApple", "장식 (Apple)" }, { "ShopLabelOutfitApple", "의상 (Apple)" }, { "ShopLabelSkinBoss", "추종자 스킨 (보스)" }, { "DLCNecklacesName", "DLC 목걸이" }, { "DLCNecklacesDesc", "울헤이븐 DLC 목걸이를 상점에 추가합니다. 보통 DLC 게임플레이에서 획득합니다. 변경 사항을 적용하려면 상점을 다시 여세요." }, { "BossSkinsName", "보스 스킨" }, { "BossSkinsDesc", "보스 추종자 스킨을 상점에 추가합니다. 보통 보스를 처치하면 획득합니다. 변경 사항을 적용하려면 상점을 다시 여세요." }, { "ShopLabelSkinQuest", "추종자 스킨 (퀘스트)" }, { "QuestSkinsName", "퀘스트 스킨" }, { "QuestSkinsDesc", "퀘스트 잠금 추종자 스킨을 상점에 추가합니다. 보통 특정 퀘스트에서 획득합니다 (여우 퀘스트, 달팽이 조각상). 변경 사항을 적용하려면 상점을 다시 여세요." }, { "GodTearCostName", "신의 눈물 비용" }, { "GodTearCostDesc", "아이템당 신의 눈물 수. 세이브별로 비용을 올릴 수 있지만 내릴 수 없습니다." }, { "CostRequiresSave", "신의 눈물 비용을 변경하려면 먼저 세이브를 로드해 주세요." }, { "CostIncreaseConfirm", "슬롯 {2}의 아이템당 비용을 {0}에서 {1} 신의 눈물로 올리시겠습니까?\n\n이 작업은 되돌릴 수 없습니다." }, { "CostSetConfirm", "슬롯 {1}의 아이템당 비용을 {0} 신의 눈물로 설정하시겠습니까?\n\n설정 후에는 비용을 올릴 수만 있고 내릴 수 없습니다." }, { "OverbuyWarning", "게임에서 일반적으로 허용하는 것보다 많이 구매하고 있습니다. 다시 클릭하여 확인하세요." }, { "BossBypassWarning", "이 스킨은 보통 보스를 처치하면 획득합니다. 다시 클릭하여 확인하세요." }, { "QuestBypassWarning", "이 스킨은 보통 퀘스트를 통해 획득합니다. 다시 클릭하여 확인하세요." } } }, { "Italian", new Dictionary<string, string> { { "MysticAssistantLabel", "Assistente mistico" }, { "ShopLabelRelic", "Reliquia" }, { "ShopLabelSkinApple", "Aspetto seguace (Apple)" }, { "ShopLabelDecoApple", "Decorazione (Apple)" }, { "ShopLabelOutfitApple", "Vestito (Apple)" }, { "ShopLabelSkinBoss", "Aspetto seguace (Boss)" }, { "DLCNecklacesName", "Collane DLC" }, { "DLCNecklacesDesc", "Aggiunge le collane del DLC Woolhaven al negozio. Normalmente ottenute nel gameplay del DLC. Riapri il negozio per applicare le modifiche." }, { "BossSkinsName", "Skin dei boss" }, { "BossSkinsDesc", "Aggiunge le skin dei boss seguaci al negozio. Normalmente ottenute sconfiggendo i boss. Riapri il negozio per applicare le modifiche." }, { "ShopLabelSkinQuest", "Aspetto seguace (Missione)" }, { "QuestSkinsName", "Skin delle missioni" }, { "QuestSkinsDesc", "Aggiunge le skin delle missioni seguaci al negozio. Normalmente ottenute tramite missioni specifiche (missione della volpe, statue di lumaca). Riapri il negozio per applicare le modifiche." }, { "GodTearCostName", "Costo Lacrime Divine" }, { "GodTearCostDesc", "Lacrime Divine per oggetto. Il costo può essere aumentato ma non diminuito per salvataggio." }, { "CostRequiresSave", "Carica un salvataggio prima di modificare il costo delle Lacrime Divine." }, { "CostIncreaseConfirm", "Aumentare il costo da {0} a {1} Lacrime Divine per oggetto per lo slot {2}?\n\nQuesta azione non può essere annullata." }, { "CostSetConfirm", "Impostare il costo a {0} Lacrime Divine per oggetto per lo slot {1}?\n\nDopo questa operazione il costo può solo essere aumentato, non diminuito." }, { "OverbuyWarning", "Stai acquistando più di quanto il gioco normalmente consente. Clicca di nuovo per confermare." }, { "BossBypassWarning", "Questo aspetto si ottiene normalmente sconfiggendo un boss. Clicca di nuovo per confermare." }, { "QuestBypassWarning", "Questo aspetto si ottiene normalmente tramite una missione. Clicca di nuovo per confermare." } } }, { "Dutch", new Dictionary<string, string> { { "MysticAssistantLabel", "Mystieke assistent" }, { "ShopLabelRelic", "Relikwie" }, { "ShopLabelSkinApple", "Volgelingskin (Apple)" }, { "ShopLabelDecoApple", "Decoratie (Apple)" }, { "ShopLabelOutfitApple", "Outfit (Apple)" }, { "ShopLabelSkinBoss", "Volgelingskin (Baas)" }, { "DLCNecklacesName", "DLC-kettingen" }, { "DLCNecklacesDesc", "Voeg Woolhaven DLC-kettingen toe aan de winkel. Normaal verkregen via DLC-gameplay. Heropen de winkel om wijzigingen toe te passen." }, { "BossSkinsName", "Baas-skins" }, { "BossSkinsDesc", "Voeg baas-volgelingskins toe aan de winkel. Normaal verkregen door bazen te verslaan. Heropen de winkel om wijzigingen toe te passen." }, { "ShopLabelSkinQuest", "Volgelingskin (Opdracht)" }, { "QuestSkinsName", "Opdracht-skins" }, { "QuestSkinsDesc", "Voeg opdracht-gebonden volgelingskins toe aan de winkel. Normaal verkregen via specifieke opdrachten (vossenmissie, slakkenbeelden). Heropen de winkel om wijzigingen toe te passen." }, { "GodTearCostName", "Godstraan-kosten" }, { "GodTearCostDesc", "Godstranen per item. Kosten kunnen per opslag verhoogd maar niet verlaagd worden." }, { "CostRequiresSave", "Laad een opslag voordat u de Godstraan-kosten wijzigt." }, { "CostIncreaseConfirm", "Kosten verhogen van {0} naar {1} Godstranen per item voor opslagslot {2}?\n\nDit kan niet ongedaan worden gemaakt." }, { "CostSetConfirm", "Kosten instellen op {0} Godstranen per item voor opslagslot {1}?\n\nNa instelling kunnen de kosten alleen verhoogd, niet verlaagd worden." }, { "OverbuyWarning", "Je koopt meer dan het spel normaal toestaat. Klik nogmaals om te bevestigen." }, { "BossBypassWarning", "Deze skin wordt normaal verdiend door een baas te verslaan. Klik nogmaals om te bevestigen." }, { "QuestBypassWarning", "Deze skin wordt normaal via een opdracht verdiend. Klik nogmaals om te bevestigen." } } }, { "Turkish", new Dictionary<string, string> { { "MysticAssistantLabel", "Mistik Asistan" }, { "ShopLabelRelic", "Kalıntı" }, { "ShopLabelSkinApple", "Takipçi Görünümü (Apple)" }, { "ShopLabelDecoApple", "Dekorasyon (Apple)" }, { "ShopLabelOutfitApple", "Kıyafet (Apple)" }, { "ShopLabelSkinBoss", "Takipçi Görünümü (Patron)" }, { "DLCNecklacesName", "DLC Kolyeler" }, { "DLCNecklacesDesc", "Woolhaven DLC kolyelerini dükkâna ekler. Normalde DLC oynanışıyla elde edilir. Değişikliklerin geçerli olması için dükkânı yeniden açın." }, { "BossSkinsName", "Patron Görünümleri" }, { "BossSkinsDesc", "Patron takipçi görünümlerini dükkâna ekler. Normalde patronları yenerek elde edilir. Değişikliklerin geçerli olması için dükkânı yeniden açın." }, { "ShopLabelSkinQuest", "Takipçi Görünümü (Görev)" }, { "QuestSkinsName", "Görev Görünümleri" }, { "QuestSkinsDesc", "Görev kilitli takipçi görünümlerini dükkâna ekler. Normalde belirli görevlerle elde edilir (tilki görevi, salyangoz heykelleri). Değişikliklerin geçerli olması için dükkânı yeniden açın." }, { "GodTearCostName", "Tanrı Gözyaşı Maliyeti" }, { "GodTearCostDesc", "Eşya başına Tanrı Gözyaşı. Maliyet kayıt başına artırılabilir ama azaltılamaz." }, { "CostRequiresSave", "Tanrı Gözyaşı maliyetini değiştirmeden önce lütfen bir kayıt yükleyin." }, { "CostIncreaseConfirm", "Kayıt yuvası {2} için eşya başına maliyeti {0}'den {1} Tanrı Gözyaşı'na yükseltilsin mi?\n\nBu işlem geri alınamaz." }, { "CostSetConfirm", "Kayıt yuvası {1} için eşya başına maliyet {0} Tanrı Gözyaşı olarak ayarlansın mı?\n\nBundan sonra maliyet yalnızca artırılabilir, azaltılamaz." }, { "OverbuyWarning", "Oyunun normalde izin verdiğinden fazla satın alıyorsunuz. Onaylamak için tekrar tıklayın." }, { "BossBypassWarning", "Bu görünüm normalde bir patronu yenerek kazanılır. Onaylamak için tekrar tıklayın." }, { "QuestBypassWarning", "Bu görünüm normalde bir görevle kazanılır. Onaylamak için tekrar tıklayın." } } }, { "French (Canadian)", new Dictionary<string, string> { { "MysticAssistantLabel", "Assistant mystique" }, { "ShopLabelRelic", "Relique" }, { "ShopLabelSkinApple", "Apparence de suiveur (Apple)" }, { "ShopLabelDecoApple", "Décoration (Apple)" }, { "ShopLabelOutfitApple", "Tenue (Apple)" }, { "ShopLabelSkinBoss", "Apparence de suiveur (Boss)" }, { "DLCNecklacesName", "Colliers DLC" }, { "DLCNecklacesDesc", "Ajouter les colliers du DLC Woolhaven à la boutique. Normalement obtenus via le gameplay du DLC. Rouvrez la boutique pour appliquer les changements." }, { "BossSkinsName", "Skins de boss" }, { "BossSkinsDesc", "Ajouter les skins de boss au shop. Normalement obtenus en battant les boss. Rouvrez la boutique pour appliquer les changements." }, { "ShopLabelSkinQuest", "Apparence de suiveur (Quête)" }, { "QuestSkinsName", "Skins de quête" }, { "QuestSkinsDesc", "Ajouter les skins de quête au shop. Normalement obtenus via des quêtes spécifiques (quête du renard, statues d'escargot). Rouvrez la boutique pour appliquer les changements." }, { "GodTearCostName", "Coût en Larmes Divines" }, { "GodTearCostDesc", "Larmes Divines par objet. Le coût peut être augmenté mais pas diminué par sauvegarde." }, { "CostRequiresSave", "Veuillez charger une sauvegarde avant de modifier le coût en Larmes Divines." }, { "CostIncreaseConfirm", "Augmenter le coût de {0} à {1} Larmes Divines par objet pour le slot {2} ?\n\nCette action est irréversible." }, { "CostSetConfirm", "Définir le coût à {0} Larmes Divines par objet pour le slot {1} ?\n\nLe coût ne pourra qu'être augmenté après cela, pas diminué." }, { "OverbuyWarning", "Vous achetez plus que ce que le jeu permet normalement. Cliquez à nouveau pour confirmer." }, { "BossBypassWarning", "Cette apparence s'obtient normalement en battant un boss. Cliquez à nouveau pour confirmer." }, { "QuestBypassWarning", "Cette apparence s'obtient normalement via une quête. Cliquez à nouveau pour confirmer." } } }, { "Arabic", new Dictionary<string, string> { { "MysticAssistantLabel", "المساعد الغامض" }, { "ShopLabelRelic", "أثر" }, { "ShopLabelSkinApple", "مظهر التابع (Apple)" }, { "ShopLabelDecoApple", "زينة (Apple)" }, { "ShopLabelOutfitApple", "زي (Apple)" }, { "ShopLabelSkinBoss", "مظهر التابع (زعيم)" }, { "DLCNecklacesName", "قلادات المحتوى الإضافي" }, { "DLCNecklacesDesc", "إضافة قلادات محتوى وولهيفن الإضافي إلى المتجر. عادة\u064b يتم الحصول عليها من خلال لعب المحتوى الإضافي. أعد فتح المتجر لتطبيق التغييرات." }, { "BossSkinsName", "مظاهر الزعماء" }, { "BossSkinsDesc", "إضافة مظاهر أتباع الزعماء إلى المتجر. عادة\u064b يتم الحصول عليها بهزيمة الزعماء. أعد فتح المتجر لتطبيق التغييرات." }, { "ShopLabelSkinQuest", "مظهر التابع (مهمة)" }, { "QuestSkinsName", "مظاهر المهام" }, { "QuestSkinsDesc", "إضافة مظاهر أتباع المهام إلى المتجر. عادة\u064b يتم الحصول عليها من خلال مهام محددة (مهمة الثعلب، تماثيل الحلزون). أعد فتح المتجر لتطبيق التغييرات." }, { "GodTearCostName", "تكلفة دموع الإله" }, { "GodTearCostDesc", "دموع الإله لكل عنصر. يمكن زيادة التكلفة لكن لا يمكن تقليلها لكل حفظ." }, { "CostRequiresSave", "يرجى تحميل حفظ قبل تغيير تكلفة دموع الإله." }, { "CostIncreaseConfirm", "زيادة التكلفة من {0} إلى {1} دموع الإله لكل عنصر لفتحة الحفظ {2}؟\n\nلا يمكن التراجع عن هذا الإجراء." }, { "CostSetConfirm", "تعيين التكلفة إلى {0} دموع الإله لكل عنصر لفتحة الحفظ {1}؟\n\nبعد ذلك يمكن فقط زيادة التكلفة وليس تقليلها." }, { "OverbuyWarning", "أنت تشتري أكثر مما يسمح به اللعبة عادة\u064b. انقر مرة أخرى للتأكيد." }, { "BossBypassWarning", "عادة\u064b يتم الحصول على هذا المظهر بهزيمة زعيم. انقر مرة أخرى للتأكيد." }, { "QuestBypassWarning", "عادة\u064b يتم الحصول على هذا المظهر من خلال مهمة. انقر مرة أخرى للتأكيد." } } } }; internal static string MysticAssistantLabel => Get("MysticAssistantLabel"); internal static string ShopLabelRelic => Get("ShopLabelRelic"); internal static string ShopLabelSkinApple => Get("ShopLabelSkinApple"); internal static string ShopLabelDecoApple => Get("ShopLabelDecoApple"); internal static string ShopLabelOutfitApple => Get("ShopLabelOutfitApple"); internal static string ShopLabelSkinBoss => Get("ShopLabelSkinBoss"); internal static string ShopLabelSkinQuest => Get("ShopLabelSkinQuest"); internal static string DLCNecklacesName => Get("DLCNecklacesName"); internal static string BossSkinsName => Get("BossSkinsName"); internal static string QuestSkinsName => Get("QuestSkinsName"); internal static string GodTearCostName => Get("GodTearCostName"); internal static string DLCNecklacesDesc => Get("DLCNecklacesDesc"); internal static string BossSkinsDesc => Get("BossSkinsDesc"); internal static string QuestSkinsDesc => Get("QuestSkinsDesc"); internal static string GodTearCostDesc => Get("GodTearCostDesc"); internal static string OverbuyWarning => Get("OverbuyWarning"); internal static string BossBypassWarning => Get("BossBypassWarning"); internal static string QuestBypassWarning => Get("QuestBypassWarning"); internal static string CostRequiresSave => Get("CostRequiresSave"); internal static string CostIncreaseConfirm(int from, int to, int slot) { return string.Format(Get("CostIncreaseConfirm"), from, to, slot); } internal static string CostSetConfirm(int cost, int slot) { return string.Format(Get("CostSetConfirm"), cost, slot); } private static string Get(string key) { string key2 = LocalizationManager.CurrentLanguage ?? "English"; if (Strings.TryGetValue(key2, out var value) && value.TryGetValue(key, out var value2)) { return value2; } if (!Strings["English"].TryGetValue(key, out var value3)) { return key; } return value3; } } [BepInDependency("com.bepis.bepinex.configurationmanager", "18.4.1")] [BepInPlugin("p1xel8ted.cotl.mysticassistant", "Mystic Assistant Redux", "0.1.3")] public class Plugin : BaseUnityPlugin { private const string PluginGuid = "p1xel8ted.cotl.mysticassistant"; private const string PluginName = "Mystic Assistant Redux"; private const string PluginVer = "0.1.3"; internal const string ShopContextKey = "mystic_assistant_shop"; private static PopupManager _popupManager; private static bool _changingCost; internal static ManualLogSource Log { get; private set; } internal static ConfigEntry<bool> EnableDlcNecklaces { get; private set; } internal static ConfigEntry<bool> EnableBossSkins { get; private set; } internal static ConfigEntry<bool> EnableQuestSkins { get; private set; } internal static ConfigEntry<int> GodTearCost { get; private set; } internal static InventoryManager CurrentInventoryManager { get; set; } internal static List<Action> PostShopActions { get; } = new List<Action>(); internal static List<TYPES> UnlockedDecorations { get; } = new List<TYPES>(); internal static List<Card> UnlockedTarotCards { get; } = new List<Card>(); internal static List<RelicType> UnlockedRelics { get; } = new List<RelicType>(); internal static List<FollowerClothingType> UnlockedClothing { get; } = new List<FollowerClothingType>(); internal static List<int> UnlockedFleeces { get; } = new List<int>(); internal static string WarningMessage { get; set; } private void Awake() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Expected O, but got Unknown //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; GameObject val = new GameObject("Mystic Assistant Redux_PopupManager"); Object.DontDestroyOnLoad((Object)val); _popupManager = val.AddComponent<PopupManager>(); _popupManager.Title = "Mystic Assistant Redux"; EnableDlcNecklaces = ((BaseUnityPlugin)this).Config.Bind<bool>("01. Extra Content", "EnableDLCNecklaces", false, new ConfigDescription(Localization.DLCNecklacesDesc, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { DispName = Localization.DLCNecklacesName, Order = 2 } })); EnableBossSkins = ((BaseUnityPlugin)this).Config.Bind<bool>("01. Extra Content", "EnableBossSkins", false, new ConfigDescription(Localization.BossSkinsDesc, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { DispName = Localization.BossSkinsName, Order = 2 } })); EnableQuestSkins = ((BaseUnityPlugin)this).Config.Bind<bool>("01. Extra Content", "EnableQuestSkins", false, new ConfigDescription(Localization.QuestSkinsDesc, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { DispName = Localization.QuestSkinsName, Order = 1 } })); GodTearCost = ((BaseUnityPlugin)this).Config.Bind<int>("02. Shop", "GodTearCost", 1, new ConfigDescription(Localization.GodTearCostDesc, (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), new object[1] { new ConfigurationManagerAttributes { DispName = Localization.GodTearCostName, Order = 2 } })); GodTearCost.SettingChanged += OnGodTearCostChanged; Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "p1xel8ted.cotl.mysticassistant"); Log.LogInfo((object)"Mystic Assistant Redux v0.1.3 loaded."); } private static void OnGodTearCostChanged(object sender, EventArgs e) { if (_changingCost) { return; } _changingCost = true; try { int newVal = GodTearCost.Value; if (!SaveAndLoad.Loaded) { GodTearCost.Value = 1; _popupManager.ShowPopupDlg("Mystic Assistant Redux", Localization.CostRequiresSave, showCloseAndDontShowAgain: false); return; } string key = GetCostKey(SaveAndLoad.SAVE_SLOT); int num = (PlayerPrefs.HasKey(key) ? PlayerPrefs.GetInt(key) : 0); if (newVal <= num) { GodTearCost.Value = num; } else { if (newVal <= 1 && num == 0) { return; } int value = ((num <= 0) ? 1 : num); GodTearCost.Value = value; string message = ((num > 0) ? Localization.CostIncreaseConfirm(num, newVal, SaveAndLoad.SAVE_SLOT) : Localization.CostSetConfirm(newVal, SaveAndLoad.SAVE_SLOT)); _popupManager.ShowConfirmation("Mystic Assistant Redux", message, delegate { _changingCost = true; try { PlayerPrefs.SetInt(key, newVal); PlayerPrefs.Save(); GodTearCost.Value = newVal; Log.LogInfo((object)$"[MysticShop] Cost set to {newVal} for slot {SaveAndLoad.SAVE_SLOT}"); } finally { _changingCost = false; } }); } } finally { _changingCost = false; } } internal static int GetEffectiveCost() { string costKey = GetCostKey(SaveAndLoad.SAVE_SLOT); if (!PlayerPrefs.HasKey(costKey)) { return GodTearCost.Value; } return Math.Max(GodTearCost.Value, PlayerPrefs.GetInt(costKey)); } internal static string GetCostKey(int saveSlot) { return $"MysticAssistant_Cost_{saveSlot}"; } internal static void ClearCostForSlot(int saveSlot) { string costKey = GetCostKey(saveSlot); if (PlayerPrefs.HasKey(costKey)) { PlayerPrefs.DeleteKey(costKey); PlayerPrefs.Save(); Log.LogInfo((object)$"[MysticShop] Cleared locked cost for save slot {saveSlot}"); } } internal static TraderTrackerItems GetTraderTrackerItemFromItemType(ITEM_TYPE specifiedType) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return ((IEnumerable<TraderTrackerItems>)InventoryInfo.GetShopItemTypeList()).FirstOrDefault((Func<TraderTrackerItems, bool>)((TraderTrackerItems shopItem) => shopItem.itemForTrade == specifiedType)); } internal static void ResetShopState() { PostShopActions.Clear(); UnlockedDecorations.Clear(); UnlockedTarotCards.Clear(); UnlockedRelics.Clear(); UnlockedClothing.Clear(); UnlockedFleeces.Clear(); } } } namespace MysticAssistantRedux.Patches { [HarmonyPatch] public static class MysticShopPatches { [CompilerGenerated] private sealed class <ClearAlertSuppression>d__56 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ClearAlertSuppression>d__56(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; _suppressAlertRemoval = 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 <ClearShopKeeperBarkAndReopen>d__12 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public SimpleBark boughtBark; public Interaction_MysticShop instance; public StateMachine state; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ClearShopKeeperBarkAndReopen>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; ((Component)boughtBark).gameObject.SetActive(false); boughtBark.Close(); <>2__current = (object)new WaitForSecondsRealtime(0.5f); <>1__state = 1; return true; case 1: <>1__state = -1; ((Interaction)instance).OnSecondaryInteract(state); 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 <RunPostShopActionsCoroutine>d__13 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Interaction_MysticShop instance; public StateMachine state; private List<Action>.Enumerator <>7__wrap1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RunPostShopActionsCoroutine>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 2) <= 1u) { try { } finally { <>m__Finally1(); } } <>7__wrap1 = default(List<Action>.Enumerator); <>1__state = -2; } private bool MoveNext() { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; SetMysticShopInteractable(instance, active: false); goto IL_0059; case 1: <>1__state = -1; goto IL_0059; case 2: <>1__state = -3; goto IL_00af; case 3: <>1__state = -3; goto IL_00e2; case 4: { <>1__state = -1; SetMysticShopInteractable(instance, active: true); Plugin.Log.LogInfo((object)"[MysticShop] Post-shop actions complete, returning control to player"); foreach (PlayerFarming player in PlayerFarming.players) { if (player.GoToAndStopping) { player.AbortGoTo(true); } } PlayerFarming.SetStateForAllPlayers((State)((LetterBox.IsPlaying || MMConversation.isPlaying) ? 13 : 0), false, (PlayerFarming)null); state.CURRENT_STATE = (State)0; return false; } IL_00e2: if (<>7__wrap1.MoveNext()) { <>7__wrap1.Current(); goto IL_00af; } <>m__Finally1(); <>7__wrap1 = default(List<Action>.Enumerator); <>2__current = (object)new WaitForSecondsRealtime(0.5f); <>1__state = 4; return true; IL_00af: if (UIMenuBase.ActiveMenus.Count > 0) { <>2__current = null; <>1__state = 2; return true; } <>2__current = (object)new WaitForSecondsRealtime(0.25f); <>1__state = 3; return true; IL_0059: if (UIMenuBase.ActiveMenus.Count > 0) { <>2__current = null; <>1__state = 1; return true; } <>7__wrap1 = Plugin.PostShopActions.GetEnumerator(); <>1__state = -3; goto IL_00e2; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>7__wrap1).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static bool _appleFleeceButtonAdded; private static bool _appleSkinsValidated; private static readonly HashSet<string> ValidatedAppleSkins = new HashSet<string>(); private static Sprite _fleece680Sprite; private static ClothingData[] _lastInjectedClothingArray; private static readonly HashSet<TYPES> _appleDecoTypes = new HashSet<TYPES>(ExclusiveContent.AppleDecorations); private static readonly Dictionary<TYPES, GameObject> _ghostCache = new Dictionary<TYPES, GameObject>(); private static readonly HashSet<string> _bossSkinAlertsBeforeReplace = new HashSet<string>(); private static bool _suppressAlertRemoval; [HarmonyPostfix] [HarmonyPatch(typeof(Interaction_MysticShop), "Start")] public static void Start_Postfix(Interaction_MysticShop __instance) { ((Interaction)__instance).HasSecondaryInteraction = true; ((Interaction)__instance).SecondaryLabel = Localization.MysticAssistantLabel; } [HarmonyPrefix] [HarmonyPatch(typeof(Interaction), "OnSecondaryInteract")] public static void OnSecondaryInteract_Prefix(Interaction __instance, StateMachine state) { Interaction_MysticShop val = (Interaction_MysticShop)(object)((__instance is Interaction_MysticShop) ? __instance : null); if (val != null) { SimpleBark boughtBark = val.boughtBark; if ((Object)(object)boughtBark != (Object)null && boughtBark.IsSpeaking) { ((MonoBehaviour)val).StartCoroutine(ClearShopKeeperBarkAndReopen(val, boughtBark, state)); } else { OpenAssistantShop(val, state); } } } private static void OpenAssistantShop(Interaction_MysticShop instance, StateMachine state) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) Plugin.Log.LogInfo((object)"[MysticShop] Opening assistant shop"); Plugin.CurrentInventoryManager = new InventoryManager(instance); Plugin.ResetShopState(); HUD_Manager.Instance.Hide(false, 0, false); PlayerFarming playerFarming = ((Component)state).GetComponent<PlayerFarming>(); PlayerFarming.SetStateForAllPlayers((State)13, false, (PlayerFarming)null); playerFarming.GoToAndStop(((Component)playerFarming).transform.position, playerFarming.LookToObject, false, false, (Action)null, 20f, true, (Action)null, true, true, true, true, (Vector3?)null); UIItemSelectorOverlayController shopItemSelector = MonoSingleton<UIManager>.Instance.ShowItemSelector(playerFarming, Plugin.CurrentInventoryManager.GetShopInventory(), new Params { Key = "mystic_assistant_shop", Context = (Context)2, Offset = new Vector2(0f, 150f), ShowEmpty = true, RequiresDiscovery = false, HideQuantity = false, ShowCoins = false, AllowInputOnlyFromPlayer = playerFarming, DontCache = true }); if (((Interaction)instance).InputOnlyFromInteractingPlayer) { MonoSingleton<UINavigatorNew>.Instance.AllowInputOnlyFromPlayer = playerFarming; } shopItemSelector.CostProvider = Plugin.GetTraderTrackerItemFromItemType; shopItemSelector.OnItemChosen = (Action<ITEM_TYPE>)Delegate.Combine(shopItemSelector.OnItemChosen, (Action<ITEM_TYPE>)delegate(ITEM_TYPE chosenItemType) { //IL_0000: 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) TraderTrackerItems traderTrackerItemFromItemType = Plugin.GetTraderTrackerItemFromItemType(chosenItemType); GivePlayerBoughtItem(instance, shopItemSelector, playerFarming, traderTrackerItemFromItemType, chosenItemType); }); ((UIMenuBase)shopItemSelector).OnCancel = (Action)Delegate.Combine(((UIMenuBase)shopItemSelector).OnCancel, (Action)delegate { HUD_Manager.Instance.Show(0, false); }); UIItemSelectorOverlayController obj = shopItemSelector; ((UIMenuBase)obj).OnHidden = (Action)Delegate.Combine(((UIMenuBase)obj).OnHidden, (Action)delegate { Plugin.Log.LogInfo((object)$"[MysticShop] Shop closed, {Plugin.PostShopActions.Count} post-shop actions queued"); PlayerFarming.SetStateForAllPlayers((State)13, false, (PlayerFarming)null); SetMysticShopInteractable(instance, active: false); ((MonoBehaviour)instance).StartCoroutine(RunPostShopActionsCoroutine(instance, state)); }); } private static void GivePlayerBoughtItem(Interaction_MysticShop instance, UIItemSelectorOverlayController shopItemSelector, PlayerFarming playerFarming, TraderTrackerItems boughtItem, ITEM_TYPE boughtItemType) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Invalid comparison between Unknown and I4 //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Invalid comparison between Unknown and I4 //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Invalid comparison between Unknown and I4 //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Invalid comparison between Unknown and I4 //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Invalid comparison between Unknown and I4 //IL_0695: Unknown result type (might be due to invalid IL or missing references) //IL_069a: Unknown result type (might be due to invalid IL or missing references) //IL_06a1: Unknown result type (might be due to invalid IL or missing references) //IL_06a8: Unknown result type (might be due to invalid IL or missing references) //IL_06af: Unknown result type (might be due to invalid IL or missing references) //IL_06c5: Unknown result type (might be due to invalid IL or missing references) //IL_06d1: Unknown result type (might be due to invalid IL or missing references) //IL_06df: Unknown result type (might be due to invalid IL or missing references) //IL_06f1: 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_00d8: Invalid comparison between Unknown and I4 //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Invalid comparison between Unknown and I4 //IL_05ea: Unknown result type (might be due to invalid IL or missing references) //IL_05ef: Unknown result type (might be due to invalid IL or missing references) //IL_05f1: Unknown result type (might be due to invalid IL or missing references) //IL_05f8: Unknown result type (might be due to invalid IL or missing references) //IL_0604: Unknown result type (might be due to invalid IL or missing references) //IL_0610: Unknown result type (might be due to invalid IL or missing references) //IL_061e: Unknown result type (might be due to invalid IL or missing references) //IL_0630: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Invalid comparison between Unknown and I4 //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected I4, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Invalid comparison between Unknown and I4 //IL_096f: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Unknown result type (might be due to invalid IL or missing references) //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_037f: Unknown result type (might be due to invalid IL or missing references) //IL_038b: Unknown result type (might be due to invalid IL or missing references) //IL_0398: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected I4, but got Unknown //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected I4, but got Unknown //IL_0150: 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_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 //IL_056a: Unknown result type (might be due to invalid IL or missing references) //IL_0578: 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_0096: Invalid comparison between Unknown and I4 //IL_040f: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0427: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Invalid comparison between Unknown and I4 //IL_0770: Unknown result type (might be due to invalid IL or missing references) //IL_077e: Unknown result type (might be due to invalid IL or missing references) //IL_080a: Unknown result type (might be due to invalid IL or missing references) //IL_0818: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected I4, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_04b3: 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_04cb: Unknown result type (might be due to invalid IL or missing references) //IL_04d9: Unknown result type (might be due to invalid IL or missing references) //IL_04eb: Unknown result type (might be due to invalid IL or missing references) //IL_08c6: Unknown result type (might be due to invalid IL or missing references) //IL_08d4: Unknown result type (might be due to invalid IL or missing references) //IL_0935: Unknown result type (might be due to invalid IL or missing references) //IL_093e: Expected I4, but got Unknown //IL_0948: Unknown result type (might be due to invalid IL or missing references) Inventory.ChangeItemQuantity(119, -boughtItem.SellPriceActual, 0); DataManager instance2 = DataManager.Instance; instance2.MysticRewardCount++; int itemListCountByItemType = Plugin.CurrentInventoryManager.GetItemListCountByItemType(boughtItemType); Plugin.Log.LogInfo((object)$"[MysticShop] Player purchased: {boughtItemType} (cost: {boughtItem.SellPriceActual} God Tear)"); if ((int)boughtItemType <= 52) { if ((int)boughtItemType <= 27) { if ((int)boughtItemType != 20) { if ((int)boughtItemType != 26) { if ((int)boughtItemType != 27) { goto IL_0935; } int index = Random.Range(0, itemListCountByItemType); RelicType relicByIndex = Plugin.CurrentInventoryManager.GetRelicByIndex(index); DataManager.UnlockRelic(relicByIndex); Plugin.UnlockedRelics.Add(relicByIndex); Plugin.CurrentInventoryManager.RemoveItemFromListByTypeAndIndex(boughtItemType, index); Plugin.CurrentInventoryManager.ChangeShopStockByQuantity(boughtItemType, -1); Plugin.Log.LogInfo((object)$"[MysticShop] Unlocked relic: {relicByIndex}"); if (!Plugin.CurrentInventoryManager.BoughtRelic) { Plugin.PostShopActions.Add(ShowUnlockedRelics); Plugin.CurrentInventoryManager.SetBoughtRelicFlag(value: true); } } else { int index2 = Random.Range(0, itemListCountByItemType); Card tarotCardByIndex = Plugin.CurrentInventoryManager.GetTarotCardByIndex(index2); Plugin.UnlockedTarotCards.Add(tarotCardByIndex); Plugin.CurrentInventoryManager.RemoveItemFromListByTypeAndIndex(boughtItemType, index2); Plugin.CurrentInventoryManager.ChangeShopStockByQuantity(boughtItemType, -1); Plugin.Log.LogInfo((object)$"[MysticShop] Unlocked tarot card: {tarotCardByIndex}"); if (!Plugin.CurrentInventoryManager.BoughtTarotCard) { Plugin.PostShopActions.Add(ShowUnlockedTarotCards); Plugin.CurrentInventoryManager.SetBoughtTarotCardFlag(value: true); } } } else { Inventory.ChangeItemQuantity((int)boughtItemType, 100, 0); Plugin.Log.LogInfo((object)"[MysticShop] Gave player 100 Gold"); } } else if ((int)boughtItemType != 40) { if ((int)boughtItemType != 42) { if ((int)boughtItemType != 52) { goto IL_0935; } int index3 = Random.Range(0, itemListCountByItemType); string followerSkinNameByIndex = Plugin.CurrentInventoryManager.GetFollowerSkinNameByIndex(index3); DataManager.SetFollowerSkinUnlocked(followerSkinNameByIndex); RegisterSkinAlert(followerSkinNameByIndex); Plugin.CurrentInventoryManager.RemoveItemFromListByTypeAndIndex(boughtItemType, index3); Plugin.CurrentInventoryManager.ChangeShopStockByQuantity(boughtItemType, -1); Plugin.Log.LogInfo((object)("[MysticShop] Unlocked follower skin: " + followerSkinNameByIndex)); if (!Plugin.CurrentInventoryManager.BoughtFollowerSkin) { Plugin.PostShopActions.Add(ShowUnlockedFollowerSkins); Plugin.CurrentInventoryManager.SetBoug