Decompiled source of BetterMarketPlus v1.3.6

BepInEx/plugins/BetterMarketPlus.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using BetterMarketPlus.Compatibility;
using BetterMarketPlus.Configuration;
using BetterMarketPlus.Integrations;
using BetterMarketPlus.Localization;
using BetterMarketPlus.Patches;
using BetterMarketPlus.Utils;
using HarmonyLib;
using Newtonsoft.Json;
using TMPro;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.SmartFormat.Extensions;
using UnityEngine.Localization.SmartFormat.PersistentVariables;
using UnityEngine.Localization.Tables;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("BetterMarketPlus")]
[assembly: AssemblyDescription("Better Market Plus mod for Old Market Simulator by Ice Box Studio")]
[assembly: AssemblyCompany("Ice Box Studio")]
[assembly: AssemblyProduct("BetterMarketPlus")]
[assembly: AssemblyCopyright("Copyright © 2026 Ice Box Studio All rights reserved.")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("EAAD3296-E8E3-4C52-BF86-6907CB4F80E6")]
[assembly: AssemblyFileVersion("1.3.6.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.3.6.0")]
namespace BetterMarketPlus
{
	[BepInPlugin("IceBoxStudio.BetterMarketPlus", "BetterMarketPlus", "1.3.6")]
	[BepInIncompatibility("ViViKo.BetterMarket")]
	public class BetterMarketPlus : BaseUnityPlugin
	{
		public static BetterMarketPlus _Instance;

		private Harmony _harmony;

		private bool patchesApplied;

		public static BetterMarketPlus Instance => _Instance;

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			_Instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			try
			{
				Logger.LogInfo((object)"=============================================");
				Logger.LogInfo((object)("BetterMarketPlus " + LocalizationManager.Instance.GetLocalizedText("plugin.initializing")));
				Logger.LogInfo((object)(LocalizationManager.Instance.GetLocalizedText("plugin.author_prefix") + "Ice Box Studio(https://steamcommunity.com/id/ibox666/)"));
				ConfigManager.Initialize(((BaseUnityPlugin)this).Config);
				ApplyPatches();
				Logger.LogInfo((object)("BetterMarketPlus " + LocalizationManager.Instance.GetLocalizedText("plugin.initialized")));
				Logger.LogInfo((object)"=============================================");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("BetterMarketPlus 初始化错误: " + ex.Message + "\n" + ex.StackTrace));
			}
		}

		private void ApplyPatches()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (!patchesApplied)
			{
				try
				{
					_harmony = new Harmony("IceBoxStudio.BetterMarketPlus");
					_harmony.PatchAll();
					patchesApplied = true;
					return;
				}
				catch (Exception ex)
				{
					Logger.LogError((object)("BetterMarketPlus 应用补丁错误: " + ex.Message + "\n" + ex.StackTrace));
					return;
				}
			}
			Logger.LogInfo((object)LocalizationManager.Instance.GetLocalizedText("plugin.patches_skipped"));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "IceBoxStudio.BetterMarketPlus";

		public const string PLUGIN_NAME = "BetterMarketPlus";

		public const string PLUGIN_VERSION = "1.3.6";
	}
}
namespace BetterMarketPlus.Utils
{
	public static class ChinesePinyin
	{
		private static Dictionary<char, string> _pinyinMap;

		private static string _currentLanguage;

		private const string PinyinData = "a:啊|ai:矮爱碍唉|an:按安广|ang:昂|ao:傲奥|ba:巴把吧拔|bai:百摆|ban:办板般伴|bang:傍棒榜绑帮|bao:包保宝薄报|bei:被背杯备贝辈|ben:本|bi:闭壁币秘笔必比|bian:便扁辨边变遍|biao:标膘|bie:别|bin:槟|bing:屏饼并柄兵病|bo:播博泊|bu:部不卜布捕补|cai:财菜材才采|can:餐|cao:槽草|ce:策侧|ceng:曾|cha:查茶|chai:柴|chan:产单|chang:场常长肠尝|chao:超|che:车|chen:陈趁晨|cheng:成橙诚程城|chi:吃|chong:重冲虫|chou:抽绸酬|chu:出除锄处畜雏储|chuan:船传|chuang:窗床创|chui:吹锤|chun:春|ci:此刺次伺|cong:葱从|cu:醋|cuan:攒|cun:存村|cuo:错|da:打达大答|dai:袋代带待夫|dan:蛋诞但旦|dang:当档|dao:导到盗刀岛稻道捣|de:的地得德|deng:灯等|di:第抵低迪帝递弟|dian:店点典|diao:吊钓雕掉调|die:叠|ding:订定锭顶|dong:冬动冻东洞|dou:豆都|du:度独督肚|duan:断短端|dui:对堆队|dun:顿|duo:多朵夺|e:额饿|er:尔儿而|fa:法发|fan:返番翻反烦|fang:放访方坊房防纺芳|fei:费非菲肥废|fen:分粉份芬|feng:蜂封风丰|fou:否|fu:负复铺腐富服弗浮父付福附|gai:改该|gan:甘干感竿橄赶敢|gang:港|gao:高镐|ge:格个各革戈|gei:给|gen:跟根|geng:耕更|gong:工公弓供功共|gou:购篝狗垢|gu:雇顾骨鼓古|gua:挂瓜|guan:关官罐馆冠惯观|guang:光|gui:贵柜归瑰鬼轨|guo:过果国锅|hai:海还害孩嘿|han:汉罕寒|hang:行|hao:好号|he:和合荷鹤|hei:黑|hen:很|hong:红|hou:猴后候厚|hu:护呼胡壶虎狐|hua:花画华化话划|huai:坏怀|huan:欢换缓焕|huang:黄|hui:回会卉灰绘挥毁恢|huo:货活获火或伙|ji:继计期季集鸡忌级圾积极及机技几己急记纪寄系吉寂|jia:价加家架甲|jian:建间捡坚件剑键见渐健艰|jiang:将匠浆酱姜桨奖|jiao:觉叫窖浇蕉椒酵骄脚交角|jie:结接节解界洁藉街介姐|jin:进禁金近紧尽今|jing:经警精景净井静|jiu:韭酒就旧|ju:具炬距菊居|juan:卷|jue:绝|jun:均军|ka:卡|kai:开楷|kan:看砍|kang:康|kao:烤|ke:可克客科刻|ken:肯|keng:坑|kong:空|kou:口|ku:库|kuai:块快|kuan:宽|kuang:框矿况|kui:葵馈愧魁|kun:捆昆|kuo:扩阔|la:蜡垃辣啦落|lai:来|lan:缆蓝栏榄懒兰览|lang:浪|lao:酪老劳牢|le:乐了|lei:类肋|leng:冷|li:利历里立栗李力犁理鲤离丽厉励礼莉|lian:连莲炼练|liang:量粮两梁良|liao:料|lie:列猎|lin:赁林|ling:灵零另令|liu:留浏|long:笼龙弄|lu:绿鹿路卢|luan:峦乱|lue:略|lun:伦|luo:萝罗洛|lv:率旅|ma:码吗马麻玛|mai:卖买麦霾|man:满蔓漫|mang:芒忙|mao:猫贸|me:么|mei:莓梅玫美没每霉|men:门们|meng:萌|mi:米咪弥迷蜜|mian:面眠缅|miao:苗妙|mie:灭|min:敏民|ming:明命名|mo:模磨默|mu:目木牧母墓|na:那拿纳呐哪|nai:奶耐|nan:南男难|nao:闹|ne:呢|neng:能|ni:你拟妮尼|nian:年酿念|nin:您|ning:宁|niu:牛|nong:农|nu:努|nuan:暖|nuo:诺|nv:女|pa:帕|pai:派牌排|pan:盘畔|pao:跑|pei:配佩陪|pen:盆|peng:膨棚朋|pi:批皮啤匹|pian:片|pin:品聘|ping:平苹|po:破|pu:璞葡普堡扑朴|qi:其启起奇汽器骑七妻气齐岂|qian:前钱|qiang:墙枪强|qiao:巧|qie:茄切惬|qin:亲|qing:请情清青庆轻|qiu:秋球求|qu:取曲去|quan:全权|que:确缺|qun:群|ran:然燃染|rang:壤让|re:热|ren:仁人任|reng:扔|ri:日|rong:容熔融|rou:肉|ru:入如|rui:锐|run:润|ruo:若|sa:洒撒|sai:赛塞|sao:扫骚|se:色|sen:森|sha:沙鲨|shan:删山闪善|shang:上商伤赏|shao:哨少烧绍|she:设奢折|shen:神深身什|sheng:剩生圣声牲|shi:石市示始使饰师式世时食士室是狮视十实拾事试适|shou:收售寿手受首守|shu:束数蔬输树鼠叔术殊舒书|shuang:双|shui:税睡水谁|shun:顺|shuo:说|si:斯丝饲思死|song:送松|su:苏|suan:算|sui:随碎虽|suo:所索锁|ta:他塌它她|tai:台太态泰|tan:摊毯滩探|tang:糖|tao:桃萄|te:特|teng:疼|ti:提屉体|tian:天田甜添|tiao:条跳挑|tie:铁|ting:停听庭|tong:桶通铜同|tou:头|tu:图土兔|tuan:团|tui:退腿推|tuo:托|wa:挖|wai:外|wan:晚万完玩湾|wang:网王往望忘|wei:为维位威围尾慰委卫味喂|wen:温闻文|wo:我卧|wu:午务无物武屋乌污雾|xi:戏西细夕吸希稀惜习|xia:下夏虾狭|xian:鲜限仙先现险献|xiang:向香像箱想享相响襄|xiao:消小销效|xie:谢些|xin:新心锌信|xing:杏型形性兴幸|xiong:熊雄兄|xiu:修休|xu:续许需须序蓄|xuan:旋选渲|xue:穴雪|xun:逊训薰|ya:亚芽呀娅|yan:炎言眼盐岩焰颜|yang:烊样洋羊养|yao:邀要腰耀鳐药遥|ye:夜业野爷也叶|yi:已以议移一宜椅衣仪意艺易异役溢|yin:音银阴引|ying:营樱影迎鹰应英赢|yong:佣用|you:游友有油又|yu:余于羽玉育鱼语誉屿愉郁渔与域裕予|yuan:员园圆鸢源愿援远缘|yue:越月跃悦|yun:运|za:扎杂|zai:在再|zan:咱暂|zang:脏|zao:造|ze:择|zeng:赠增|zha:榨|zhai:摘窄|zhan:战展|zhang:张账涨胀章障|zhao:找招着|zhe:这者|zhen:真榛帧镇砧震振枕珍|zheng:正证争整|zhi:之置致植质止汁制志只挚指纸枝织至秩知支|zhong:种中众|zhou:帚州周轴|zhu:主住筑烛竹猪柱助株逐|zhua:抓|zhuan:转|zhuang:装状庄壮|zhun:准|zhuo:桌琢卓|zi:子孜字资自滋|zong:总棕|zou:走|zu:租族足祖|zui:最|zuo:作做座";

		private const string TraditionalPinyinData = "a:亞啊|ai:矮愛礙唉|an:按安廣|ang:昂|ao:傲奧|ba:巴把吧拔|bai:百擺|ban:辦板闆般伴|bang:傍棒榜綁幫|bao:包保寶薄報|bei:被背盃備別貝輩|ben:本|bi:閉壁幣秘筆必比|bian:便扁邊變遍|biao:標膘|bin:檳|bing:屏餅並柄兵病|bo:蔔播博泊|bu:部不布捕補|cai:財菜材才採|can:餐|cao:槽草|ce:策側|ceng:曾|cha:查茶|chai:柴|chan:產|chang:場常長腸嚐|chao:超|che:車|chen:陳趁晨|cheng:成誠程橙城|chi:吃|chong:重衝蟲|chou:抽綢酬|chu:出除鋤處畜雛儲|chuan:船傳|chuang:窗床創|chui:吹錘|chun:春|ci:此刺次伺|cong:蔥從|cu:醋|cun:存村|cuo:錯|da:打達大答|dai:袋代帶待夫|dan:單蛋誕但旦|dang:當檔|dao:導到盜刀島稻道|de:的地得德|deng:燈等|di:第抵低迪帝遞弟|dian:店點典|diao:吊釣雕掉調|die:疊|ding:訂定丁錠頂|dong:冬動凍東洞|dou:豆都|du:度獨督肚|duan:斷短端|dui:對堆隊|dun:頓|duo:多朵奪|e:額餓|er:爾兒而|fa:法發|fan:返番翻反煩|fang:放訪方坊房防紡芳|fei:費非菲肥廢|fen:粉份分芬|feng:蜂封風豐|fou:否|fu:負復腐富服弗浮父複付福附|gai:改該|gan:甘乾感竿橄趕敢幹|gang:港|gao:高|ge:格個各革戈|gei:給|gen:跟根|geng:耕更|gong:工公弓供功共|gou:購篝狗垢|gu:雇顧骨古|gua:掛瓜|guan:關官罐館冠慣觀|guang:光|gui:貴櫃歸瑰鬼軌|guo:過果國鍋|hai:海還害孩嘿|han:漢罕寒|hang:行|hao:好號鎬|he:和合荷鶴|hei:黑|hen:很|hong:紅|hou:猴後候厚|hu:護呼胡壺虎狐|hua:花畫華化話劃|huai:壞懷|huan:歡換緩煥|huang:黃|hui:回會卉灰繪揮毀恢|huo:貨活穫火獲或伙|ji:繼計期季集雞級圾積極及機技幾己急記紀寄忌吉寂|jia:價加家架傢甲|jian:建間撿堅件劍鍵見漸健艱|jiang:將匠漿醬薑槳獎|jiao:覺叫窖澆蕉椒酵驕腳交角|jie:結接節解界潔藉街介姐|jin:進禁金近緊盡今|jing:經警精景淨井靜|jiu:韭酒就舊|ju:具炬距菊居|juan:捲卷|jue:絕|jun:均軍|ka:卡|kai:開楷|kan:看砍|kang:康|kao:烤|ke:可克客科刻|ken:肯|keng:坑|kong:空|kou:口|ku:庫|kuai:快|kuan:寬|kuang:框礦況|kui:葵饋愧魁|kun:捆昆|kuo:擴闊|la:蠟垃辣落啦|lai:來|lan:纜藍欄欖懶蘭覽|lang:浪|lao:酪老勞牢|le:樂了|lei:類肋|leng:冷|li:利曆裏立栗李力犁理鯉離麗裡俐厲勵禮莉|lian:連蓮煉練|liang:量糧兩梁良|liao:料|lie:列獵|lin:賃林|ling:靈零另令|liu:柳留瀏|long:籠龍弄|lu:綠鹿路盧|luan:巒亂|lue:略|lun:倫|luo:蘿羅洛|lv:率旅|ma:碼嗎馬麻瑪|mai:賣買麥霾|man:滿蔓漫|mang:芒忙|mao:貓貿|me:麼|mei:莓梅玫美沒每霉|men:門們|meng:萌|mi:米咪彌迷蜜|mian:面麵眠緬|miao:苗妙|mie:滅|min:敏民|ming:明命名|mo:模磨默|mu:目木牧募母墓|na:那拿納吶哪|nai:奶耐|nan:南男難|nao:鬧|ne:呢|neng:能|ni:你擬妮尼|nian:年釀念|nin:您|ning:寧|niu:牛|nong:農|nu:努|nuan:暖|nuo:諾|nv:女|pa:帕|pai:派牌排|pan:盤畔|pao:跑|pei:配佩陪|pen:盆|peng:膨棚朋|pi:批皮啤匹|pian:片|pin:品蘋|ping:平|po:破撲|pu:鋪璞葡普堡樸|qi:其啟起奇汽器騎七妻氣齊豈|qian:前牆槍錢|qiang:強|qiao:巧|qie:茄切愜|qin:親|qing:請情清青慶輕|qiu:秋球求|qu:取曲去|quan:全權|que:確缺|ran:然燃染|rang:壤讓|re:熱|ren:仁人任|reng:扔|ri:日|rong:容熔融|rou:肉|ru:入乳如|rui:銳|run:潤|ruo:若|sa:灑撒|sai:賽塞|sao:掃騷|se:色|sen:森|sha:沙鯊|shan:刪山閃善|shang:上商傷賞|shao:哨少燒紹|she:設奢折|shei:誰|shen:神深身什|sheng:剩生聖聲牲|shi:石市示始使飾師式世時食士室是獅視十實拾事試適|shou:收售壽手受首守|shu:束數蔬輸樹鼠叔術殊舒書|shuang:雙|shui:稅睡水|shun:順|shuo:說|si:斯絲飼思死|song:送鬆|su:甦|suan:算|sui:隨碎雖|suo:所鎖|ta:他塌它她|tai:臺太態泰台|tan:攤毯灘探|tang:糖|tao:桃萄|te:特|teng:疼|ti:提屜體|tian:天田甜添|tiao:條跳挑|tie:鐵|ting:停聽庭|tong:桶通銅同|tou:頭|tu:圖土兔|tuan:團|tui:退腿推|tuo:託|wa:挖|wai:外|wan:晚萬完玩灣|wang:網王往望忘|wei:為維位威圍尾慰委衛味餵|wen:溫聞文|wo:我臥|wu:午務無物武屋烏汙霧|xi:戲西細析夕吸希稀喜惜習係|xia:下夏蝦狹|xian:鮮限仙先現險獻|xiang:向香像箱想享相響襄|xiao:消小銷效|xie:謝些|xin:新心鋅信|xing:杏型形性興幸|xiong:熊雄兄|xiu:修休|xu:續許需須序蓄|xuan:旋選渲|xue:穴雪|xun:遜訓薰|ya:芽呀婭|yan:炎言眼鹽岩焰顏|yang:烊樣洋羊養|yao:邀要腰耀鰩藥遙|ye:夜業耶野葉爺也|yi:已以議移一宜椅衣儀意藝易異役溢|yin:音銀陰引|ying:營櫻影迎鷹應英贏|yong:傭用|you:遊友有油又|yu:餘於羽玉育魚語譽嶼愉鬱漁與域裕予|yuan:員園圓鳶源願援遠緣|yue:越月躍悅|yun:運|za:紮雜|zai:在再|zan:咱暫攢|zang:髒|zao:造|ze:擇|zeng:贈增|zha:榨|zhai:摘窄|zhan:戰展|zhang:張賬漲脹章障|zhao:找招|zhe:這者|zhen:真榛幀鎮砧震振枕珍|zheng:正證爭整|zhi:之置致植質止汁制誌只摯製指紙枝織至秩隻知支|zhong:種中眾|zhou:帚州周軸|zhu:主住築燭竹豬著柱助株逐|zhua:抓|zhuan:轉|zhuang:裝狀莊壯|zhun:準|zhuo:桌琢卓|zi:子孜字資自滋|zong:總棕|zou:走|zu:租組族足祖|zui:最|zuo:作做座";

		private static void Initialize(string languageCode)
		{
			bool flag = languageCode == "zh-Hant";
			string text = (flag ? "zh-Hant" : "zh");
			if (!(_currentLanguage == text))
			{
				_pinyinMap = new Dictionary<char, string>();
				if (flag)
				{
					LoadPinyinData("a:亞啊|ai:矮愛礙唉|an:按安廣|ang:昂|ao:傲奧|ba:巴把吧拔|bai:百擺|ban:辦板闆般伴|bang:傍棒榜綁幫|bao:包保寶薄報|bei:被背盃備別貝輩|ben:本|bi:閉壁幣秘筆必比|bian:便扁邊變遍|biao:標膘|bin:檳|bing:屏餅並柄兵病|bo:蔔播博泊|bu:部不布捕補|cai:財菜材才採|can:餐|cao:槽草|ce:策側|ceng:曾|cha:查茶|chai:柴|chan:產|chang:場常長腸嚐|chao:超|che:車|chen:陳趁晨|cheng:成誠程橙城|chi:吃|chong:重衝蟲|chou:抽綢酬|chu:出除鋤處畜雛儲|chuan:船傳|chuang:窗床創|chui:吹錘|chun:春|ci:此刺次伺|cong:蔥從|cu:醋|cun:存村|cuo:錯|da:打達大答|dai:袋代帶待夫|dan:單蛋誕但旦|dang:當檔|dao:導到盜刀島稻道|de:的地得德|deng:燈等|di:第抵低迪帝遞弟|dian:店點典|diao:吊釣雕掉調|die:疊|ding:訂定丁錠頂|dong:冬動凍東洞|dou:豆都|du:度獨督肚|duan:斷短端|dui:對堆隊|dun:頓|duo:多朵奪|e:額餓|er:爾兒而|fa:法發|fan:返番翻反煩|fang:放訪方坊房防紡芳|fei:費非菲肥廢|fen:粉份分芬|feng:蜂封風豐|fou:否|fu:負復腐富服弗浮父複付福附|gai:改該|gan:甘乾感竿橄趕敢幹|gang:港|gao:高|ge:格個各革戈|gei:給|gen:跟根|geng:耕更|gong:工公弓供功共|gou:購篝狗垢|gu:雇顧骨古|gua:掛瓜|guan:關官罐館冠慣觀|guang:光|gui:貴櫃歸瑰鬼軌|guo:過果國鍋|hai:海還害孩嘿|han:漢罕寒|hang:行|hao:好號鎬|he:和合荷鶴|hei:黑|hen:很|hong:紅|hou:猴後候厚|hu:護呼胡壺虎狐|hua:花畫華化話劃|huai:壞懷|huan:歡換緩煥|huang:黃|hui:回會卉灰繪揮毀恢|huo:貨活穫火獲或伙|ji:繼計期季集雞級圾積極及機技幾己急記紀寄忌吉寂|jia:價加家架傢甲|jian:建間撿堅件劍鍵見漸健艱|jiang:將匠漿醬薑槳獎|jiao:覺叫窖澆蕉椒酵驕腳交角|jie:結接節解界潔藉街介姐|jin:進禁金近緊盡今|jing:經警精景淨井靜|jiu:韭酒就舊|ju:具炬距菊居|juan:捲卷|jue:絕|jun:均軍|ka:卡|kai:開楷|kan:看砍|kang:康|kao:烤|ke:可克客科刻|ken:肯|keng:坑|kong:空|kou:口|ku:庫|kuai:快|kuan:寬|kuang:框礦況|kui:葵饋愧魁|kun:捆昆|kuo:擴闊|la:蠟垃辣落啦|lai:來|lan:纜藍欄欖懶蘭覽|lang:浪|lao:酪老勞牢|le:樂了|lei:類肋|leng:冷|li:利曆裏立栗李力犁理鯉離麗裡俐厲勵禮莉|lian:連蓮煉練|liang:量糧兩梁良|liao:料|lie:列獵|lin:賃林|ling:靈零另令|liu:柳留瀏|long:籠龍弄|lu:綠鹿路盧|luan:巒亂|lue:略|lun:倫|luo:蘿羅洛|lv:率旅|ma:碼嗎馬麻瑪|mai:賣買麥霾|man:滿蔓漫|mang:芒忙|mao:貓貿|me:麼|mei:莓梅玫美沒每霉|men:門們|meng:萌|mi:米咪彌迷蜜|mian:面麵眠緬|miao:苗妙|mie:滅|min:敏民|ming:明命名|mo:模磨默|mu:目木牧募母墓|na:那拿納吶哪|nai:奶耐|nan:南男難|nao:鬧|ne:呢|neng:能|ni:你擬妮尼|nian:年釀念|nin:您|ning:寧|niu:牛|nong:農|nu:努|nuan:暖|nuo:諾|nv:女|pa:帕|pai:派牌排|pan:盤畔|pao:跑|pei:配佩陪|pen:盆|peng:膨棚朋|pi:批皮啤匹|pian:片|pin:品蘋|ping:平|po:破撲|pu:鋪璞葡普堡樸|qi:其啟起奇汽器騎七妻氣齊豈|qian:前牆槍錢|qiang:強|qiao:巧|qie:茄切愜|qin:親|qing:請情清青慶輕|qiu:秋球求|qu:取曲去|quan:全權|que:確缺|ran:然燃染|rang:壤讓|re:熱|ren:仁人任|reng:扔|ri:日|rong:容熔融|rou:肉|ru:入乳如|rui:銳|run:潤|ruo:若|sa:灑撒|sai:賽塞|sao:掃騷|se:色|sen:森|sha:沙鯊|shan:刪山閃善|shang:上商傷賞|shao:哨少燒紹|she:設奢折|shei:誰|shen:神深身什|sheng:剩生聖聲牲|shi:石市示始使飾師式世時食士室是獅視十實拾事試適|shou:收售壽手受首守|shu:束數蔬輸樹鼠叔術殊舒書|shuang:雙|shui:稅睡水|shun:順|shuo:說|si:斯絲飼思死|song:送鬆|su:甦|suan:算|sui:隨碎雖|suo:所鎖|ta:他塌它她|tai:臺太態泰台|tan:攤毯灘探|tang:糖|tao:桃萄|te:特|teng:疼|ti:提屜體|tian:天田甜添|tiao:條跳挑|tie:鐵|ting:停聽庭|tong:桶通銅同|tou:頭|tu:圖土兔|tuan:團|tui:退腿推|tuo:託|wa:挖|wai:外|wan:晚萬完玩灣|wang:網王往望忘|wei:為維位威圍尾慰委衛味餵|wen:溫聞文|wo:我臥|wu:午務無物武屋烏汙霧|xi:戲西細析夕吸希稀喜惜習係|xia:下夏蝦狹|xian:鮮限仙先現險獻|xiang:向香像箱想享相響襄|xiao:消小銷效|xie:謝些|xin:新心鋅信|xing:杏型形性興幸|xiong:熊雄兄|xiu:修休|xu:續許需須序蓄|xuan:旋選渲|xue:穴雪|xun:遜訓薰|ya:芽呀婭|yan:炎言眼鹽岩焰顏|yang:烊樣洋羊養|yao:邀要腰耀鰩藥遙|ye:夜業耶野葉爺也|yi:已以議移一宜椅衣儀意藝易異役溢|yin:音銀陰引|ying:營櫻影迎鷹應英贏|yong:傭用|you:遊友有油又|yu:餘於羽玉育魚語譽嶼愉鬱漁與域裕予|yuan:員園圓鳶源願援遠緣|yue:越月躍悅|yun:運|za:紮雜|zai:在再|zan:咱暫攢|zang:髒|zao:造|ze:擇|zeng:贈增|zha:榨|zhai:摘窄|zhan:戰展|zhang:張賬漲脹章障|zhao:找招|zhe:這者|zhen:真榛幀鎮砧震振枕珍|zheng:正證爭整|zhi:之置致植質止汁制誌只摯製指紙枝織至秩隻知支|zhong:種中眾|zhou:帚州周軸|zhu:主住築燭竹豬著柱助株逐|zhua:抓|zhuan:轉|zhuang:裝狀莊壯|zhun:準|zhuo:桌琢卓|zi:子孜字資自滋|zong:總棕|zou:走|zu:租組族足祖|zui:最|zuo:作做座");
				}
				else
				{
					LoadPinyinData("a:啊|ai:矮爱碍唉|an:按安广|ang:昂|ao:傲奥|ba:巴把吧拔|bai:百摆|ban:办板般伴|bang:傍棒榜绑帮|bao:包保宝薄报|bei:被背杯备贝辈|ben:本|bi:闭壁币秘笔必比|bian:便扁辨边变遍|biao:标膘|bie:别|bin:槟|bing:屏饼并柄兵病|bo:播博泊|bu:部不卜布捕补|cai:财菜材才采|can:餐|cao:槽草|ce:策侧|ceng:曾|cha:查茶|chai:柴|chan:产单|chang:场常长肠尝|chao:超|che:车|chen:陈趁晨|cheng:成橙诚程城|chi:吃|chong:重冲虫|chou:抽绸酬|chu:出除锄处畜雏储|chuan:船传|chuang:窗床创|chui:吹锤|chun:春|ci:此刺次伺|cong:葱从|cu:醋|cuan:攒|cun:存村|cuo:错|da:打达大答|dai:袋代带待夫|dan:蛋诞但旦|dang:当档|dao:导到盗刀岛稻道捣|de:的地得德|deng:灯等|di:第抵低迪帝递弟|dian:店点典|diao:吊钓雕掉调|die:叠|ding:订定锭顶|dong:冬动冻东洞|dou:豆都|du:度独督肚|duan:断短端|dui:对堆队|dun:顿|duo:多朵夺|e:额饿|er:尔儿而|fa:法发|fan:返番翻反烦|fang:放访方坊房防纺芳|fei:费非菲肥废|fen:分粉份芬|feng:蜂封风丰|fou:否|fu:负复铺腐富服弗浮父付福附|gai:改该|gan:甘干感竿橄赶敢|gang:港|gao:高镐|ge:格个各革戈|gei:给|gen:跟根|geng:耕更|gong:工公弓供功共|gou:购篝狗垢|gu:雇顾骨鼓古|gua:挂瓜|guan:关官罐馆冠惯观|guang:光|gui:贵柜归瑰鬼轨|guo:过果国锅|hai:海还害孩嘿|han:汉罕寒|hang:行|hao:好号|he:和合荷鹤|hei:黑|hen:很|hong:红|hou:猴后候厚|hu:护呼胡壶虎狐|hua:花画华化话划|huai:坏怀|huan:欢换缓焕|huang:黄|hui:回会卉灰绘挥毁恢|huo:货活获火或伙|ji:继计期季集鸡忌级圾积极及机技几己急记纪寄系吉寂|jia:价加家架甲|jian:建间捡坚件剑键见渐健艰|jiang:将匠浆酱姜桨奖|jiao:觉叫窖浇蕉椒酵骄脚交角|jie:结接节解界洁藉街介姐|jin:进禁金近紧尽今|jing:经警精景净井静|jiu:韭酒就旧|ju:具炬距菊居|juan:卷|jue:绝|jun:均军|ka:卡|kai:开楷|kan:看砍|kang:康|kao:烤|ke:可克客科刻|ken:肯|keng:坑|kong:空|kou:口|ku:库|kuai:块快|kuan:宽|kuang:框矿况|kui:葵馈愧魁|kun:捆昆|kuo:扩阔|la:蜡垃辣啦落|lai:来|lan:缆蓝栏榄懒兰览|lang:浪|lao:酪老劳牢|le:乐了|lei:类肋|leng:冷|li:利历里立栗李力犁理鲤离丽厉励礼莉|lian:连莲炼练|liang:量粮两梁良|liao:料|lie:列猎|lin:赁林|ling:灵零另令|liu:留浏|long:笼龙弄|lu:绿鹿路卢|luan:峦乱|lue:略|lun:伦|luo:萝罗洛|lv:率旅|ma:码吗马麻玛|mai:卖买麦霾|man:满蔓漫|mang:芒忙|mao:猫贸|me:么|mei:莓梅玫美没每霉|men:门们|meng:萌|mi:米咪弥迷蜜|mian:面眠缅|miao:苗妙|mie:灭|min:敏民|ming:明命名|mo:模磨默|mu:目木牧母墓|na:那拿纳呐哪|nai:奶耐|nan:南男难|nao:闹|ne:呢|neng:能|ni:你拟妮尼|nian:年酿念|nin:您|ning:宁|niu:牛|nong:农|nu:努|nuan:暖|nuo:诺|nv:女|pa:帕|pai:派牌排|pan:盘畔|pao:跑|pei:配佩陪|pen:盆|peng:膨棚朋|pi:批皮啤匹|pian:片|pin:品聘|ping:平苹|po:破|pu:璞葡普堡扑朴|qi:其启起奇汽器骑七妻气齐岂|qian:前钱|qiang:墙枪强|qiao:巧|qie:茄切惬|qin:亲|qing:请情清青庆轻|qiu:秋球求|qu:取曲去|quan:全权|que:确缺|qun:群|ran:然燃染|rang:壤让|re:热|ren:仁人任|reng:扔|ri:日|rong:容熔融|rou:肉|ru:入如|rui:锐|run:润|ruo:若|sa:洒撒|sai:赛塞|sao:扫骚|se:色|sen:森|sha:沙鲨|shan:删山闪善|shang:上商伤赏|shao:哨少烧绍|she:设奢折|shen:神深身什|sheng:剩生圣声牲|shi:石市示始使饰师式世时食士室是狮视十实拾事试适|shou:收售寿手受首守|shu:束数蔬输树鼠叔术殊舒书|shuang:双|shui:税睡水谁|shun:顺|shuo:说|si:斯丝饲思死|song:送松|su:苏|suan:算|sui:随碎虽|suo:所索锁|ta:他塌它她|tai:台太态泰|tan:摊毯滩探|tang:糖|tao:桃萄|te:特|teng:疼|ti:提屉体|tian:天田甜添|tiao:条跳挑|tie:铁|ting:停听庭|tong:桶通铜同|tou:头|tu:图土兔|tuan:团|tui:退腿推|tuo:托|wa:挖|wai:外|wan:晚万完玩湾|wang:网王往望忘|wei:为维位威围尾慰委卫味喂|wen:温闻文|wo:我卧|wu:午务无物武屋乌污雾|xi:戏西细夕吸希稀惜习|xia:下夏虾狭|xian:鲜限仙先现险献|xiang:向香像箱想享相响襄|xiao:消小销效|xie:谢些|xin:新心锌信|xing:杏型形性兴幸|xiong:熊雄兄|xiu:修休|xu:续许需须序蓄|xuan:旋选渲|xue:穴雪|xun:逊训薰|ya:亚芽呀娅|yan:炎言眼盐岩焰颜|yang:烊样洋羊养|yao:邀要腰耀鳐药遥|ye:夜业野爷也叶|yi:已以议移一宜椅衣仪意艺易异役溢|yin:音银阴引|ying:营樱影迎鹰应英赢|yong:佣用|you:游友有油又|yu:余于羽玉育鱼语誉屿愉郁渔与域裕予|yuan:员园圆鸢源愿援远缘|yue:越月跃悦|yun:运|za:扎杂|zai:在再|zan:咱暂|zang:脏|zao:造|ze:择|zeng:赠增|zha:榨|zhai:摘窄|zhan:战展|zhang:张账涨胀章障|zhao:找招着|zhe:这者|zhen:真榛帧镇砧震振枕珍|zheng:正证争整|zhi:之置致植质止汁制志只挚指纸枝织至秩知支|zhong:种中众|zhou:帚州周轴|zhu:主住筑烛竹猪柱助株逐|zhua:抓|zhuan:转|zhuang:装状庄壮|zhun:准|zhuo:桌琢卓|zi:子孜字资自滋|zong:总棕|zou:走|zu:租族足祖|zui:最|zuo:作做座");
				}
				_currentLanguage = text;
			}
		}

		private static void LoadPinyinData(string data)
		{
			string[] array = data.Split(new char[1] { '|' });
			foreach (string text in array)
			{
				int num = text.IndexOf(':');
				if (num <= 0)
				{
					continue;
				}
				string value = text.Substring(0, num);
				string text2 = text.Substring(num + 1);
				foreach (char key in text2)
				{
					if (!_pinyinMap.ContainsKey(key))
					{
						_pinyinMap[key] = value;
					}
				}
			}
		}

		public static string GetInitials(string text, string languageCode = "zh")
		{
			Initialize(languageCode);
			if (string.IsNullOrEmpty(text))
			{
				return string.Empty;
			}
			StringBuilder stringBuilder = new StringBuilder();
			foreach (char c in text)
			{
				if (_pinyinMap.TryGetValue(c, out var value))
				{
					if (value.Length > 0)
					{
						stringBuilder.Append(value[0]);
					}
				}
				else
				{
					stringBuilder.Append(c);
				}
			}
			return stringBuilder.ToString();
		}

		public static bool IsPinyinMatch(string input, string text, string languageCode = "zh")
		{
			Initialize(languageCode);
			if (string.IsNullOrEmpty(input))
			{
				return true;
			}
			if (string.IsNullOrEmpty(text))
			{
				return false;
			}
			List<string> pinyinTokens = GetPinyinTokens(text);
			string input2 = input.ToLowerInvariant();
			for (int i = 0; i < pinyinTokens.Count; i++)
			{
				if (MatchRecursiveTokens(input2, 0, pinyinTokens, i))
				{
					return true;
				}
			}
			return false;
		}

		private static List<string> GetPinyinTokens(string text)
		{
			List<string> list = new List<string>();
			foreach (char c in text)
			{
				if (_pinyinMap.TryGetValue(c, out var value))
				{
					list.Add(value);
				}
				else
				{
					list.Add(char.ToLowerInvariant(c).ToString());
				}
			}
			return list;
		}

		private static bool MatchRecursiveTokens(string input, int inputIdx, List<string> tokens, int tokenIdx)
		{
			if (inputIdx >= input.Length)
			{
				return true;
			}
			if (tokenIdx >= tokens.Count)
			{
				return false;
			}
			string text = tokens[tokenIdx];
			int num = 0;
			int num2 = Math.Min(input.Length - inputIdx, text.Length);
			for (int i = 0; i < num2 && input[inputIdx + i] == text[i]; i++)
			{
				num++;
			}
			if (num == 0)
			{
				return false;
			}
			for (int num3 = num; num3 >= 1; num3--)
			{
				if (MatchRecursiveTokens(input, inputIdx + num3, tokens, tokenIdx + 1))
				{
					return true;
				}
			}
			return false;
		}
	}
	public class FishingWorldMarkersController : MonoBehaviour
	{
		private readonly List<(FishingZone zone, GameObject marker)> _markers = new List<(FishingZone, GameObject)>();

		private Camera _cam;

		private bool _visible;

		private TMP_FontAsset _fontAsset;

		private Color _textColor = Color.white;

		private static bool _globalVisible;

		public static FishingWorldMarkersController Instance { get; private set; }

		public bool IsVisible => _visible;

		public static void Ensure()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)Instance != (Object)null))
			{
				Instance = new GameObject("FishingWorldMarkersController").AddComponent<FishingWorldMarkersController>();
				Instance.BuildMarkers();
				Instance.SetVisible(_globalVisible);
			}
		}

		public static void Toggle()
		{
			Ensure();
			bool flag = !Instance._visible;
			Instance.SetVisible(flag);
			_globalVisible = flag;
		}

		private void Awake()
		{
			//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)
			_cam = Camera.main;
			TextMeshProUGUI val = UIManager.Instance?.textCoins;
			if ((Object)(object)val != (Object)null)
			{
				_fontAsset = ((TMP_Text)val).font;
				_textColor = ((Graphic)val).color;
			}
			_visible = _globalVisible;
			LocalizationManager.OnLanguageChanged -= OnLanguageChanged;
			LocalizationManager.OnLanguageChanged += OnLanguageChanged;
		}

		private void OnDestroy()
		{
			if ((Object)(object)Instance == (Object)(object)this)
			{
				Instance = null;
			}
			LocalizationManager.OnLanguageChanged -= OnLanguageChanged;
		}

		private void Update()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: 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)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			if (!_visible)
			{
				return;
			}
			if ((Object)(object)_cam == (Object)null)
			{
				_cam = Camera.main;
			}
			Vector3 position = default(Vector3);
			foreach (var (val, val2) in _markers)
			{
				if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
				{
					continue;
				}
				Collider component = ((Component)val).GetComponent<Collider>();
				Vector3 val3;
				Bounds bounds;
				if (!Object.op_Implicit((Object)(object)component))
				{
					val3 = ((Component)val).transform.position;
				}
				else
				{
					bounds = component.bounds;
					val3 = ((Bounds)(ref bounds)).center;
				}
				Vector3 val4 = val3;
				float num;
				if (val4.y > 8f)
				{
					float y;
					if (!Object.op_Implicit((Object)(object)component))
					{
						y = val4.y;
					}
					else
					{
						bounds = component.bounds;
						y = ((Bounds)(ref bounds)).max.y;
					}
					num = y + 0.5f;
				}
				else
				{
					num = Mathf.Max(2.25f, val4.y + 2f);
				}
				((Vector3)(ref position))..ctor(val4.x, num, val4.z);
				val2.transform.position = position;
				if (Object.op_Implicit((Object)(object)_cam))
				{
					val2.transform.rotation = Quaternion.LookRotation(val2.transform.position - ((Component)_cam).transform.position, Vector3.up);
				}
			}
		}

		private void BuildMarkers()
		{
			ClearMarkers();
			FishingZone[] array = Object.FindObjectsOfType<FishingZone>(true);
			foreach (FishingZone val in array)
			{
				_markers.Add((val, CreateMarkerFor(val)));
			}
		}

		private GameObject CreateMarkerFor(FishingZone zone)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject($"FishingZoneMarker_{((Object)zone).GetInstanceID()}");
			SpriteRenderer obj = val.AddComponent<SpriteRenderer>();
			obj.sprite = UIManager.Instance?.spriteTask;
			obj.color = new Color(0f, 0.7f, 1f, 1f);
			((Renderer)obj).sortingOrder = 5000;
			GameObject val2 = new GameObject("Title");
			val2.transform.SetParent(val.transform, false);
			TextMeshPro val3 = val2.AddComponent<TextMeshPro>();
			((TMP_Text)val3).text = LocalizationManager.Instance.GetLocalizedText("fishing_world.title");
			if ((Object)(object)_fontAsset != (Object)null)
			{
				((TMP_Text)val3).font = _fontAsset;
			}
			((TMP_Text)val3).fontSize = 4.5f;
			((Graphic)val3).color = _textColor;
			((TMP_Text)val3).alignment = (TextAlignmentOptions)514;
			val3.sortingOrder = 5001;
			GameObject val4 = new GameObject("FishList");
			val4.transform.SetParent(val.transform, false);
			float num = BuildFishRows(val4, zone);
			float num2 = 0.8f;
			float num3 = 1.2f;
			float num4 = num3;
			if (num > 0f)
			{
				num4 = num3 + (num - num2);
			}
			val4.transform.localPosition = Vector3.up * num4;
			val2.transform.localPosition = Vector3.up * (num4 + 1f);
			float num5 = 0.8f;
			val.transform.localScale = new Vector3(num5, num5, num5);
			return val;
		}

		private float BuildFishRows(GameObject parent, FishingZone zone)
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Expected O, but got Unknown
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			//IL_0317: Unknown result type (might be due to invalid IL or missing references)
			//IL_0344: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			List<(ItemSO, bool)> list = ((zone.fishes != null) ? (from f in zone.fishes
				where f != null && (Object)(object)f.itemSO != (Object)null
				select (f.itemSO, !f.allowFishingRod)).ToList() : new List<(ItemSO, bool)>());
			int count = list.Count;
			if (count == 0)
			{
				GameObject val = new GameObject("Empty");
				val.transform.SetParent(parent.transform, false);
				val.transform.localPosition = Vector3.zero;
				TextMeshPro val2 = val.AddComponent<TextMeshPro>();
				((TMP_Text)val2).text = LocalizationManager.Instance.GetLocalizedText("fishing_world.no_fish");
				if ((Object)(object)_fontAsset != (Object)null)
				{
					((TMP_Text)val2).font = _fontAsset;
				}
				((TMP_Text)val2).fontSize = 3.5f;
				((Graphic)val2).color = _textColor;
				((TMP_Text)val2).alignment = (TextAlignmentOptions)514;
				val2.sortingOrder = 5001;
				return 0f;
			}
			float num = Mathf.Round((float)zone.probability * 100f / (float)count) / 100f;
			float num2 = 0f;
			float num3 = 0.8f;
			float num4 = 0.2f;
			foreach (var item3 in list)
			{
				ItemSO item = item3.Item1;
				bool item2 = item3.Item2;
				GameObject val3 = new GameObject($"Row_{item.id}");
				val3.transform.SetParent(parent.transform, false);
				val3.transform.localPosition = new Vector3(0f, 0f - num2, 0f);
				GameObject val4 = new GameObject("Icon");
				val4.transform.SetParent(val3.transform, false);
				SpriteRenderer val5 = val4.AddComponent<SpriteRenderer>();
				val5.sprite = item.sprite;
				if ((Object)(object)val5.sprite == (Object)null)
				{
					val5.sprite = UIManager.Instance?.spriteTask;
				}
				val5.color = Color.white;
				((Renderer)val5).sortingOrder = 5001;
				float num5 = EnsureFixedIconSize(val5, 0.7f);
				GameObject val6 = new GameObject("Text");
				val6.transform.SetParent(val3.transform, false);
				TextMeshPro val7 = val6.AddComponent<TextMeshPro>();
				((TMP_Text)val7).rectTransform.pivot = new Vector2(0f, 0.5f);
				string localizedName = item.GetLocalizedName();
				string localizedString = LocalizationSettings.StringDatabase.GetLocalizedString(TableReference.op_Implicit("Translations"), TableEntryReference.op_Implicit("fish_trap"), (Locale)null, (FallbackBehavior)0, Array.Empty<object>());
				string arg = (item2 ? (LocalizationManager.Instance.GetLocalizedText("fishing_world.trap_need") + localizedString + ", ") : string.Empty);
				((TMP_Text)val7).text = $"{localizedName} ({arg}{num}%)";
				if ((Object)(object)_fontAsset != (Object)null)
				{
					((TMP_Text)val7).font = _fontAsset;
				}
				((TMP_Text)val7).fontSize = 3.8f;
				((Graphic)val7).color = _textColor;
				((TMP_Text)val7).alignment = (TextAlignmentOptions)513;
				val7.sortingOrder = 5001;
				((TMP_Text)val7).ForceMeshUpdate(false, false);
				float x = ((TMP_Text)val7).GetPreferredValues().x;
				float num6 = (0f - (num5 + num4 + x)) / 2f;
				val4.transform.localPosition = new Vector3(num6 + num5 / 2f, 0f, 0f);
				val6.transform.localPosition = new Vector3(num6 + num5 + num4, 0f, 0f);
				num2 += num3;
			}
			return num2;
		}

		private void OnLanguageChanged(string newLocale)
		{
			bool visible = _visible;
			BuildMarkers();
			SetVisible(visible);
		}

		private float EnsureFixedIconSize(SpriteRenderer icon, float targetHeight)
		{
			//IL_0029: 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_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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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)
			Sprite sprite = icon.sprite;
			if ((Object)(object)sprite == (Object)null)
			{
				((Component)icon).transform.localScale = Vector3.one * targetHeight;
				return targetHeight;
			}
			Bounds bounds = sprite.bounds;
			Vector3 size = ((Bounds)(ref bounds)).size;
			float num = Mathf.Max(0.0001f, size.y);
			float num2 = targetHeight / num;
			((Component)icon).transform.localScale = new Vector3(num2, num2, 1f);
			return size.x * num2;
		}

		private void ClearMarkers()
		{
			foreach (var marker in _markers)
			{
				if (Object.op_Implicit((Object)(object)marker.marker))
				{
					Object.Destroy((Object)(object)marker.marker);
				}
			}
			_markers.Clear();
		}

		private void SetVisible(bool show)
		{
			_visible = show;
			foreach (var marker in _markers)
			{
				if (Object.op_Implicit((Object)(object)marker.marker))
				{
					marker.marker.SetActive(show);
				}
			}
		}
	}
	public static class InputActionBindingHelper
	{
		public static InputAction CreateButtonAction(string actionName, string hotkey, Action onPerformed)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			string text = BuildBindingPath(hotkey);
			if (string.IsNullOrWhiteSpace(text))
			{
				return null;
			}
			InputAction val = new InputAction(actionName, (InputActionType)1, text, (string)null, (string)null, (string)null);
			if (onPerformed != null)
			{
				val.performed += delegate
				{
					onPerformed();
				};
			}
			val.Enable();
			return val;
		}

		public static string BuildBindingPath(string hotkey)
		{
			if (string.IsNullOrWhiteSpace(hotkey))
			{
				return null;
			}
			string text = hotkey.Trim();
			if (text.Contains("<") && text.Contains(">"))
			{
				return text;
			}
			string text2 = text.ToLowerInvariant();
			return text2 switch
			{
				"leftbutton" => "<Mouse>/leftButton", 
				"rightbutton" => "<Mouse>/rightButton", 
				"middlebutton" => "<Mouse>/middleButton", 
				"backbutton" => "<Mouse>/backButton", 
				"forwardbutton" => "<Mouse>/forwardButton", 
				"buttonsouth" => "<Gamepad>/buttonSouth", 
				"buttoneast" => "<Gamepad>/buttonEast", 
				"buttonwest" => "<Gamepad>/buttonWest", 
				"buttonnorth" => "<Gamepad>/buttonNorth", 
				"leftshoulder" => "<Gamepad>/leftShoulder", 
				"rightshoulder" => "<Gamepad>/rightShoulder", 
				"lefttrigger" => "<Gamepad>/leftTrigger", 
				"righttrigger" => "<Gamepad>/rightTrigger", 
				"dpadup" => "<Gamepad>/dpad/up", 
				"dpaddown" => "<Gamepad>/dpad/down", 
				"dpadleft" => "<Gamepad>/dpad/left", 
				"dpadright" => "<Gamepad>/dpad/right", 
				"startbutton" => "<Gamepad>/start", 
				"selectbutton" => "<Gamepad>/select", 
				"leftstickpress" => "<Gamepad>/leftStickPress", 
				"rightstickpress" => "<Gamepad>/rightStickPress", 
				_ => "<Keyboard>/" + text2, 
			};
		}

		public static string FormatHotkeyForDisplay(string s)
		{
			if (string.IsNullOrWhiteSpace(s))
			{
				return string.Empty;
			}
			s = s.Trim();
			if (s.Length == 1)
			{
				return s.ToUpperInvariant();
			}
			if (s[0] == 'f' || s[0] == 'F')
			{
				bool flag = true;
				for (int i = 1; i < s.Length; i++)
				{
					if (!char.IsDigit(s[i]))
					{
						flag = false;
						break;
					}
				}
				if (flag)
				{
					return ("F" + s.Substring(1)).ToUpperInvariant();
				}
			}
			string text = s.ToLowerInvariant();
			switch (text)
			{
			case "leftbutton":
				return "Mouse Left";
			case "rightbutton":
				return "Mouse Right";
			case "middlebutton":
				return "Mouse Middle";
			case "backbutton":
				return "Mouse Back";
			case "forwardbutton":
				return "Mouse Forward";
			case "buttonsouth":
				return "Gamepad A";
			case "buttoneast":
				return "Gamepad B";
			case "buttonwest":
				return "Gamepad X";
			case "buttonnorth":
				return "Gamepad Y";
			case "leftshoulder":
				return "Gamepad LB";
			case "rightshoulder":
				return "Gamepad RB";
			case "lefttrigger":
				return "Gamepad LT";
			case "righttrigger":
				return "Gamepad RT";
			case "dpadup":
				return "D-Pad Up";
			case "dpaddown":
				return "D-Pad Down";
			case "dpadleft":
				return "D-Pad Left";
			case "dpadright":
				return "D-Pad Right";
			case "startbutton":
				return "Gamepad Start";
			case "selectbutton":
				return "Gamepad Select";
			case "leftstickpress":
				return "Left Stick Press";
			case "rightstickpress":
				return "Right Stick Press";
			default:
				switch (text.Length)
				{
				case 5:
					switch (text[0])
					{
					case 's':
						if (!(text == "slash"))
						{
							break;
						}
						return "/";
					case 'm':
						if (!(text == "minus"))
						{
							break;
						}
						return "-";
					case 'c':
						if (!(text == "comma"))
						{
							break;
						}
						return ",";
					case 'q':
						if (!(text == "quote"))
						{
							break;
						}
						return "'";
					}
					break;
				case 9:
					switch (text[4])
					{
					case 's':
						if (!(text == "backslash"))
						{
							break;
						}
						return "\\";
					case 'c':
						if (!(text == "semicolon"))
						{
							break;
						}
						return ";";
					case 'q':
						if (!(text == "backquote"))
						{
							break;
						}
						return "`";
					}
					break;
				case 6:
					switch (text[0])
					{
					case 'e':
						if (!(text == "equals"))
						{
							break;
						}
						return "=";
					case 'p':
						if (!(text == "period"))
						{
							break;
						}
						return ".";
					}
					break;
				case 4:
					if (!(text == "plus"))
					{
						break;
					}
					return "+";
				case 11:
					if (!(text == "leftbracket"))
					{
						break;
					}
					return "[";
				case 12:
					if (!(text == "rightbracket"))
					{
						break;
					}
					return "]";
				}
				break;
			case null:
				break;
			}
			switch (text)
			{
			case "alt":
			case "ctrl":
			case "shift":
			case "enter":
			case "space":
			case "escape":
			case "esc":
			case "tab":
			case "backspace":
			case "capslock":
				return char.ToUpper(s[0]) + s.Substring(1).ToLowerInvariant();
			case "leftalt":
				return "LeftAlt";
			case "rightalt":
				return "RightAlt";
			case "leftctrl":
				return "LeftCtrl";
			case "rightctrl":
				return "RightCtrl";
			case "leftshift":
				return "LeftShift";
			case "rightshift":
				return "RightShift";
			default:
				return char.ToUpper(s[0]) + s.Substring(1).ToLowerInvariant();
			}
		}
	}
	public static class JapaneseRomaji
	{
		private static Dictionary<char, string> _romajiMap;

		private static bool _initialized;

		private const string KanjiData = "a:亜阿|ai:愛埃|aku:悪|an:安暗案|ann:案|asa:朝麻|ashi:足葦|asu:明|ata:当|atara:新|ato:後|ba:場馬婆|bai:倍売梅買|ban:晩番盤板|bat:罰|batsu:罰|be:部|bei:米|kome:米|ben:本|bi:美鼻備|bin:便瓶|bo:母墓慕簿|boku:木僕|bu:部歩|bun:分文聞|byo:秒病|byou:秒病|cha:茶|chi:千地知血遅置値乳稚|chiku:竹畜築|chin:賃沈珍|cho:貯著|chou:長鳥朝町調帳張庁頂蝶貯著|chu:中注昼|chuu:中注昼虫|da:打駄|dai:大代台第題内|dan:男暖段弾団|datsu:脱|de:出|den:田電伝殿|do:土度努怒|doku:読独毒|don:丼曇|dou:同動堂道童働銅導|e:絵枝重|ei:英映栄営衛泳|eki:駅役液易益|en:円園遠塩演延煙炎|etsu:越悦|fu:父不布風婦負富浮腐敷膚賦譜|fui:吹|fuku:福服複腹復幅副吹|fun:分紛粉|furi:降|furu:古降震|fusa:塞|fuse:防|futa:二蓋|futatabi:再|futo:太|fuy:冬|fuyu:冬|ga:画賀芽牙蛾雅餓駕|gai:外害街概該涯垣|gaku:学楽額岳|gan:岩顔岸丸含眼願元|gatsu:月|ge:下夏外化解毛|gei:芸迎鯨|gek:激|geki:劇激撃隙|gen:元言原減現源厳限眼|getsu:月|gi:気技義疑議儀犠|gin:銀吟|go:五午後語誤護互呉娯|goku:極獄|gomu:護謨|gon:言|gu:具愚虞|gun:軍郡群|gya:逆ギャ|gyak:逆|gyaku:逆|gyo:魚漁御|gyou:業行形|gyu:牛|gyuu:牛|ha:八波破葉派羽歯覇把|hai:入配倍敗背杯廃拝灰肺|hak:白|haku:白博泊拍薄迫舶|han:半反飯板版判犯班般繁販範煩|hana:花鼻放離|har:春晴|hara:原腹払|hari:針|haru:春晴|has:橋|hashi:橋箸端走|hat:八発|hatsu:発初髪伐|haya:早速|he:戸|hei:平兵閉並幣弊|hen:変編辺返偏片|hi:日火費飛悲彼比皮肥非秘疲被避陽干|hibi:響|hidari:左|higashi:東|hik:光引|hika:光|hiki:引|hiku:引低|hima:暇|hin:品貧頻浜賓|hir:昼|hira:平開枚|hiro:広拾|hiru:昼|his:久|hisa:久|hisho:秘書|hit:一|hito:一人|hiza:膝|ho:歩保捕補舗穂帆|hod:程|hodo:程|hog:保護|hogo:保護|hok:北|hoku:北|hon:本翻|hos:星干細|hoshi:星干欲|hoso:細|hot:発|hotoke:仏|hou:方法包訪豊放報宝崩抱縫芳|hyak:百|hyaku:百|hyo:表評氷標俵票漂|hyou:表評氷標俵票漂|i:一以位囲委意移胃衣医依井威為異遺維伊鋳居射|ichi:一市位置|ie:家|ik:行生|ika:行怒|iki:行息域|iku:育幾|in:員院飲因印引隠陰|iro:色|is:石|isha:医者|ishi:石医師意志|iso:急忙|it:一|ita:板痛致|ito:糸|its:五|itsu:五逸|iu:言|iw:岩祝|iwa:岩祝|ja:蛇邪|jak:弱若|jaku:弱若寂|ji:二字寺時次耳事自治持示磁似児辞慈滋|jik:直|jiki:直食磁|jin:人神尽仁迅甚陣尋|jish:辞書|jisho:辞書|jits:実|jitsu:日実術|jo:女除序助叙徐|jou:上定場乗城状常情条譲醸嬢錠畳浄縄|ju:十手受授樹需呪|juk:熟|juku:熟塾|jun:順純準潤巡殉|juu:十重住充銃獣縦|ka:下火花何化加夏家科果歌河価荷課可仮過架佳街嘉暇禍稼箇蚊|kai:会海回開階貝買改界械快灰解介絵塊怪悔壊懐戒皆諧|kak:各角書|kaku:角客画格確覚核革郭隔獲嚇穫|kam:神紙|kami:上神紙髪|kan:間寒感漢館完官管干幹刊患慣観歓監緩環甘艦肝冠勘勧|kang:考|kanga:考|kao:顔|kar:軽借刈|kara:空唐辛|kari:借狩|karu:軽刈|kas:貸傘|kasa:傘重|kashi:貸菓|kata:方形肩硬片語賢|kat:勝|katsu:活勝割滑喝褐轄|kaw:川革河|kawa:川革河皮乾|kay:通|kayo:通|ke:気家毛化怪|kei:計京形軽景系経警芸掲恵傾継契刑茎鶏|kek:決|ken:見犬健県建験件険検研券憲賢謙圏肩献権顕拳|ketsu:決結血欠潔穴傑|ki:気木記起期喜機帰貴危基奇寄規紀幾揮輝飢騎既棋棄祈季稀|kik:聞|kiki:聞危機|kiku:聞菊効|kim:決君|kime:決|kimi:君|kin:金近今禁勤均筋琴菌巾襟欣|kir:切着霧|kiri:切霧|kiru:切着|kish:岸|kishi:岸騎士|kit:北切|kita:北来汚|kitsu:吉喫詰|ko:子小古戸湖個庫呼枯雇固粉己狐顧鼓誇|kob:交|kobo:零|koe:声肥|koi:恋濃鯉|kok:国黒|koku:国谷刻告黒穀酷克|kom:混込|kome:米込|komu:込混|kon:今困根婚混紺魂恨献|koo:氷|kori:氷|kor:氷凍|koro:転殺頃|kos:腰越|koshi:腰越|kota:答|koto:事言異琴|kou:高口工公行考光好降紅広更港鋼甲香厚耕侯航荒硬綱鉱構皇后抗拘貢講購効候|ku:九口空苦工区具紅供久句食暮駆|kubi:首|kud:下果|kuda:下|kudamono:果物|kue:机|kui:食杭|kuj:鯨|kuji:鯨籤|kum:組雲|kuma:熊|kumi:組|kumo:雲蜘蛛|kun:君訓薫勲|kur:黒暗車|kura:暗蔵倉|kuri:栗繰|kuru:来狂|kus:薬草|kusa:草臭腐|kushi:串櫛|kuso:糞|kut:靴|kutsu:靴屈掘|kuu:空食|ky:木|kyaku:客脚却|kyo:去巨居拒挙拠許虚|kyou:京強教橋境競共恐協胸供郷叫狂鏡狭脅興響驚|kyu:九休|kyuu:九休急球宮究級求泣救吸旧給久牛窮巨弓丘|ma:間真馬魔麻摩磨|mai:毎妹米買枚埋舞|mak:巻負幕|maka:任|maki:巻薪|maku:幕巻撒|man:万満漫慢|mar:丸|maru:丸|mas:増|masa:正|mash:増|mashi:増|masu:増升|mat:待松末|mata:又股|matsu:待松末祭抹|may:迷眉|mayo:迷|mayu:眉|me:目芽女|mei:名明命迷盟銘鳴姪|men:面綿免麺|metsu:滅|mi:三見身美実未味海魅|mich:道|michi:道|mid:緑|mido:緑|midori:緑|mie:見|mig:右磨|migi:右|miga:磨|mik:三|mika:三|mim:耳|mimi:耳|min:民眠皆|mina:皆港|minato:港|mir:見|miru:見|mis:店|mise:店|mit:三|mitsu:三密蜜|miz:水瑞|mizu:水瑞|mo:木茂模藻|mochi:持餅|mod:戻|modo:戻|mok:木黙|moku:木目黙牧|mom:紅葉|momi:紅葉|mon:門問文|mono:物者|mor:森盛漏守|mori:森盛漏守|mos:燃|mosu:燃|mot:持本元求|moto:本元素|mots:持|motsu:物持|mu:六無務夢武墓麦矛霧|mugi:麦|muk:向剥|muka:向迎|muki:向|muku:向剥|mun:胸|mune:胸棟宗|mur:村|mura:村群斑|mus:虫蒸結|mushi:虫蒸無視|musu:結|mut:六|mutsu:六睦|myo:名|myou:名明妙苗|n:ん|na:七名何南魚菜那奈|naga:長流|nagare:流|nage:投|nai:内無奈|nak:中泣|naka:中仲|naki:泣|nam:波並涙|nama:生|nami:波並|nan:南何難軟男|nana:七|nao:直治|nar:鳴成習|nara:習奈良並|nari:成鳴|nas:茄|nasu:茄成|nat:夏|natsu:夏懐|naw:縄|nawa:縄|nay:悩|naya:悩|ne:音根寝値子|neg:願|nega:願|nei:寧|nek:猫|neko:猫|nem:眠|nemu:眠|nen:年念燃粘|ner:練寝|neru:練寝|netsu:熱|ni:二日似煮荷肉泥尼|nich:日|nichi:日|nig:逃握苦|niga:苦|nige:逃|nigi:握|nik:肉日|niku:肉憎|nin:人任忍認妊|nir:煮|niru:煮|nis:西|nishi:西|niw:庭|niwa:庭鶏|no:野能農納之|nob:登伸|nobo:登上|nok:残|noko:残|nom:飲|nomu:飲|non:暖|nor:乗法|nori:乗法海苔|nos:載|nose:載|not:後|nozo:除|nu:布塗縫|nug:脱|nugu:脱|nui:縫|nuk:抜|nuku:抜温|num:沼|numa:沼|nun:布|nuno:布|nur:塗|nuru:塗温|nus:盗|nusu:盗|nyo:女如|nyou:尿|nyu:入乳|nyuu:入乳柔|o:小尾雄緒|oa:終|och:落|ochi:落|od:踊|odo:踊|odor:踊|odori:踊|oe:終|oi:老追甥|ok:億屋置奥|oka:丘岡|oki:置起沖|oko:行怒|okor:怒|okori:怒|okoru:怒|oku:億屋置奥贈遅|okur:送贈|okuri:送贈|om:重思|omo:重思面主|omoi:重思|omot:表|omote:表|on:音温恩遠|onna:女|oo:大多王往央|or:折降織|ori:折降織|os:押恐教雄襲推|osa:長納治修|oshi:教押惜|oso:遅恐襲|osor:恐|osore:恐|ot:音落乙|oto:音弟夫|otoko:男|ototo:弟|otouto:弟|ou:王黄横欧追応央奥|ow:終|owa:終|oy:親泳|oya:親|oyo:泳|pa:派把|pai:牌|pan:般|patsu:発|pe:頁|pei:平|pen:片|pi:皮否比|pika:光|pin:品貧頻|po:歩舗|pon:本|pp:葉|ppu:葉|ra:羅裸良楽|rai:来雷頼礼|rak:楽落|raku:楽落絡酪|ran:乱卵欄蘭覧嵐|rei:礼例冷零霊励麗鈴令齢|rek:歴|reki:歴|ren:連練恋蓮|retsu:列烈裂|ri:六理利里裏離履梨吏|rik:六陸力|riku:六陸|rin:林輪臨隣鈴倫|ritsu:立率律栗|ro:六路露炉老呂魯|rok:六録|roku:六録鹿|ron:論|rou:労老郎朗浪廊漏楼蝋|ru:流留類|rui:類涙塁累|ryo:旅両領漁猟慮|ryou:旅両領漁猟慮涼良量料療僚寮菱|ryu:流留竜柳|ryuu:流留竜柳隆粒硫|sa:三差佐左沙砂鎖詐サ|sab:寂|sabi:寂錆|sag:下探|saga:探|sage:下|sai:西細最再祭菜採妻裁彩際済災砕|sak:作昨策桜咲|saka:坂酒逆栄|sakai:境|sakan:盛|sakana:魚|sake:酒鮭叫避|saki:先咲|saku:作昨策桜咲柵索錯酢|sam:寒冷|sama:様|same:冷覚鮫|san:三山算参散産賛酸傘惨|sara:皿更|sas:指刺|sasa:支笹|sashi:指刺差|sat:殺撮冊察|satsu:札殺察撮刷冊|saw:騒|sawa:騒触沢|say:鞘|saya:鞘|se:世背施瀬|sei:生正青西声製性誠世勢整静星制精税政成晴清聖征誓|seki:石赤関席責積昔夕析惜籍跡|sem:狭攻|sema:狭|seme:攻|sen:千川先線戦選専船洗泉浅銭宣鮮仙扇栓潜占|set:雪説切折接|setsu:雪説切折接設節殺|sha:社車者写謝射砂煮遮捨|shak:借尺石赤|shaku:借尺石赤酌爵釈|shi:四市矢糸私紙指脂姉氏子支始使死試詩志思姿視紫史司飼師施資至詞歯誌|shiba:芝縛|shibaraku:暫|shichi:七質|shig:仕事|shige:茂|shigi:鴫|shik:敷識|shika:鹿然|shiki:色式指揮識敷|shim:島閉|shima:島縞|shime:閉絞占|shin:新心神親身森真信進深申震浸寝針慎伸振辛|shinju:真珠|shio:塩潮|shir:白知|shira:白調|shiro:白城代|shiru:汁知|shish:獅|shishi:獅子|shita:下舌|shits:室失質漆執湿|shitsu:室失質漆執湿叱嫉|shiz:静沈|shizu:静沈雫|sho:小少書所初諸署緒暑庶処|shok:食職色植触|shoku:食職色植触燭飾|shoo:消|shou:少正生小商勝証象消賞将章障傷焦照承招咲床症召|shu:手主守首朱酒種取趣狩|shuk:宿縮祝|shuku:宿縮祝粛淑|shun:春瞬旬俊|shut:出|shutsu:出術|shuu:週集終習衆州舟秀周拾執宗就修愁臭|so:十祖素組租粗|sod:育|soda:育|soe:添|sok:速測足即束促息|soku:速測足即束促息則側塞|son:村存損尊孫|sor:空|sora:空|sore:其|soro:揃|sot:卒外|sotsu:卒率|soto:外|sou:早草走送想争相窓層装燥総捜掃双僧遭槽桑創葬奏|su:水素酢主守巣砂|sub:滑|sube:滑統|sud:既|sude:既|sue:末据|sug:過杉|sugi:過杉|sugu:直|sui:水吸吹推粋酔遂睡穂|suk:好透空少|suka:透|suki:好梳|suku:少救|sum:住済澄墨隅|sumi:住済澄墨隅炭|sumu:住済澄|sun:寸損|sur:刷|suri:刷|suru:為|sus:進|susu:進煤勧|sut:捨廃|sute:捨|suu:数吸枢|suw:座|suwa:座|suz:涼鈴|suzu:涼鈴|ta:田多他手太足|tab:食旅|tabe:食|tabi:旅度|tach:立|tachi:立達断裁|tad:正唯|tada:正唯|tae:絶耐|tag:耕|taga:耕|tai:体隊待対退太貸帯台泰袋態耐替滞|tak:高竹宅|taka:高鷹|taki:滝炊焚|taku:宅卓拓沢託濯|tam:玉球|tama:玉球弾魂|tame:溜|tami:民|tan:単短炭端反担探淡誕嘆|tana:棚店|tane:種|tani:谷|tano:楽頼|tao:倒|tar:足樽垂|tari:足|taru:樽垂|tas:助足|tashi:足|tasu:助足|tat:立建達断裁|tata:戦畳叩|tatak:戦叩|tataka:戦|tataku:叩|tate:建立盾縦|tato:例|tatsu:立建達断裁龍竜辰|tay:頼|tayo:頼|te:手|tei:定低庭弟提停底程廷呈貞堤帝訂|tek:的鉄敵適|teki:的敵適滴|ten:天店点転展典添|ter:照|tera:寺照|teru:照|tes:鉄|tetsu:鉄哲徹撤|to:十戸徒都土渡登塗賭途|tob:飛跳|tobi:飛跳|tobu:飛跳|tod:届|todo:届|tog:研|toga:研|toh:遠|toho:徒歩|toi:問遠樋|tok:特徳得|toke:時計|toki:時溶|toko:床常|toku:特徳得読解督篤|tom:止泊富友|toma:止泊|tomo:友共供智伴|ton:豚遁頓|tonari:隣|too:十遠通|tor:取鳥捕撮盗採|tori:鳥取捕撮盗採通|toru:取捕撮盗採|tos:年|toshi:年都市|tot:整|toto:整|totsu:突凸|tou:東当投冬刀島湯答頭等登統盗透到党塔倒陶凍糖筒桃闘|tsu:津通都|tsub:粒|tsuba:翼椿|tsubo:壺坪|tsubu:粒潰|tsuch:土|tsuchi:土槌|tsud:集|tsudo:集|tsug:次継告|tsugi:次継|tsugu:継告|tsui:対墜追|tsuk:月着作付突使疲漬机|tsuka:使塚掴束遣|tsukau:使|tsuke:付漬|tsuki:月付突|tsuku:作着付突就|tsuma:妻|tsume:爪冷詰|tsumi:罪積摘|tsumori:積|tsumu:積紡|tsun:常|tsune:常|tsuno:角|tsur:釣連|tsura:辛|tsure:連|tsuri:釣|tsuru:鶴釣|tsut:伝蔦|tsuta:伝蔦|tsutaw:伝|tsuto:勤努|tsutsum:包|tsutsumu:包|tsuy:強|tsuyo:強|u:右雨宇羽有生売牛受打歌海産|ub:奪|uba:奪|ube:諾|uchi:内打家|ud:腕|ude:腕|ue:上植飢|ug:動|ugo:動|ugok:動|ugoki:動|ui:初|uj:氏|uji:氏|uk:受浮|uka:浮|uke:受|um:生馬梅海産埋熟|uma:馬甘旨|ume:梅埋|umi:海産膿|un:運雲|ur:売裏占|ura:裏浦恨|ure:売|uri:売瓜|uru:売潤|us:薄失牛臼|ushi:牛失後|uso:嘘|usagi:兎|usu:薄臼|ut:歌打写|uta:歌|utsu:打写移映|utsuk:美|utsukushi:美|uw:上|uwa:上|uy:敬|uya:敬|w:和輪|wa:和話輪羽環我|wai:歪賄|wak:分若湧枠|waka:分若|waki:脇湧|waku:枠惑沸|wan:湾腕椀|war:割悪笑|wara:笑藁|waru:悪割|was:忘|wasu:忘|wasure:忘|wat:渡綿|wata:綿|watas:渡|watashi:私渡|waz:技|waza:技|wo:を|y:矢|ya:八矢屋谷夜野也耶|yak:役薬焼訳約厄|yaku:役薬焼訳約厄躍益|yam:山止病|yama:山|yame:止|yami:止病闇|yan:柳|yane:屋根|yas:安休易|yasa:優易|yashi:養癒椰|yasu:安休|yat:雇|yato:雇|yo:四世代夜予余預善誉与|yob:呼|yobu:呼|yog:汚|yogo:汚|yok:欲横翌浴抑|yoke:避除|yoko:横|yoku:欲翌浴抑|yom:読|yomu:読|yon:四|yor:寄頼選喜|yori:寄頼選|yoru:夜寄選|yos:寄|yose:寄|yoshi:良吉芳|yot:四|yots:四|yotsu:四|you:用洋羊曜要容葉陽様幼溶腰踊謡養擁窯傭|yow:弱|yowa:弱|yu:湯油由輸諭癒諭|yubi:指|yue:故|yui:結唯遺|yuk:行雪|yuka:床愉快|yuki:雪行|yuku:行|yum:夢弓|yume:夢|yumi:弓|yun:輸入|yuu:夕友有勇遊郵優融|z:図|za:座雑|zai:在財材罪剤|zak:雑|zaku:雑|zan:残山暫|zar:皿|zara:皿|zas:雑|zatsu:雑|ze:是税|zei:税|zen:全前然善禅漸繕膳|zetsu:舌絶|zi:字自事辞慈滋磁|zo:象蔵|zok:族続|zoku:族続属賊|zon:存|zou:造像増臓蔵象憎|zu:図頭豆|zun:寸|zut:頭|zutsu:頭|tamago:卵|shou:醤|so:噌|ryou:了|aki:秋|choku:捗|kezu:削|juu:従|shuu:収酬|osa:収|kaku:拡描|hiro:拡|oroshi:卸|gou:合豪|a:合|sai:栽幸|bai:培|fu:埠普|ka:貨掛華|kakari:係|kei:係型兄|shou:昇詳紹|nobo:昇|kabe:壁|mou:猛|tobira:扉|kuwa:鍬詳|hana:華|kan:缶看|kata:型|chin:陳|han:搬|fue:笛|kage:影|ei:影|jiku:軸|gan:頑|sao:竿|chou:彫|ho:彫褒|juu:絨|tan:毯鍛|hachi:鉢蜂|kago:籠|hako:箱|ami:網|byou:描|kyo:距況|taku:択|hone:骨|kotsu:骨|bou:棒房亡|en:鉛宴援|namari:鉛|chuu:鍮抽柱|ken:剣|tou:灯|akari:灯|ki:器|utsuwa:器|ya:冶|oni:鬼|ine:稲|tsu:吊|ren:錬|kama:釜|saru:猿|nezumi:鼠|tora:虎|saku:搾|shibo:搾|hashira:柱|hitsu:必|kanara:必|hiki:匹|dou:洞|hora:洞|kutsu:窟|chiga:違|kou:江功康|e:江|hatake:畑|shiawa:幸|chitsu:秩|shuku:叔|fusa:房|on:穏|oda:穏|chiku:蓄|takuwa:蓄|tai:怠|okota:怠|betsu:別|waka:別|utage:宴|ore:俺|na:亡|ani:兄|jou:穣|etsu:閲";

		public static Dictionary<char, string> GetRomajiMap()
		{
			if (_initialized)
			{
				return _romajiMap;
			}
			Initialize();
			return _romajiMap;
		}

		public static void Initialize()
		{
			if (!_initialized)
			{
				_romajiMap = new Dictionary<char, string>();
				AddKana();
				ProcessKanjiData("a:亜阿|ai:愛埃|aku:悪|an:安暗案|ann:案|asa:朝麻|ashi:足葦|asu:明|ata:当|atara:新|ato:後|ba:場馬婆|bai:倍売梅買|ban:晩番盤板|bat:罰|batsu:罰|be:部|bei:米|kome:米|ben:本|bi:美鼻備|bin:便瓶|bo:母墓慕簿|boku:木僕|bu:部歩|bun:分文聞|byo:秒病|byou:秒病|cha:茶|chi:千地知血遅置値乳稚|chiku:竹畜築|chin:賃沈珍|cho:貯著|chou:長鳥朝町調帳張庁頂蝶貯著|chu:中注昼|chuu:中注昼虫|da:打駄|dai:大代台第題内|dan:男暖段弾団|datsu:脱|de:出|den:田電伝殿|do:土度努怒|doku:読独毒|don:丼曇|dou:同動堂道童働銅導|e:絵枝重|ei:英映栄営衛泳|eki:駅役液易益|en:円園遠塩演延煙炎|etsu:越悦|fu:父不布風婦負富浮腐敷膚賦譜|fui:吹|fuku:福服複腹復幅副吹|fun:分紛粉|furi:降|furu:古降震|fusa:塞|fuse:防|futa:二蓋|futatabi:再|futo:太|fuy:冬|fuyu:冬|ga:画賀芽牙蛾雅餓駕|gai:外害街概該涯垣|gaku:学楽額岳|gan:岩顔岸丸含眼願元|gatsu:月|ge:下夏外化解毛|gei:芸迎鯨|gek:激|geki:劇激撃隙|gen:元言原減現源厳限眼|getsu:月|gi:気技義疑議儀犠|gin:銀吟|go:五午後語誤護互呉娯|goku:極獄|gomu:護謨|gon:言|gu:具愚虞|gun:軍郡群|gya:逆ギャ|gyak:逆|gyaku:逆|gyo:魚漁御|gyou:業行形|gyu:牛|gyuu:牛|ha:八波破葉派羽歯覇把|hai:入配倍敗背杯廃拝灰肺|hak:白|haku:白博泊拍薄迫舶|han:半反飯板版判犯班般繁販範煩|hana:花鼻放離|har:春晴|hara:原腹払|hari:針|haru:春晴|has:橋|hashi:橋箸端走|hat:八発|hatsu:発初髪伐|haya:早速|he:戸|hei:平兵閉並幣弊|hen:変編辺返偏片|hi:日火費飛悲彼比皮肥非秘疲被避陽干|hibi:響|hidari:左|higashi:東|hik:光引|hika:光|hiki:引|hiku:引低|hima:暇|hin:品貧頻浜賓|hir:昼|hira:平開枚|hiro:広拾|hiru:昼|his:久|hisa:久|hisho:秘書|hit:一|hito:一人|hiza:膝|ho:歩保捕補舗穂帆|hod:程|hodo:程|hog:保護|hogo:保護|hok:北|hoku:北|hon:本翻|hos:星干細|hoshi:星干欲|hoso:細|hot:発|hotoke:仏|hou:方法包訪豊放報宝崩抱縫芳|hyak:百|hyaku:百|hyo:表評氷標俵票漂|hyou:表評氷標俵票漂|i:一以位囲委意移胃衣医依井威為異遺維伊鋳居射|ichi:一市位置|ie:家|ik:行生|ika:行怒|iki:行息域|iku:育幾|in:員院飲因印引隠陰|iro:色|is:石|isha:医者|ishi:石医師意志|iso:急忙|it:一|ita:板痛致|ito:糸|its:五|itsu:五逸|iu:言|iw:岩祝|iwa:岩祝|ja:蛇邪|jak:弱若|jaku:弱若寂|ji:二字寺時次耳事自治持示磁似児辞慈滋|jik:直|jiki:直食磁|jin:人神尽仁迅甚陣尋|jish:辞書|jisho:辞書|jits:実|jitsu:日実術|jo:女除序助叙徐|jou:上定場乗城状常情条譲醸嬢錠畳浄縄|ju:十手受授樹需呪|juk:熟|juku:熟塾|jun:順純準潤巡殉|juu:十重住充銃獣縦|ka:下火花何化加夏家科果歌河価荷課可仮過架佳街嘉暇禍稼箇蚊|kai:会海回開階貝買改界械快灰解介絵塊怪悔壊懐戒皆諧|kak:各角書|kaku:角客画格確覚核革郭隔獲嚇穫|kam:神紙|kami:上神紙髪|kan:間寒感漢館完官管干幹刊患慣観歓監緩環甘艦肝冠勘勧|kang:考|kanga:考|kao:顔|kar:軽借刈|kara:空唐辛|kari:借狩|karu:軽刈|kas:貸傘|kasa:傘重|kashi:貸菓|kata:方形肩硬片語賢|kat:勝|katsu:活勝割滑喝褐轄|kaw:川革河|kawa:川革河皮乾|kay:通|kayo:通|ke:気家毛化怪|kei:計京形軽景系経警芸掲恵傾継契刑茎鶏|kek:決|ken:見犬健県建験件険検研券憲賢謙圏肩献権顕拳|ketsu:決結血欠潔穴傑|ki:気木記起期喜機帰貴危基奇寄規紀幾揮輝飢騎既棋棄祈季稀|kik:聞|kiki:聞危機|kiku:聞菊効|kim:決君|kime:決|kimi:君|kin:金近今禁勤均筋琴菌巾襟欣|kir:切着霧|kiri:切霧|kiru:切着|kish:岸|kishi:岸騎士|kit:北切|kita:北来汚|kitsu:吉喫詰|ko:子小古戸湖個庫呼枯雇固粉己狐顧鼓誇|kob:交|kobo:零|koe:声肥|koi:恋濃鯉|kok:国黒|koku:国谷刻告黒穀酷克|kom:混込|kome:米込|komu:込混|kon:今困根婚混紺魂恨献|koo:氷|kori:氷|kor:氷凍|koro:転殺頃|kos:腰越|koshi:腰越|kota:答|koto:事言異琴|kou:高口工公行考光好降紅広更港鋼甲香厚耕侯航荒硬綱鉱構皇后抗拘貢講購効候|ku:九口空苦工区具紅供久句食暮駆|kubi:首|kud:下果|kuda:下|kudamono:果物|kue:机|kui:食杭|kuj:鯨|kuji:鯨籤|kum:組雲|kuma:熊|kumi:組|kumo:雲蜘蛛|kun:君訓薫勲|kur:黒暗車|kura:暗蔵倉|kuri:栗繰|kuru:来狂|kus:薬草|kusa:草臭腐|kushi:串櫛|kuso:糞|kut:靴|kutsu:靴屈掘|kuu:空食|ky:木|kyaku:客脚却|kyo:去巨居拒挙拠許虚|kyou:京強教橋境競共恐協胸供郷叫狂鏡狭脅興響驚|kyu:九休|kyuu:九休急球宮究級求泣救吸旧給久牛窮巨弓丘|ma:間真馬魔麻摩磨|mai:毎妹米買枚埋舞|mak:巻負幕|maka:任|maki:巻薪|maku:幕巻撒|man:万満漫慢|mar:丸|maru:丸|mas:増|masa:正|mash:増|mashi:増|masu:増升|mat:待松末|mata:又股|matsu:待松末祭抹|may:迷眉|mayo:迷|mayu:眉|me:目芽女|mei:名明命迷盟銘鳴姪|men:面綿免麺|metsu:滅|mi:三見身美実未味海魅|mich:道|michi:道|mid:緑|mido:緑|midori:緑|mie:見|mig:右磨|migi:右|miga:磨|mik:三|mika:三|mim:耳|mimi:耳|min:民眠皆|mina:皆港|minato:港|mir:見|miru:見|mis:店|mise:店|mit:三|mitsu:三密蜜|miz:水瑞|mizu:水瑞|mo:木茂模藻|mochi:持餅|mod:戻|modo:戻|mok:木黙|moku:木目黙牧|mom:紅葉|momi:紅葉|mon:門問文|mono:物者|mor:森盛漏守|mori:森盛漏守|mos:燃|mosu:燃|mot:持本元求|moto:本元素|mots:持|motsu:物持|mu:六無務夢武墓麦矛霧|mugi:麦|muk:向剥|muka:向迎|muki:向|muku:向剥|mun:胸|mune:胸棟宗|mur:村|mura:村群斑|mus:虫蒸結|mushi:虫蒸無視|musu:結|mut:六|mutsu:六睦|myo:名|myou:名明妙苗|n:ん|na:七名何南魚菜那奈|naga:長流|nagare:流|nage:投|nai:内無奈|nak:中泣|naka:中仲|naki:泣|nam:波並涙|nama:生|nami:波並|nan:南何難軟男|nana:七|nao:直治|nar:鳴成習|nara:習奈良並|nari:成鳴|nas:茄|nasu:茄成|nat:夏|natsu:夏懐|naw:縄|nawa:縄|nay:悩|naya:悩|ne:音根寝値子|neg:願|nega:願|nei:寧|nek:猫|neko:猫|nem:眠|nemu:眠|nen:年念燃粘|ner:練寝|neru:練寝|netsu:熱|ni:二日似煮荷肉泥尼|nich:日|nichi:日|nig:逃握苦|niga:苦|nige:逃|nigi:握|nik:肉日|niku:肉憎|nin:人任忍認妊|nir:煮|niru:煮|nis:西|nishi:西|niw:庭|niwa:庭鶏|no:野能農納之|nob:登伸|nobo:登上|nok:残|noko:残|nom:飲|nomu:飲|non:暖|nor:乗法|nori:乗法海苔|nos:載|nose:載|not:後|nozo:除|nu:布塗縫|nug:脱|nugu:脱|nui:縫|nuk:抜|nuku:抜温|num:沼|numa:沼|nun:布|nuno:布|nur:塗|nuru:塗温|nus:盗|nusu:盗|nyo:女如|nyou:尿|nyu:入乳|nyuu:入乳柔|o:小尾雄緒|oa:終|och:落|ochi:落|od:踊|odo:踊|odor:踊|odori:踊|oe:終|oi:老追甥|ok:億屋置奥|oka:丘岡|oki:置起沖|oko:行怒|okor:怒|okori:怒|okoru:怒|oku:億屋置奥贈遅|okur:送贈|okuri:送贈|om:重思|omo:重思面主|omoi:重思|omot:表|omote:表|on:音温恩遠|onna:女|oo:大多王往央|or:折降織|ori:折降織|os:押恐教雄襲推|osa:長納治修|oshi:教押惜|oso:遅恐襲|osor:恐|osore:恐|ot:音落乙|oto:音弟夫|otoko:男|ototo:弟|otouto:弟|ou:王黄横欧追応央奥|ow:終|owa:終|oy:親泳|oya:親|oyo:泳|pa:派把|pai:牌|pan:般|patsu:発|pe:頁|pei:平|pen:片|pi:皮否比|pika:光|pin:品貧頻|po:歩舗|pon:本|pp:葉|ppu:葉|ra:羅裸良楽|rai:来雷頼礼|rak:楽落|raku:楽落絡酪|ran:乱卵欄蘭覧嵐|rei:礼例冷零霊励麗鈴令齢|rek:歴|reki:歴|ren:連練恋蓮|retsu:列烈裂|ri:六理利里裏離履梨吏|rik:六陸力|riku:六陸|rin:林輪臨隣鈴倫|ritsu:立率律栗|ro:六路露炉老呂魯|rok:六録|roku:六録鹿|ron:論|rou:労老郎朗浪廊漏楼蝋|ru:流留類|rui:類涙塁累|ryo:旅両領漁猟慮|ryou:旅両領漁猟慮涼良量料療僚寮菱|ryu:流留竜柳|ryuu:流留竜柳隆粒硫|sa:三差佐左沙砂鎖詐サ|sab:寂|sabi:寂錆|sag:下探|saga:探|sage:下|sai:西細最再祭菜採妻裁彩際済災砕|sak:作昨策桜咲|saka:坂酒逆栄|sakai:境|sakan:盛|sakana:魚|sake:酒鮭叫避|saki:先咲|saku:作昨策桜咲柵索錯酢|sam:寒冷|sama:様|same:冷覚鮫|san:三山算参散産賛酸傘惨|sara:皿更|sas:指刺|sasa:支笹|sashi:指刺差|sat:殺撮冊察|satsu:札殺察撮刷冊|saw:騒|sawa:騒触沢|say:鞘|saya:鞘|se:世背施瀬|sei:生正青西声製性誠世勢整静星制精税政成晴清聖征誓|seki:石赤関席責積昔夕析惜籍跡|sem:狭攻|sema:狭|seme:攻|sen:千川先線戦選専船洗泉浅銭宣鮮仙扇栓潜占|set:雪説切折接|setsu:雪説切折接設節殺|sha:社車者写謝射砂煮遮捨|shak:借尺石赤|shaku:借尺石赤酌爵釈|shi:四市矢糸私紙指脂姉氏子支始使死試詩志思姿視紫史司飼師施資至詞歯誌|shiba:芝縛|shibaraku:暫|shichi:七質|shig:仕事|shige:茂|shigi:鴫|shik:敷識|shika:鹿然|shiki:色式指揮識敷|shim:島閉|shima:島縞|shime:閉絞占|shin:新心神親身森真信進深申震浸寝針慎伸振辛|shinju:真珠|shio:塩潮|shir:白知|shira:白調|shiro:白城代|shiru:汁知|shish:獅|shishi:獅子|shita:下舌|shits:室失質漆執湿|shitsu:室失質漆執湿叱嫉|shiz:静沈|shizu:静沈雫|sho:小少書所初諸署緒暑庶処|shok:食職色植触|shoku:食職色植触燭飾|shoo:消|shou:少正生小商勝証象消賞将章障傷焦照承招咲床症召|shu:手主守首朱酒種取趣狩|shuk:宿縮祝|shuku:宿縮祝粛淑|shun:春瞬旬俊|shut:出|shutsu:出術|shuu:週集終習衆州舟秀周拾執宗就修愁臭|so:十祖素組租粗|sod:育|soda:育|soe:添|sok:速測足即束促息|soku:速測足即束促息則側塞|son:村存損尊孫|sor:空|sora:空|sore:其|soro:揃|sot:卒外|sotsu:卒率|soto:外|sou:早草走送想争相窓層装燥総捜掃双僧遭槽桑創葬奏|su:水素酢主守巣砂|sub:滑|sube:滑統|sud:既|sude:既|sue:末据|sug:過杉|sugi:過杉|sugu:直|sui:水吸吹推粋酔遂睡穂|suk:好透空少|suka:透|suki:好梳|suku:少救|sum:住済澄墨隅|sumi:住済澄墨隅炭|sumu:住済澄|sun:寸損|sur:刷|suri:刷|suru:為|sus:進|susu:進煤勧|sut:捨廃|sute:捨|suu:数吸枢|suw:座|suwa:座|suz:涼鈴|suzu:涼鈴|ta:田多他手太足|tab:食旅|tabe:食|tabi:旅度|tach:立|tachi:立達断裁|tad:正唯|tada:正唯|tae:絶耐|tag:耕|taga:耕|tai:体隊待対退太貸帯台泰袋態耐替滞|tak:高竹宅|taka:高鷹|taki:滝炊焚|taku:宅卓拓沢託濯|tam:玉球|tama:玉球弾魂|tame:溜|tami:民|tan:単短炭端反担探淡誕嘆|tana:棚店|tane:種|tani:谷|tano:楽頼|tao:倒|tar:足樽垂|tari:足|taru:樽垂|tas:助足|tashi:足|tasu:助足|tat:立建達断裁|tata:戦畳叩|tatak:戦叩|tataka:戦|tataku:叩|tate:建立盾縦|tato:例|tatsu:立建達断裁龍竜辰|tay:頼|tayo:頼|te:手|tei:定低庭弟提停底程廷呈貞堤帝訂|tek:的鉄敵適|teki:的敵適滴|ten:天店点転展典添|ter:照|tera:寺照|teru:照|tes:鉄|tetsu:鉄哲徹撤|to:十戸徒都土渡登塗賭途|tob:飛跳|tobi:飛跳|tobu:飛跳|tod:届|todo:届|tog:研|toga:研|toh:遠|toho:徒歩|toi:問遠樋|tok:特徳得|toke:時計|toki:時溶|toko:床常|toku:特徳得読解督篤|tom:止泊富友|toma:止泊|tomo:友共供智伴|ton:豚遁頓|tonari:隣|too:十遠通|tor:取鳥捕撮盗採|tori:鳥取捕撮盗採通|toru:取捕撮盗採|tos:年|toshi:年都市|tot:整|toto:整|totsu:突凸|tou:東当投冬刀島湯答頭等登統盗透到党塔倒陶凍糖筒桃闘|tsu:津通都|tsub:粒|tsuba:翼椿|tsubo:壺坪|tsubu:粒潰|tsuch:土|tsuchi:土槌|tsud:集|tsudo:集|tsug:次継告|tsugi:次継|tsugu:継告|tsui:対墜追|tsuk:月着作付突使疲漬机|tsuka:使塚掴束遣|tsukau:使|tsuke:付漬|tsuki:月付突|tsuku:作着付突就|tsuma:妻|tsume:爪冷詰|tsumi:罪積摘|tsumori:積|tsumu:積紡|tsun:常|tsune:常|tsuno:角|tsur:釣連|tsura:辛|tsure:連|tsuri:釣|tsuru:鶴釣|tsut:伝蔦|tsuta:伝蔦|tsutaw:伝|tsuto:勤努|tsutsum:包|tsutsumu:包|tsuy:強|tsuyo:強|u:右雨宇羽有生売牛受打歌海産|ub:奪|uba:奪|ube:諾|uchi:内打家|ud:腕|ude:腕|ue:上植飢|ug:動|ugo:動|ugok:動|ugoki:動|ui:初|uj:氏|uji:氏|uk:受浮|uka:浮|uke:受|um:生馬梅海産埋熟|uma:馬甘旨|ume:梅埋|umi:海産膿|un:運雲|ur:売裏占|ura:裏浦恨|ure:売|uri:売瓜|uru:売潤|us:薄失牛臼|ushi:牛失後|uso:嘘|usagi:兎|usu:薄臼|ut:歌打写|uta:歌|utsu:打写移映|utsuk:美|utsukushi:美|uw:上|uwa:上|uy:敬|uya:敬|w:和輪|wa:和話輪羽環我|wai:歪賄|wak:分若湧枠|waka:分若|waki:脇湧|waku:枠惑沸|wan:湾腕椀|war:割悪笑|wara:笑藁|waru:悪割|was:忘|wasu:忘|wasure:忘|wat:渡綿|wata:綿|watas:渡|watashi:私渡|waz:技|waza:技|wo:を|y:矢|ya:八矢屋谷夜野也耶|yak:役薬焼訳約厄|yaku:役薬焼訳約厄躍益|yam:山止病|yama:山|yame:止|yami:止病闇|yan:柳|yane:屋根|yas:安休易|yasa:優易|yashi:養癒椰|yasu:安休|yat:雇|yato:雇|yo:四世代夜予余預善誉与|yob:呼|yobu:呼|yog:汚|yogo:汚|yok:欲横翌浴抑|yoke:避除|yoko:横|yoku:欲翌浴抑|yom:読|yomu:読|yon:四|yor:寄頼選喜|yori:寄頼選|yoru:夜寄選|yos:寄|yose:寄|yoshi:良吉芳|yot:四|yots:四|yotsu:四|you:用洋羊曜要容葉陽様幼溶腰踊謡養擁窯傭|yow:弱|yowa:弱|yu:湯油由輸諭癒諭|yubi:指|yue:故|yui:結唯遺|yuk:行雪|yuka:床愉快|yuki:雪行|yuku:行|yum:夢弓|yume:夢|yumi:弓|yun:輸入|yuu:夕友有勇遊郵優融|z:図|za:座雑|zai:在財材罪剤|zak:雑|zaku:雑|zan:残山暫|zar:皿|zara:皿|zas:雑|zatsu:雑|ze:是税|zei:税|zen:全前然善禅漸繕膳|zetsu:舌絶|zi:字自事辞慈滋磁|zo:象蔵|zok:族続|zoku:族続属賊|zon:存|zou:造像増臓蔵象憎|zu:図頭豆|zun:寸|zut:頭|zutsu:頭|tamago:卵|shou:醤|so:噌|ryou:了|aki:秋|choku:捗|kezu:削|juu:従|shuu:収酬|osa:収|kaku:拡描|hiro:拡|oroshi:卸|gou:合豪|a:合|sai:栽幸|bai:培|fu:埠普|ka:貨掛華|kakari:係|kei:係型兄|shou:昇詳紹|nobo:昇|kabe:壁|mou:猛|tobira:扉|kuwa:鍬詳|hana:華|kan:缶看|kata:型|chin:陳|han:搬|fue:笛|kage:影|ei:影|jiku:軸|gan:頑|sao:竿|chou:彫|ho:彫褒|juu:絨|tan:毯鍛|hachi:鉢蜂|kago:籠|hako:箱|ami:網|byou:描|kyo:距況|taku:択|hone:骨|kotsu:骨|bou:棒房亡|en:鉛宴援|namari:鉛|chuu:鍮抽柱|ken:剣|tou:灯|akari:灯|ki:器|utsuwa:器|ya:冶|oni:鬼|ine:稲|tsu:吊|ren:錬|kama:釜|saru:猿|nezumi:鼠|tora:虎|saku:搾|shibo:搾|hashira:柱|hitsu:必|kanara:必|hiki:匹|dou:洞|hora:洞|kutsu:窟|chiga:違|kou:江功康|e:江|hatake:畑|shiawa:幸|chitsu:秩|shuku:叔|fusa:房|on:穏|oda:穏|chiku:蓄|takuwa:蓄|tai:怠|okota:怠|betsu:別|waka:別|utage:宴|ore:俺|na:亡|ani:兄|jou:穣|etsu:閲");
				_initialized = true;
			}
		}

		private static void AddKana()
		{
			Add('あ', "a");
			Add('い', "i");
			Add('う', "u");
			Add('え', "e");
			Add('お', "o");
			Add('か', "ka");
			Add('き', "ki");
			Add('く', "ku");
			Add('け', "ke");
			Add('こ', "ko");
			Add('さ', "sa");
			Add('し', "shi");
			Add('す', "su");
			Add('せ', "se");
			Add('そ', "so");
			Add('た', "ta");
			Add('ち', "chi");
			Add('つ', "tsu");
			Add('て', "te");
			Add('と', "to");
			Add('な', "na");
			Add('に', "ni");
			Add('ぬ', "nu");
			Add('ね', "ne");
			Add('の', "no");
			Add('は', "ha");
			Add('ひ', "hi");
			Add('ふ', "fu");
			Add('へ', "he");
			Add('ほ', "ho");
			Add('ま', "ma");
			Add('み', "mi");
			Add('む', "mu");
			Add('め', "me");
			Add('も', "mo");
			Add('や', "ya");
			Add('ゆ', "yu");
			Add('よ', "yo");
			Add('ら', "ra");
			Add('り', "ri");
			Add('る', "ru");
			Add('れ', "re");
			Add('ろ', "ro");
			Add('わ', "wa");
			Add('を', "wo");
			Add('ん', "n,m");
			Add('が', "ga");
			Add('ぎ', "gi");
			Add('ぐ', "gu");
			Add('げ', "ge");
			Add('ご', "go");
			Add('ざ', "za");
			Add('じ', "ji");
			Add('ず', "zu");
			Add('ぜ', "ze");
			Add('ぞ', "zo");
			Add('だ', "da");
			Add('ぢ', "ji");
			Add('づ', "zu");
			Add('で', "de");
			Add('ど', "do");
			Add('ば', "ba");
			Add('び', "bi");
			Add('ぶ', "bu");
			Add('べ', "be");
			Add('ぼ', "bo");
			Add('ぱ', "pa");
			Add('ぴ', "pi");
			Add('ぷ', "pu");
			Add('ぺ', "pe");
			Add('ぽ', "po");
			Add('ゃ', "ya");
			Add('ゅ', "yu");
			Add('ょ', "yo");
			Add('っ', "tsu,=");
			Add('ア', "a");
			Add('イ', "i");
			Add('ウ', "u");
			Add('エ', "e");
			Add('オ', "o");
			Add('カ', "ka");
			Add('キ', "ki");
			Add('ク', "ku");
			Add('ケ', "ke");
			Add('コ', "ko");
			Add('サ', "sa");
			Add('シ', "shi");
			Add('ス', "su");
			Add('セ', "se");
			Add('ソ', "so");
			Add('タ', "ta");
			Add('チ', "chi");
			Add('ツ', "tsu");
			Add('テ', "te");
			Add('ト', "to");
			Add('ナ', "na");
			Add('ニ', "ni");
			Add('ヌ', "nu");
			Add('ネ', "ne");
			Add('ノ', "no");
			Add('ハ', "ha");
			Add('ヒ', "hi");
			Add('フ', "fu");
			Add('ヘ', "he");
			Add('ホ', "ho");
			Add('マ', "ma");
			Add('ミ', "mi");
			Add('ム', "mu");
			Add('メ', "me");
			Add('モ', "mo");
			Add('ヤ', "ya");
			Add('ユ', "yu");
			Add('ヨ', "yo");
			Add('ラ', "ra");
			Add('リ', "ri");
			Add('ル', "ru");
			Add('レ', "re");
			Add('ロ', "ro");
			Add('ワ', "wa");
			Add('ヲ', "wo");
			Add('ン', "n,m");
			Add('ガ', "ga");
			Add('ギ', "gi");
			Add('グ', "gu");
			Add('ゲ', "ge");
			Add('ゴ', "go");
			Add('ザ', "za");
			Add('ジ', "ji");
			Add('ズ', "zu");
			Add('ゼ', "ze");
			Add('ゾ', "zo");
			Add('ダ', "da");
			Add('ヂ', "ji");
			Add('ヅ', "zu");
			Add('デ', "de");
			Add('ド', "do");
			Add('バ', "ba");
			Add('ビ', "bi");
			Add('ブ', "bu");
			Add('ベ', "be");
			Add('ボ', "bo");
			Add('パ', "pa");
			Add('ピ', "pi");
			Add('プ', "pu");
			Add('ペ', "pe");
			Add('ポ', "po");
			Add('ャ', "ya");
			Add('ュ', "yu");
			Add('ョ', "yo");
			Add('ッ', "tsu,=");
			Add('ー', "-,");
		}

		private static void Add(char c, string r)
		{
			if (!_romajiMap.ContainsKey(c))
			{
				_romajiMap[c] = r;
			}
		}

		private static void ProcessKanjiData(string data)
		{
			string[] array = data.Split(new char[1] { '|' });
			foreach (string text in array)
			{
				int num = text.IndexOf(':');
				if (num <= 0)
				{
					continue;
				}
				string text2 = text.Substring(0, num);
				string text3 = text.Substring(num + 1);
				foreach (char key in text3)
				{
					if (!_romajiMap.ContainsKey(key))
					{
						_romajiMap[key] = text2;
						continue;
					}
					string text4 = _romajiMap[key];
					if (Array.IndexOf(text4.Split(new char[1] { ',' }), text2) == -1)
					{
						_romajiMap[key] = text4 + "," + text2;
					}
				}
			}
		}

		public static bool IsMatch(string input, string text)
		{
			Initialize();
			if (string.IsNullOrEmpty(input))
			{
				return true;
			}
			if (string.IsNullOrEmpty(text))
			{
				return false;
			}
			List<string[]> romajiTokens = GetRomajiTokens(text);
			string input2 = input.ToLowerInvariant();
			for (int i = 0; i < romajiTokens.Count; i++)
			{
				if (MatchRecursive(input2, 0, romajiTokens, i))
				{
					return true;
				}
			}
			return false;
		}

		private static List<string[]> GetRomajiTokens(string text)
		{
			List<string[]> list = new List<string[]>();
			foreach (char c in text)
			{
				if (_romajiMap.TryGetValue(c, out var value))
				{
					list.Add(value.Split(new char[1] { ',' }));
				}
				else
				{
					list.Add(new string[1] { char.ToLowerInvariant(c).ToString() });
				}
			}
			return list;
		}

		private static bool MatchRecursive(string input, int inputIdx, List<string[]> tokens, int tokenIdx)
		{
			if (inputIdx >= input.Length)
			{
				return true;
			}
			if (tokenIdx >= tokens.Count)
			{
				return false;
			}
			string[] array = tokens[tokenIdx];
			foreach (string text in array)
			{
				if (string.IsNullOrEmpty(text))
				{
					if (MatchRecursive(input, inputIdx, tokens, tokenIdx + 1))
					{
						return true;
					}
					continue;
				}
				if (text == "=")
				{
					if (tokenIdx + 1 >= tokens.Count)
					{
						continue;
					}
					string[] array2 = tokens[tokenIdx + 1];
					foreach (string text2 in array2)
					{
						if (!string.IsNullOrEmpty(text2))
						{
							char c = text2[0];
							if (inputIdx < input.Length && input[inputIdx] == c && MatchRecursive(input, inputIdx + 1, tokens, tokenIdx + 1))
							{
								return true;
							}
						}
					}
					continue;
				}
				int num = Math.Min(input.Length - inputIdx, text.Length);
				int num2 = 0;
				for (int k = 0; k < num; k++)
				{
					bool flag = input[inputIdx + k] == text[k];
					if (!flag && text[k] == 'n' && input[inputIdx + k] == 'm')
					{
						flag = true;
					}
					if (!flag)
					{
						break;
					}
					num2++;
				}
				if (num2 <= 0)
				{
					continue;
				}
				for (int num3 = num2; num3 >= 1; num3--)
				{
					if (MatchRecursive(input, inputIdx + num3, tokens, tokenIdx + 1))
					{
						return true;
					}
				}
			}
			return false;
		}
	}
	public static class JournalVoidPouchLogic
	{
		[CompilerGenerated]
		private sealed class <InjectVoidPouchItemsEndOfFrameCoroutine>d__2 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public RectTransform container;

			public TMP_FontAsset font;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForEndOfFrame();
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if ((Object)(object)container == (Object)null)
					{
						return false;
					}
					InjectVoidPouchItems(container, font);
					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();
			}
		}

		public static string BuildDisplayName(ItemSO item, int totalAmount, int voidAmount, bool isMerge)
		{
			if ((Object)(object)item == (Object)null)
			{
				return string.Empty;
			}
			string text = item.GetLocalizedName();
			int stackCapacity = GetStackCapacity(item);
			if (stackCapacity > 1)
			{
				int num = totalAmount / stackCapacity;
				if (num < 1 && totalAmount > 0)
				{
					num = 1;
				}
				text += $" x {num}";
			}
			else
			{
				int num = totalAmount;
				if (num > 1)
				{
					text += $" x {num}";
				}
			}
			string arg;
			if (!isMerge)
			{
				arg = "(VP)";
			}
			else if (voidAmount > 0)
			{
				string localizedText = LocalizationManager.Instance.GetLocalizedText("journal.vp.unit_item");
				if (stackCapacity > 1)
				{
					int num2 = voidAmount / stackCapacity;
					if (num2 < 1)
					{
						num2 = 1;
					}
					string localizedText2 = LocalizationManager.Instance.GetLocalizedText((UIManagerJournalCategoriesPatch.CurrentCategoryMode == 0) ? "journal.vp.unit_box" : "journal.vp.unit_group");
					arg = ((num2 <= 1) ? LocalizationManager.Instance.GetLocalizedText($"(VP: {num2}{localizedText2})") : LocalizationManager.Instance.GetLocalizedText($"(VP: {num2}{localizedText2}/{voidAmount}{localizedText})"));
				}
				else
				{
					arg = $"(VP: {voidAmount}{localizedText})";
				}
			}
			else
			{
				arg = "(VP: 0)";
			}
			string text2 = $" <size={12}><color=#B92120>{arg}</color></size>";
			return text + text2;
		}

		public static void InjectVoidPouchItemsEndOfFrame(RectTransform container, TMP_FontAsset font)
		{
			if (!((Object)(object)container == (Object)null))
			{
				UIManager instance = UIManager.Instance;
				if (!((Object)(object)instance == (Object)null))
				{
					((MonoBehaviour)instance).StartCoroutine(InjectVoidPouchItemsEndOfFrameCoroutine(container, font));
				}
			}
		}

		[IteratorStateMachine(typeof(<InjectVoidPouchItemsEndOfFrameCoroutine>d__2))]
		private static IEnumerator InjectVoidPouchItemsEndOfFrameCoroutine(RectTransform container, TMP_FontAsset font)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <InjectVoidPouchItemsEndOfFrameCoroutine>d__2(0)
			{
				container = container,
				font = font
			};
		}

		public static void InjectVoidPouchItems(RectTransform container, TMP_FontAsset font)
		{
			Dictionary<long, int> storedItems = VoidPouchIntegration.GetStoredItems();
			if (storedItems.Count == 0)
			{
				return;
			}
			HashSet<long> hashSet = new HashSet<long>();
			for (int i = 0; i < ((Transform)container).childCount; i++)
			{
				Transform child = ((Transform)container).GetChild(i);
				if (((Object)child).name.StartsWith("BMP_"))
				{
					if (!((Object)child).name.StartsWith("BMP_VoidPouchRow_") || !long.TryParse(((Object)child).name.Substring("BMP_VoidPouchRow_".Length), out var result))
					{
						continue;
					}
					hashSet.Add(result);
					if (!storedItems.TryGetValue(result, out var value))
					{
						continue;
					}
					int totalAmount = UpdateRowAmount(child, value, isMerge: false);
					GameManager instance = GameManager.Instance;
					ItemSO val = null;
					if ((Object)(object)instance != (Object)null && instance.itemDatabase != null)
					{
						for (int j = 0; j < instance.itemDatabase.Count; j++)
						{
							if (instance.itemDatabase[j].id == result)
							{
								val = instance.itemDatabase[j];
								break;
							}
						}
					}
					if ((Object)(object)val != (Object)null)
					{
						UpdateRowName(child, val, totalAmount, value, isMerge: false);
					}
					continue;
				}
				ItemSO val2 = ResolveItemFromRow(child);
				if (!((Object)(object)val2 != (Object)null))
				{
					continue;
				}
				Transform val3 = child.Find("TextItem");
				if ((Object)(object)val3 != (Object)null)
				{
					Text component = ((Component)val3).GetComponent<Text>();
					TextMeshProUGUI component2 = ((Component)val3).GetComponent<TextMeshProUGUI>();
					if ((((Object)(object)component != (Object)null) ? component.text : (((Object)(object)component2 != (Object)null) ? ((TMP_Text)component2).text : "")).IndexOf("(VP", StringComparison.OrdinalIgnoreCase) >= 0)
					{
						hashSet.Add(val2.id);
						continue;
					}
				}
				hashSet.Add(val2.id);
				if (storedItems.TryGetValue(val2.id, out var value2))
				{
					int totalAmount2 = UpdateRowAmount(child, value2, isMerge: true);
					UpdateRowName(child, val2, totalAmount2, value2, isMerge: true);
				}
			}
			Transform val4 = UIManagerJournalCategoriesPatch.FindRowTemplate(container);
			if ((Object)(object)val4 == (Object)null)
			{
				return;
			}
			GameManager instance2 = GameManager.Instance;
			if ((Object)(object)instance2 == (Object)null || instance2.itemDatabase == null)
			{
				return;
			}
			foreach (KeyValuePair<long, int> item in storedItems)
			{
				long key = item.Key;
				int value3 = item.Value;
				if (hashSet.Contains(key))
				{
					continue;
				}
				ItemSO val5 = null;
				for (int k = 0; k < instance2.itemDatabase.Count; k++)
				{
					if (instance2.itemDatabase[k].id == key)
					{
						val5 = instance2.itemDatabase[k];
						break;
					}
				}
				if ((Object)(object)val5 == (Object)null)
				{
					continue;
				}
				GameObject val6 = Object.Instantiate<GameObject>(((Component)val4).gameObject, (Transform)(object)container);
				((Object)val6).name = $"BMP_VoidPouchRow_{key}";
				val6.SetActive(true);
				int totalAmount3 = UpdateRowAmount(val6.transform, value3, isMerge: false);
				UpdateRowName(val6.transform, val5, totalAmount3, value3, isMerge: false);
				if (!((Object)(object)font != (Object)null))
				{
					continue;
				}
				Transform val7 = val6.transform.Find("TextItem");
				if ((Object)(object)val7 != (Object)null)
				{
					TextMeshProUGUI component3 = ((Component)val7).GetComponent<TextMeshProUGUI>();
					if ((Object)(object)component3 != (Object)null)
					{
						((TMP_Text)component3).font = font;
					}
				}
			}
			UIManagerJournalItemIconsPatch.AddItemIconsToInventoryList((Transform)(object)container);
		}

		private static int GetStackCapacity(ItemSO item)
		{
			if ((Object)(object)item == (Object)null)
			{
				return 1;
			}
			int num = 1;
			FieldInfo fieldInfo = AccessTools.Field(((object)item).GetType(), "stackSize");
			if (fieldInfo != null)
			{
				try
				{
					num = (int)fieldInfo.GetValue(item);
				}
				catch
				{
				}
			}
			if (num <= 1 && ((object)item).GetType().Name == "ProductSO")
			{
				FieldInfo fieldInfo2 = AccessTools.Field(((object)item).GetType(), "amount");
				if (fieldInfo2 != null && fieldInfo2.FieldType == typeof(int))
				{
					try
					{
						int num2 = (int)fieldInfo2.GetValue(item);
						if (num2 > 1)
						{
							num = num2;
						}
					}
					catch
					{
					}
				}
			}
			if (num >= 1)
			{
				return num;
			}
			return 1;
		}

		private static void UpdateRowName(Transform row, ItemSO item, int totalAmount, int voidAmount, bool isMerge)
		{
			if ((Object)(object)row == (Object)null || (Object)(object)item == (Object)null)
			{
				return;
			}
			Transform val = row.Find("TextItem");
			if ((Object)(object)val != (Object)null)
			{
				string text = BuildDisplayName(item, totalAmount, voidAmount, isMerge);
				Text component = ((Component)val).GetComponent<Text>();
				if ((Object)(object)component != (Object)null)
				{
					component.supportRichText = true;
					component.horizontalOverflow = (HorizontalWrapMode)1;
					component.verticalOverflow = (VerticalWrapMode)0;
					component.text = text;
				}
				TextMeshProUGUI component2 = ((Component)val).GetComponent<TextMeshProUGUI>();
				if ((Object)(object)component2 != (Object)null)
				{
					((TMP_Text)component2).richText = true;
					((TMP_Text)component2).enableWordWrapping = false;
					((TMP_Text)component2).overflowMode = (TextOverflowModes)1;
					((TMP_Text)component2).text = text;
				}
			}
		}

		private static int UpdateRowAmount(Transform row, int voidAmount, bool isMerge)
		{
			Transform val = row.Find("TextAmount");
			int result = voidAmount;
			if ((Object)(object)val != (Object)null)
			{
				Text component = ((Component)val).GetComponent<Text>();
				TextMeshProUGUI component2 = ((Component)val).GetComponent<TextMeshProUGUI>();
				int result2 = 0;
				if (isMerge)
				{
					int.TryParse((((Object)(object)component != (Object)null) ? component.text : (((Object)(object)component2 != (Object)null) ? ((TMP_Text)component2).text : "0")).Replace("x", "").Trim(), out result2);
				}
				result = (isMerge ? (result2 + voidAmount) : voidAmount);
				string text = result.ToString();
				if ((Object)(object)component != (Object)null)
				{
					component.supportRichText = false;
					component.text = text;
				}
				if ((Object)(object)component2 != (Object)null)
				{
					((TMP_Text)component2).richText = false;
					((TMP_Text)component2).text = text;
				}
			}
			return result;
		}

		private static ItemSO ResolveItemFromRow(Transform row)
		{
			Transform obj = row.Find("TextItem");
			Text val = ((obj != null) ? ((Component)obj).GetComponent<Text>() : null);
			TextMeshProUGUI val2 = null;
			if ((Object)(object)val == (Object)null)
			{
				Transform val3 = row.Find("TextItem");
				if ((Object)(object)val3 != (Object)null)
				{
					val2 = ((Component)val3).GetComponent<TextMeshProUGUI>();
				}
			}
			string text = (((Object)(object)val != (Object)null) ? val.text : ((val2 != null) ? ((TMP_Text)val2).text : null));
			if (string.IsNullOrEmpty(text))
			{
				return null;
			}
			return UIManagerJournalCategoriesPatch.ResolveItemSOByName(text);
		}
	}
	public static class SaveSlotManager
	{
		public static void Initialize()
		{
		}
	}
	[HarmonyPatch(typeof(SaveManager), "LoadWorldData")]
	public static class SaveManagerLoadWorldDataPatch
	{
		[HarmonyPostfix]
		public static void Postfix()
		{
			UnacceptedTaskManager.Instance.ReloadForNewSaveSlot();
		}
	}
	[HarmonyPatch(typeof(GameManager), "Awake")]
	public static class GameManagerAwakePatch
	{
		[HarmonyPostfix]
		public static void Postfix()
		{
			UnacceptedTaskManager.Instance.LoadMarkedExpansions();
		}
	}
	[HarmonyPatch(typeof(SaveManager), "SetCurrentSlot")]
	public static class SaveManagerSetCurrentSlotPatch
	{
		[HarmonyPostfix]
		public static void Postfix()
		{
			UnacceptedTaskManager.Instance.ReloadForNewSaveSlot();
		}
	}
	public class UnacceptedTaskManager
	{
		private static UnacceptedTaskManager _instance;

		private readonly HashSet<long> markedAdvancedExpansions = new HashSet<long>();

		private readonly Dictionary<long, ulong> markedByUsers = new Dictionary<long, ulong>();

		private readonly Dictionary<long, string> markedByUsernames = new Dictionary<long, string>();

		public static UnacceptedTaskManager Instance
		{
			get
			{
				if (_instance == null)
				{
					_instance = new UnacceptedTaskManager();
				}
				return _instance;
			}
		}

		private static string CurrentSlot
		{
			get
			{
				if ((Object)(object)SaveManager.Instance != (Object)null)
				{
					string text = AccessTools.Field(typeof(SaveManager), "currentSlot")?.GetValue(SaveManager.Instance) as string;
					if (!string.IsNullOrEmpty(text))
					{
						return text;
					}
				}
				return "slot1";
			}
		}

		private static string MarkedExpansionsFilePath => Path.Combine(Paths.ConfigPath, "BetterMarketPlus", "marked_expansions_" + CurrentSlot + ".json");

		public event Action OnMarkedExpansionsChanged;

		public event Action<long> OnToggleRequested;

		public event Action<long> OnRemoveRequested;

		public void DeleteMarkedExpansionsFileForSlot(string slot)
		{
			if (string.IsNullOrEmpty(slot))
			{
				return;
			}
			string path = Path.Combine(Paths.ConfigPath, "BetterMarketPlus", "marked_expansions_" + slot + ".json");
			if (!File.Exists(path))
			{
				return;
			}
			try
			{
				File.Delete(path);
			}
			catch
			{
			}
		}

		public void DeleteMarkedExpansionsFileForCurrentSlot()
		{
			DeleteMarkedExpansionsFileForSlot(CurrentSlot);
		}

		public bool ToggleAdvancedExpansion(long expansionId)
		{
			bool result = !markedAdvancedExpansions.Contains(expansionId);
			Action<long> onToggleRequested = this.OnToggleRequested;
			if (onToggleRequested != null)
			{
				onToggleRequested(expansionId);
				return result;
			}
			return result;
		}

		public bool IsAdvancedExpansionMarked(long expansionId)
		{
			return markedAdvancedExpansions.Contains(expansionId);
		}

		public List<long> GetMarkedAdvancedExpansionIds()
		{
			return new List<long>(markedAdvancedExpansions);
		}

		public List<AdvancedExpansionSO> GetMarkedUnlockedAdvancedExpansions()
		{
			List<AdvancedExpansionSO> list = new List<AdvancedExpansionSO>();
			if (GameManager.Instance?.expansionDatabase == null)
			{
				return list;
			}
			foreach (ExpansionSO item in GameManager.Instance.expansionDatabase)
			{
				AdvancedExpansionSO val = (AdvancedExpansionSO)(object)((item is AdvancedExpansionSO) ? item : null);
				if (val != null && markedAdvancedExpansions.Contains(item.id) && !GameManager.Instance.IsExpansionUnlocked(item.id))
				{
					list.Add(val);
				}
			}
			return list;
		}

		public bool RemoveUnlockedExpansion(long expansionId)
		{
			this.OnRemoveRequested?.Invoke(expansionId);
			return true;
		}

		public void SaveMarkedExpansions()
		{
			string directoryName = Path.GetDirectoryName(MarkedExpansionsFilePath);
			if (!Directory.Exists(directoryName))
			{
				Directory.CreateDirectory(directoryName);
			}
			string contents = JsonConvert.SerializeObject((object)new MarkedExpansionsSaveData
			{
				MarkedExpansionIds = new List<long>(markedAdvancedExpansions),
				MarkedByUsers = new Dictionary<long, ulong>(markedByUsers),
				MarkedByUsernames = new Dictionary<long, string>(markedByUsernames)
			}, (Formatting)1);
			File.WriteAllText(MarkedExpansionsFilePath, contents);
		}

		public void LoadMarkedExpansions()
		{
			if (!File.Exists(MarkedExpansionsFilePath))
			{
				return;
			}
			MarkedExpansionsSaveData markedExpansionsSaveData = JsonConvert.DeserializeObject<MarkedExpansionsSaveData>(File.ReadAllText(MarkedExpansionsFilePath));
			if (markedExpansionsSaveData?.MarkedExpansionIds == null)
			{
				return;
			}
			markedAdvancedExpansions.Clear();
			markedByUsers.Clear();
			markedByUsernames.Clear();
			foreach (long markedExpansionId in markedExpansionsSaveData.MarkedExpansionIds)
			{
				markedAdvancedExpansions.Add(markedExpansionId);
				if (markedExpansionsSaveData.MarkedByUsers != null && markedExpansionsSaveData.MarkedByUsers.TryGetValue(markedExpansionId, out var value))
				{
					markedByUsers[markedExpansionId] = value;
				}
				if (markedExpansionsSaveData.MarkedByUsernames != null && markedExpansionsSaveData.MarkedByUsernames.TryGetValue(markedExpansionId, out var value2))
				{
					markedByUsernames[markedExpansionId] = value2;
				}
			}
		}

		public void ReloadForNewSaveSlot()
		{
			markedAdvancedExpansions.Clear();
			LoadMarkedExpansions();
		}

		public void SyncFromNetwork(List<long> markedExpansionIds, List<ulong> markerUserIds, List<string> markerUsernames)
		{
			markedAdvancedExpansions.Clear();
			markedByUsers.Clear();
			markedByUsernames.Clear();
			for (int i = 0; i < markedExpansionIds.Count; i++)
			{
				long num = markedExpansionIds[i];
				markedAdvancedExpansions.Add(num);
				if (markerUserIds != null && i < markerUserIds.Count)
				{
					markedByUsers[num] = markerUserIds[i];
				}
				if (markerUsernames != null && i < markerUsernames.Count && !string.IsNullOrEmpty(markerUsernames[i]))
				{
					markedByUsernames[num] = markerUsernames[i];
				}
			}
			this.OnMarkedExpansionsChanged?.Invoke();
		}

		internal void InternalAdd(long expansionId, ulong markerUserId)
		{
			if (markedAdvancedExpansions.Contains(expansionId))
			{
				return;
			}
			markedAdvancedExpansions.Add(expansionId);
			markedByUsers[expansionId] = markerUserId;
			try
			{
				if (AccessTools.Field(typeof(GameManager), "clientIdMap")?.GetValue(GameManager.Instance) is Dictionary<ulong, ulong> dictionary)
				{
					foreach (KeyValuePair<ulong, ulong> item in dictionary)
					{
						if (item.Value == markerUserId)
						{
							string clientNickname = GameManager.Instance.GetClientNickname(item.Key);
							if (!string.IsNullOrEmpty(clientNickname))
							{
								markedByUsernames[expansionId] = clientNickname;
							}
							break;
						}
					}
				}
			}
			catch
			{
			}
			SaveMarkedExpansions();
			this.OnMarkedExpansionsChanged?.