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);
}
}