Decompiled source of ShopsMod v1.0.0

ShopsMod.dll

Decompiled 4 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("ShopsMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0.0")]
[assembly: AssemblyProduct("ShopsMod")]
[assembly: AssemblyTitle("ShopsMod")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ShopsMod;

internal static class ApothecaryShop
{
	[HarmonyPatch(typeof(Mainload), "LoadData")]
	private static class Mainload_LoadData_Patch
	{
		private static void Postfix()
		{
			InstallBuildDefinition();
			EnsureApothecarySaveEntries();
		}
	}

	[HarmonyPatch(typeof(PerBuildCreat), "initShow")]
	private static class PerBuildCreat_InitShow_Patch
	{
		private static bool Prefix(PerBuildCreat __instance)
		{
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null || ((Object)((Component)__instance).gameObject).name != 240.ToString())
			{
				return true;
			}
			Transform val = ((Component)__instance).transform.Find("Show");
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			for (int i = 0; i < val.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)val.GetChild(i)).gameObject);
			}
			GameObject val2 = Resources.Load<GameObject>("AllBuild/" + Mainload.BuildTaoZhuangID_SelectNow + "/Icon/" + 154);
			if ((Object)(object)val2 != (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(val2);
				obj.transform.SetParent(val);
				obj.transform.localScale = new Vector3(0.5f, 0.5f, 1f);
				obj.transform.localPosition = Vector3.zero;
			}
			bool flag = Mainload.FamilyData != null && Mainload.FamilyData.Count > 2 && int.Parse(Mainload.FamilyData[2]) >= int.Parse(Mainload.AllBuilddata[240][4]);
			Button component = ((Component)__instance).GetComponent<Button>();
			if ((Object)(object)component != (Object)null)
			{
				((Selectable)component).interactable = flag;
			}
			Transform val3 = ((Component)__instance).transform.Find("Lock");
			if ((Object)(object)val3 != (Object)null)
			{
				((Component)val3).gameObject.SetActive(!flag);
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildTip), "AddBuildTip")]
	private static class PerBuildTip_AddBuildTip_Patch
	{
		private static bool Prefix(PerBuildTip __instance)
		{
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			if (Mainload.BuildID_Creatselect != 240.ToString())
			{
				return true;
			}
			for (int i = 0; i < ((Component)__instance).transform.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Component)__instance).transform.GetChild(i)).gameObject);
			}
			GameObject val = Resources.Load<GameObject>("AllBuild/" + Mainload.BuildTaoZhuangID_SelectNow + "/BuildTip/" + 154 + "/" + Mainload.BuildDirID_CreatSelect);
			if ((Object)(object)val != (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(val);
				obj.transform.SetParent(((Component)__instance).transform);
				obj.transform.localPosition = Vector3.zero;
				obj.transform.localScale = Vector3.one;
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildScene), "ZhuanBuild")]
	private static class PerBuildScene_ZhuanBuild_Patch
	{
		private static void Prefix(PerBuildScene __instance, ref bool __state)
		{
			__state = false;
			if (!((Object)(object)__instance == (Object)null) && !(__instance.buildClassID != 240.ToString()))
			{
				__state = true;
				__instance.buildClassID = 154.ToString();
			}
		}

		private static void Postfix(PerBuildScene __instance, bool __state)
		{
			if (__state && !((Object)(object)__instance == (Object)null))
			{
				__instance.buildClassID = 240.ToString();
				RestoreLogicalBuildId(__instance);
			}
		}
	}

	[HarmonyPatch(typeof(ShopPanelA), "OnEnableShow")]
	private static class ShopPanelA_OnEnableShow_Patch
	{
		private static void Prefix(ShopPanelA __instance, ref int __state)
		{
			__state = 0;
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			FieldInfo fieldInfo = AccessTools.Field(typeof(ShopPanelA), "BuildClassID");
			if (!(fieldInfo == null))
			{
				object value = fieldInfo.GetValue(__instance);
				if (value is int && (int)value == 240)
				{
					fieldInfo.SetValue(__instance, 154);
					__state = 240;
				}
			}
		}

		private static void Postfix(ShopPanelA __instance, int __state)
		{
			Restore(__instance, __state);
		}

		private static Exception Finalizer(ShopPanelA __instance, int __state, Exception __exception)
		{
			Restore(__instance, __state);
			return __exception;
		}

		private static void Restore(ShopPanelA __instance, int state)
		{
			if (!((Object)(object)__instance == (Object)null) && state == 240)
			{
				FieldInfo fieldInfo = AccessTools.Field(typeof(ShopPanelA), "BuildClassID");
				if (fieldInfo != null)
				{
					fieldInfo.SetValue(__instance, 240);
				}
			}
		}
	}

	[HarmonyPatch(typeof(FormuAct), "ZhaoShopMan")]
	private static class FormuAct_ZhaoShopMan_Patch
	{
		private static bool Prefix(int RenNum, int Bindex, ref string __result)
		{
			if (Bindex < 0 || Mainload.BuildInto_s == null || Bindex >= Mainload.BuildInto_s.Count || Mainload.BuildInto_s[Bindex] == null || Mainload.BuildInto_s[Bindex].Count <= 1 || Mainload.BuildInto_s[Bindex][1] != 240.ToString())
			{
				return true;
			}
			if (RenNum <= 0)
			{
				__result = AllText.Text_UIA[830][Mainload.SetData[4]];
				Mainload.isTimeGoDay = true;
				return false;
			}
			Mainload.BuildInto_s[Bindex][3] = (int.Parse(Mainload.BuildInto_s[Bindex][3]) + RenNum).ToString();
			__result = AllText.Text_UIA[831][Mainload.SetData[4]].Replace("@", RenNum.ToString());
			FormulaData.TaskOrder_AddNum(9, RenNum);
			Mainload.isTimeGoDay = true;
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildScene), "FixBuild")]
	private static class PerBuildScene_FixBuild_Patch
	{
		private static bool Prefix(PerBuildScene __instance, bool isAuto)
		{
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_031f: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null || __instance.buildClassID != 240.ToString() || __instance.BuildBigClass != "S")
			{
				return true;
			}
			int siblingIndex = ((Component)__instance).transform.GetSiblingIndex();
			int num = int.Parse(Mainload.SceneID.Split(new char[1] { '|' })[1]);
			int num2 = FormulaData.FixBuildCost(240);
			if (int.Parse(Mainload.CityData_now[num][0][9]) < num2)
			{
				Mainload.isNoCoinsForFastFixBuild = true;
				Mainload.Tip_Show.Add(new List<string>
				{
					"1",
					AllText.Text_TipShow[11][Mainload.SetData[4]]
				});
				return false;
			}
			Mainload.CityData_now[num][0][9] = (int.Parse(Mainload.CityData_now[num][0][9]) - num2).ToString();
			FormulaData.BuildS_AddData(num, siblingIndex, 0, 0, true, false);
			Mainload.BuildInto_s[siblingIndex][5] = InitBuildData.Build_ToFix(Mainload.BuildInto_s[siblingIndex][5]);
			__instance.buildstateID = int.Parse(Mainload.BuildInto_s[siblingIndex][5]);
			__instance.buildstateID_Last = __instance.buildstateID;
			Mainload.BuildInto_s[siblingIndex][7] = "0";
			FormulaData.BuildS_AddData(num, siblingIndex, 1, 0, false, false);
			for (int i = 0; i < ((Component)__instance).transform.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Component)__instance).transform.GetChild(i)).gameObject);
			}
			string text = Mainload.BuildInto_s[siblingIndex][11];
			string buildShiliID = Mainload.BuildInto_s[siblingIndex][0];
			GameObject val = Resources.Load<GameObject>("AllBuild/" + text + "/Scene/" + 154 + "/" + __instance.buildstateID);
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			GameObject obj = Object.Instantiate<GameObject>(val);
			((Object)obj).name = __instance.buildstateID.ToString();
			PerBuildShow component = obj.GetComponent<PerBuildShow>();
			if ((Object)(object)component != (Object)null)
			{
				component.buildShiliID = buildShiliID;
				component.buildClassID = 240.ToString();
				component.AllbuildClassID = Mainload.AllBuilddata[240][5];
				component.BuildBigClass = __instance.BuildBigClass;
			}
			obj.transform.SetParent(((Component)__instance).transform);
			obj.transform.localScale = Vector3.one;
			obj.transform.localPosition = Vector3.zero;
			GameObject val2 = Resources.Load<GameObject>("SmokeA");
			if ((Object)(object)val2 != (Object)null)
			{
				GameObject obj2 = Object.Instantiate<GameObject>(val2);
				obj2.transform.SetParent(((Component)__instance).transform);
				obj2.transform.localScale = new Vector3(1.8f, 1.8f, 1f);
				obj2.transform.localPosition = new Vector3(0f, 0.8f, 0f);
			}
			if (!isAuto)
			{
				Mainload.Tip_Show.Add(new List<string>
				{
					"0",
					AllText.Text_TipShow[262][Mainload.SetData[4]].Replace("@", num2.ToString())
				});
			}
			return false;
		}
	}

	public const int BuildId = 240;

	public const int VisualBuildId = 154;

	private const int RequiredRenown = 15;

	private static readonly int[] ApothecaryItems = new int[14]
	{
		68, 69, 70, 71, 72, 75, 168, 282, 283, 285,
		163, 164, 165, 167
	};

	private static int BuildCoins => ShopFrequencyConfig.GetApothecaryBuildCoins();

	private static int BuildGold => ShopFrequencyConfig.GetApothecaryBuildGold();

	private static void InstallBuildDefinition()
	{
		if (Mainload.AllBuilddata != null && Mainload.BuildGroupdata != null)
		{
			while (Mainload.AllBuilddata.Count <= 240)
			{
				Mainload.AllBuilddata.Add(null);
			}
			Mainload.AllBuilddata[240] = CreateBuildDefinition();
			AddBuildToGroup(6);
			AddBuildToGroup(8);
			AddBuildText();
		}
	}

	private static void EnsureApothecarySaveEntries()
	{
		if (Mainload.BuildInto_s == null)
		{
			return;
		}
		for (int i = 0; i < Mainload.BuildInto_s.Count; i++)
		{
			List<string> list = Mainload.BuildInto_s[i];
			if (list == null || list.Count <= 1)
			{
				continue;
			}
			string text = list[1];
			int result = 240;
			if (text != result.ToString())
			{
				continue;
			}
			while (list.Count < 12)
			{
				list.Add("0");
			}
			if (!int.TryParse(list[2], out result))
			{
				list[2] = "1";
			}
			if (!int.TryParse(list[3], out result))
			{
				list[3] = "0";
			}
			if (!int.TryParse(list[5], out result))
			{
				list[5] = "0";
			}
			if (string.IsNullOrEmpty(list[6]))
			{
				list[6] = "-1";
			}
			if (!int.TryParse(list[8], out var result2))
			{
				result2 = 0;
			}
			if (result2 <= 0)
			{
				int num = 240;
				int result3 = 1;
				if (Mainload.AllBuilddata != null && num >= 0 && num < Mainload.AllBuilddata.Count && Mainload.AllBuilddata[num] != null && Mainload.AllBuilddata[num].Count > 3)
				{
					string[] array = Mainload.AllBuilddata[num][3].Split(new char[1] { '|' });
					if (array.Length > 1)
					{
						int.TryParse(array[1], out result3);
					}
				}
				if (result3 <= 0)
				{
					result3 = 1;
				}
				result = Mainload.GongZiPerAdd * result3 * 2;
				list[8] = result.ToString();
			}
			if (!int.TryParse(list[9], out result))
			{
				list[9] = "0";
			}
			if (string.IsNullOrEmpty(list[11]))
			{
				list[11] = Mainload.BuildTaoZhuangID_SelectNow;
			}
		}
	}

	private static List<string> CreateBuildDefinition()
	{
		if (Mainload.AllBuilddata.Count > 60 && Mainload.AllBuilddata[60] != null)
		{
			List<string> list = new List<string>(Mainload.AllBuilddata[60]);
			if (list.Count > 1)
			{
				list[1] = BuildCoins + "|" + BuildGold;
			}
			if (list.Count > 3)
			{
				string[] array = list[3].Split(new char[1] { '|' });
				string text = ((array.Length != 0) ? array[0] : "1");
				string text2 = ((array.Length > 1) ? array[1] : "1");
				string text3 = ((array.Length > 3) ? array[3] : "60");
				list[3] = text + "|" + text2 + "|" + BuildItemData() + "|" + text3;
			}
			if (list.Count > 4)
			{
				list[4] = 15.ToString();
			}
			if (list.Count > 5)
			{
				list[5] = "13";
			}
			return list;
		}
		return new List<string>
		{
			"null",
			BuildCoins + "|" + BuildGold,
			"500",
			"1|1|" + BuildItemData() + "|60",
			15.ToString(),
			"13",
			"null",
			"0|0|0|0|0|0|0|0|0|0@0@0@0@0@0@0@0@0@0@0@0@0@0|10|2|-2|0|0|0|0|0|0|0|0",
			"0",
			"0|0|0"
		};
	}

	private static string BuildItemData()
	{
		List<string> list = new List<string>();
		for (int i = 0; i < ApothecaryItems.Length; i++)
		{
			int itemId = ApothecaryItems[i];
			int apothecary = ShopFrequencyConfig.GetApothecary(itemId);
			if (apothecary > 0)
			{
				list.Add(itemId + "~" + apothecary);
			}
		}
		return string.Join("@", list.ToArray());
	}

	private static void AddBuildToGroup(int groupIndex)
	{
		if (groupIndex < 0 || groupIndex >= Mainload.BuildGroupdata.Count)
		{
			return;
		}
		List<string> list = Mainload.BuildGroupdata[groupIndex];
		if (list == null || list.Count < 2)
		{
			return;
		}
		string text = list[1];
		string text2 = 240.ToString();
		string[] array = text.Split(new char[1] { '|' });
		for (int i = 0; i < array.Length; i++)
		{
			if (array[i] == text2)
			{
				return;
			}
		}
		list[1] = text + "|" + text2;
	}

	private static void AddBuildText()
	{
		if (AllText.Text_AllBuild != null)
		{
			while (AllText.Text_AllBuild.Count <= 240)
			{
				AllText.Text_AllBuild.Add(new List<string> { "", "" });
			}
			AllText.Text_AllBuild[240] = new List<string> { "药铺|经营药品与毒药生意", "Apothecary|Sell medicines and poisons." };
		}
	}

	private static void RestoreLogicalBuildId(PerBuildScene scene)
	{
		if (((Component)scene).transform.childCount != 0)
		{
			PerBuildShow component = ((Component)((Component)scene).transform.GetChild(0)).GetComponent<PerBuildShow>();
			if (!((Object)(object)component == (Object)null))
			{
				component.buildClassID = 240.ToString();
				component.AllbuildClassID = Mainload.AllBuilddata[240][5];
				component.BuildBigClass = scene.BuildBigClass;
			}
		}
	}
}
internal static class SaveCompatibility
{
	[HarmonyPatch(typeof(SaveData), "ReadBuildData")]
	private static class SaveData_ReadBuildData_Patch
	{
		private static void Postfix(string SceneClass, string ScenIndexA, string ScenIndexB)
		{
			if (SceneClass != "S" || Mainload.BuildInto_s == null)
			{
				return;
			}
			bool flag = false;
			for (int i = 0; i < Mainload.BuildInto_s.Count; i++)
			{
				List<string> list = Mainload.BuildInto_s[i];
				if (list == null || list.Count <= 1)
				{
					continue;
				}
				if (list[1] == 240.ToString())
				{
					EnsureMarker(list, "ShopsMod:Apothecary");
					flag = true;
				}
				else if (list[1] == 241.ToString())
				{
					EnsureMarker(list, "ShopsMod:Taoist");
					flag = true;
				}
				else if (list.Count > 13)
				{
					if (list[13] == "ShopsMod:Apothecary")
					{
						list[1] = 240.ToString();
					}
					else if (list[13] == "ShopsMod:Taoist")
					{
						list[1] = 241.ToString();
					}
				}
			}
			if (flag)
			{
				SaveData.SaveBuild("S", ScenIndexA, ScenIndexB, false);
			}
		}
	}

	[HarmonyPatch(typeof(SaveData), "SaveBuild")]
	private static class SaveData_SaveBuild_Patch
	{
		private static void Prefix()
		{
			if (Mainload.BuildInto_s == null)
			{
				return;
			}
			for (int i = 0; i < Mainload.BuildInto_s.Count; i++)
			{
				List<string> list = Mainload.BuildInto_s[i];
				if (list != null && list.Count > 1)
				{
					string text = ((list.Count > 13) ? list[13] : null);
					if (list[1] == 240.ToString() || text == "ShopsMod:Apothecary")
					{
						EnsureMarker(list, "ShopsMod:Apothecary");
						list[1] = 52.ToString();
					}
					else if (list[1] == 241.ToString() || text == "ShopsMod:Taoist")
					{
						EnsureMarker(list, "ShopsMod:Taoist");
						list[1] = 52.ToString();
					}
				}
			}
		}

		private static void Postfix()
		{
			if (Mainload.BuildInto_s == null)
			{
				return;
			}
			for (int i = 0; i < Mainload.BuildInto_s.Count; i++)
			{
				List<string> list = Mainload.BuildInto_s[i];
				if (list != null && list.Count > 13)
				{
					if (list[13] == "ShopsMod:Apothecary")
					{
						list[1] = 240.ToString();
					}
					else if (list[13] == "ShopsMod:Taoist")
					{
						list[1] = 241.ToString();
					}
				}
			}
		}
	}

	private const int ApothecaryBuildId = 240;

	private const int TaoistBuildId = 241;

	private const int VanillaFallbackBuildId = 52;

	private const int MarkerIndex = 13;

	private const string ApothecaryMarker = "ShopsMod:Apothecary";

	private const string TaoistMarker = "ShopsMod:Taoist";

	private static void EnsureMarker(List<string> build, string marker)
	{
		while (build.Count <= 13)
		{
			build.Add("0");
		}
		build[13] = marker;
	}
}
internal static class ShopFrequencyConfig
{
	private static readonly Dictionary<int, ConfigEntry<int>> Apothecary = new Dictionary<int, ConfigEntry<int>>();

	private static readonly Dictionary<int, ConfigEntry<int>> Taoist = new Dictionary<int, ConfigEntry<int>>();

	private static ConfigEntry<int> ApothecaryBuildCoins;

	private static ConfigEntry<int> ApothecaryBuildGold;

	private static ConfigEntry<int> TaoistBuildCoins;

	private static ConfigEntry<int> TaoistBuildGold;

	internal static void Bind(ConfigFile config)
	{
		BindApothecary(config, 68, 3, "Longevity Pill / 长寿丹");
		BindApothecary(config, 69, 3, "Bliss Pill / 极乐丹");
		BindApothecary(config, 70, 3, "Beauty Pill / 美颜丹");
		BindApothecary(config, 71, 1, "Glow Pill / 极品美颜丹");
		BindApothecary(config, 72, 1, "Eternal Pill / 极品长寿丹");
		BindApothecary(config, 75, 1, "Passion Pill / 合欢丹");
		BindApothecary(config, 168, 2, "Revival Pill / 回魂丹");
		BindApothecary(config, 282, 2, "Abortion Pill / 堕胎丹");
		BindApothecary(config, 283, 2, "Contraceptive Pill / 避孕丹");
		BindApothecary(config, 285, 1, "Spirit Wisdom Pill / 灵慧丹");
		BindApothecary(config, 163, 5, "Gelsemium / 番木鳖");
		BindApothecary(config, 164, 3, "Wolfsbane / 乌头");
		BindApothecary(config, 165, 2, "Tripterygium / 雷公腾");
		BindApothecary(config, 167, 1, "Toad Venom / 鹤顶红");
		BindTaoist(config, 157, 1, "Level 1 Spell / 一阶符咒");
		BindTaoist(config, 158, 1, "Level 2 Spell / 二阶符咒");
		BindTaoist(config, 159, 1, "Level 3 Spell / 三阶符咒");
		BindTaoist(config, 160, 1, "Level 4 Spell / 四阶符咒");
		BindTaoist(config, 161, 1, "Level 5 Spell / 五阶符咒");
		BindTaoist(config, 162, 1, "Level 6 Spell / 六阶符咒");
		ApothecaryBuildCoins = config.Bind<int>("Building Costs", "Apothecary Coins", 1000000, "Apothecary Coins / 药铺铜钱");
		ApothecaryBuildGold = config.Bind<int>("Building Costs", "Apothecary Gold", 5000, "Apothecary Gold / 药铺元宝");
		TaoistBuildCoins = config.Bind<int>("Building Costs", "Taoist Shop Coins", 1500000, "Taoist Shop Coins / 道观商铺铜钱");
		TaoistBuildGold = config.Bind<int>("Building Costs", "Taoist Shop Gold", 5000, "Taoist Shop Gold / 道观商铺元宝");
	}

	private static void BindApothecary(ConfigFile config, int itemId, int defaultValue, string description)
	{
		Apothecary[itemId] = config.Bind<int>("Apothecary Shop", "Item " + itemId, defaultValue, description);
	}

	private static void BindTaoist(ConfigFile config, int itemId, int defaultValue, string description)
	{
		Taoist[itemId] = config.Bind<int>("Taoist Shop", "Item " + itemId, defaultValue, description);
	}

	internal static int GetApothecary(int itemId)
	{
		if (Apothecary.TryGetValue(itemId, out var value))
		{
			if (value.Value >= 0)
			{
				return value.Value;
			}
			return 0;
		}
		return 0;
	}

	internal static int GetTaoist(int itemId)
	{
		if (Taoist.TryGetValue(itemId, out var value))
		{
			if (value.Value >= 0)
			{
				return value.Value;
			}
			return 0;
		}
		return 0;
	}

	internal static int GetApothecaryBuildCoins()
	{
		if (ApothecaryBuildCoins != null && ApothecaryBuildCoins.Value >= 0)
		{
			return ApothecaryBuildCoins.Value;
		}
		return 0;
	}

	internal static int GetApothecaryBuildGold()
	{
		if (ApothecaryBuildGold != null && ApothecaryBuildGold.Value >= 0)
		{
			return ApothecaryBuildGold.Value;
		}
		return 0;
	}

	internal static int GetTaoistBuildCoins()
	{
		if (TaoistBuildCoins != null && TaoistBuildCoins.Value >= 0)
		{
			return TaoistBuildCoins.Value;
		}
		return 0;
	}

	internal static int GetTaoistBuildGold()
	{
		if (TaoistBuildGold != null && TaoistBuildGold.Value >= 0)
		{
			return TaoistBuildGold.Value;
		}
		return 0;
	}
}
[BepInPlugin("ShopsMod", "ShopsMod - Apothecary & Taoist Shops", "1.0.0")]
public class ShopsModPlugin : BaseUnityPlugin
{
	private void Awake()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		ShopFrequencyConfig.Bind(((BaseUnityPlugin)this).Config);
		new Harmony("ShopsMod").PatchAll(typeof(ShopsModPlugin).Assembly);
	}
}
internal static class TaoistShopSystem
{
	[HarmonyPatch(typeof(Mainload), "LoadData")]
	private static class Mainload_LoadData_Patch
	{
		private static void Postfix()
		{
			InstallBuildDefinition();
			EnsureTaoistSaveEntries();
		}
	}

	[HarmonyPatch(typeof(PerBuildCreat), "initShow")]
	private static class PerBuildCreat_InitShow_Patch
	{
		private static bool Prefix(PerBuildCreat __instance)
		{
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null || ((Object)((Component)__instance).gameObject).name != 241.ToString())
			{
				return true;
			}
			Transform val = ((Component)__instance).transform.Find("Show");
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			for (int i = 0; i < val.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)val.GetChild(i)).gameObject);
			}
			GameObject val2 = Resources.Load<GameObject>("AllBuild/" + Mainload.BuildTaoZhuangID_SelectNow + "/Icon/" + 135);
			if ((Object)(object)val2 != (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(val2);
				obj.transform.SetParent(val);
				obj.transform.localScale = new Vector3(0.5f, 0.5f, 1f);
				obj.transform.localPosition = Vector3.zero;
			}
			bool flag = Mainload.FamilyData != null && Mainload.FamilyData.Count > 2 && int.Parse(Mainload.FamilyData[2]) >= int.Parse(Mainload.AllBuilddata[241][4]);
			Button component = ((Component)__instance).GetComponent<Button>();
			if ((Object)(object)component != (Object)null)
			{
				((Selectable)component).interactable = flag;
			}
			Transform val3 = ((Component)__instance).transform.Find("Lock");
			if ((Object)(object)val3 != (Object)null)
			{
				((Component)val3).gameObject.SetActive(!flag);
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildTip), "AddBuildTip")]
	private static class PerBuildTip_AddBuildTip_Patch
	{
		private static bool Prefix(PerBuildTip __instance)
		{
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			if (Mainload.BuildID_Creatselect != 241.ToString())
			{
				return true;
			}
			for (int i = 0; i < ((Component)__instance).transform.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Component)__instance).transform.GetChild(i)).gameObject);
			}
			GameObject val = Resources.Load<GameObject>("AllBuild/" + Mainload.BuildTaoZhuangID_SelectNow + "/BuildTip/" + 135 + "/" + Mainload.BuildDirID_CreatSelect);
			if ((Object)(object)val != (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(val);
				obj.transform.SetParent(((Component)__instance).transform);
				obj.transform.localPosition = Vector3.zero;
				obj.transform.localScale = Vector3.one;
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildScene), "ZhuanBuild")]
	private static class PerBuildScene_ZhuanBuild_Patch
	{
		private static void Prefix(PerBuildScene __instance, ref bool __state)
		{
			__state = false;
			if (!((Object)(object)__instance == (Object)null) && !(__instance.buildClassID != 241.ToString()))
			{
				__state = true;
				__instance.buildClassID = 135.ToString();
			}
		}

		private static void Postfix(PerBuildScene __instance, bool __state)
		{
			if (__state && !((Object)(object)__instance == (Object)null))
			{
				__instance.buildClassID = 241.ToString();
				RestoreLogicalBuildId(__instance);
			}
		}
	}

	[HarmonyPatch(typeof(ShopPanelA), "OnEnableShow")]
	private static class ShopPanelA_OnEnableShow_Patch
	{
		private static void Prefix(ShopPanelA __instance, ref int __state)
		{
			__state = 0;
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			FieldInfo fieldInfo = AccessTools.Field(typeof(ShopPanelA), "BuildClassID");
			if (!(fieldInfo == null))
			{
				object value = fieldInfo.GetValue(__instance);
				if (value is int && (int)value == 241)
				{
					fieldInfo.SetValue(__instance, 135);
					__state = 241;
				}
			}
		}

		private static void Postfix(ShopPanelA __instance, int __state)
		{
			Restore(__instance, __state);
		}

		private static Exception Finalizer(ShopPanelA __instance, int __state, Exception __exception)
		{
			Restore(__instance, __state);
			return __exception;
		}

		private static void Restore(ShopPanelA __instance, int state)
		{
			if (!((Object)(object)__instance == (Object)null) && state == 241)
			{
				FieldInfo fieldInfo = AccessTools.Field(typeof(ShopPanelA), "BuildClassID");
				if (fieldInfo != null)
				{
					fieldInfo.SetValue(__instance, 241);
				}
			}
		}
	}

	[HarmonyPatch(typeof(FormuAct), "ZhaoShopMan")]
	private static class FormuAct_ZhaoShopMan_Patch
	{
		private static bool Prefix(int RenNum, int Bindex, ref string __result)
		{
			if (Bindex < 0 || Mainload.BuildInto_s == null || Bindex >= Mainload.BuildInto_s.Count || Mainload.BuildInto_s[Bindex] == null || Mainload.BuildInto_s[Bindex].Count <= 1 || Mainload.BuildInto_s[Bindex][1] != 241.ToString())
			{
				return true;
			}
			if (RenNum <= 0)
			{
				__result = AllText.Text_UIA[830][Mainload.SetData[4]];
				Mainload.isTimeGoDay = true;
				return false;
			}
			Mainload.BuildInto_s[Bindex][3] = (int.Parse(Mainload.BuildInto_s[Bindex][3]) + RenNum).ToString();
			__result = AllText.Text_UIA[831][Mainload.SetData[4]].Replace("@", RenNum.ToString());
			FormulaData.TaskOrder_AddNum(9, RenNum);
			Mainload.isTimeGoDay = true;
			return false;
		}
	}

	[HarmonyPatch(typeof(PerBuildScene), "FixBuild")]
	private static class PerBuildScene_FixBuild_Patch
	{
		private static bool Prefix(PerBuildScene __instance, bool isAuto)
		{
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_031f: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance == (Object)null || __instance.buildClassID != 241.ToString() || __instance.BuildBigClass != "S")
			{
				return true;
			}
			int siblingIndex = ((Component)__instance).transform.GetSiblingIndex();
			int num = int.Parse(Mainload.SceneID.Split(new char[1] { '|' })[1]);
			int num2 = FormulaData.FixBuildCost(241);
			if (int.Parse(Mainload.CityData_now[num][0][9]) < num2)
			{
				Mainload.isNoCoinsForFastFixBuild = true;
				Mainload.Tip_Show.Add(new List<string>
				{
					"1",
					AllText.Text_TipShow[11][Mainload.SetData[4]]
				});
				return false;
			}
			Mainload.CityData_now[num][0][9] = (int.Parse(Mainload.CityData_now[num][0][9]) - num2).ToString();
			FormulaData.BuildS_AddData(num, siblingIndex, 0, 0, true, false);
			Mainload.BuildInto_s[siblingIndex][5] = InitBuildData.Build_ToFix(Mainload.BuildInto_s[siblingIndex][5]);
			__instance.buildstateID = int.Parse(Mainload.BuildInto_s[siblingIndex][5]);
			__instance.buildstateID_Last = __instance.buildstateID;
			Mainload.BuildInto_s[siblingIndex][7] = "0";
			FormulaData.BuildS_AddData(num, siblingIndex, 1, 0, false, false);
			for (int i = 0; i < ((Component)__instance).transform.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Component)__instance).transform.GetChild(i)).gameObject);
			}
			string text = Mainload.BuildInto_s[siblingIndex][11];
			string buildShiliID = Mainload.BuildInto_s[siblingIndex][0];
			GameObject val = Resources.Load<GameObject>("AllBuild/" + text + "/Scene/" + 135 + "/" + __instance.buildstateID);
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			GameObject obj = Object.Instantiate<GameObject>(val);
			((Object)obj).name = __instance.buildstateID.ToString();
			PerBuildShow component = obj.GetComponent<PerBuildShow>();
			if ((Object)(object)component != (Object)null)
			{
				component.buildShiliID = buildShiliID;
				component.buildClassID = 241.ToString();
				component.AllbuildClassID = Mainload.AllBuilddata[241][5];
				component.BuildBigClass = __instance.BuildBigClass;
			}
			obj.transform.SetParent(((Component)__instance).transform);
			obj.transform.localScale = Vector3.one;
			obj.transform.localPosition = Vector3.zero;
			GameObject val2 = Resources.Load<GameObject>("SmokeA");
			if ((Object)(object)val2 != (Object)null)
			{
				GameObject obj2 = Object.Instantiate<GameObject>(val2);
				obj2.transform.SetParent(((Component)__instance).transform);
				obj2.transform.localScale = new Vector3(1.8f, 1.8f, 1f);
				obj2.transform.localPosition = new Vector3(0f, 0.8f, 0f);
			}
			if (!isAuto)
			{
				Mainload.Tip_Show.Add(new List<string>
				{
					"0",
					AllText.Text_TipShow[262][Mainload.SetData[4]].Replace("@", num2.ToString())
				});
			}
			return false;
		}
	}

	public const int BuildId = 241;

	public const int VisualBuildId = 135;

	private const int RequiredRenown = 20;

	private static readonly int[] TaoistItems = new int[6] { 157, 158, 159, 160, 161, 162 };

	private static int BuildCoins => ShopFrequencyConfig.GetTaoistBuildCoins();

	private static int BuildGold => ShopFrequencyConfig.GetTaoistBuildGold();

	private static void InstallBuildDefinition()
	{
		if (Mainload.AllBuilddata != null && Mainload.BuildGroupdata != null)
		{
			while (Mainload.AllBuilddata.Count <= 241)
			{
				Mainload.AllBuilddata.Add(null);
			}
			Mainload.AllBuilddata[241] = CreateBuildDefinition();
			AddBuildToGroup(6);
			AddBuildToGroup(8);
			AddBuildText();
		}
	}

	private static void EnsureTaoistSaveEntries()
	{
		if (Mainload.BuildInto_s == null)
		{
			return;
		}
		for (int i = 0; i < Mainload.BuildInto_s.Count; i++)
		{
			List<string> list = Mainload.BuildInto_s[i];
			if (list == null || list.Count <= 1)
			{
				continue;
			}
			string text = list[1];
			int result = 241;
			if (text != result.ToString())
			{
				continue;
			}
			while (list.Count < 12)
			{
				list.Add("0");
			}
			if (!int.TryParse(list[2], out result))
			{
				list[2] = "1";
			}
			if (!int.TryParse(list[3], out result))
			{
				list[3] = "0";
			}
			if (!int.TryParse(list[5], out result))
			{
				list[5] = "0";
			}
			if (string.IsNullOrEmpty(list[6]))
			{
				list[6] = "-1";
			}
			if (!int.TryParse(list[8], out var result2))
			{
				result2 = 0;
			}
			if (result2 <= 0)
			{
				int num = 241;
				int result3 = 1;
				if (Mainload.AllBuilddata != null && num >= 0 && num < Mainload.AllBuilddata.Count && Mainload.AllBuilddata[num] != null && Mainload.AllBuilddata[num].Count > 3)
				{
					string[] array = Mainload.AllBuilddata[num][3].Split(new char[1] { '|' });
					if (array.Length > 1)
					{
						int.TryParse(array[1], out result3);
					}
				}
				if (result3 <= 0)
				{
					result3 = 1;
				}
				result = Mainload.GongZiPerAdd * result3 * 2;
				list[8] = result.ToString();
			}
			if (!int.TryParse(list[9], out result))
			{
				list[9] = "0";
			}
			if (string.IsNullOrEmpty(list[11]))
			{
				list[11] = Mainload.BuildTaoZhuangID_SelectNow;
			}
		}
	}

	private static List<string> CreateBuildDefinition()
	{
		if (Mainload.AllBuilddata.Count > 61 && Mainload.AllBuilddata[61] != null)
		{
			List<string> list = new List<string>(Mainload.AllBuilddata[61]);
			if (list.Count > 1)
			{
				list[1] = BuildCoins + "|" + BuildGold;
			}
			if (list.Count > 3)
			{
				string[] array = list[3].Split(new char[1] { '|' });
				string text = ((array.Length != 0) ? array[0] : "1");
				string text2 = ((array.Length > 1) ? array[1] : "1");
				string text3 = ((array.Length > 3) ? array[3] : "60");
				list[3] = text + "|" + text2 + "|" + BuildItemData() + "|" + text3;
			}
			if (list.Count > 4)
			{
				list[4] = 20.ToString();
			}
			if (list.Count > 5)
			{
				list[5] = "13";
			}
			return list;
		}
		return new List<string>
		{
			"null",
			BuildCoins + "|" + BuildGold,
			"500",
			"1|1|" + BuildItemData() + "|60",
			20.ToString(),
			"13",
			"null",
			"0|0|0|0|0|0|0|0|0|0@0@0@0@0@0@0@0@0@0@0@0@0@0|10|2|-2|0|0|0|0|0|0|0|0",
			"0",
			"0|0|0"
		};
	}

	private static string BuildItemData()
	{
		List<string> list = new List<string>();
		for (int i = 0; i < TaoistItems.Length; i++)
		{
			int itemId = TaoistItems[i];
			int taoist = ShopFrequencyConfig.GetTaoist(itemId);
			if (taoist > 0)
			{
				list.Add(itemId + "~" + taoist);
			}
		}
		return string.Join("@", list.ToArray());
	}

	private static void AddBuildToGroup(int groupIndex)
	{
		if (groupIndex < 0 || groupIndex >= Mainload.BuildGroupdata.Count)
		{
			return;
		}
		List<string> list = Mainload.BuildGroupdata[groupIndex];
		if (list == null || list.Count < 2)
		{
			return;
		}
		string text = list[1];
		string text2 = 241.ToString();
		string[] array = text.Split(new char[1] { '|' });
		for (int i = 0; i < array.Length; i++)
		{
			if (array[i] == text2)
			{
				return;
			}
		}
		list[1] = text + "|" + text2;
	}

	private static void AddBuildText()
	{
		if (AllText.Text_AllBuild != null)
		{
			while (AllText.Text_AllBuild.Count <= 241)
			{
				AllText.Text_AllBuild.Add(new List<string> { "", "" });
			}
			AllText.Text_AllBuild[241] = new List<string> { "道观商铺|贩卖道教符箓与道家用品之所", "Taoist Shop|A shop selling Taoist talismans and related goods." };
		}
	}

	private static void RestoreLogicalBuildId(PerBuildScene scene)
	{
		if (((Component)scene).transform.childCount != 0)
		{
			PerBuildShow component = ((Component)((Component)scene).transform.GetChild(0)).GetComponent<PerBuildShow>();
			if (!((Object)(object)component == (Object)null))
			{
				component.buildClassID = 241.ToString();
				component.AllbuildClassID = Mainload.AllBuilddata[241][5];
				component.BuildBigClass = scene.BuildBigClass;
			}
		}
	}
}
internal static class VanillaShopExpansion
{
	[HarmonyPatch(typeof(Mainload), "LoadData")]
	private static class Mainload_LoadData_Patch
	{
		private static void Postfix()
		{
			AddItemsToBuild(60, SmithyItems, "Smithy");
			AddItemsToBuild(54, CosmeticItems, "Cosmetic Store");
		}
	}

	private const int SmithyBuildId = 60;

	private const int CosmeticStoreBuildId = 54;

	private static readonly string[] SmithyItems = new string[3] { "103~1", "110~1", "111~1" };

	private static readonly string[] CosmeticItems = new string[2] { "49~1", "50~1" };

	private static void AddItemsToBuild(int buildId, string[] additions, string shopName)
	{
		if (Mainload.AllBuilddata == null || buildId < 0 || buildId >= Mainload.AllBuilddata.Count || Mainload.AllBuilddata[buildId] == null || Mainload.AllBuilddata[buildId].Count <= 3)
		{
			return;
		}
		List<string> list = Mainload.AllBuilddata[buildId];
		string[] array = list[3].Split(new char[1] { '|' });
		if (array.Length < 3)
		{
			return;
		}
		List<string> list2 = new List<string>(array[2].Split(new char[1] { '@' }));
		for (int i = 0; i < additions.Length; i++)
		{
			string text = additions[i].Split(new char[1] { '~' })[0];
			bool flag = false;
			for (int j = 0; j < list2.Count; j++)
			{
				if (!string.IsNullOrEmpty(list2[j]) && list2[j].Split(new char[1] { '~' })[0] == text)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				list2.Add(additions[i]);
			}
		}
		array[2] = string.Join("@", list2.ToArray());
		list[3] = string.Join("|", array);
	}
}