MWITools

Tools for MilkyWayIdle. Shows total action time. Shows market prices. Shows action number quick inputs. Shows how many actions are needed to reach certain skill level. Shows skill exp percentages. Shows total networth. Shows combat summary. Shows combat maps index. Shows item level on item icons. Shows how many ability books are needed to reach certain level. Shows market equipment filters.

  1. // ==UserScript==
  2. // @name MWITools
  3. // @namespace http://tampermonkey.net/
  4. // @version 23.7
  5. // @description Tools for MilkyWayIdle. Shows total action time. Shows market prices. Shows action number quick inputs. Shows how many actions are needed to reach certain skill level. Shows skill exp percentages. Shows total networth. Shows combat summary. Shows combat maps index. Shows item level on item icons. Shows how many ability books are needed to reach certain level. Shows market equipment filters.
  6. // @author bot7420
  7. // @license CC-BY-NC-SA-4.0
  8. // @match https://www.milkywayidle.com/*
  9. // @match https://test.milkywayidle.com/*
  10. // @match https://amvoidguy.github.io/MWICombatSimulatorTest/*
  11. // @match https://shykai.github.io/mwisim.github.io/*
  12. // @match https://shykai.github.io/MWICombatSimulatorTest/dist/*
  13. // @match https://mooneycalc.netlify.app/*
  14. // @grant GM_addStyle
  15. // @grant GM.xmlHttpRequest
  16. // @grant GM_xmlhttpRequest
  17. // @grant GM_notification
  18. // @grant GM_getValue
  19. // @grant GM_setValue
  20. // @require https://cdnjs.cloudflare.com/ajax/libs/mathjs/12.4.2/math.js
  21. // @require https://cdn.jsdelivr.net/npm/chart.js@3.7.0/dist/chart.min.js
  22. // @require https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.0.0/dist/chartjs-plugin-datalabels.min.js
  23. // ==/UserScript==
  24.  
  25. /*
  26. Steam客户端玩家还需要额外安装兼容插件。
  27.  
  28. MilkyWayIdle Steam game client players should also install this script:
  29. https://raw.githubusercontent.com/YangLeda/Userscripts-For-MilkyWayIdle/refs/heads/main/MWITools%20addon%20for%20Steam%20version.js
  30. */
  31.  
  32. /*
  33. 【遇到MWITools插件有问题时的解决方法】
  34.  
  35. 请先务必排查以下问题:
  36. 1. 你的MWITools插件已更新至最新版(greasyfork网站有可能被墙,请开梯子更新;或者到QQ群文件里下载后手动导入或复制粘贴代码);
  37. 2. 你没有重复安装插件(有的人装了新版本插件,但还有个旧版本的没有删除,在同时运行;或者有的人在同一个浏览器里装了两个油猴类浏览器插件);
  38. 3. 安装或更新完插件后,以及在游戏设置里切换过语言后,必须刷新游戏网页;
  39. 4. 请在电脑上、使用最新版本Chrome浏览器、使用最新版本TamperMonkey(油猴)插件尝试(作者精力有限,做不到逐个适配各种环境、为每个人定位环境问题,
  40. 遇到问题时请优先使用上述主流环境。如果你一定要使用旧版本或其它品牌的浏览器或油猴插件,遇到问题请优先自行摸索如何解决,作者很可能无法解决你的问题。
  41. 手机使用问题很多,作者不定位手机上问题。问问群友用什么浏览器好使,多换几个浏览器试试。苹果手机建议尝试focus浏览器。)。
  42.  
  43. 如果仍有问题,请私聊作者具体问题是什么、复现问题的具体步骤、最好附带截图;
  44. 与网络有关的问题,右上角红字显示无法从API更新市场数据时,点击红字查看错误信息,截图发给作者;
  45. 报错日志是定位问题的快速甚至唯一方法,请打开浏览器开发者工具查看终端,刷新游戏网页,复现遇到的问题,截图发给作者。
  46. */
  47.  
  48. (() => {
  49. "use strict";
  50.  
  51. const THOUSAND_SEPERATOR = new Intl.NumberFormat().format(1111).replaceAll("1", "").at(0) || "";
  52. const DECIMAL_SEPERATOR = new Intl.NumberFormat().format(1.1).replaceAll("1", "").at(0);
  53.  
  54. const isZHInGameSetting = localStorage.getItem("i18nextLng")?.toLowerCase()?.startsWith("zh"); // 获取游戏内设置语言
  55. let isZH = isZHInGameSetting; // MWITools 本身显示的语言默认由游戏内设置语言决定
  56.  
  57. /* 自定义插件字体颜色 */
  58. /* 找颜色自行网上搜索"CSS颜色" */
  59. /* 可以是颜色名称,比如"red";也可以是颜色Hex,比如"#ED694D" */
  60. // Customization
  61. let SCRIPT_COLOR_MAIN = "green"; // 脚本主要字体颜色
  62. let SCRIPT_COLOR_TOOLTIP = "darkgreen"; // 物品悬浮窗的字体颜色
  63. const SCRIPT_COLOR_ALERT = "red"; // 警告字体颜色
  64.  
  65. const MARKET_API_URL = "https://www.milkywayidle.com/game_data/marketplace.json";
  66.  
  67. let settingsMap = {
  68. useOrangeAsMainColor: {
  69. id: "useOrangeAsMainColor",
  70. desc: isZH ? "使用橙色字体" : "Use orange as the main color for the script.",
  71. isTrue: true,
  72. },
  73. totalActionTime: {
  74. id: "totalActionTime",
  75. desc: isZH
  76. ? "左上角显示:当前动作预计总耗时、预计何时完成"
  77. : "Top left: Estimated total time of the current action, estimated complete time.",
  78. isTrue: true,
  79. },
  80. actionPanel_totalTime: {
  81. id: "actionPanel_totalTime",
  82. desc: isZH
  83. ? "动作面板显示:动作预计总耗时、到多少级还需做多少次、每小时经验"
  84. : "Action panel: Estimated total time of the action, times needed to reach a target skill level, exp/hour.",
  85. isTrue: true,
  86. },
  87. actionPanel_totalTime_quickInputs: {
  88. id: "actionPanel_totalTime_quickInputs",
  89. desc: isZH ? "动作面板显示:快速输入次数 [依赖上一项]" : "Action panel: Quick input numbers. [Depends on the previous selection]",
  90. isTrue: true,
  91. },
  92. actionPanel_foragingTotal: {
  93. id: "actionPanel_foragingTotal",
  94. desc: isZH
  95. ? "动作面板显示:采摘综合图显示综合收益 [依赖上一项]"
  96. : "Action panel: Overall profit of the foraging maps with multiple outcomes. [Depends on the previous selection]",
  97. isTrue: true,
  98. },
  99. networth: {
  100. id: "networth",
  101. desc: isZH
  102. ? "右上角显示:流动资产(+2及以上物品按强化模拟成本计算)"
  103. : "Top right: Current assets (Items with at least 2 enhancement levels are valued by enchancing simulator).",
  104. isTrue: true,
  105. },
  106. invWorth: {
  107. id: "invWorth",
  108. desc: isZH
  109. ? "仓库搜索栏下方显示:仓库和战力总结 [依赖上一项]"
  110. : "Below inventory search bar: Inventory and character summery. [Depends on the previous selection]",
  111. isTrue: true,
  112. },
  113. invSort: {
  114. id: "invSort",
  115. desc: isZH ? "仓库显示:仓库物品排序 [依赖上一项]" : "Inventory: Sort inventory items. [Depends on the previous selection]",
  116. isTrue: true,
  117. },
  118. profileBuildScore: {
  119. id: "profileBuildScore",
  120. desc: isZH ? "人物面板显示:战力分" : "Profile panel: Build score.",
  121. isTrue: true,
  122. },
  123. itemTooltip_prices: {
  124. id: "itemTooltip_prices",
  125. desc: isZH ? "物品悬浮窗显示:24小时市场均价" : "Item tooltip: 24 hours average market price.",
  126. isTrue: true,
  127. },
  128. itemTooltip_profit: {
  129. id: "itemTooltip_profit",
  130. desc: isZH
  131. ? "物品悬浮窗显示:生产成本和利润计算 [依赖上一项]"
  132. : "Item tooltip: Production cost and profit. [Depends on the previous selection]",
  133. isTrue: true,
  134. },
  135. showConsumTips: {
  136. id: "showConsumTips",
  137. desc: isZH
  138. ? "物品悬浮窗显示:消耗品回血回魔速度、回复性价比、每天最多消耗数量"
  139. : "Item tooltip: HP/MP consumables restore speed, cost performance, max cost per day.",
  140. isTrue: true,
  141. },
  142. networkAlert: {
  143. id: "networkAlert",
  144. desc: isZH ? "右上角显示:无法联网更新市场数据时,红字警告" : "Top right: Alert message when market price data can not be fetched.",
  145. isTrue: true,
  146. },
  147. expPercentage: {
  148. id: "expPercentage",
  149. desc: isZH ? "左侧栏显示:技能经验百分比" : "Left sidebar: Percentages of exp of the skill levels.",
  150. isTrue: true,
  151. },
  152. battlePanel: {
  153. id: "battlePanel",
  154. desc: isZH
  155. ? "战斗总结面板(战斗时点击玩家头像)显示:平均每小时战斗次数、收入、经验"
  156. : "Battle info panel(click on player avatar during combat): Encounters/hour, revenue, exp.",
  157. isTrue: true,
  158. },
  159. itemIconLevel: {
  160. id: "itemIconLevel",
  161. desc: isZH ? "装备图标右上角显示:装备等级" : "Top right corner of equipment icons: Equipment level.",
  162. isTrue: true,
  163. },
  164. showsKeyInfoInIcon: {
  165. id: "showsKeyInfoInIcon",
  166. desc: isZH
  167. ? "钥匙和钥匙碎片图标右上角显示:对应的地图序号 [依赖上一项]"
  168. : "Top right corner of key/fragment icons: Corresponding combat zone index number. [Depends on the previous selection]",
  169. isTrue: true,
  170. },
  171. marketFilter: {
  172. id: "marketFilter",
  173. desc: isZH ? "市场页面显示:装备按等级、职业、部位筛选" : "Marketplace: Filter by equipment level, class, slot.",
  174. isTrue: true,
  175. },
  176. taskMapIndex: {
  177. id: "taskMapIndex",
  178. desc: isZH ? "任务页面显示:目标战斗地图序号" : "Tasks page: Combat zone index number.",
  179. isTrue: true,
  180. },
  181. mapIndex: {
  182. id: "mapIndex",
  183. desc: isZH ? "战斗地图选择页面显示:地图序号" : "Combat zones page: Combat zone index number.",
  184. isTrue: true,
  185. },
  186. skillbook: {
  187. id: "skillbook",
  188. desc: isZH
  189. ? "技能书的物品词典面板显示:到多少级还需要多少本技能书"
  190. : "Item dictionary of skill books: Number of books needed to reach target skill level.",
  191. isTrue: true,
  192. },
  193. ThirdPartyLinks: {
  194. id: "ThirdPartyLinks",
  195. desc: isZH ? "左侧菜单栏显示:第三方工具网站链接、脚本设置链接" : "Left sidebar: Links to 3rd-party websites, script settings.",
  196. isTrue: true,
  197. },
  198. actionQueue: {
  199. id: "actionQueue",
  200. desc: isZH
  201. ? "上方动作队列菜单显示:队列中每个动作预计总时间、到何时完成"
  202. : "Queued actions panel at the top: Estimated total time and complete time of each queued action.",
  203. isTrue: true,
  204. },
  205. enhanceSim: {
  206. id: "enhanceSim",
  207. desc: isZH
  208. ? "带强化等级的装备的悬浮菜单显示:强化模拟计算"
  209. : "Tooltip of equipment with enhancement level: Enhancing simulator calculations.",
  210. isTrue: true,
  211. },
  212. checkEquipment: {
  213. id: "checkEquipment",
  214. desc: isZH
  215. ? "页面上方显示:战斗时穿了生产装备,或者生产时没有穿对应的生产装备而仓库里有,红字警告"
  216. : "Top: Alert message when combating with production equipments equipted, or producing when there are unequipted corresponding production equipment in the inventory.",
  217. isTrue: true,
  218. },
  219. notifiEmptyAction: {
  220. id: "notifiEmptyAction",
  221. desc: isZH
  222. ? "弹窗通知:正在空闲(游戏网页打开时才有效)"
  223. : "Browser notification: Action queue is empty. (Works only when the game page is open.)",
  224. isTrue: false,
  225. },
  226. fillMarketOrderPrice: {
  227. id: "fillMarketOrderPrice",
  228. desc: isZH
  229. ? "发布市场订单时自动填写为最小压价"
  230. : "Automatically input price with the smallest increasement/decreasement when posting marketplace bid/sell orders.",
  231. isTrue: true,
  232. },
  233. showDamage: {
  234. id: "showDamage",
  235. desc: isZH ? "战斗时,人物头像下方显示:伤害统计数字" : "Bottom of player avatar during combat: DPS.",
  236. isTrue: true,
  237. },
  238. showDamageGraph: {
  239. id: "showDamageGraph",
  240. desc: isZH
  241. ? "战斗时,悬浮窗显示:伤害统计图表 [依赖上一项]"
  242. : "Floating window during combat: DPS chart. [Depends on the previous selection]",
  243. isTrue: true,
  244. },
  245. damageGraphTransparentBackground: {
  246. id: "damageGraphTransparentBackground",
  247. desc: isZH ? "伤害统计图表背景透明 [依赖上一项]" : "DPS chart transparent and blur background. [Depends on the previous selection]",
  248. isTrue: true,
  249. },
  250. forceMWIToolsDisplayZH: {
  251. id: "forceMWIToolsDisplayZH",
  252. desc: isZH ? "MWITools本身强制显示中文 MWITools always in Chinese" : "MWITools本身强制显示中文 MWITools always in Chinese",
  253. isTrue: false,
  254. },
  255. };
  256. readSettings();
  257.  
  258. // 非游戏网站
  259. if (document.URL.includes("amvoidguy.github.io") || document.URL.includes("shykai.github.io/MWICombatSimulatorTest/")) {
  260. addImportButtonForAmvoidguy();
  261. observeResultsForAmvoidguy();
  262. return;
  263. } else if (document.URL.includes("shykai.github.io/mwisim")) {
  264. addImportButtonFor9Battles();
  265. observeResultsForAmvoidguy();
  266. return;
  267. } else if (document.URL.includes("mooneycalc.netlify.app")) {
  268. addImportButtonForMooneycalc();
  269. return;
  270. }
  271.  
  272. /* 官方汉化 */
  273. // /static/js/main.9972e69d.chunk.js
  274. const ZHitemNames = {
  275. "/items/coin": "\u91d1\u5e01",
  276. "/items/task_token": "\u4efb\u52a1\u4ee3\u5e01",
  277. "/items/chimerical_token": "\u5947\u5e7b\u4ee3\u5e01",
  278. "/items/sinister_token": "\u9634\u68ee\u4ee3\u5e01",
  279. "/items/enchanted_token": "\u79d8\u6cd5\u4ee3\u5e01",
  280. "/items/pirate_token": "\u6d77\u76d7\u4ee3\u5e01",
  281. "/items/cowbell": "\u725b\u94c3",
  282. "/items/bag_of_10_cowbells": "\u725b\u94c3\u888b (10\u4e2a)",
  283. "/items/purples_gift": "\u5c0f\u7d2b\u725b\u7684\u793c\u7269",
  284. "/items/small_meteorite_cache": "\u5c0f\u9668\u77f3\u8231",
  285. "/items/medium_meteorite_cache": "\u4e2d\u9668\u77f3\u8231",
  286. "/items/large_meteorite_cache": "\u5927\u9668\u77f3\u8231",
  287. "/items/small_artisans_crate": "\u5c0f\u5de5\u5320\u5323",
  288. "/items/medium_artisans_crate": "\u4e2d\u5de5\u5320\u5323",
  289. "/items/large_artisans_crate": "\u5927\u5de5\u5320\u5323",
  290. "/items/small_treasure_chest": "\u5c0f\u5b9d\u7bb1",
  291. "/items/medium_treasure_chest": "\u4e2d\u5b9d\u7bb1",
  292. "/items/large_treasure_chest": "\u5927\u5b9d\u7bb1",
  293. "/items/chimerical_chest": "\u5947\u5e7b\u5b9d\u7bb1",
  294. "/items/sinister_chest": "\u9634\u68ee\u5b9d\u7bb1",
  295. "/items/enchanted_chest": "\u79d8\u6cd5\u5b9d\u7bb1",
  296. "/items/pirate_chest": "\u6d77\u76d7\u5b9d\u7bb1",
  297. "/items/blue_key_fragment": "\u84dd\u8272\u94a5\u5319\u788e\u7247",
  298. "/items/green_key_fragment": "\u7eff\u8272\u94a5\u5319\u788e\u7247",
  299. "/items/purple_key_fragment": "\u7d2b\u8272\u94a5\u5319\u788e\u7247",
  300. "/items/white_key_fragment": "\u767d\u8272\u94a5\u5319\u788e\u7247",
  301. "/items/orange_key_fragment": "\u6a59\u8272\u94a5\u5319\u788e\u7247",
  302. "/items/brown_key_fragment": "\u68d5\u8272\u94a5\u5319\u788e\u7247",
  303. "/items/stone_key_fragment": "\u77f3\u5934\u94a5\u5319\u788e\u7247",
  304. "/items/dark_key_fragment": "\u9ed1\u6697\u94a5\u5319\u788e\u7247",
  305. "/items/burning_key_fragment": "\u71c3\u70e7\u94a5\u5319\u788e\u7247",
  306. "/items/chimerical_entry_key": "\u5947\u5e7b\u94a5\u5319",
  307. "/items/chimerical_chest_key": "\u5947\u5e7b\u5b9d\u7bb1\u94a5\u5319",
  308. "/items/sinister_entry_key": "\u9634\u68ee\u94a5\u5319",
  309. "/items/sinister_chest_key": "\u9634\u68ee\u5b9d\u7bb1\u94a5\u5319",
  310. "/items/enchanted_entry_key": "\u79d8\u6cd5\u94a5\u5319",
  311. "/items/enchanted_chest_key": "\u79d8\u6cd5\u5b9d\u7bb1\u94a5\u5319",
  312. "/items/pirate_entry_key": "\u6d77\u76d7\u94a5\u5319",
  313. "/items/pirate_chest_key": "\u6d77\u76d7\u5b9d\u7bb1\u94a5\u5319",
  314. "/items/donut": "\u751c\u751c\u5708",
  315. "/items/blueberry_donut": "\u84dd\u8393\u751c\u751c\u5708",
  316. "/items/blackberry_donut": "\u9ed1\u8393\u751c\u751c\u5708",
  317. "/items/strawberry_donut": "\u8349\u8393\u751c\u751c\u5708",
  318. "/items/mooberry_donut": "\u54de\u8393\u751c\u751c\u5708",
  319. "/items/marsberry_donut": "\u706b\u661f\u8393\u751c\u751c\u5708",
  320. "/items/spaceberry_donut": "\u592a\u7a7a\u8393\u751c\u751c\u5708",
  321. "/items/cupcake": "\u7eb8\u676f\u86cb\u7cd5",
  322. "/items/blueberry_cake": "\u84dd\u8393\u86cb\u7cd5",
  323. "/items/blackberry_cake": "\u9ed1\u8393\u86cb\u7cd5",
  324. "/items/strawberry_cake": "\u8349\u8393\u86cb\u7cd5",
  325. "/items/mooberry_cake": "\u54de\u8393\u86cb\u7cd5",
  326. "/items/marsberry_cake": "\u706b\u661f\u8393\u86cb\u7cd5",
  327. "/items/spaceberry_cake": "\u592a\u7a7a\u8393\u86cb\u7cd5",
  328. "/items/gummy": "\u8f6f\u7cd6",
  329. "/items/apple_gummy": "\u82f9\u679c\u8f6f\u7cd6",
  330. "/items/orange_gummy": "\u6a59\u5b50\u8f6f\u7cd6",
  331. "/items/plum_gummy": "\u674e\u5b50\u8f6f\u7cd6",
  332. "/items/peach_gummy": "\u6843\u5b50\u8f6f\u7cd6",
  333. "/items/dragon_fruit_gummy": "\u706b\u9f99\u679c\u8f6f\u7cd6",
  334. "/items/star_fruit_gummy": "\u6768\u6843\u8f6f\u7cd6",
  335. "/items/yogurt": "\u9178\u5976",
  336. "/items/apple_yogurt": "\u82f9\u679c\u9178\u5976",
  337. "/items/orange_yogurt": "\u6a59\u5b50\u9178\u5976",
  338. "/items/plum_yogurt": "\u674e\u5b50\u9178\u5976",
  339. "/items/peach_yogurt": "\u6843\u5b50\u9178\u5976",
  340. "/items/dragon_fruit_yogurt": "\u706b\u9f99\u679c\u9178\u5976",
  341. "/items/star_fruit_yogurt": "\u6768\u6843\u9178\u5976",
  342. "/items/milking_tea": "\u6324\u5976\u8336",
  343. "/items/foraging_tea": "\u91c7\u6458\u8336",
  344. "/items/woodcutting_tea": "\u4f10\u6728\u8336",
  345. "/items/cooking_tea": "\u70f9\u996a\u8336",
  346. "/items/brewing_tea": "\u51b2\u6ce1\u8336",
  347. "/items/alchemy_tea": "\u70bc\u91d1\u8336",
  348. "/items/enhancing_tea": "\u5f3a\u5316\u8336",
  349. "/items/cheesesmithing_tea": "\u5976\u916a\u953b\u9020\u8336",
  350. "/items/crafting_tea": "\u5236\u4f5c\u8336",
  351. "/items/tailoring_tea": "\u7f1d\u7eab\u8336",
  352. "/items/super_milking_tea": "\u8d85\u7ea7\u6324\u5976\u8336",
  353. "/items/super_foraging_tea": "\u8d85\u7ea7\u91c7\u6458\u8336",
  354. "/items/super_woodcutting_tea": "\u8d85\u7ea7\u4f10\u6728\u8336",
  355. "/items/super_cooking_tea": "\u8d85\u7ea7\u70f9\u996a\u8336",
  356. "/items/super_brewing_tea": "\u8d85\u7ea7\u51b2\u6ce1\u8336",
  357. "/items/super_alchemy_tea": "\u8d85\u7ea7\u70bc\u91d1\u8336",
  358. "/items/super_enhancing_tea": "\u8d85\u7ea7\u5f3a\u5316\u8336",
  359. "/items/super_cheesesmithing_tea": "\u8d85\u7ea7\u5976\u916a\u953b\u9020\u8336",
  360. "/items/super_crafting_tea": "\u8d85\u7ea7\u5236\u4f5c\u8336",
  361. "/items/super_tailoring_tea": "\u8d85\u7ea7\u7f1d\u7eab\u8336",
  362. "/items/ultra_milking_tea": "\u7a76\u6781\u6324\u5976\u8336",
  363. "/items/ultra_foraging_tea": "\u7a76\u6781\u91c7\u6458\u8336",
  364. "/items/ultra_woodcutting_tea": "\u7a76\u6781\u4f10\u6728\u8336",
  365. "/items/ultra_cooking_tea": "\u7a76\u6781\u70f9\u996a\u8336",
  366. "/items/ultra_brewing_tea": "\u7a76\u6781\u51b2\u6ce1\u8336",
  367. "/items/ultra_alchemy_tea": "\u7a76\u6781\u70bc\u91d1\u8336",
  368. "/items/ultra_enhancing_tea": "\u7a76\u6781\u5f3a\u5316\u8336",
  369. "/items/ultra_cheesesmithing_tea": "\u7a76\u6781\u5976\u916a\u953b\u9020\u8336",
  370. "/items/ultra_crafting_tea": "\u7a76\u6781\u5236\u4f5c\u8336",
  371. "/items/ultra_tailoring_tea": "\u7a76\u6781\u7f1d\u7eab\u8336",
  372. "/items/gathering_tea": "\u91c7\u96c6\u8336",
  373. "/items/gourmet_tea": "\u7f8e\u98df\u8336",
  374. "/items/wisdom_tea": "\u7ecf\u9a8c\u8336",
  375. "/items/processing_tea": "\u52a0\u5de5\u8336",
  376. "/items/efficiency_tea": "\u6548\u7387\u8336",
  377. "/items/artisan_tea": "\u5de5\u5320\u8336",
  378. "/items/catalytic_tea": "\u50ac\u5316\u8336",
  379. "/items/blessed_tea": "\u798f\u6c14\u8336",
  380. "/items/stamina_coffee": "\u8010\u529b\u5496\u5561",
  381. "/items/intelligence_coffee": "\u667a\u529b\u5496\u5561",
  382. "/items/defense_coffee": "\u9632\u5fa1\u5496\u5561",
  383. "/items/attack_coffee": "\u653b\u51fb\u5496\u5561",
  384. "/items/power_coffee": "\u529b\u91cf\u5496\u5561",
  385. "/items/ranged_coffee": "\u8fdc\u7a0b\u5496\u5561",
  386. "/items/magic_coffee": "\u9b54\u6cd5\u5496\u5561",
  387. "/items/super_stamina_coffee": "\u8d85\u7ea7\u8010\u529b\u5496\u5561",
  388. "/items/super_intelligence_coffee": "\u8d85\u7ea7\u667a\u529b\u5496\u5561",
  389. "/items/super_defense_coffee": "\u8d85\u7ea7\u9632\u5fa1\u5496\u5561",
  390. "/items/super_attack_coffee": "\u8d85\u7ea7\u653b\u51fb\u5496\u5561",
  391. "/items/super_power_coffee": "\u8d85\u7ea7\u529b\u91cf\u5496\u5561",
  392. "/items/super_ranged_coffee": "\u8d85\u7ea7\u8fdc\u7a0b\u5496\u5561",
  393. "/items/super_magic_coffee": "\u8d85\u7ea7\u9b54\u6cd5\u5496\u5561",
  394. "/items/ultra_stamina_coffee": "\u7a76\u6781\u8010\u529b\u5496\u5561",
  395. "/items/ultra_intelligence_coffee": "\u7a76\u6781\u667a\u529b\u5496\u5561",
  396. "/items/ultra_defense_coffee": "\u7a76\u6781\u9632\u5fa1\u5496\u5561",
  397. "/items/ultra_attack_coffee": "\u7a76\u6781\u653b\u51fb\u5496\u5561",
  398. "/items/ultra_power_coffee": "\u7a76\u6781\u529b\u91cf\u5496\u5561",
  399. "/items/ultra_ranged_coffee": "\u7a76\u6781\u8fdc\u7a0b\u5496\u5561",
  400. "/items/ultra_magic_coffee": "\u7a76\u6781\u9b54\u6cd5\u5496\u5561",
  401. "/items/wisdom_coffee": "\u7ecf\u9a8c\u5496\u5561",
  402. "/items/lucky_coffee": "\u5e78\u8fd0\u5496\u5561",
  403. "/items/swiftness_coffee": "\u8fc5\u6377\u5496\u5561",
  404. "/items/channeling_coffee": "\u541f\u5531\u5496\u5561",
  405. "/items/critical_coffee": "\u66b4\u51fb\u5496\u5561",
  406. "/items/poke": "\u7834\u80c6\u4e4b\u523a",
  407. "/items/impale": "\u900f\u9aa8\u4e4b\u523a",
  408. "/items/puncture": "\u7834\u7532\u4e4b\u523a",
  409. "/items/penetrating_strike": "\u8d2f\u5fc3\u4e4b\u523a",
  410. "/items/scratch": "\u722a\u5f71\u65a9",
  411. "/items/cleave": "\u5206\u88c2\u65a9",
  412. "/items/maim": "\u8840\u5203\u65a9",
  413. "/items/crippling_slash": "\u81f4\u6b8b\u65a9",
  414. "/items/smack": "\u91cd\u78be",
  415. "/items/sweep": "\u91cd\u626b",
  416. "/items/stunning_blow": "\u91cd\u9524",
  417. "/items/fracturing_impact": "\u788e\u88c2\u51b2\u51fb",
  418. "/items/shield_bash": "\u76fe\u51fb",
  419. "/items/quick_shot": "\u5feb\u901f\u5c04\u51fb",
  420. "/items/aqua_arrow": "\u6d41\u6c34\u7bad",
  421. "/items/flame_arrow": "\u70c8\u7130\u7bad",
  422. "/items/rain_of_arrows": "\u7bad\u96e8",
  423. "/items/silencing_shot": "\u6c89\u9ed8\u4e4b\u7bad",
  424. "/items/steady_shot": "\u7a33\u5b9a\u5c04\u51fb",
  425. "/items/pestilent_shot": "\u75ab\u75c5\u5c04\u51fb",
  426. "/items/penetrating_shot": "\u8d2f\u7a7f\u5c04\u51fb",
  427. "/items/water_strike": "\u6d41\u6c34\u51b2\u51fb",
  428. "/items/ice_spear": "\u51b0\u67aa\u672f",
  429. "/items/frost_surge": "\u51b0\u971c\u7206\u88c2",
  430. "/items/mana_spring": "\u6cd5\u529b\u55b7\u6cc9",
  431. "/items/entangle": "\u7f20\u7ed5",
  432. "/items/toxic_pollen": "\u5267\u6bd2\u7c89\u5c18",
  433. "/items/natures_veil": "\u81ea\u7136\u83cc\u5e55",
  434. "/items/life_drain": "\u751f\u547d\u5438\u53d6",
  435. "/items/fireball": "\u706b\u7403",
  436. "/items/flame_blast": "\u7194\u5ca9\u7206\u88c2",
  437. "/items/firestorm": "\u706b\u7130\u98ce\u66b4",
  438. "/items/smoke_burst": "\u70df\u7206\u706d\u5f71",
  439. "/items/minor_heal": "\u521d\u7ea7\u81ea\u6108\u672f",
  440. "/items/heal": "\u81ea\u6108\u672f",
  441. "/items/quick_aid": "\u5feb\u901f\u6cbb\u7597\u672f",
  442. "/items/rejuvenate": "\u7fa4\u4f53\u6cbb\u7597\u672f",
  443. "/items/taunt": "\u5632\u8bbd",
  444. "/items/provoke": "\u6311\u8845",
  445. "/items/toughness": "\u575a\u97e7",
  446. "/items/elusiveness": "\u95ea\u907f",
  447. "/items/precision": "\u7cbe\u786e",
  448. "/items/berserk": "\u72c2\u66b4",
  449. "/items/elemental_affinity": "\u5143\u7d20\u589e\u5e45",
  450. "/items/frenzy": "\u72c2\u901f",
  451. "/items/spike_shell": "\u5c16\u523a\u9632\u62a4",
  452. "/items/arcane_reflection": "\u5965\u672f\u53cd\u5c04",
  453. "/items/vampirism": "\u5438\u8840",
  454. "/items/revive": "\u590d\u6d3b",
  455. "/items/insanity": "\u75af\u72c2",
  456. "/items/invincible": "\u65e0\u654c",
  457. "/items/fierce_aura": "\u7269\u7406\u5149\u73af",
  458. "/items/aqua_aura": "\u6d41\u6c34\u5149\u73af",
  459. "/items/sylvan_aura": "\u81ea\u7136\u5149\u73af",
  460. "/items/flame_aura": "\u706b\u7130\u5149\u73af",
  461. "/items/speed_aura": "\u901f\u5ea6\u5149\u73af",
  462. "/items/critical_aura": "\u66b4\u51fb\u5149\u73af",
  463. "/items/gobo_stabber": "\u54e5\u5e03\u6797\u957f\u5251",
  464. "/items/gobo_slasher": "\u54e5\u5e03\u6797\u5173\u5200",
  465. "/items/gobo_smasher": "\u54e5\u5e03\u6797\u72fc\u7259\u68d2",
  466. "/items/spiked_bulwark": "\u5c16\u523a\u91cd\u76fe",
  467. "/items/werewolf_slasher": "\u72fc\u4eba\u5173\u5200",
  468. "/items/griffin_bulwark": "\u72ee\u9e6b\u91cd\u76fe",
  469. "/items/gobo_shooter": "\u54e5\u5e03\u6797\u5f39\u5f13",
  470. "/items/vampiric_bow": "\u5438\u8840\u5f13",
  471. "/items/cursed_bow": "\u5492\u6028\u4e4b\u5f13",
  472. "/items/gobo_boomstick": "\u54e5\u5e03\u6797\u706b\u68cd",
  473. "/items/cheese_bulwark": "\u5976\u916a\u91cd\u76fe",
  474. "/items/verdant_bulwark": "\u7fe0\u7eff\u91cd\u76fe",
  475. "/items/azure_bulwark": "\u851a\u84dd\u91cd\u76fe",
  476. "/items/burble_bulwark": "\u6df1\u7d2b\u91cd\u76fe",
  477. "/items/crimson_bulwark": "\u7edb\u7ea2\u91cd\u76fe",
  478. "/items/rainbow_bulwark": "\u5f69\u8679\u91cd\u76fe",
  479. "/items/holy_bulwark": "\u795e\u5723\u91cd\u76fe",
  480. "/items/wooden_bow": "\u6728\u5f13",
  481. "/items/birch_bow": "\u6866\u6728\u5f13",
  482. "/items/cedar_bow": "\u96ea\u677e\u5f13",
  483. "/items/purpleheart_bow": "\u7d2b\u5fc3\u5f13",
  484. "/items/ginkgo_bow": "\u94f6\u674f\u5f13",
  485. "/items/redwood_bow": "\u7ea2\u6749\u5f13",
  486. "/items/arcane_bow": "\u795e\u79d8\u5f13",
  487. "/items/stalactite_spear": "\u77f3\u949f\u957f\u67aa",
  488. "/items/granite_bludgeon": "\u82b1\u5c97\u5ca9\u5927\u68d2",
  489. "/items/furious_spear": "\u72c2\u6012\u957f\u67aa",
  490. "/items/regal_sword": "\u541b\u738b\u4e4b\u5251",
  491. "/items/chaotic_flail": "\u6df7\u6c8c\u8fde\u67b7",
  492. "/items/soul_hunter_crossbow": "\u7075\u9b42\u730e\u624b\u5f29",
  493. "/items/sundering_crossbow": "\u88c2\u7a7a\u4e4b\u5f29",
  494. "/items/frost_staff": "\u51b0\u971c\u6cd5\u6756",
  495. "/items/infernal_battlestaff": "\u70bc\u72f1\u6cd5\u6756",
  496. "/items/jackalope_staff": "\u9e7f\u89d2\u5154\u4e4b\u6756",
  497. "/items/rippling_trident": "\u6d9f\u6f2a\u4e09\u53c9\u621f",
  498. "/items/blooming_trident": "\u7efd\u653e\u4e09\u53c9\u621f",
  499. "/items/blazing_trident": "\u70bd\u7130\u4e09\u53c9\u621f",
  500. "/items/cheese_sword": "\u5976\u916a\u5251",
  501. "/items/verdant_sword": "\u7fe0\u7eff\u5251",
  502. "/items/azure_sword": "\u851a\u84dd\u5251",
  503. "/items/burble_sword": "\u6df1\u7d2b\u5251",
  504. "/items/crimson_sword": "\u7edb\u7ea2\u5251",
  505. "/items/rainbow_sword": "\u5f69\u8679\u5251",
  506. "/items/holy_sword": "\u795e\u5723\u5251",
  507. "/items/cheese_spear": "\u5976\u916a\u957f\u67aa",
  508. "/items/verdant_spear": "\u7fe0\u7eff\u957f\u67aa",
  509. "/items/azure_spear": "\u851a\u84dd\u957f\u67aa",
  510. "/items/burble_spear": "\u6df1\u7d2b\u957f\u67aa",
  511. "/items/crimson_spear": "\u7edb\u7ea2\u957f\u67aa",
  512. "/items/rainbow_spear": "\u5f69\u8679\u957f\u67aa",
  513. "/items/holy_spear": "\u795e\u5723\u957f\u67aa",
  514. "/items/cheese_mace": "\u5976\u916a\u9489\u5934\u9524",
  515. "/items/verdant_mace": "\u7fe0\u7eff\u9489\u5934\u9524",
  516. "/items/azure_mace": "\u851a\u84dd\u9489\u5934\u9524",
  517. "/items/burble_mace": "\u6df1\u7d2b\u9489\u5934\u9524",
  518. "/items/crimson_mace": "\u7edb\u7ea2\u9489\u5934\u9524",
  519. "/items/rainbow_mace": "\u5f69\u8679\u9489\u5934\u9524",
  520. "/items/holy_mace": "\u795e\u5723\u9489\u5934\u9524",
  521. "/items/wooden_crossbow": "\u6728\u5f29",
  522. "/items/birch_crossbow": "\u6866\u6728\u5f29",
  523. "/items/cedar_crossbow": "\u96ea\u677e\u5f29",
  524. "/items/purpleheart_crossbow": "\u7d2b\u5fc3\u5f29",
  525. "/items/ginkgo_crossbow": "\u94f6\u674f\u5f29",
  526. "/items/redwood_crossbow": "\u7ea2\u6749\u5f29",
  527. "/items/arcane_crossbow": "\u795e\u79d8\u5f29",
  528. "/items/wooden_water_staff": "\u6728\u5236\u6c34\u6cd5\u6756",
  529. "/items/birch_water_staff": "\u6866\u6728\u6c34\u6cd5\u6756",
  530. "/items/cedar_water_staff": "\u96ea\u677e\u6c34\u6cd5\u6756",
  531. "/items/purpleheart_water_staff": "\u7d2b\u5fc3\u6c34\u6cd5\u6756",
  532. "/items/ginkgo_water_staff": "\u94f6\u674f\u6c34\u6cd5\u6756",
  533. "/items/redwood_water_staff": "\u7ea2\u6749\u6c34\u6cd5\u6756",
  534. "/items/arcane_water_staff": "\u795e\u79d8\u6c34\u6cd5\u6756",
  535. "/items/wooden_nature_staff": "\u6728\u5236\u81ea\u7136\u6cd5\u6756",
  536. "/items/birch_nature_staff": "\u6866\u6728\u81ea\u7136\u6cd5\u6756",
  537. "/items/cedar_nature_staff": "\u96ea\u677e\u81ea\u7136\u6cd5\u6756",
  538. "/items/purpleheart_nature_staff": "\u7d2b\u5fc3\u81ea\u7136\u6cd5\u6756",
  539. "/items/ginkgo_nature_staff": "\u94f6\u674f\u81ea\u7136\u6cd5\u6756",
  540. "/items/redwood_nature_staff": "\u7ea2\u6749\u81ea\u7136\u6cd5\u6756",
  541. "/items/arcane_nature_staff": "\u795e\u79d8\u81ea\u7136\u6cd5\u6756",
  542. "/items/wooden_fire_staff": "\u6728\u5236\u706b\u6cd5\u6756",
  543. "/items/birch_fire_staff": "\u6866\u6728\u706b\u6cd5\u6756",
  544. "/items/cedar_fire_staff": "\u96ea\u677e\u706b\u6cd5\u6756",
  545. "/items/purpleheart_fire_staff": "\u7d2b\u5fc3\u706b\u6cd5\u6756",
  546. "/items/ginkgo_fire_staff": "\u94f6\u674f\u706b\u6cd5\u6756",
  547. "/items/redwood_fire_staff": "\u7ea2\u6749\u706b\u6cd5\u6756",
  548. "/items/arcane_fire_staff": "\u795e\u79d8\u706b\u6cd5\u6756",
  549. "/items/eye_watch": "\u638c\u4e0a\u76d1\u5de5",
  550. "/items/snake_fang_dirk": "\u86c7\u7259\u77ed\u5251",
  551. "/items/vision_shield": "\u89c6\u89c9\u76fe",
  552. "/items/gobo_defender": "\u54e5\u5e03\u6797\u9632\u5fa1\u8005",
  553. "/items/vampire_fang_dirk": "\u5438\u8840\u9b3c\u77ed\u5251",
  554. "/items/knights_aegis": "\u9a91\u58eb\u76fe",
  555. "/items/treant_shield": "\u6811\u4eba\u76fe",
  556. "/items/manticore_shield": "\u874e\u72ee\u76fe",
  557. "/items/tome_of_healing": "\u6cbb\u7597\u4e4b\u4e66",
  558. "/items/tome_of_the_elements": "\u5143\u7d20\u4e4b\u4e66",
  559. "/items/watchful_relic": "\u8b66\u6212\u9057\u7269",
  560. "/items/bishops_codex": "\u4e3b\u6559\u6cd5\u5178",
  561. "/items/cheese_buckler": "\u5976\u916a\u5706\u76fe",
  562. "/items/verdant_buckler": "\u7fe0\u7eff\u5706\u76fe",
  563. "/items/azure_buckler": "\u851a\u84dd\u5706\u76fe",
  564. "/items/burble_buckler": "\u6df1\u7d2b\u5706\u76fe",
  565. "/items/crimson_buckler": "\u7edb\u7ea2\u5706\u76fe",
  566. "/items/rainbow_buckler": "\u5f69\u8679\u5706\u76fe",
  567. "/items/holy_buckler": "\u795e\u5723\u5706\u76fe",
  568. "/items/wooden_shield": "\u6728\u76fe",
  569. "/items/birch_shield": "\u6866\u6728\u76fe",
  570. "/items/cedar_shield": "\u96ea\u677e\u76fe",
  571. "/items/purpleheart_shield": "\u7d2b\u5fc3\u76fe",
  572. "/items/ginkgo_shield": "\u94f6\u674f\u76fe",
  573. "/items/redwood_shield": "\u7ea2\u6749\u76fe",
  574. "/items/arcane_shield": "\u795e\u79d8\u76fe",
  575. "/items/sinister_cape": "\u9634\u68ee\u6597\u7bf7",
  576. "/items/chimerical_quiver": "\u5947\u5e7b\u7bad\u888b",
  577. "/items/enchanted_cloak": "\u79d8\u6cd5\u62ab\u98ce",
  578. "/items/red_culinary_hat": "\u7ea2\u8272\u53a8\u5e08\u5e3d",
  579. "/items/snail_shell_helmet": "\u8717\u725b\u58f3\u5934\u76d4",
  580. "/items/vision_helmet": "\u89c6\u89c9\u5934\u76d4",
  581. "/items/fluffy_red_hat": "\u84ec\u677e\u7ea2\u5e3d\u5b50",
  582. "/items/corsair_helmet": "\u63a0\u593a\u8005\u5934\u76d4",
  583. "/items/acrobatic_hood": "\u6742\u6280\u5e08\u515c\u5e3d",
  584. "/items/magicians_hat": "\u9b54\u672f\u5e08\u5e3d",
  585. "/items/cheese_helmet": "\u5976\u916a\u5934\u76d4",
  586. "/items/verdant_helmet": "\u7fe0\u7eff\u5934\u76d4",
  587. "/items/azure_helmet": "\u851a\u84dd\u5934\u76d4",
  588. "/items/burble_helmet": "\u6df1\u7d2b\u5934\u76d4",
  589. "/items/crimson_helmet": "\u7edb\u7ea2\u5934\u76d4",
  590. "/items/rainbow_helmet": "\u5f69\u8679\u5934\u76d4",
  591. "/items/holy_helmet": "\u795e\u5723\u5934\u76d4",
  592. "/items/rough_hood": "\u7c97\u7cd9\u515c\u5e3d",
  593. "/items/reptile_hood": "\u722c\u884c\u52a8\u7269\u515c\u5e3d",
  594. "/items/gobo_hood": "\u54e5\u5e03\u6797\u515c\u5e3d",
  595. "/items/beast_hood": "\u91ce\u517d\u515c\u5e3d",
  596. "/items/umbral_hood": "\u6697\u5f71\u515c\u5e3d",
  597. "/items/cotton_hat": "\u68c9\u5e3d",
  598. "/items/linen_hat": "\u4e9a\u9ebb\u5e3d",
  599. "/items/bamboo_hat": "\u7af9\u5e3d",
  600. "/items/silk_hat": "\u4e1d\u5e3d",
  601. "/items/radiant_hat": "\u5149\u8f89\u5e3d",
  602. "/items/dairyhands_top": "\u6324\u5976\u5de5\u4e0a\u8863",
  603. "/items/foragers_top": "\u91c7\u6458\u8005\u4e0a\u8863",
  604. "/items/lumberjacks_top": "\u4f10\u6728\u5de5\u4e0a\u8863",
  605. "/items/cheesemakers_top": "\u5976\u916a\u5e08\u4e0a\u8863",
  606. "/items/crafters_top": "\u5de5\u5320\u4e0a\u8863",
  607. "/items/tailors_top": "\u88c1\u7f1d\u4e0a\u8863",
  608. "/items/chefs_top": "\u53a8\u5e08\u4e0a\u8863",
  609. "/items/brewers_top": "\u996e\u54c1\u5e08\u4e0a\u8863",
  610. "/items/alchemists_top": "\u70bc\u91d1\u5e08\u4e0a\u8863",
  611. "/items/enhancers_top": "\u5f3a\u5316\u5e08\u4e0a\u8863",
  612. "/items/gator_vest": "\u9cc4\u9c7c\u9a6c\u7532",
  613. "/items/turtle_shell_body": "\u9f9f\u58f3\u80f8\u7532",
  614. "/items/colossus_plate_body": "\u5de8\u50cf\u80f8\u7532",
  615. "/items/demonic_plate_body": "\u6076\u9b54\u80f8\u7532",
  616. "/items/anchorbound_plate_body": "\u951a\u5b9a\u80f8\u7532",
  617. "/items/maelstrom_plate_body": "\u6012\u6d9b\u80f8\u7532",
  618. "/items/marine_tunic": "\u6d77\u6d0b\u76ae\u8863",
  619. "/items/revenant_tunic": "\u4ea1\u7075\u76ae\u8863",
  620. "/items/griffin_tunic": "\u72ee\u9e6b\u76ae\u8863",
  621. "/items/kraken_tunic": "\u514b\u62c9\u80af\u76ae\u8863",
  622. "/items/icy_robe_top": "\u51b0\u971c\u888d\u670d",
  623. "/items/flaming_robe_top": "\u70c8\u7130\u888d\u670d",
  624. "/items/luna_robe_top": "\u6708\u795e\u888d\u670d",
  625. "/items/royal_water_robe_top": "\u7687\u5bb6\u6c34\u7cfb\u888d\u670d",
  626. "/items/royal_nature_robe_top": "\u7687\u5bb6\u81ea\u7136\u7cfb\u888d\u670d",
  627. "/items/royal_fire_robe_top": "\u7687\u5bb6\u706b\u7cfb\u888d\u670d",
  628. "/items/cheese_plate_body": "\u5976\u916a\u80f8\u7532",
  629. "/items/verdant_plate_body": "\u7fe0\u7eff\u80f8\u7532",
  630. "/items/azure_plate_body": "\u851a\u84dd\u80f8\u7532",
  631. "/items/burble_plate_body": "\u6df1\u7d2b\u80f8\u7532",
  632. "/items/crimson_plate_body": "\u7edb\u7ea2\u80f8\u7532",
  633. "/items/rainbow_plate_body": "\u5f69\u8679\u80f8\u7532",
  634. "/items/holy_plate_body": "\u795e\u5723\u80f8\u7532",
  635. "/items/rough_tunic": "\u7c97\u7cd9\u76ae\u8863",
  636. "/items/reptile_tunic": "\u722c\u884c\u52a8\u7269\u76ae\u8863",
  637. "/items/gobo_tunic": "\u54e5\u5e03\u6797\u76ae\u8863",
  638. "/items/beast_tunic": "\u91ce\u517d\u76ae\u8863",
  639. "/items/umbral_tunic": "\u6697\u5f71\u76ae\u8863",
  640. "/items/cotton_robe_top": "\u68c9\u5e03\u888d\u670d",
  641. "/items/linen_robe_top": "\u4e9a\u9ebb\u888d\u670d",
  642. "/items/bamboo_robe_top": "\u7af9\u888d\u670d",
  643. "/items/silk_robe_top": "\u4e1d\u7ef8\u888d\u670d",
  644. "/items/radiant_robe_top": "\u5149\u8f89\u888d\u670d",
  645. "/items/dairyhands_bottoms": "\u6324\u5976\u5de5\u4e0b\u88c5",
  646. "/items/foragers_bottoms": "\u91c7\u6458\u8005\u4e0b\u88c5",
  647. "/items/lumberjacks_bottoms": "\u4f10\u6728\u5de5\u4e0b\u88c5",
  648. "/items/cheesemakers_bottoms": "\u5976\u916a\u5e08\u4e0b\u88c5",
  649. "/items/crafters_bottoms": "\u5de5\u5320\u4e0b\u88c5",
  650. "/items/tailors_bottoms": "\u88c1\u7f1d\u4e0b\u88c5",
  651. "/items/chefs_bottoms": "\u53a8\u5e08\u4e0b\u88c5",
  652. "/items/brewers_bottoms": "\u996e\u54c1\u5e08\u4e0b\u88c5",
  653. "/items/alchemists_bottoms": "\u70bc\u91d1\u5e08\u4e0b\u88c5",
  654. "/items/enhancers_bottoms": "\u5f3a\u5316\u5e08\u4e0b\u88c5",
  655. "/items/turtle_shell_legs": "\u9f9f\u58f3\u817f\u7532",
  656. "/items/colossus_plate_legs": "\u5de8\u50cf\u817f\u7532",
  657. "/items/demonic_plate_legs": "\u6076\u9b54\u817f\u7532",
  658. "/items/anchorbound_plate_legs": "\u951a\u5b9a\u817f\u7532",
  659. "/items/maelstrom_plate_legs": "\u6012\u6d9b\u817f\u7532",
  660. "/items/marine_chaps": "\u822a\u6d77\u76ae\u88e4",
  661. "/items/revenant_chaps": "\u4ea1\u7075\u76ae\u88e4",
  662. "/items/griffin_chaps": "\u72ee\u9e6b\u76ae\u88e4",
  663. "/items/kraken_chaps": "\u514b\u62c9\u80af\u76ae\u88e4",
  664. "/items/icy_robe_bottoms": "\u51b0\u971c\u888d\u88d9",
  665. "/items/flaming_robe_bottoms": "\u70c8\u7130\u888d\u88d9",
  666. "/items/luna_robe_bottoms": "\u6708\u795e\u888d\u88d9",
  667. "/items/royal_water_robe_bottoms": "\u7687\u5bb6\u6c34\u7cfb\u888d\u88d9",
  668. "/items/royal_nature_robe_bottoms": "\u7687\u5bb6\u81ea\u7136\u7cfb\u888d\u88d9",
  669. "/items/royal_fire_robe_bottoms": "\u7687\u5bb6\u706b\u7cfb\u888d\u88d9",
  670. "/items/cheese_plate_legs": "\u5976\u916a\u817f\u7532",
  671. "/items/verdant_plate_legs": "\u7fe0\u7eff\u817f\u7532",
  672. "/items/azure_plate_legs": "\u851a\u84dd\u817f\u7532",
  673. "/items/burble_plate_legs": "\u6df1\u7d2b\u817f\u7532",
  674. "/items/crimson_plate_legs": "\u7edb\u7ea2\u817f\u7532",
  675. "/items/rainbow_plate_legs": "\u5f69\u8679\u817f\u7532",
  676. "/items/holy_plate_legs": "\u795e\u5723\u817f\u7532",
  677. "/items/rough_chaps": "\u7c97\u7cd9\u76ae\u88e4",
  678. "/items/reptile_chaps": "\u722c\u884c\u52a8\u7269\u76ae\u88e4",
  679. "/items/gobo_chaps": "\u54e5\u5e03\u6797\u76ae\u88e4",
  680. "/items/beast_chaps": "\u91ce\u517d\u76ae\u88e4",
  681. "/items/umbral_chaps": "\u6697\u5f71\u76ae\u88e4",
  682. "/items/cotton_robe_bottoms": "\u68c9\u888d\u88d9",
  683. "/items/linen_robe_bottoms": "\u4e9a\u9ebb\u888d\u88d9",
  684. "/items/bamboo_robe_bottoms": "\u7af9\u888d\u88d9",
  685. "/items/silk_robe_bottoms": "\u4e1d\u7ef8\u888d\u88d9",
  686. "/items/radiant_robe_bottoms": "\u5149\u8f89\u888d\u88d9",
  687. "/items/enchanted_gloves": "\u9644\u9b54\u624b\u5957",
  688. "/items/pincer_gloves": "\u87f9\u94b3\u624b\u5957",
  689. "/items/panda_gloves": "\u718a\u732b\u624b\u5957",
  690. "/items/magnetic_gloves": "\u78c1\u529b\u624b\u5957",
  691. "/items/dodocamel_gauntlets": "\u6e21\u6e21\u9a7c\u62a4\u624b",
  692. "/items/sighted_bracers": "\u7784\u51c6\u62a4\u8155",
  693. "/items/marksman_bracers": "\u795e\u5c04\u62a4\u8155",
  694. "/items/chrono_gloves": "\u65f6\u7a7a\u624b\u5957",
  695. "/items/cheese_gauntlets": "\u5976\u916a\u62a4\u624b",
  696. "/items/verdant_gauntlets": "\u7fe0\u7eff\u62a4\u624b",
  697. "/items/azure_gauntlets": "\u851a\u84dd\u62a4\u624b",
  698. "/items/burble_gauntlets": "\u6df1\u7d2b\u62a4\u624b",
  699. "/items/crimson_gauntlets": "\u7edb\u7ea2\u62a4\u624b",
  700. "/items/rainbow_gauntlets": "\u5f69\u8679\u62a4\u624b",
  701. "/items/holy_gauntlets": "\u795e\u5723\u62a4\u624b",
  702. "/items/rough_bracers": "\u7c97\u7cd9\u62a4\u8155",
  703. "/items/reptile_bracers": "\u722c\u884c\u52a8\u7269\u62a4\u8155",
  704. "/items/gobo_bracers": "\u54e5\u5e03\u6797\u62a4\u8155",
  705. "/items/beast_bracers": "\u91ce\u517d\u62a4\u8155",
  706. "/items/umbral_bracers": "\u6697\u5f71\u62a4\u8155",
  707. "/items/cotton_gloves": "\u68c9\u624b\u5957",
  708. "/items/linen_gloves": "\u4e9a\u9ebb\u624b\u5957",
  709. "/items/bamboo_gloves": "\u7af9\u624b\u5957",
  710. "/items/silk_gloves": "\u4e1d\u624b\u5957",
  711. "/items/radiant_gloves": "\u5149\u8f89\u624b\u5957",
  712. "/items/collectors_boots": "\u6536\u85cf\u5bb6\u9774",
  713. "/items/shoebill_shoes": "\u9cb8\u5934\u9e73\u978b",
  714. "/items/black_bear_shoes": "\u9ed1\u718a\u978b",
  715. "/items/grizzly_bear_shoes": "\u68d5\u718a\u978b",
  716. "/items/polar_bear_shoes": "\u5317\u6781\u718a\u978b",
  717. "/items/centaur_boots": "\u534a\u4eba\u9a6c\u9774",
  718. "/items/sorcerer_boots": "\u5deb\u5e08\u9774",
  719. "/items/cheese_boots": "\u5976\u916a\u9774",
  720. "/items/verdant_boots": "\u7fe0\u7eff\u9774",
  721. "/items/azure_boots": "\u851a\u84dd\u9774",
  722. "/items/burble_boots": "\u6df1\u7d2b\u9774",
  723. "/items/crimson_boots": "\u7edb\u7ea2\u9774",
  724. "/items/rainbow_boots": "\u5f69\u8679\u9774",
  725. "/items/holy_boots": "\u795e\u5723\u9774",
  726. "/items/rough_boots": "\u7c97\u7cd9\u9774",
  727. "/items/reptile_boots": "\u722c\u884c\u52a8\u7269\u9774",
  728. "/items/gobo_boots": "\u54e5\u5e03\u6797\u9774",
  729. "/items/beast_boots": "\u91ce\u517d\u9774",
  730. "/items/umbral_boots": "\u6697\u5f71\u9774",
  731. "/items/cotton_boots": "\u68c9\u9774",
  732. "/items/linen_boots": "\u4e9a\u9ebb\u9774",
  733. "/items/bamboo_boots": "\u7af9\u9774",
  734. "/items/silk_boots": "\u4e1d\u9774",
  735. "/items/radiant_boots": "\u5149\u8f89\u9774",
  736. "/items/small_pouch": "\u5c0f\u888b\u5b50",
  737. "/items/medium_pouch": "\u4e2d\u888b\u5b50",
  738. "/items/large_pouch": "\u5927\u888b\u5b50",
  739. "/items/giant_pouch": "\u5de8\u5927\u888b\u5b50",
  740. "/items/gluttonous_pouch": "\u8d2a\u98df\u4e4b\u888b",
  741. "/items/guzzling_pouch": "\u66b4\u996e\u4e4b\u56ca",
  742. "/items/necklace_of_efficiency": "\u6548\u7387\u9879\u94fe",
  743. "/items/fighter_necklace": "\u6218\u58eb\u9879\u94fe",
  744. "/items/ranger_necklace": "\u5c04\u624b\u9879\u94fe",
  745. "/items/wizard_necklace": "\u5deb\u5e08\u9879\u94fe",
  746. "/items/necklace_of_wisdom": "\u7ecf\u9a8c\u9879\u94fe",
  747. "/items/necklace_of_speed": "\u901f\u5ea6\u9879\u94fe",
  748. "/items/philosophers_necklace": "\u8d24\u8005\u9879\u94fe",
  749. "/items/earrings_of_gathering": "\u91c7\u96c6\u8033\u73af",
  750. "/items/earrings_of_essence_find": "\u7cbe\u534e\u53d1\u73b0\u8033\u73af",
  751. "/items/earrings_of_armor": "\u62a4\u7532\u8033\u73af",
  752. "/items/earrings_of_regeneration": "\u6062\u590d\u8033\u73af",
  753. "/items/earrings_of_resistance": "\u6297\u6027\u8033\u73af",
  754. "/items/earrings_of_rare_find": "\u7a00\u6709\u53d1\u73b0\u8033\u73af",
  755. "/items/earrings_of_critical_strike": "\u66b4\u51fb\u8033\u73af",
  756. "/items/philosophers_earrings": "\u8d24\u8005\u8033\u73af",
  757. "/items/ring_of_gathering": "\u91c7\u96c6\u6212\u6307",
  758. "/items/ring_of_essence_find": "\u7cbe\u534e\u53d1\u73b0\u6212\u6307",
  759. "/items/ring_of_armor": "\u62a4\u7532\u6212\u6307",
  760. "/items/ring_of_regeneration": "\u6062\u590d\u6212\u6307",
  761. "/items/ring_of_resistance": "\u6297\u6027\u6212\u6307",
  762. "/items/ring_of_rare_find": "\u7a00\u6709\u53d1\u73b0\u6212\u6307",
  763. "/items/ring_of_critical_strike": "\u66b4\u51fb\u6212\u6307",
  764. "/items/philosophers_ring": "\u8d24\u8005\u6212\u6307",
  765. "/items/basic_task_badge": "\u57fa\u7840\u4efb\u52a1\u5fbd\u7ae0",
  766. "/items/advanced_task_badge": "\u9ad8\u7ea7\u4efb\u52a1\u5fbd\u7ae0",
  767. "/items/expert_task_badge": "\u4e13\u5bb6\u4efb\u52a1\u5fbd\u7ae0",
  768. "/items/celestial_brush": "\u661f\u7a7a\u5237\u5b50",
  769. "/items/cheese_brush": "\u5976\u916a\u5237\u5b50",
  770. "/items/verdant_brush": "\u7fe0\u7eff\u5237\u5b50",
  771. "/items/azure_brush": "\u851a\u84dd\u5237\u5b50",
  772. "/items/burble_brush": "\u6df1\u7d2b\u5237\u5b50",
  773. "/items/crimson_brush": "\u7edb\u7ea2\u5237\u5b50",
  774. "/items/rainbow_brush": "\u5f69\u8679\u5237\u5b50",
  775. "/items/holy_brush": "\u795e\u5723\u5237\u5b50",
  776. "/items/celestial_shears": "\u661f\u7a7a\u526a\u5200",
  777. "/items/cheese_shears": "\u5976\u916a\u526a\u5200",
  778. "/items/verdant_shears": "\u7fe0\u7eff\u526a\u5200",
  779. "/items/azure_shears": "\u851a\u84dd\u526a\u5200",
  780. "/items/burble_shears": "\u6df1\u7d2b\u526a\u5200",
  781. "/items/crimson_shears": "\u7edb\u7ea2\u526a\u5200",
  782. "/items/rainbow_shears": "\u5f69\u8679\u526a\u5200",
  783. "/items/holy_shears": "\u795e\u5723\u526a\u5200",
  784. "/items/celestial_hatchet": "\u661f\u7a7a\u65a7\u5934",
  785. "/items/cheese_hatchet": "\u5976\u916a\u65a7\u5934",
  786. "/items/verdant_hatchet": "\u7fe0\u7eff\u65a7\u5934",
  787. "/items/azure_hatchet": "\u851a\u84dd\u65a7\u5934",
  788. "/items/burble_hatchet": "\u6df1\u7d2b\u65a7\u5934",
  789. "/items/crimson_hatchet": "\u7edb\u7ea2\u65a7\u5934",
  790. "/items/rainbow_hatchet": "\u5f69\u8679\u65a7\u5934",
  791. "/items/holy_hatchet": "\u795e\u5723\u65a7\u5934",
  792. "/items/celestial_hammer": "\u661f\u7a7a\u9524\u5b50",
  793. "/items/cheese_hammer": "\u5976\u916a\u9524\u5b50",
  794. "/items/verdant_hammer": "\u7fe0\u7eff\u9524\u5b50",
  795. "/items/azure_hammer": "\u851a\u84dd\u9524\u5b50",
  796. "/items/burble_hammer": "\u6df1\u7d2b\u9524\u5b50",
  797. "/items/crimson_hammer": "\u7edb\u7ea2\u9524\u5b50",
  798. "/items/rainbow_hammer": "\u5f69\u8679\u9524\u5b50",
  799. "/items/holy_hammer": "\u795e\u5723\u9524\u5b50",
  800. "/items/celestial_chisel": "\u661f\u7a7a\u51ff\u5b50",
  801. "/items/cheese_chisel": "\u5976\u916a\u51ff\u5b50",
  802. "/items/verdant_chisel": "\u7fe0\u7eff\u51ff\u5b50",
  803. "/items/azure_chisel": "\u851a\u84dd\u51ff\u5b50",
  804. "/items/burble_chisel": "\u6df1\u7d2b\u51ff\u5b50",
  805. "/items/crimson_chisel": "\u7edb\u7ea2\u51ff\u5b50",
  806. "/items/rainbow_chisel": "\u5f69\u8679\u51ff\u5b50",
  807. "/items/holy_chisel": "\u795e\u5723\u51ff\u5b50",
  808. "/items/celestial_needle": "\u661f\u7a7a\u9488",
  809. "/items/cheese_needle": "\u5976\u916a\u9488",
  810. "/items/verdant_needle": "\u7fe0\u7eff\u9488",
  811. "/items/azure_needle": "\u851a\u84dd\u9488",
  812. "/items/burble_needle": "\u6df1\u7d2b\u9488",
  813. "/items/crimson_needle": "\u7edb\u7ea2\u9488",
  814. "/items/rainbow_needle": "\u5f69\u8679\u9488",
  815. "/items/holy_needle": "\u795e\u5723\u9488",
  816. "/items/celestial_spatula": "\u661f\u7a7a\u9505\u94f2",
  817. "/items/cheese_spatula": "\u5976\u916a\u9505\u94f2",
  818. "/items/verdant_spatula": "\u7fe0\u7eff\u9505\u94f2",
  819. "/items/azure_spatula": "\u851a\u84dd\u9505\u94f2",
  820. "/items/burble_spatula": "\u6df1\u7d2b\u9505\u94f2",
  821. "/items/crimson_spatula": "\u7edb\u7ea2\u9505\u94f2",
  822. "/items/rainbow_spatula": "\u5f69\u8679\u9505\u94f2",
  823. "/items/holy_spatula": "\u795e\u5723\u9505\u94f2",
  824. "/items/celestial_pot": "\u661f\u7a7a\u58f6",
  825. "/items/cheese_pot": "\u5976\u916a\u58f6",
  826. "/items/verdant_pot": "\u7fe0\u7eff\u58f6",
  827. "/items/azure_pot": "\u851a\u84dd\u58f6",
  828. "/items/burble_pot": "\u6df1\u7d2b\u58f6",
  829. "/items/crimson_pot": "\u7edb\u7ea2\u58f6",
  830. "/items/rainbow_pot": "\u5f69\u8679\u58f6",
  831. "/items/holy_pot": "\u795e\u5723\u58f6",
  832. "/items/celestial_alembic": "\u661f\u7a7a\u84b8\u998f\u5668",
  833. "/items/cheese_alembic": "\u5976\u916a\u84b8\u998f\u5668",
  834. "/items/verdant_alembic": "\u7fe0\u7eff\u84b8\u998f\u5668",
  835. "/items/azure_alembic": "\u851a\u84dd\u84b8\u998f\u5668",
  836. "/items/burble_alembic": "\u6df1\u7d2b\u84b8\u998f\u5668",
  837. "/items/crimson_alembic": "\u7edb\u7ea2\u84b8\u998f\u5668",
  838. "/items/rainbow_alembic": "\u5f69\u8679\u84b8\u998f\u5668",
  839. "/items/holy_alembic": "\u795e\u5723\u84b8\u998f\u5668",
  840. "/items/celestial_enhancer": "\u661f\u7a7a\u5f3a\u5316\u5668",
  841. "/items/cheese_enhancer": "\u5976\u916a\u5f3a\u5316\u5668",
  842. "/items/verdant_enhancer": "\u7fe0\u7eff\u5f3a\u5316\u5668",
  843. "/items/azure_enhancer": "\u851a\u84dd\u5f3a\u5316\u5668",
  844. "/items/burble_enhancer": "\u6df1\u7d2b\u5f3a\u5316\u5668",
  845. "/items/crimson_enhancer": "\u7edb\u7ea2\u5f3a\u5316\u5668",
  846. "/items/rainbow_enhancer": "\u5f69\u8679\u5f3a\u5316\u5668",
  847. "/items/holy_enhancer": "\u795e\u5723\u5f3a\u5316\u5668",
  848. "/items/milk": "\u725b\u5976",
  849. "/items/verdant_milk": "\u7fe0\u7eff\u725b\u5976",
  850. "/items/azure_milk": "\u851a\u84dd\u725b\u5976",
  851. "/items/burble_milk": "\u6df1\u7d2b\u725b\u5976",
  852. "/items/crimson_milk": "\u7edb\u7ea2\u725b\u5976",
  853. "/items/rainbow_milk": "\u5f69\u8679\u725b\u5976",
  854. "/items/holy_milk": "\u795e\u5723\u725b\u5976",
  855. "/items/cheese": "\u5976\u916a",
  856. "/items/verdant_cheese": "\u7fe0\u7eff\u5976\u916a",
  857. "/items/azure_cheese": "\u851a\u84dd\u5976\u916a",
  858. "/items/burble_cheese": "\u6df1\u7d2b\u5976\u916a",
  859. "/items/crimson_cheese": "\u7edb\u7ea2\u5976\u916a",
  860. "/items/rainbow_cheese": "\u5f69\u8679\u5976\u916a",
  861. "/items/holy_cheese": "\u795e\u5723\u5976\u916a",
  862. "/items/log": "\u539f\u6728",
  863. "/items/birch_log": "\u767d\u6866\u539f\u6728",
  864. "/items/cedar_log": "\u96ea\u677e\u539f\u6728",
  865. "/items/purpleheart_log": "\u7d2b\u5fc3\u539f\u6728",
  866. "/items/ginkgo_log": "\u94f6\u674f\u539f\u6728",
  867. "/items/redwood_log": "\u7ea2\u6749\u539f\u6728",
  868. "/items/arcane_log": "\u795e\u79d8\u539f\u6728",
  869. "/items/lumber": "\u6728\u677f",
  870. "/items/birch_lumber": "\u767d\u6866\u6728\u677f",
  871. "/items/cedar_lumber": "\u96ea\u677e\u6728\u677f",
  872. "/items/purpleheart_lumber": "\u7d2b\u5fc3\u6728\u677f",
  873. "/items/ginkgo_lumber": "\u94f6\u674f\u6728\u677f",
  874. "/items/redwood_lumber": "\u7ea2\u6749\u6728\u677f",
  875. "/items/arcane_lumber": "\u795e\u79d8\u6728\u677f",
  876. "/items/rough_hide": "\u7c97\u7cd9\u517d\u76ae",
  877. "/items/reptile_hide": "\u722c\u884c\u52a8\u7269\u76ae",
  878. "/items/gobo_hide": "\u54e5\u5e03\u6797\u76ae",
  879. "/items/beast_hide": "\u91ce\u517d\u76ae",
  880. "/items/umbral_hide": "\u6697\u5f71\u76ae",
  881. "/items/rough_leather": "\u7c97\u7cd9\u76ae\u9769",
  882. "/items/reptile_leather": "\u722c\u884c\u52a8\u7269\u76ae\u9769",
  883. "/items/gobo_leather": "\u54e5\u5e03\u6797\u76ae\u9769",
  884. "/items/beast_leather": "\u91ce\u517d\u76ae\u9769",
  885. "/items/umbral_leather": "\u6697\u5f71\u76ae\u9769",
  886. "/items/cotton": "\u68c9\u82b1",
  887. "/items/flax": "\u4e9a\u9ebb",
  888. "/items/bamboo_branch": "\u7af9\u5b50",
  889. "/items/cocoon": "\u8695\u8327",
  890. "/items/radiant_fiber": "\u5149\u8f89\u7ea4\u7ef4",
  891. "/items/cotton_fabric": "\u68c9\u82b1\u5e03\u6599",
  892. "/items/linen_fabric": "\u4e9a\u9ebb\u5e03\u6599",
  893. "/items/bamboo_fabric": "\u7af9\u5b50\u5e03\u6599",
  894. "/items/silk_fabric": "\u4e1d\u7ef8",
  895. "/items/radiant_fabric": "\u5149\u8f89\u5e03\u6599",
  896. "/items/egg": "\u9e21\u86cb",
  897. "/items/wheat": "\u5c0f\u9ea6",
  898. "/items/sugar": "\u7cd6",
  899. "/items/blueberry": "\u84dd\u8393",
  900. "/items/blackberry": "\u9ed1\u8393",
  901. "/items/strawberry": "\u8349\u8393",
  902. "/items/mooberry": "\u54de\u8393",
  903. "/items/marsberry": "\u706b\u661f\u8393",
  904. "/items/spaceberry": "\u592a\u7a7a\u8393",
  905. "/items/apple": "\u82f9\u679c",
  906. "/items/orange": "\u6a59\u5b50",
  907. "/items/plum": "\u674e\u5b50",
  908. "/items/peach": "\u6843\u5b50",
  909. "/items/dragon_fruit": "\u706b\u9f99\u679c",
  910. "/items/star_fruit": "\u6768\u6843",
  911. "/items/arabica_coffee_bean": "\u4f4e\u7ea7\u5496\u5561\u8c46",
  912. "/items/robusta_coffee_bean": "\u4e2d\u7ea7\u5496\u5561\u8c46",
  913. "/items/liberica_coffee_bean": "\u9ad8\u7ea7\u5496\u5561\u8c46",
  914. "/items/excelsa_coffee_bean": "\u7279\u7ea7\u5496\u5561\u8c46",
  915. "/items/fieriosa_coffee_bean": "\u706b\u5c71\u5496\u5561\u8c46",
  916. "/items/spacia_coffee_bean": "\u592a\u7a7a\u5496\u5561\u8c46",
  917. "/items/green_tea_leaf": "\u7eff\u8336\u53f6",
  918. "/items/black_tea_leaf": "\u9ed1\u8336\u53f6",
  919. "/items/burble_tea_leaf": "\u7d2b\u8336\u53f6",
  920. "/items/moolong_tea_leaf": "\u54de\u9f99\u8336\u53f6",
  921. "/items/red_tea_leaf": "\u7ea2\u8336\u53f6",
  922. "/items/emp_tea_leaf": "\u865a\u7a7a\u8336\u53f6",
  923. "/items/catalyst_of_coinification": "\u70b9\u91d1\u50ac\u5316\u5242",
  924. "/items/catalyst_of_decomposition": "\u5206\u89e3\u50ac\u5316\u5242",
  925. "/items/catalyst_of_transmutation": "\u8f6c\u5316\u50ac\u5316\u5242",
  926. "/items/prime_catalyst": "\u81f3\u9ad8\u50ac\u5316\u5242",
  927. "/items/snake_fang": "\u86c7\u7259",
  928. "/items/shoebill_feather": "\u9cb8\u5934\u9e73\u7fbd\u6bdb",
  929. "/items/snail_shell": "\u8717\u725b\u58f3",
  930. "/items/crab_pincer": "\u87f9\u94b3",
  931. "/items/turtle_shell": "\u4e4c\u9f9f\u58f3",
  932. "/items/marine_scale": "\u6d77\u6d0b\u9cde\u7247",
  933. "/items/treant_bark": "\u6811\u76ae",
  934. "/items/centaur_hoof": "\u534a\u4eba\u9a6c\u8e44",
  935. "/items/luna_wing": "\u6708\u795e\u7ffc",
  936. "/items/gobo_rag": "\u54e5\u5e03\u6797\u62b9\u5e03",
  937. "/items/goggles": "\u62a4\u76ee\u955c",
  938. "/items/magnifying_glass": "\u653e\u5927\u955c",
  939. "/items/eye_of_the_watcher": "\u89c2\u5bdf\u8005\u4e4b\u773c",
  940. "/items/icy_cloth": "\u51b0\u971c\u7ec7\u7269",
  941. "/items/flaming_cloth": "\u70c8\u7130\u7ec7\u7269",
  942. "/items/sorcerers_sole": "\u9b54\u6cd5\u5e08\u978b\u5e95",
  943. "/items/chrono_sphere": "\u65f6\u7a7a\u7403",
  944. "/items/frost_sphere": "\u51b0\u971c\u7403",
  945. "/items/panda_fluff": "\u718a\u732b\u7ed2",
  946. "/items/black_bear_fluff": "\u9ed1\u718a\u7ed2",
  947. "/items/grizzly_bear_fluff": "\u68d5\u718a\u7ed2",
  948. "/items/polar_bear_fluff": "\u5317\u6781\u718a\u7ed2",
  949. "/items/red_panda_fluff": "\u5c0f\u718a\u732b\u7ed2",
  950. "/items/magnet": "\u78c1\u94c1",
  951. "/items/stalactite_shard": "\u949f\u4e73\u77f3\u788e\u7247",
  952. "/items/living_granite": "\u82b1\u5c97\u5ca9",
  953. "/items/colossus_core": "\u5de8\u50cf\u6838\u5fc3",
  954. "/items/vampire_fang": "\u5438\u8840\u9b3c\u4e4b\u7259",
  955. "/items/werewolf_claw": "\u72fc\u4eba\u4e4b\u722a",
  956. "/items/revenant_anima": "\u4ea1\u8005\u4e4b\u9b42",
  957. "/items/soul_fragment": "\u7075\u9b42\u788e\u7247",
  958. "/items/infernal_ember": "\u5730\u72f1\u4f59\u70ec",
  959. "/items/demonic_core": "\u6076\u9b54\u6838\u5fc3",
  960. "/items/griffin_leather": "\u72ee\u9e6b\u4e4b\u76ae",
  961. "/items/manticore_sting": "\u874e\u72ee\u4e4b\u523a",
  962. "/items/jackalope_antler": "\u9e7f\u89d2\u5154\u4e4b\u89d2",
  963. "/items/dodocamel_plume": "\u6e21\u6e21\u9a7c\u4e4b\u7fce",
  964. "/items/griffin_talon": "\u72ee\u9e6b\u4e4b\u722a",
  965. "/items/acrobats_ribbon": "\u6742\u6280\u5e08\u5f69\u5e26",
  966. "/items/magicians_cloth": "\u9b54\u672f\u5e08\u7ec7\u7269",
  967. "/items/chaotic_chain": "\u6df7\u6c8c\u9501\u94fe",
  968. "/items/cursed_ball": "\u8bc5\u5492\u4e4b\u7403",
  969. "/items/royal_cloth": "\u7687\u5bb6\u7ec7\u7269",
  970. "/items/knights_ingot": "\u9a91\u58eb\u4e4b\u952d",
  971. "/items/bishops_scroll": "\u4e3b\u6559\u5377\u8f74",
  972. "/items/regal_jewel": "\u541b\u738b\u5b9d\u77f3",
  973. "/items/sundering_jewel": "\u88c2\u7a7a\u5b9d\u77f3",
  974. "/items/marksman_brooch": "\u795e\u5c04\u80f8\u9488",
  975. "/items/corsair_crest": "\u63a0\u593a\u8005\u5fbd\u7ae0",
  976. "/items/damaged_anchor": "\u7834\u635f\u8239\u951a",
  977. "/items/maelstrom_plating": "\u6012\u6d9b\u7532\u7247",
  978. "/items/kraken_leather": "\u514b\u62c9\u80af\u76ae\u9769",
  979. "/items/kraken_fang": "\u514b\u62c9\u80af\u4e4b\u7259",
  980. "/items/butter_of_proficiency": "\u7cbe\u901a\u4e4b\u6cb9",
  981. "/items/thread_of_expertise": "\u4e13\u7cbe\u4e4b\u7ebf",
  982. "/items/branch_of_insight": "\u6d1e\u5bdf\u4e4b\u679d",
  983. "/items/gluttonous_energy": "\u8d2a\u98df\u80fd\u91cf",
  984. "/items/guzzling_energy": "\u66b4\u996e\u80fd\u91cf",
  985. "/items/milking_essence": "\u6324\u5976\u7cbe\u534e",
  986. "/items/foraging_essence": "\u91c7\u6458\u7cbe\u534e",
  987. "/items/woodcutting_essence": "\u4f10\u6728\u7cbe\u534e",
  988. "/items/cheesesmithing_essence": "\u5976\u916a\u953b\u9020\u7cbe\u534e",
  989. "/items/crafting_essence": "\u5236\u4f5c\u7cbe\u534e",
  990. "/items/tailoring_essence": "\u7f1d\u7eab\u7cbe\u534e",
  991. "/items/cooking_essence": "\u70f9\u996a\u7cbe\u534e",
  992. "/items/brewing_essence": "\u51b2\u6ce1\u7cbe\u534e",
  993. "/items/alchemy_essence": "\u70bc\u91d1\u7cbe\u534e",
  994. "/items/enhancing_essence": "\u5f3a\u5316\u7cbe\u534e",
  995. "/items/swamp_essence": "\u6cbc\u6cfd\u7cbe\u534e",
  996. "/items/aqua_essence": "\u6d77\u6d0b\u7cbe\u534e",
  997. "/items/jungle_essence": "\u4e1b\u6797\u7cbe\u534e",
  998. "/items/gobo_essence": "\u54e5\u5e03\u6797\u7cbe\u534e",
  999. "/items/eyessence": "\u773c\u7cbe\u534e",
  1000. "/items/sorcerer_essence": "\u6cd5\u5e08\u7cbe\u534e",
  1001. "/items/bear_essence": "\u718a\u718a\u7cbe\u534e",
  1002. "/items/golem_essence": "\u9b54\u50cf\u7cbe\u534e",
  1003. "/items/twilight_essence": "\u66ae\u5149\u7cbe\u534e",
  1004. "/items/abyssal_essence": "\u5730\u72f1\u7cbe\u534e",
  1005. "/items/chimerical_essence": "\u5947\u5e7b\u7cbe\u534e",
  1006. "/items/sinister_essence": "\u9634\u68ee\u7cbe\u534e",
  1007. "/items/enchanted_essence": "\u79d8\u6cd5\u7cbe\u534e",
  1008. "/items/pirate_essence": "\u6d77\u76d7\u7cbe\u534e",
  1009. "/items/task_crystal": "\u4efb\u52a1\u6c34\u6676",
  1010. "/items/star_fragment": "\u661f\u5149\u788e\u7247",
  1011. "/items/pearl": "\u73cd\u73e0",
  1012. "/items/amber": "\u7425\u73c0",
  1013. "/items/garnet": "\u77f3\u69b4\u77f3",
  1014. "/items/jade": "\u7fe1\u7fe0",
  1015. "/items/amethyst": "\u7d2b\u6c34\u6676",
  1016. "/items/moonstone": "\u6708\u4eae\u77f3",
  1017. "/items/sunstone": "\u592a\u9633\u77f3",
  1018. "/items/philosophers_stone": "\u8d24\u8005\u4e4b\u77f3",
  1019. "/items/crushed_pearl": "\u73cd\u73e0\u788e\u7247",
  1020. "/items/crushed_amber": "\u7425\u73c0\u788e\u7247",
  1021. "/items/crushed_garnet": "\u77f3\u69b4\u77f3\u788e\u7247",
  1022. "/items/crushed_jade": "\u7fe1\u7fe0\u788e\u7247",
  1023. "/items/crushed_amethyst": "\u7d2b\u6c34\u6676\u788e\u7247",
  1024. "/items/crushed_moonstone": "\u6708\u4eae\u77f3\u788e\u7247",
  1025. "/items/crushed_sunstone": "\u592a\u9633\u77f3\u788e\u7247",
  1026. "/items/crushed_philosophers_stone": "\u8d24\u8005\u4e4b\u77f3\u788e\u7247",
  1027. "/items/shard_of_protection": "\u4fdd\u62a4\u788e\u7247",
  1028. "/items/mirror_of_protection": "\u4fdd\u62a4\u4e4b\u955c",
  1029. };
  1030.  
  1031. const ZHActionNames = {
  1032. "/actions/milking/cow": "\u5976\u725b",
  1033. "/actions/milking/verdant_cow": "\u7fe0\u7eff\u5976\u725b",
  1034. "/actions/milking/azure_cow": "\u851a\u84dd\u5976\u725b",
  1035. "/actions/milking/burble_cow": "\u6df1\u7d2b\u5976\u725b",
  1036. "/actions/milking/crimson_cow": "\u7edb\u7ea2\u5976\u725b",
  1037. "/actions/milking/unicow": "\u5f69\u8679\u5976\u725b",
  1038. "/actions/milking/holy_cow": "\u795e\u5723\u5976\u725b",
  1039. "/actions/foraging/egg": "\u9e21\u86cb",
  1040. "/actions/foraging/wheat": "\u5c0f\u9ea6",
  1041. "/actions/foraging/sugar": "\u7cd6",
  1042. "/actions/foraging/cotton": "\u68c9\u82b1",
  1043. "/actions/foraging/farmland": "\u7fe0\u91ce\u519c\u573a",
  1044. "/actions/foraging/blueberry": "\u84dd\u8393",
  1045. "/actions/foraging/apple": "\u82f9\u679c",
  1046. "/actions/foraging/arabica_coffee_bean": "\u4f4e\u7ea7\u5496\u5561\u8c46",
  1047. "/actions/foraging/flax": "\u4e9a\u9ebb",
  1048. "/actions/foraging/shimmering_lake": "\u6ce2\u5149\u6e56\u6cca",
  1049. "/actions/foraging/blackberry": "\u9ed1\u8393",
  1050. "/actions/foraging/orange": "\u6a59\u5b50",
  1051. "/actions/foraging/robusta_coffee_bean": "\u4e2d\u7ea7\u5496\u5561\u8c46",
  1052. "/actions/foraging/misty_forest": "\u8ff7\u96fe\u68ee\u6797",
  1053. "/actions/foraging/strawberry": "\u8349\u8393",
  1054. "/actions/foraging/plum": "\u674e\u5b50",
  1055. "/actions/foraging/liberica_coffee_bean": "\u9ad8\u7ea7\u5496\u5561\u8c46",
  1056. "/actions/foraging/bamboo_branch": "\u7af9\u5b50",
  1057. "/actions/foraging/burble_beach": "\u6df1\u7d2b\u6c99\u6ee9",
  1058. "/actions/foraging/mooberry": "\u54de\u8393",
  1059. "/actions/foraging/peach": "\u6843\u5b50",
  1060. "/actions/foraging/excelsa_coffee_bean": "\u7279\u7ea7\u5496\u5561\u8c46",
  1061. "/actions/foraging/cocoon": "\u8695\u8327",
  1062. "/actions/foraging/silly_cow_valley": "\u50bb\u725b\u5c71\u8c37",
  1063. "/actions/foraging/marsberry": "\u706b\u661f\u8393",
  1064. "/actions/foraging/dragon_fruit": "\u706b\u9f99\u679c",
  1065. "/actions/foraging/fieriosa_coffee_bean": "\u706b\u5c71\u5496\u5561\u8c46",
  1066. "/actions/foraging/olympus_mons": "\u5965\u6797\u5339\u65af\u5c71",
  1067. "/actions/foraging/spaceberry": "\u592a\u7a7a\u8393",
  1068. "/actions/foraging/star_fruit": "\u6768\u6843",
  1069. "/actions/foraging/spacia_coffee_bean": "\u592a\u7a7a\u5496\u5561\u8c46",
  1070. "/actions/foraging/radiant_fiber": "\u5149\u8f89\u7ea4\u7ef4",
  1071. "/actions/foraging/asteroid_belt": "\u5c0f\u884c\u661f\u5e26",
  1072. "/actions/woodcutting/tree": "\u6811",
  1073. "/actions/woodcutting/birch_tree": "\u6866\u6811",
  1074. "/actions/woodcutting/cedar_tree": "\u96ea\u677e\u6811",
  1075. "/actions/woodcutting/purpleheart_tree": "\u7d2b\u5fc3\u6811",
  1076. "/actions/woodcutting/ginkgo_tree": "\u94f6\u674f\u6811",
  1077. "/actions/woodcutting/redwood_tree": "\u7ea2\u6749\u6811",
  1078. "/actions/woodcutting/arcane_tree": "\u5965\u79d8\u6811",
  1079. "/actions/cheesesmithing/cheese": "\u5976\u916a",
  1080. "/actions/cheesesmithing/cheese_boots": "\u5976\u916a\u9774",
  1081. "/actions/cheesesmithing/cheese_gauntlets": "\u5976\u916a\u62a4\u624b",
  1082. "/actions/cheesesmithing/cheese_sword": "\u5976\u916a\u5251",
  1083. "/actions/cheesesmithing/cheese_brush": "\u5976\u916a\u5237\u5b50",
  1084. "/actions/cheesesmithing/cheese_shears": "\u5976\u916a\u526a\u5200",
  1085. "/actions/cheesesmithing/cheese_hatchet": "\u5976\u916a\u65a7\u5934",
  1086. "/actions/cheesesmithing/cheese_spear": "\u5976\u916a\u957f\u67aa",
  1087. "/actions/cheesesmithing/cheese_hammer": "\u5976\u916a\u9524\u5b50",
  1088. "/actions/cheesesmithing/cheese_chisel": "\u5976\u916a\u51ff\u5b50",
  1089. "/actions/cheesesmithing/cheese_needle": "\u5976\u916a\u9488",
  1090. "/actions/cheesesmithing/cheese_spatula": "\u5976\u916a\u9505\u94f2",
  1091. "/actions/cheesesmithing/cheese_pot": "\u5976\u916a\u58f6",
  1092. "/actions/cheesesmithing/cheese_mace": "\u5976\u916a\u9489\u5934\u9524",
  1093. "/actions/cheesesmithing/cheese_alembic": "\u5976\u916a\u84b8\u998f\u5668",
  1094. "/actions/cheesesmithing/cheese_enhancer": "\u5976\u916a\u5f3a\u5316\u5668",
  1095. "/actions/cheesesmithing/cheese_helmet": "\u5976\u916a\u5934\u76d4",
  1096. "/actions/cheesesmithing/cheese_buckler": "\u5976\u916a\u5706\u76fe",
  1097. "/actions/cheesesmithing/cheese_bulwark": "\u5976\u916a\u91cd\u76fe",
  1098. "/actions/cheesesmithing/cheese_plate_legs": "\u5976\u916a\u817f\u7532",
  1099. "/actions/cheesesmithing/cheese_plate_body": "\u5976\u916a\u80f8\u7532",
  1100. "/actions/cheesesmithing/verdant_cheese": "\u7fe0\u7eff\u5976\u916a",
  1101. "/actions/cheesesmithing/verdant_boots": "\u7fe0\u7eff\u9774",
  1102. "/actions/cheesesmithing/verdant_gauntlets": "\u7fe0\u7eff\u62a4\u624b",
  1103. "/actions/cheesesmithing/verdant_sword": "\u7fe0\u7eff\u5251",
  1104. "/actions/cheesesmithing/verdant_brush": "\u7fe0\u7eff\u5237\u5b50",
  1105. "/actions/cheesesmithing/verdant_shears": "\u7fe0\u7eff\u526a\u5200",
  1106. "/actions/cheesesmithing/verdant_hatchet": "\u7fe0\u7eff\u65a7\u5934",
  1107. "/actions/cheesesmithing/verdant_spear": "\u7fe0\u7eff\u957f\u67aa",
  1108. "/actions/cheesesmithing/verdant_hammer": "\u7fe0\u7eff\u9524\u5b50",
  1109. "/actions/cheesesmithing/verdant_chisel": "\u7fe0\u7eff\u51ff\u5b50",
  1110. "/actions/cheesesmithing/verdant_needle": "\u7fe0\u7eff\u9488",
  1111. "/actions/cheesesmithing/verdant_spatula": "\u7fe0\u7eff\u9505\u94f2",
  1112. "/actions/cheesesmithing/verdant_pot": "\u7fe0\u7eff\u58f6",
  1113. "/actions/cheesesmithing/verdant_mace": "\u7fe0\u7eff\u9489\u5934\u9524",
  1114. "/actions/cheesesmithing/snake_fang_dirk": "\u86c7\u7259\u77ed\u5251",
  1115. "/actions/cheesesmithing/verdant_alembic": "\u7fe0\u7eff\u84b8\u998f\u5668",
  1116. "/actions/cheesesmithing/verdant_enhancer": "\u7fe0\u7eff\u5f3a\u5316\u5668",
  1117. "/actions/cheesesmithing/verdant_helmet": "\u7fe0\u7eff\u5934\u76d4",
  1118. "/actions/cheesesmithing/verdant_buckler": "\u7fe0\u7eff\u5706\u76fe",
  1119. "/actions/cheesesmithing/verdant_bulwark": "\u7fe0\u7eff\u91cd\u76fe",
  1120. "/actions/cheesesmithing/verdant_plate_legs": "\u7fe0\u7eff\u817f\u7532",
  1121. "/actions/cheesesmithing/verdant_plate_body": "\u7fe0\u7eff\u80f8\u7532",
  1122. "/actions/cheesesmithing/azure_cheese": "\u851a\u84dd\u5976\u916a",
  1123. "/actions/cheesesmithing/azure_boots": "\u851a\u84dd\u9774",
  1124. "/actions/cheesesmithing/azure_gauntlets": "\u851a\u84dd\u62a4\u624b",
  1125. "/actions/cheesesmithing/azure_sword": "\u851a\u84dd\u5251",
  1126. "/actions/cheesesmithing/azure_brush": "\u851a\u84dd\u5237\u5b50",
  1127. "/actions/cheesesmithing/azure_shears": "\u851a\u84dd\u526a\u5200",
  1128. "/actions/cheesesmithing/azure_hatchet": "\u851a\u84dd\u65a7\u5934",
  1129. "/actions/cheesesmithing/azure_spear": "\u851a\u84dd\u957f\u67aa",
  1130. "/actions/cheesesmithing/azure_hammer": "\u851a\u84dd\u9524\u5b50",
  1131. "/actions/cheesesmithing/azure_chisel": "\u851a\u84dd\u51ff\u5b50",
  1132. "/actions/cheesesmithing/azure_needle": "\u851a\u84dd\u9488",
  1133. "/actions/cheesesmithing/azure_spatula": "\u851a\u84dd\u9505\u94f2",
  1134. "/actions/cheesesmithing/azure_pot": "\u851a\u84dd\u58f6",
  1135. "/actions/cheesesmithing/azure_mace": "\u851a\u84dd\u9489\u5934\u9524",
  1136. "/actions/cheesesmithing/pincer_gloves": "\u87f9\u94b3\u624b\u5957",
  1137. "/actions/cheesesmithing/azure_alembic": "\u851a\u84dd\u84b8\u998f\u5668",
  1138. "/actions/cheesesmithing/azure_enhancer": "\u851a\u84dd\u5f3a\u5316\u5668",
  1139. "/actions/cheesesmithing/azure_helmet": "\u851a\u84dd\u5934\u76d4",
  1140. "/actions/cheesesmithing/azure_buckler": "\u851a\u84dd\u5706\u76fe",
  1141. "/actions/cheesesmithing/azure_bulwark": "\u851a\u84dd\u91cd\u76fe",
  1142. "/actions/cheesesmithing/azure_plate_legs": "\u851a\u84dd\u817f\u7532",
  1143. "/actions/cheesesmithing/snail_shell_helmet": "\u8717\u725b\u58f3\u5934\u76d4",
  1144. "/actions/cheesesmithing/azure_plate_body": "\u851a\u84dd\u80f8\u7532",
  1145. "/actions/cheesesmithing/turtle_shell_legs": "\u9f9f\u58f3\u817f\u7532",
  1146. "/actions/cheesesmithing/turtle_shell_body": "\u9f9f\u58f3\u80f8\u7532",
  1147. "/actions/cheesesmithing/burble_cheese": "\u6df1\u7d2b\u5976\u916a",
  1148. "/actions/cheesesmithing/burble_boots": "\u6df1\u7d2b\u9774",
  1149. "/actions/cheesesmithing/burble_gauntlets": "\u6df1\u7d2b\u62a4\u624b",
  1150. "/actions/cheesesmithing/burble_sword": "\u6df1\u7d2b\u5251",
  1151. "/actions/cheesesmithing/burble_brush": "\u6df1\u7d2b\u5237\u5b50",
  1152. "/actions/cheesesmithing/burble_shears": "\u6df1\u7d2b\u526a\u5200",
  1153. "/actions/cheesesmithing/burble_hatchet": "\u6df1\u7d2b\u65a7\u5934",
  1154. "/actions/cheesesmithing/burble_spear": "\u6df1\u7d2b\u957f\u67aa",
  1155. "/actions/cheesesmithing/burble_hammer": "\u6df1\u7d2b\u9524\u5b50",
  1156. "/actions/cheesesmithing/burble_chisel": "\u6df1\u7d2b\u51ff\u5b50",
  1157. "/actions/cheesesmithing/burble_needle": "\u6df1\u7d2b\u9488",
  1158. "/actions/cheesesmithing/burble_spatula": "\u6df1\u7d2b\u9505\u94f2",
  1159. "/actions/cheesesmithing/burble_pot": "\u6df1\u7d2b\u58f6",
  1160. "/actions/cheesesmithing/burble_mace": "\u6df1\u7d2b\u9489\u5934\u9524",
  1161. "/actions/cheesesmithing/burble_alembic": "\u6df1\u7d2b\u84b8\u998f\u5668",
  1162. "/actions/cheesesmithing/burble_enhancer": "\u6df1\u7d2b\u5f3a\u5316\u5668",
  1163. "/actions/cheesesmithing/burble_helmet": "\u6df1\u7d2b\u5934\u76d4",
  1164. "/actions/cheesesmithing/burble_buckler": "\u6df1\u7d2b\u5706\u76fe",
  1165. "/actions/cheesesmithing/burble_bulwark": "\u6df1\u7d2b\u91cd\u76fe",
  1166. "/actions/cheesesmithing/burble_plate_legs": "\u6df1\u7d2b\u817f\u7532",
  1167. "/actions/cheesesmithing/burble_plate_body": "\u6df1\u7d2b\u80f8\u7532",
  1168. "/actions/cheesesmithing/crimson_cheese": "\u7edb\u7ea2\u5976\u916a",
  1169. "/actions/cheesesmithing/crimson_boots": "\u7edb\u7ea2\u9774",
  1170. "/actions/cheesesmithing/crimson_gauntlets": "\u7edb\u7ea2\u62a4\u624b",
  1171. "/actions/cheesesmithing/crimson_sword": "\u7edb\u7ea2\u5251",
  1172. "/actions/cheesesmithing/crimson_brush": "\u7edb\u7ea2\u5237\u5b50",
  1173. "/actions/cheesesmithing/crimson_shears": "\u7edb\u7ea2\u526a\u5200",
  1174. "/actions/cheesesmithing/crimson_hatchet": "\u7edb\u7ea2\u65a7\u5934",
  1175. "/actions/cheesesmithing/crimson_spear": "\u7edb\u7ea2\u957f\u67aa",
  1176. "/actions/cheesesmithing/crimson_hammer": "\u7edb\u7ea2\u9524\u5b50",
  1177. "/actions/cheesesmithing/crimson_chisel": "\u7edb\u7ea2\u51ff\u5b50",
  1178. "/actions/cheesesmithing/crimson_needle": "\u7edb\u7ea2\u9488",
  1179. "/actions/cheesesmithing/crimson_spatula": "\u7edb\u7ea2\u9505\u94f2",
  1180. "/actions/cheesesmithing/crimson_pot": "\u7edb\u7ea2\u58f6",
  1181. "/actions/cheesesmithing/crimson_mace": "\u7edb\u7ea2\u9489\u5934\u9524",
  1182. "/actions/cheesesmithing/crimson_alembic": "\u7edb\u7ea2\u84b8\u998f\u5668",
  1183. "/actions/cheesesmithing/crimson_enhancer": "\u7edb\u7ea2\u5f3a\u5316\u5668",
  1184. "/actions/cheesesmithing/crimson_helmet": "\u7edb\u7ea2\u5934\u76d4",
  1185. "/actions/cheesesmithing/crimson_buckler": "\u7edb\u7ea2\u5706\u76fe",
  1186. "/actions/cheesesmithing/crimson_bulwark": "\u7edb\u7ea2\u91cd\u76fe",
  1187. "/actions/cheesesmithing/crimson_plate_legs": "\u7edb\u7ea2\u817f\u7532",
  1188. "/actions/cheesesmithing/vision_helmet": "\u89c6\u89c9\u5934\u76d4",
  1189. "/actions/cheesesmithing/vision_shield": "\u89c6\u89c9\u76fe",
  1190. "/actions/cheesesmithing/crimson_plate_body": "\u7edb\u7ea2\u80f8\u7532",
  1191. "/actions/cheesesmithing/rainbow_cheese": "\u5f69\u8679\u5976\u916a",
  1192. "/actions/cheesesmithing/rainbow_boots": "\u5f69\u8679\u9774",
  1193. "/actions/cheesesmithing/black_bear_shoes": "\u9ed1\u718a\u978b",
  1194. "/actions/cheesesmithing/grizzly_bear_shoes": "\u68d5\u718a\u978b",
  1195. "/actions/cheesesmithing/polar_bear_shoes": "\u5317\u6781\u718a\u978b",
  1196. "/actions/cheesesmithing/rainbow_gauntlets": "\u5f69\u8679\u62a4\u624b",
  1197. "/actions/cheesesmithing/rainbow_sword": "\u5f69\u8679\u5251",
  1198. "/actions/cheesesmithing/panda_gloves": "\u718a\u732b\u624b\u5957",
  1199. "/actions/cheesesmithing/rainbow_brush": "\u5f69\u8679\u5237\u5b50",
  1200. "/actions/cheesesmithing/rainbow_shears": "\u5f69\u8679\u526a\u5200",
  1201. "/actions/cheesesmithing/rainbow_hatchet": "\u5f69\u8679\u65a7\u5934",
  1202. "/actions/cheesesmithing/rainbow_spear": "\u5f69\u8679\u957f\u67aa",
  1203. "/actions/cheesesmithing/rainbow_hammer": "\u5f69\u8679\u9524\u5b50",
  1204. "/actions/cheesesmithing/rainbow_chisel": "\u5f69\u8679\u51ff\u5b50",
  1205. "/actions/cheesesmithing/rainbow_needle": "\u5f69\u8679\u9488",
  1206. "/actions/cheesesmithing/rainbow_spatula": "\u5f69\u8679\u9505\u94f2",
  1207. "/actions/cheesesmithing/rainbow_pot": "\u5f69\u8679\u58f6",
  1208. "/actions/cheesesmithing/rainbow_mace": "\u5f69\u8679\u9489\u5934\u9524",
  1209. "/actions/cheesesmithing/rainbow_alembic": "\u5f69\u8679\u84b8\u998f\u5668",
  1210. "/actions/cheesesmithing/rainbow_enhancer": "\u5f69\u8679\u5f3a\u5316\u5668",
  1211. "/actions/cheesesmithing/rainbow_helmet": "\u5f69\u8679\u5934\u76d4",
  1212. "/actions/cheesesmithing/rainbow_buckler": "\u5f69\u8679\u5706\u76fe",
  1213. "/actions/cheesesmithing/rainbow_bulwark": "\u5f69\u8679\u91cd\u76fe",
  1214. "/actions/cheesesmithing/rainbow_plate_legs": "\u5f69\u8679\u817f\u7532",
  1215. "/actions/cheesesmithing/rainbow_plate_body": "\u5f69\u8679\u80f8\u7532",
  1216. "/actions/cheesesmithing/holy_cheese": "\u795e\u5723\u5976\u916a",
  1217. "/actions/cheesesmithing/holy_boots": "\u795e\u5723\u9774",
  1218. "/actions/cheesesmithing/holy_gauntlets": "\u795e\u5723\u62a4\u624b",
  1219. "/actions/cheesesmithing/holy_sword": "\u795e\u5723\u5251",
  1220. "/actions/cheesesmithing/holy_brush": "\u795e\u5723\u5237\u5b50",
  1221. "/actions/cheesesmithing/holy_shears": "\u795e\u5723\u526a\u5200",
  1222. "/actions/cheesesmithing/holy_hatchet": "\u795e\u5723\u65a7\u5934",
  1223. "/actions/cheesesmithing/holy_spear": "\u795e\u5723\u957f\u67aa",
  1224. "/actions/cheesesmithing/holy_hammer": "\u795e\u5723\u9524\u5b50",
  1225. "/actions/cheesesmithing/holy_chisel": "\u795e\u5723\u51ff\u5b50",
  1226. "/actions/cheesesmithing/holy_needle": "\u795e\u5723\u9488",
  1227. "/actions/cheesesmithing/holy_spatula": "\u795e\u5723\u9505\u94f2",
  1228. "/actions/cheesesmithing/holy_pot": "\u795e\u5723\u58f6",
  1229. "/actions/cheesesmithing/holy_mace": "\u795e\u5723\u9489\u5934\u9524",
  1230. "/actions/cheesesmithing/magnetic_gloves": "\u78c1\u529b\u624b\u5957",
  1231. "/actions/cheesesmithing/stalactite_spear": "\u77f3\u949f\u957f\u67aa",
  1232. "/actions/cheesesmithing/granite_bludgeon": "\u82b1\u5c97\u5ca9\u5927\u68d2",
  1233. "/actions/cheesesmithing/vampire_fang_dirk": "\u5438\u8840\u9b3c\u77ed\u5251",
  1234. "/actions/cheesesmithing/werewolf_slasher": "\u72fc\u4eba\u5173\u5200",
  1235. "/actions/cheesesmithing/holy_alembic": "\u795e\u5723\u84b8\u998f\u5668",
  1236. "/actions/cheesesmithing/holy_enhancer": "\u795e\u5723\u5f3a\u5316\u5668",
  1237. "/actions/cheesesmithing/holy_helmet": "\u795e\u5723\u5934\u76d4",
  1238. "/actions/cheesesmithing/holy_buckler": "\u795e\u5723\u5706\u76fe",
  1239. "/actions/cheesesmithing/holy_bulwark": "\u795e\u5723\u91cd\u76fe",
  1240. "/actions/cheesesmithing/holy_plate_legs": "\u795e\u5723\u817f\u7532",
  1241. "/actions/cheesesmithing/holy_plate_body": "\u795e\u5723\u80f8\u7532",
  1242. "/actions/cheesesmithing/celestial_brush": "\u661f\u7a7a\u5237\u5b50",
  1243. "/actions/cheesesmithing/celestial_shears": "\u661f\u7a7a\u526a\u5200",
  1244. "/actions/cheesesmithing/celestial_hatchet": "\u661f\u7a7a\u65a7\u5934",
  1245. "/actions/cheesesmithing/celestial_hammer": "\u661f\u7a7a\u9524\u5b50",
  1246. "/actions/cheesesmithing/celestial_chisel": "\u661f\u7a7a\u51ff\u5b50",
  1247. "/actions/cheesesmithing/celestial_needle": "\u661f\u7a7a\u9488",
  1248. "/actions/cheesesmithing/celestial_spatula": "\u661f\u7a7a\u9505\u94f2",
  1249. "/actions/cheesesmithing/celestial_pot": "\u661f\u7a7a\u58f6",
  1250. "/actions/cheesesmithing/celestial_alembic": "\u661f\u7a7a\u84b8\u998f\u5668",
  1251. "/actions/cheesesmithing/celestial_enhancer": "\u661f\u7a7a\u5f3a\u5316\u5668",
  1252. "/actions/cheesesmithing/colossus_plate_body": "\u5de8\u50cf\u80f8\u7532",
  1253. "/actions/cheesesmithing/colossus_plate_legs": "\u5de8\u50cf\u817f\u7532",
  1254. "/actions/cheesesmithing/demonic_plate_body": "\u6076\u9b54\u80f8\u7532",
  1255. "/actions/cheesesmithing/demonic_plate_legs": "\u6076\u9b54\u817f\u7532",
  1256. "/actions/cheesesmithing/spiked_bulwark": "\u5c16\u523a\u91cd\u76fe",
  1257. "/actions/cheesesmithing/dodocamel_gauntlets": "\u6e21\u6e21\u9a7c\u62a4\u624b",
  1258. "/actions/cheesesmithing/corsair_helmet": "\u63a0\u593a\u8005\u5934\u76d4",
  1259. "/actions/cheesesmithing/knights_aegis": "\u9a91\u58eb\u76fe",
  1260. "/actions/cheesesmithing/anchorbound_plate_legs": "\u951a\u5b9a\u817f\u7532",
  1261. "/actions/cheesesmithing/maelstrom_plate_legs": "\u6012\u6d9b\u817f\u7532",
  1262. "/actions/cheesesmithing/griffin_bulwark": "\u72ee\u9e6b\u91cd\u76fe",
  1263. "/actions/cheesesmithing/furious_spear": "\u72c2\u6012\u957f\u67aa",
  1264. "/actions/cheesesmithing/chaotic_flail": "\u6df7\u6c8c\u8fde\u67b7",
  1265. "/actions/cheesesmithing/regal_sword": "\u541b\u738b\u4e4b\u5251",
  1266. "/actions/cheesesmithing/anchorbound_plate_body": "\u951a\u5b9a\u80f8\u7532",
  1267. "/actions/cheesesmithing/maelstrom_plate_body": "\u6012\u6d9b\u80f8\u7532",
  1268. "/actions/crafting/lumber": "\u6728\u677f",
  1269. "/actions/crafting/wooden_crossbow": "\u6728\u5f29",
  1270. "/actions/crafting/wooden_water_staff": "\u6728\u5236\u6c34\u6cd5\u6756",
  1271. "/actions/crafting/basic_task_badge": "\u57fa\u7840\u4efb\u52a1\u5fbd\u7ae0",
  1272. "/actions/crafting/advanced_task_badge": "\u9ad8\u7ea7\u4efb\u52a1\u5fbd\u7ae0",
  1273. "/actions/crafting/expert_task_badge": "\u4e13\u5bb6\u4efb\u52a1\u5fbd\u7ae0",
  1274. "/actions/crafting/wooden_shield": "\u6728\u76fe",
  1275. "/actions/crafting/wooden_nature_staff": "\u6728\u5236\u81ea\u7136\u6cd5\u6756",
  1276. "/actions/crafting/wooden_bow": "\u6728\u5f13",
  1277. "/actions/crafting/wooden_fire_staff": "\u6728\u5236\u706b\u6cd5\u6756",
  1278. "/actions/crafting/birch_lumber": "\u767d\u6866\u6728\u677f",
  1279. "/actions/crafting/birch_crossbow": "\u6866\u6728\u5f29",
  1280. "/actions/crafting/birch_water_staff": "\u6866\u6728\u6c34\u6cd5\u6756",
  1281. "/actions/crafting/crushed_pearl": "\u73cd\u73e0\u788e\u7247",
  1282. "/actions/crafting/birch_shield": "\u6866\u6728\u76fe",
  1283. "/actions/crafting/birch_nature_staff": "\u6866\u6728\u81ea\u7136\u6cd5\u6756",
  1284. "/actions/crafting/birch_bow": "\u6866\u6728\u5f13",
  1285. "/actions/crafting/ring_of_gathering": "\u91c7\u96c6\u6212\u6307",
  1286. "/actions/crafting/birch_fire_staff": "\u6866\u6728\u706b\u6cd5\u6756",
  1287. "/actions/crafting/earrings_of_gathering": "\u91c7\u96c6\u8033\u73af",
  1288. "/actions/crafting/cedar_lumber": "\u96ea\u677e\u6728\u677f",
  1289. "/actions/crafting/cedar_crossbow": "\u96ea\u677e\u5f29",
  1290. "/actions/crafting/cedar_water_staff": "\u96ea\u677e\u6c34\u6cd5\u6756",
  1291. "/actions/crafting/cedar_shield": "\u96ea\u677e\u76fe",
  1292. "/actions/crafting/cedar_nature_staff": "\u96ea\u677e\u81ea\u7136\u6cd5\u6756",
  1293. "/actions/crafting/cedar_bow": "\u96ea\u677e\u5f13",
  1294. "/actions/crafting/crushed_amber": "\u7425\u73c0\u788e\u7247",
  1295. "/actions/crafting/cedar_fire_staff": "\u96ea\u677e\u706b\u6cd5\u6756",
  1296. "/actions/crafting/ring_of_essence_find": "\u7cbe\u534e\u53d1\u73b0\u6212\u6307",
  1297. "/actions/crafting/earrings_of_essence_find": "\u7cbe\u534e\u53d1\u73b0\u8033\u73af",
  1298. "/actions/crafting/necklace_of_efficiency": "\u6548\u7387\u9879\u94fe",
  1299. "/actions/crafting/purpleheart_lumber": "\u7d2b\u5fc3\u6728\u677f",
  1300. "/actions/crafting/purpleheart_crossbow": "\u7d2b\u5fc3\u5f29",
  1301. "/actions/crafting/purpleheart_water_staff": "\u7d2b\u5fc3\u6c34\u6cd5\u6756",
  1302. "/actions/crafting/purpleheart_shield": "\u7d2b\u5fc3\u76fe",
  1303. "/actions/crafting/purpleheart_nature_staff": "\u7d2b\u5fc3\u81ea\u7136\u6cd5\u6756",
  1304. "/actions/crafting/purpleheart_bow": "\u7d2b\u5fc3\u5f13",
  1305. "/actions/crafting/crushed_garnet": "\u77f3\u69b4\u77f3\u788e\u7247",
  1306. "/actions/crafting/crushed_jade": "\u7fe1\u7fe0\u788e\u7247",
  1307. "/actions/crafting/crushed_amethyst": "\u7d2b\u6c34\u6676\u788e\u7247",
  1308. "/actions/crafting/catalyst_of_coinification": "\u70b9\u91d1\u50ac\u5316\u5242",
  1309. "/actions/crafting/treant_shield": "\u6811\u4eba\u76fe",
  1310. "/actions/crafting/purpleheart_fire_staff": "\u7d2b\u5fc3\u706b\u6cd5\u6756",
  1311. "/actions/crafting/ring_of_regeneration": "\u6062\u590d\u6212\u6307",
  1312. "/actions/crafting/earrings_of_regeneration": "\u6062\u590d\u8033\u73af",
  1313. "/actions/crafting/fighter_necklace": "\u6218\u58eb\u9879\u94fe",
  1314. "/actions/crafting/ginkgo_lumber": "\u94f6\u674f\u6728\u677f",
  1315. "/actions/crafting/ginkgo_crossbow": "\u94f6\u674f\u5f29",
  1316. "/actions/crafting/ginkgo_water_staff": "\u94f6\u674f\u6c34\u6cd5\u6756",
  1317. "/actions/crafting/ring_of_armor": "\u62a4\u7532\u6212\u6307",
  1318. "/actions/crafting/catalyst_of_decomposition": "\u5206\u89e3\u50ac\u5316\u5242",
  1319. "/actions/crafting/ginkgo_shield": "\u94f6\u674f\u76fe",
  1320. "/actions/crafting/earrings_of_armor": "\u62a4\u7532\u8033\u73af",
  1321. "/actions/crafting/ginkgo_nature_staff": "\u94f6\u674f\u81ea\u7136\u6cd5\u6756",
  1322. "/actions/crafting/ranger_necklace": "\u5c04\u624b\u9879\u94fe",
  1323. "/actions/crafting/ginkgo_bow": "\u94f6\u674f\u5f13",
  1324. "/actions/crafting/ring_of_resistance": "\u6297\u6027\u6212\u6307",
  1325. "/actions/crafting/crushed_moonstone": "\u6708\u4eae\u77f3\u788e\u7247",
  1326. "/actions/crafting/ginkgo_fire_staff": "\u94f6\u674f\u706b\u6cd5\u6756",
  1327. "/actions/crafting/earrings_of_resistance": "\u6297\u6027\u8033\u73af",
  1328. "/actions/crafting/wizard_necklace": "\u5deb\u5e08\u9879\u94fe",
  1329. "/actions/crafting/ring_of_rare_find": "\u7a00\u6709\u53d1\u73b0\u6212\u6307",
  1330. "/actions/crafting/catalyst_of_transmutation": "\u8f6c\u5316\u50ac\u5316\u5242",
  1331. "/actions/crafting/earrings_of_rare_find": "\u7a00\u6709\u53d1\u73b0\u8033\u73af",
  1332. "/actions/crafting/necklace_of_wisdom": "\u7ecf\u9a8c\u9879\u94fe",
  1333. "/actions/crafting/redwood_lumber": "\u7ea2\u6749\u6728\u677f",
  1334. "/actions/crafting/redwood_crossbow": "\u7ea2\u6749\u5f29",
  1335. "/actions/crafting/redwood_water_staff": "\u7ea2\u6749\u6c34\u6cd5\u6756",
  1336. "/actions/crafting/redwood_shield": "\u7ea2\u6749\u76fe",
  1337. "/actions/crafting/redwood_nature_staff": "\u7ea2\u6749\u81ea\u7136\u6cd5\u6756",
  1338. "/actions/crafting/redwood_bow": "\u7ea2\u6749\u5f13",
  1339. "/actions/crafting/crushed_sunstone": "\u592a\u9633\u77f3\u788e\u7247",
  1340. "/actions/crafting/chimerical_entry_key": "\u5947\u5e7b\u94a5\u5319",
  1341. "/actions/crafting/chimerical_chest_key": "\u5947\u5e7b\u5b9d\u7bb1\u94a5\u5319",
  1342. "/actions/crafting/eye_watch": "\u638c\u4e0a\u76d1\u5de5",
  1343. "/actions/crafting/watchful_relic": "\u8b66\u6212\u9057\u7269",
  1344. "/actions/crafting/redwood_fire_staff": "\u7ea2\u6749\u706b\u6cd5\u6756",
  1345. "/actions/crafting/ring_of_critical_strike": "\u66b4\u51fb\u6212\u6307",
  1346. "/actions/crafting/mirror_of_protection": "\u4fdd\u62a4\u4e4b\u955c",
  1347. "/actions/crafting/earrings_of_critical_strike": "\u66b4\u51fb\u8033\u73af",
  1348. "/actions/crafting/necklace_of_speed": "\u901f\u5ea6\u9879\u94fe",
  1349. "/actions/crafting/arcane_lumber": "\u795e\u79d8\u6728\u677f",
  1350. "/actions/crafting/arcane_crossbow": "\u795e\u79d8\u5f29",
  1351. "/actions/crafting/arcane_water_staff": "\u795e\u79d8\u6c34\u6cd5\u6756",
  1352. "/actions/crafting/sinister_entry_key": "\u9634\u68ee\u94a5\u5319",
  1353. "/actions/crafting/sinister_chest_key": "\u9634\u68ee\u5b9d\u7bb1\u94a5\u5319",
  1354. "/actions/crafting/arcane_shield": "\u795e\u79d8\u76fe",
  1355. "/actions/crafting/arcane_nature_staff": "\u795e\u79d8\u81ea\u7136\u6cd5\u6756",
  1356. "/actions/crafting/manticore_shield": "\u874e\u72ee\u76fe",
  1357. "/actions/crafting/arcane_bow": "\u795e\u79d8\u5f13",
  1358. "/actions/crafting/enchanted_entry_key": "\u79d8\u6cd5\u94a5\u5319",
  1359. "/actions/crafting/enchanted_chest_key": "\u79d8\u6cd5\u5b9d\u7bb1\u94a5\u5319",
  1360. "/actions/crafting/pirate_entry_key": "\u6d77\u76d7\u94a5\u5319",
  1361. "/actions/crafting/pirate_chest_key": "\u6d77\u76d7\u5b9d\u7bb1\u94a5\u5319",
  1362. "/actions/crafting/arcane_fire_staff": "\u795e\u79d8\u706b\u6cd5\u6756",
  1363. "/actions/crafting/vampiric_bow": "\u5438\u8840\u5f13",
  1364. "/actions/crafting/soul_hunter_crossbow": "\u7075\u9b42\u730e\u624b\u5f29",
  1365. "/actions/crafting/rippling_trident": "\u6d9f\u6f2a\u4e09\u53c9\u621f",
  1366. "/actions/crafting/blooming_trident": "\u7efd\u653e\u4e09\u53c9\u621f",
  1367. "/actions/crafting/blazing_trident": "\u70bd\u7130\u4e09\u53c9\u621f",
  1368. "/actions/crafting/frost_staff": "\u51b0\u971c\u6cd5\u6756",
  1369. "/actions/crafting/infernal_battlestaff": "\u70bc\u72f1\u6cd5\u6756",
  1370. "/actions/crafting/jackalope_staff": "\u9e7f\u89d2\u5154\u4e4b\u6756",
  1371. "/actions/crafting/philosophers_ring": "\u8d24\u8005\u6212\u6307",
  1372. "/actions/crafting/crushed_philosophers_stone": "\u8d24\u8005\u4e4b\u77f3\u788e\u7247",
  1373. "/actions/crafting/philosophers_earrings": "\u8d24\u8005\u8033\u73af",
  1374. "/actions/crafting/philosophers_necklace": "\u8d24\u8005\u9879\u94fe",
  1375. "/actions/crafting/bishops_codex": "\u4e3b\u6559\u6cd5\u5178",
  1376. "/actions/crafting/cursed_bow": "\u5492\u6028\u4e4b\u5f13",
  1377. "/actions/crafting/sundering_crossbow": "\u88c2\u7a7a\u4e4b\u5f29",
  1378. "/actions/tailoring/rough_leather": "\u7c97\u7cd9\u76ae\u9769",
  1379. "/actions/tailoring/cotton_fabric": "\u68c9\u82b1\u5e03\u6599",
  1380. "/actions/tailoring/rough_boots": "\u7c97\u7cd9\u9774",
  1381. "/actions/tailoring/cotton_boots": "\u68c9\u9774",
  1382. "/actions/tailoring/rough_bracers": "\u7c97\u7cd9\u62a4\u8155",
  1383. "/actions/tailoring/cotton_gloves": "\u68c9\u624b\u5957",
  1384. "/actions/tailoring/small_pouch": "\u5c0f\u888b\u5b50",
  1385. "/actions/tailoring/rough_hood": "\u7c97\u7cd9\u515c\u5e3d",
  1386. "/actions/tailoring/cotton_hat": "\u68c9\u5e3d",
  1387. "/actions/tailoring/rough_chaps": "\u7c97\u7cd9\u76ae\u88e4",
  1388. "/actions/tailoring/cotton_robe_bottoms": "\u68c9\u5e03\u888d\u88d9",
  1389. "/actions/tailoring/rough_tunic": "\u7c97\u7cd9\u76ae\u8863",
  1390. "/actions/tailoring/cotton_robe_top": "\u68c9\u5e03\u888d\u670d",
  1391. "/actions/tailoring/reptile_leather": "\u722c\u884c\u52a8\u7269\u76ae\u9769",
  1392. "/actions/tailoring/linen_fabric": "\u4e9a\u9ebb\u5e03\u6599",
  1393. "/actions/tailoring/reptile_boots": "\u722c\u884c\u52a8\u7269\u9774",
  1394. "/actions/tailoring/linen_boots": "\u4e9a\u9ebb\u9774",
  1395. "/actions/tailoring/reptile_bracers": "\u722c\u884c\u52a8\u7269\u62a4\u8155",
  1396. "/actions/tailoring/linen_gloves": "\u4e9a\u9ebb\u624b\u5957",
  1397. "/actions/tailoring/reptile_hood": "\u722c\u884c\u52a8\u7269\u515c\u5e3d",
  1398. "/actions/tailoring/linen_hat": "\u4e9a\u9ebb\u5e3d",
  1399. "/actions/tailoring/reptile_chaps": "\u722c\u884c\u52a8\u7269\u76ae\u88e4",
  1400. "/actions/tailoring/linen_robe_bottoms": "\u4e9a\u9ebb\u888d\u88d9",
  1401. "/actions/tailoring/medium_pouch": "\u4e2d\u888b\u5b50",
  1402. "/actions/tailoring/reptile_tunic": "\u722c\u884c\u52a8\u7269\u76ae\u8863",
  1403. "/actions/tailoring/linen_robe_top": "\u4e9a\u9ebb\u888d\u670d",
  1404. "/actions/tailoring/shoebill_shoes": "\u9cb8\u5934\u9e73\u978b",
  1405. "/actions/tailoring/gobo_leather": "\u54e5\u5e03\u6797\u76ae\u9769",
  1406. "/actions/tailoring/bamboo_fabric": "\u7af9\u5b50\u5e03\u6599",
  1407. "/actions/tailoring/gobo_boots": "\u54e5\u5e03\u6797\u9774",
  1408. "/actions/tailoring/bamboo_boots": "\u7af9\u9774",
  1409. "/actions/tailoring/gobo_bracers": "\u54e5\u5e03\u6797\u62a4\u8155",
  1410. "/actions/tailoring/bamboo_gloves": "\u7af9\u624b\u5957",
  1411. "/actions/tailoring/gobo_hood": "\u54e5\u5e03\u6797\u515c\u5e3d",
  1412. "/actions/tailoring/bamboo_hat": "\u7af9\u5e3d",
  1413. "/actions/tailoring/gobo_chaps": "\u54e5\u5e03\u6797\u76ae\u88e4",
  1414. "/actions/tailoring/bamboo_robe_bottoms": "\u7af9\u5e03\u888d\u88d9",
  1415. "/actions/tailoring/large_pouch": "\u5927\u888b\u5b50",
  1416. "/actions/tailoring/gobo_tunic": "\u54e5\u5e03\u6797\u76ae\u8863",
  1417. "/actions/tailoring/bamboo_robe_top": "\u7af9\u888d\u670d",
  1418. "/actions/tailoring/marine_tunic": "\u6d77\u6d0b\u76ae\u8863",
  1419. "/actions/tailoring/marine_chaps": "\u822a\u6d77\u76ae\u88e4",
  1420. "/actions/tailoring/icy_robe_top": "\u51b0\u971c\u888d\u670d",
  1421. "/actions/tailoring/icy_robe_bottoms": "\u51b0\u971c\u888d\u88d9",
  1422. "/actions/tailoring/flaming_robe_top": "\u70c8\u7130\u888d\u670d",
  1423. "/actions/tailoring/flaming_robe_bottoms": "\u70c8\u7130\u888d\u88d9",
  1424. "/actions/tailoring/beast_leather": "\u91ce\u517d\u76ae\u9769",
  1425. "/actions/tailoring/silk_fabric": "\u4e1d\u7ef8",
  1426. "/actions/tailoring/beast_boots": "\u91ce\u517d\u9774",
  1427. "/actions/tailoring/silk_boots": "\u4e1d\u9774",
  1428. "/actions/tailoring/beast_bracers": "\u91ce\u517d\u62a4\u8155",
  1429. "/actions/tailoring/silk_gloves": "\u4e1d\u624b\u5957",
  1430. "/actions/tailoring/collectors_boots": "\u6536\u85cf\u5bb6\u4e4b\u9774",
  1431. "/actions/tailoring/sighted_bracers": "\u7784\u51c6\u62a4\u8155",
  1432. "/actions/tailoring/beast_hood": "\u91ce\u517d\u515c\u5e3d",
  1433. "/actions/tailoring/silk_hat": "\u4e1d\u5e3d",
  1434. "/actions/tailoring/beast_chaps": "\u91ce\u517d\u76ae\u88e4",
  1435. "/actions/tailoring/silk_robe_bottoms": "\u4e1d\u7ef8\u888d\u88d9",
  1436. "/actions/tailoring/centaur_boots": "\u534a\u4eba\u9a6c\u9774",
  1437. "/actions/tailoring/sorcerer_boots": "\u5deb\u5e08\u9774",
  1438. "/actions/tailoring/giant_pouch": "\u5de8\u5927\u888b\u5b50",
  1439. "/actions/tailoring/beast_tunic": "\u91ce\u517d\u76ae\u8863",
  1440. "/actions/tailoring/silk_robe_top": "\u4e1d\u7ef8\u888d\u670d",
  1441. "/actions/tailoring/red_culinary_hat": "\u7ea2\u8272\u53a8\u5e08\u5e3d",
  1442. "/actions/tailoring/luna_robe_top": "\u6708\u795e\u888d\u670d",
  1443. "/actions/tailoring/luna_robe_bottoms": "\u6708\u795e\u888d\u88d9",
  1444. "/actions/tailoring/umbral_leather": "\u6697\u5f71\u76ae\u9769",
  1445. "/actions/tailoring/radiant_fabric": "\u5149\u8f89\u5e03\u6599",
  1446. "/actions/tailoring/umbral_boots": "\u6697\u5f71\u9774",
  1447. "/actions/tailoring/radiant_boots": "\u5149\u8f89\u9774",
  1448. "/actions/tailoring/umbral_bracers": "\u6697\u5f71\u62a4\u8155",
  1449. "/actions/tailoring/radiant_gloves": "\u5149\u8f89\u624b\u5957",
  1450. "/actions/tailoring/enchanted_gloves": "\u9644\u9b54\u624b\u5957",
  1451. "/actions/tailoring/fluffy_red_hat": "\u84ec\u677e\u7ea2\u5e3d\u5b50",
  1452. "/actions/tailoring/chrono_gloves": "\u65f6\u7a7a\u624b\u5957",
  1453. "/actions/tailoring/umbral_hood": "\u6697\u5f71\u515c\u5e3d",
  1454. "/actions/tailoring/radiant_hat": "\u5149\u8f89\u5e3d",
  1455. "/actions/tailoring/umbral_chaps": "\u6697\u5f71\u76ae\u88e4",
  1456. "/actions/tailoring/radiant_robe_bottoms": "\u5149\u8f89\u888d\u88d9",
  1457. "/actions/tailoring/umbral_tunic": "\u6697\u5f71\u76ae\u8863",
  1458. "/actions/tailoring/radiant_robe_top": "\u5149\u8f89\u888d\u670d",
  1459. "/actions/tailoring/revenant_chaps": "\u4ea1\u7075\u76ae\u88e4",
  1460. "/actions/tailoring/griffin_chaps": "\u72ee\u9e6b\u62a4\u817f",
  1461. "/actions/tailoring/dairyhands_top": "\u6324\u5976\u5de5\u4e0a\u8863",
  1462. "/actions/tailoring/dairyhands_bottoms": "\u6324\u5976\u5de5\u4e0b\u88c5",
  1463. "/actions/tailoring/foragers_top": "\u91c7\u6458\u8005\u4e0a\u8863",
  1464. "/actions/tailoring/foragers_bottoms": "\u91c7\u6458\u8005\u4e0b\u88c5",
  1465. "/actions/tailoring/lumberjacks_top": "\u4f10\u6728\u5de5\u4e0a\u8863",
  1466. "/actions/tailoring/lumberjacks_bottoms": "\u4f10\u6728\u5de5\u4e0b\u88c5",
  1467. "/actions/tailoring/cheesemakers_top": "\u5976\u916a\u5e08\u4e0a\u8863",
  1468. "/actions/tailoring/cheesemakers_bottoms": "\u5976\u916a\u5e08\u4e0b\u88c5",
  1469. "/actions/tailoring/crafters_top": "\u5de5\u5320\u4e0a\u8863",
  1470. "/actions/tailoring/crafters_bottoms": "\u5de5\u5320\u4e0b\u88c5",
  1471. "/actions/tailoring/tailors_top": "\u88c1\u7f1d\u4e0a\u8863",
  1472. "/actions/tailoring/tailors_bottoms": "\u88c1\u7f1d\u4e0b\u88c5",
  1473. "/actions/tailoring/chefs_top": "\u53a8\u5e08\u4e0a\u8863",
  1474. "/actions/tailoring/chefs_bottoms": "\u53a8\u5e08\u4e0b\u88c5",
  1475. "/actions/tailoring/brewers_top": "\u996e\u54c1\u5e08\u4e0a\u8863",
  1476. "/actions/tailoring/brewers_bottoms": "\u996e\u54c1\u5e08\u4e0b\u88c5",
  1477. "/actions/tailoring/alchemists_top": "\u70bc\u91d1\u5e08\u7684\u4e0a\u8863",
  1478. "/actions/tailoring/alchemists_bottoms": "\u70bc\u91d1\u5e08\u4e0b\u88c5",
  1479. "/actions/tailoring/enhancers_top": "\u5f3a\u5316\u5e08\u4e0a\u8863",
  1480. "/actions/tailoring/enhancers_bottoms": "\u5f3a\u5316\u5e08\u4e0b\u88c5",
  1481. "/actions/tailoring/revenant_tunic": "\u4ea1\u7075\u76ae\u8863",
  1482. "/actions/tailoring/griffin_tunic": "\u72ee\u9e6b\u76ae\u8863",
  1483. "/actions/tailoring/gluttonous_pouch": "\u8d2a\u98df\u4e4b\u888b",
  1484. "/actions/tailoring/guzzling_pouch": "\u66b4\u996e\u4e4b\u56ca",
  1485. "/actions/tailoring/marksman_bracers": "\u795e\u5c04\u62a4\u8155",
  1486. "/actions/tailoring/acrobatic_hood": "\u6742\u6280\u5e08\u515c\u5e3d",
  1487. "/actions/tailoring/magicians_hat": "\u9b54\u672f\u5e08\u4e4b\u5e3d",
  1488. "/actions/tailoring/kraken_chaps": "\u514b\u62c9\u80af\u76ae\u88e4",
  1489. "/actions/tailoring/royal_water_robe_bottoms": "\u7687\u5bb6\u6c34\u7cfb\u888d\u88d9",
  1490. "/actions/tailoring/royal_nature_robe_bottoms": "\u7687\u5bb6\u81ea\u7136\u7cfb\u888d\u88d9",
  1491. "/actions/tailoring/royal_fire_robe_bottoms": "\u7687\u5bb6\u706b\u7cfb\u888d\u88d9",
  1492. "/actions/tailoring/kraken_tunic": "\u514b\u62c9\u80af\u76ae\u8863",
  1493. "/actions/tailoring/royal_water_robe_top": "\u7687\u5bb6\u6c34\u7cfb\u888d\u670d",
  1494. "/actions/tailoring/royal_nature_robe_top": "\u7687\u5bb6\u81ea\u7136\u7cfb\u888d\u670d",
  1495. "/actions/tailoring/royal_fire_robe_top": "\u7687\u5bb6\u706b\u7cfb\u888d\u670d",
  1496. "/actions/cooking/donut": "\u751c\u751c\u5708",
  1497. "/actions/cooking/cupcake": "\u7eb8\u676f\u86cb\u7cd5",
  1498. "/actions/cooking/gummy": "\u8f6f\u7cd6",
  1499. "/actions/cooking/yogurt": "\u9178\u5976",
  1500. "/actions/cooking/blueberry_donut": "\u84dd\u8393\u751c\u751c\u5708",
  1501. "/actions/cooking/blueberry_cake": "\u84dd\u8393\u86cb\u7cd5",
  1502. "/actions/cooking/apple_gummy": "\u82f9\u679c\u8f6f\u7cd6",
  1503. "/actions/cooking/apple_yogurt": "\u82f9\u679c\u9178\u5976",
  1504. "/actions/cooking/blackberry_donut": "\u9ed1\u8393\u751c\u751c\u5708",
  1505. "/actions/cooking/blackberry_cake": "\u9ed1\u8393\u86cb\u7cd5",
  1506. "/actions/cooking/orange_gummy": "\u6a59\u5b50\u8f6f\u7cd6",
  1507. "/actions/cooking/orange_yogurt": "\u6a59\u5b50\u9178\u5976",
  1508. "/actions/cooking/strawberry_donut": "\u8349\u8393\u751c\u751c\u5708",
  1509. "/actions/cooking/strawberry_cake": "\u8349\u8393\u86cb\u7cd5",
  1510. "/actions/cooking/plum_gummy": "\u674e\u5b50\u8f6f\u7cd6",
  1511. "/actions/cooking/plum_yogurt": "\u674e\u5b50\u9178\u5976",
  1512. "/actions/cooking/mooberry_donut": "\u54de\u8393\u751c\u751c\u5708",
  1513. "/actions/cooking/mooberry_cake": "\u54de\u8393\u86cb\u7cd5",
  1514. "/actions/cooking/peach_gummy": "\u6843\u5b50\u8f6f\u7cd6",
  1515. "/actions/cooking/peach_yogurt": "\u6843\u5b50\u9178\u5976",
  1516. "/actions/cooking/marsberry_donut": "\u706b\u661f\u8393\u751c\u751c\u5708",
  1517. "/actions/cooking/marsberry_cake": "\u706b\u661f\u8393\u86cb\u7cd5",
  1518. "/actions/cooking/dragon_fruit_gummy": "\u706b\u9f99\u679c\u8f6f\u7cd6",
  1519. "/actions/cooking/dragon_fruit_yogurt": "\u706b\u9f99\u679c\u9178\u5976",
  1520. "/actions/cooking/spaceberry_donut": "\u592a\u7a7a\u8393\u751c\u751c\u5708",
  1521. "/actions/cooking/spaceberry_cake": "\u592a\u7a7a\u8393\u86cb\u7cd5",
  1522. "/actions/cooking/star_fruit_gummy": "\u6768\u6843\u8f6f\u7cd6",
  1523. "/actions/cooking/star_fruit_yogurt": "\u6768\u6843\u9178\u5976",
  1524. "/actions/brewing/milking_tea": "\u6324\u5976\u8336",
  1525. "/actions/brewing/stamina_coffee": "\u8010\u529b\u5496\u5561",
  1526. "/actions/brewing/foraging_tea": "\u91c7\u6458\u8336",
  1527. "/actions/brewing/intelligence_coffee": "\u667a\u529b\u5496\u5561",
  1528. "/actions/brewing/gathering_tea": "\u91c7\u96c6\u8336",
  1529. "/actions/brewing/woodcutting_tea": "\u4f10\u6728\u8336",
  1530. "/actions/brewing/cooking_tea": "\u70f9\u996a\u8336",
  1531. "/actions/brewing/defense_coffee": "\u9632\u5fa1\u5496\u5561",
  1532. "/actions/brewing/brewing_tea": "\u51b2\u6ce1\u8336",
  1533. "/actions/brewing/attack_coffee": "\u653b\u51fb\u5496\u5561",
  1534. "/actions/brewing/gourmet_tea": "\u7f8e\u98df\u8336",
  1535. "/actions/brewing/alchemy_tea": "\u70bc\u91d1\u8336",
  1536. "/actions/brewing/enhancing_tea": "\u5f3a\u5316\u8336",
  1537. "/actions/brewing/cheesesmithing_tea": "\u5976\u916a\u953b\u9020\u8336",
  1538. "/actions/brewing/power_coffee": "\u529b\u91cf\u5496\u5561",
  1539. "/actions/brewing/crafting_tea": "\u5236\u4f5c\u8336",
  1540. "/actions/brewing/ranged_coffee": "\u8fdc\u7a0b\u5496\u5561",
  1541. "/actions/brewing/wisdom_tea": "\u7ecf\u9a8c\u8336",
  1542. "/actions/brewing/wisdom_coffee": "\u7ecf\u9a8c\u5496\u5561",
  1543. "/actions/brewing/tailoring_tea": "\u7f1d\u7eab\u8336",
  1544. "/actions/brewing/magic_coffee": "\u9b54\u6cd5\u5496\u5561",
  1545. "/actions/brewing/super_milking_tea": "\u8d85\u7ea7\u6324\u5976\u8336",
  1546. "/actions/brewing/super_stamina_coffee": "\u8d85\u7ea7\u8010\u529b\u5496\u5561",
  1547. "/actions/brewing/super_foraging_tea": "\u8d85\u7ea7\u91c7\u6458\u8336",
  1548. "/actions/brewing/super_intelligence_coffee": "\u8d85\u7ea7\u667a\u529b\u5496\u5561",
  1549. "/actions/brewing/processing_tea": "\u52a0\u5de5\u8336",
  1550. "/actions/brewing/lucky_coffee": "\u5e78\u8fd0\u5496\u5561",
  1551. "/actions/brewing/super_woodcutting_tea": "\u8d85\u7ea7\u4f10\u6728\u8336",
  1552. "/actions/brewing/super_cooking_tea": "\u8d85\u7ea7\u70f9\u996a\u8336",
  1553. "/actions/brewing/super_defense_coffee": "\u8d85\u7ea7\u9632\u5fa1\u5496\u5561",
  1554. "/actions/brewing/super_brewing_tea": "\u8d85\u7ea7\u51b2\u6ce1\u8336",
  1555. "/actions/brewing/ultra_milking_tea": "\u7a76\u6781\u6324\u5976\u8336",
  1556. "/actions/brewing/super_attack_coffee": "\u8d85\u7ea7\u653b\u51fb\u5496\u5561",
  1557. "/actions/brewing/ultra_stamina_coffee": "\u7a76\u6781\u8010\u529b\u5496\u5561",
  1558. "/actions/brewing/efficiency_tea": "\u6548\u7387\u8336",
  1559. "/actions/brewing/swiftness_coffee": "\u8fc5\u6377\u5496\u5561",
  1560. "/actions/brewing/super_alchemy_tea": "\u8d85\u7ea7\u70bc\u91d1\u8336",
  1561. "/actions/brewing/super_enhancing_tea": "\u8d85\u7ea7\u5f3a\u5316\u8336",
  1562. "/actions/brewing/ultra_foraging_tea": "\u7a76\u6781\u91c7\u6458\u8336",
  1563. "/actions/brewing/ultra_intelligence_coffee": "\u7a76\u6781\u667a\u529b\u5496\u5561",
  1564. "/actions/brewing/channeling_coffee": "\u541f\u5531\u5496\u5561",
  1565. "/actions/brewing/super_cheesesmithing_tea": "\u8d85\u7ea7\u5976\u916a\u953b\u9020\u8336",
  1566. "/actions/brewing/ultra_woodcutting_tea": "\u7a76\u6781\u4f10\u6728\u8336",
  1567. "/actions/brewing/super_power_coffee": "\u8d85\u7ea7\u529b\u91cf\u5496\u5561",
  1568. "/actions/brewing/artisan_tea": "\u5de5\u5320\u8336",
  1569. "/actions/brewing/super_crafting_tea": "\u8d85\u7ea7\u5236\u4f5c\u8336",
  1570. "/actions/brewing/ultra_cooking_tea": "\u7a76\u6781\u70f9\u996a\u8336",
  1571. "/actions/brewing/super_ranged_coffee": "\u8d85\u7ea7\u8fdc\u7a0b\u5496\u5561",
  1572. "/actions/brewing/ultra_defense_coffee": "\u7a76\u6781\u9632\u5fa1\u5496\u5561",
  1573. "/actions/brewing/catalytic_tea": "\u50ac\u5316\u8336",
  1574. "/actions/brewing/critical_coffee": "\u66b4\u51fb\u5496\u5561",
  1575. "/actions/brewing/super_tailoring_tea": "\u8d85\u7ea7\u7f1d\u7eab\u8336",
  1576. "/actions/brewing/ultra_brewing_tea": "\u7a76\u6781\u51b2\u6ce1\u8336",
  1577. "/actions/brewing/super_magic_coffee": "\u8d85\u7ea7\u9b54\u6cd5\u5496\u5561",
  1578. "/actions/brewing/ultra_attack_coffee": "\u7a76\u6781\u653b\u51fb\u5496\u5561",
  1579. "/actions/brewing/blessed_tea": "\u798f\u6c14\u8336",
  1580. "/actions/brewing/ultra_alchemy_tea": "\u7a76\u6781\u70bc\u91d1\u8336",
  1581. "/actions/brewing/ultra_enhancing_tea": "\u7a76\u6781\u5f3a\u5316\u8336",
  1582. "/actions/brewing/ultra_cheesesmithing_tea": "\u7a76\u6781\u5976\u916a\u953b\u9020\u8336",
  1583. "/actions/brewing/ultra_power_coffee": "\u7a76\u6781\u529b\u91cf\u5496\u5561",
  1584. "/actions/brewing/ultra_crafting_tea": "\u7a76\u6781\u5236\u4f5c\u8336",
  1585. "/actions/brewing/ultra_ranged_coffee": "\u7a76\u6781\u8fdc\u7a0b\u5496\u5561",
  1586. "/actions/brewing/ultra_tailoring_tea": "\u7a76\u6781\u7f1d\u7eab\u8336",
  1587. "/actions/brewing/ultra_magic_coffee": "\u7a76\u6781\u9b54\u6cd5\u5496\u5561",
  1588. "/actions/alchemy/coinify": "\u70b9\u91d1",
  1589. "/actions/alchemy/transmute": "\u8f6c\u5316",
  1590. "/actions/alchemy/decompose": "\u5206\u89e3",
  1591. "/actions/enhancing/enhance": "\u5f3a\u5316",
  1592. "/actions/combat/fly": "\u82cd\u8747",
  1593. "/actions/combat/rat": "\u6770\u745e",
  1594. "/actions/combat/skunk": "\u81ed\u9f2c",
  1595. "/actions/combat/porcupine": "\u8c6a\u732a",
  1596. "/actions/combat/slimy": "\u53f2\u83b1\u59c6",
  1597. "/actions/combat/smelly_planet": "\u81ed\u81ed\u661f\u7403",
  1598. "/actions/combat/smelly_planet_elite": "\u81ed\u81ed\u661f\u7403 (\u7cbe\u82f1)",
  1599. "/actions/combat/frog": "\u9752\u86d9",
  1600. "/actions/combat/snake": "\u86c7",
  1601. "/actions/combat/swampy": "\u6cbc\u6cfd\u866b",
  1602. "/actions/combat/alligator": "\u590f\u6d1b\u514b",
  1603. "/actions/combat/swamp_planet": "\u6cbc\u6cfd\u661f\u7403",
  1604. "/actions/combat/swamp_planet_elite": "\u6cbc\u6cfd\u661f\u7403 (\u7cbe\u82f1)",
  1605. "/actions/combat/sea_snail": "\u8717\u725b",
  1606. "/actions/combat/crab": "\u8783\u87f9",
  1607. "/actions/combat/aquahorse": "\u6c34\u9a6c",
  1608. "/actions/combat/nom_nom": "\u54ac\u54ac\u9c7c",
  1609. "/actions/combat/turtle": "\u5fcd\u8005\u9f9f",
  1610. "/actions/combat/aqua_planet": "\u6d77\u6d0b\u661f\u7403",
  1611. "/actions/combat/aqua_planet_elite": "\u6d77\u6d0b\u661f\u7403 (\u7cbe\u82f1)",
  1612. "/actions/combat/jungle_sprite": "\u4e1b\u6797\u7cbe\u7075",
  1613. "/actions/combat/myconid": "\u8611\u83c7\u4eba",
  1614. "/actions/combat/treant": "\u6811\u4eba",
  1615. "/actions/combat/centaur_archer": "\u534a\u4eba\u9a6c\u5f13\u7bad\u624b",
  1616. "/actions/combat/jungle_planet": "\u4e1b\u6797\u661f\u7403",
  1617. "/actions/combat/jungle_planet_elite": "\u4e1b\u6797\u661f\u7403 (\u7cbe\u82f1)",
  1618. "/actions/combat/gobo_stabby": "\u523a\u523a",
  1619. "/actions/combat/gobo_slashy": "\u780d\u780d",
  1620. "/actions/combat/gobo_smashy": "\u9524\u9524",
  1621. "/actions/combat/gobo_shooty": "\u54bb\u54bb",
  1622. "/actions/combat/gobo_boomy": "\u8f70\u8f70",
  1623. "/actions/combat/gobo_planet": "\u54e5\u5e03\u6797\u661f\u7403",
  1624. "/actions/combat/gobo_planet_elite": "\u54e5\u5e03\u6797\u661f\u7403 (\u7cbe\u82f1)",
  1625. "/actions/combat/eye": "\u72ec\u773c",
  1626. "/actions/combat/eyes": "\u53e0\u773c",
  1627. "/actions/combat/veyes": "\u590d\u773c",
  1628. "/actions/combat/planet_of_the_eyes": "\u773c\u7403\u661f\u7403",
  1629. "/actions/combat/planet_of_the_eyes_elite": "\u773c\u7403\u661f\u7403 (\u7cbe\u82f1)",
  1630. "/actions/combat/novice_sorcerer": "\u65b0\u624b\u5deb\u5e08",
  1631. "/actions/combat/ice_sorcerer": "\u51b0\u971c\u5deb\u5e08",
  1632. "/actions/combat/flame_sorcerer": "\u706b\u7130\u5deb\u5e08",
  1633. "/actions/combat/elementalist": "\u5143\u7d20\u6cd5\u5e08",
  1634. "/actions/combat/sorcerers_tower": "\u5deb\u5e08\u4e4b\u5854",
  1635. "/actions/combat/sorcerers_tower_elite": "\u5deb\u5e08\u4e4b\u5854 (\u7cbe\u82f1)",
  1636. "/actions/combat/gummy_bear": "\u8f6f\u7cd6\u718a",
  1637. "/actions/combat/panda": "\u718a\u732b",
  1638. "/actions/combat/black_bear": "\u9ed1\u718a",
  1639. "/actions/combat/grizzly_bear": "\u68d5\u718a",
  1640. "/actions/combat/polar_bear": "\u5317\u6781\u718a",
  1641. "/actions/combat/bear_with_it": "\u718a\u718a\u661f\u7403",
  1642. "/actions/combat/bear_with_it_elite": "\u718a\u718a\u661f\u7403 (\u7cbe\u82f1)",
  1643. "/actions/combat/magnetic_golem": "\u78c1\u529b\u9b54\u50cf",
  1644. "/actions/combat/stalactite_golem": "\u949f\u4e73\u77f3\u9b54\u50cf",
  1645. "/actions/combat/granite_golem": "\u82b1\u5c97\u5ca9\u9b54\u50cf",
  1646. "/actions/combat/golem_cave": "\u9b54\u50cf\u6d1e\u7a74",
  1647. "/actions/combat/golem_cave_elite": "\u9b54\u50cf\u6d1e\u7a74 (\u7cbe\u82f1)",
  1648. "/actions/combat/zombie": "\u50f5\u5c38",
  1649. "/actions/combat/vampire": "\u5438\u8840\u9b3c",
  1650. "/actions/combat/werewolf": "\u72fc\u4eba",
  1651. "/actions/combat/twilight_zone": "\u66ae\u5149\u4e4b\u5730",
  1652. "/actions/combat/twilight_zone_elite": "\u66ae\u5149\u4e4b\u5730 (\u7cbe\u82f1)",
  1653. "/actions/combat/abyssal_imp": "\u6df1\u6e0a\u5c0f\u9b3c",
  1654. "/actions/combat/soul_hunter": "\u7075\u9b42\u730e\u624b",
  1655. "/actions/combat/infernal_warlock": "\u5730\u72f1\u672f\u58eb",
  1656. "/actions/combat/infernal_abyss": "\u5730\u72f1\u6df1\u6e0a",
  1657. "/actions/combat/infernal_abyss_elite": "\u5730\u72f1\u6df1\u6e0a (\u7cbe\u82f1)",
  1658. "/actions/combat/chimerical_den": "\u5947\u5e7b\u6d1e\u7a74",
  1659. "/actions/combat/sinister_circus": "\u9634\u68ee\u9a6c\u620f\u56e2",
  1660. "/actions/combat/enchanted_fortress": "\u79d8\u6cd5\u8981\u585e",
  1661. "/actions/combat/pirate_cove": "\u6d77\u76d7\u57fa\u5730",
  1662. };
  1663.  
  1664. const ZHOthersDic = {
  1665. // monsterNames
  1666. "/monsters/abyssal_imp": "\u6df1\u6e0a\u5c0f\u9b3c",
  1667. "/monsters/acrobat": "\u6742\u6280\u5e08",
  1668. "/monsters/anchor_shark": "\u6301\u951a\u9ca8",
  1669. "/monsters/aquahorse": "\u6c34\u9a6c",
  1670. "/monsters/black_bear": "\u9ed1\u718a",
  1671. "/monsters/gobo_boomy": "\u8f70\u8f70",
  1672. "/monsters/brine_marksman": "\u6d77\u76d0\u5c04\u624b",
  1673. "/monsters/captain_fishhook": "\u9c7c\u94a9\u8239\u957f",
  1674. "/monsters/butterjerry": "\u8776\u9f20",
  1675. "/monsters/centaur_archer": "\u534a\u4eba\u9a6c\u5f13\u7bad\u624b",
  1676. "/monsters/chronofrost_sorcerer": "\u971c\u65f6\u5deb\u5e08",
  1677. "/monsters/crystal_colossus": "\u6c34\u6676\u5de8\u50cf",
  1678. "/monsters/demonic_overlord": "\u6076\u9b54\u9738\u4e3b",
  1679. "/monsters/deranged_jester": "\u5c0f\u4e11\u7687",
  1680. "/monsters/dodocamel": "\u6e21\u6e21\u9a7c",
  1681. "/monsters/dusk_revenant": "\u9ec4\u660f\u4ea1\u7075",
  1682. "/monsters/elementalist": "\u5143\u7d20\u6cd5\u5e08",
  1683. "/monsters/enchanted_bishop": "\u79d8\u6cd5\u4e3b\u6559",
  1684. "/monsters/enchanted_king": "\u79d8\u6cd5\u56fd\u738b",
  1685. "/monsters/enchanted_knight": "\u79d8\u6cd5\u9a91\u58eb",
  1686. "/monsters/enchanted_pawn": "\u79d8\u6cd5\u58eb\u5175",
  1687. "/monsters/enchanted_queen": "\u79d8\u6cd5\u738b\u540e",
  1688. "/monsters/enchanted_rook": "\u79d8\u6cd5\u5821\u5792",
  1689. "/monsters/eye": "\u72ec\u773c",
  1690. "/monsters/eyes": "\u53e0\u773c",
  1691. "/monsters/flame_sorcerer": "\u706b\u7130\u5deb\u5e08",
  1692. "/monsters/fly": "\u82cd\u8747",
  1693. "/monsters/frog": "\u9752\u86d9",
  1694. "/monsters/sea_snail": "\u8717\u725b",
  1695. "/monsters/giant_shoebill": "\u9cb8\u5934\u9e73",
  1696. "/monsters/gobo_chieftain": "\u54e5\u5e03\u6797\u914b\u957f",
  1697. "/monsters/granite_golem": "\u82b1\u5c97\u9b54\u50cf",
  1698. "/monsters/griffin": "\u72ee\u9e6b",
  1699. "/monsters/grizzly_bear": "\u68d5\u718a",
  1700. "/monsters/gummy_bear": "\u8f6f\u7cd6\u718a",
  1701. "/monsters/crab": "\u8783\u87f9",
  1702. "/monsters/ice_sorcerer": "\u51b0\u971c\u5deb\u5e08",
  1703. "/monsters/infernal_warlock": "\u5730\u72f1\u672f\u58eb",
  1704. "/monsters/jackalope": "\u9e7f\u89d2\u5154",
  1705. "/monsters/rat": "\u6770\u745e",
  1706. "/monsters/juggler": "\u6742\u800d\u8005",
  1707. "/monsters/jungle_sprite": "\u4e1b\u6797\u7cbe\u7075",
  1708. "/monsters/luna_empress": "\u6708\u795e\u4e4b\u8776",
  1709. "/monsters/magician": "\u9b54\u672f\u5e08",
  1710. "/monsters/magnetic_golem": "\u78c1\u529b\u9b54\u50cf",
  1711. "/monsters/manticore": "\u72ee\u874e\u517d",
  1712. "/monsters/marine_huntress": "\u6d77\u6d0b\u730e\u624b",
  1713. "/monsters/myconid": "\u8611\u83c7\u4eba",
  1714. "/monsters/nom_nom": "\u54ac\u54ac\u9c7c",
  1715. "/monsters/novice_sorcerer": "\u65b0\u624b\u5deb\u5e08",
  1716. "/monsters/panda": "\u718a\u732b",
  1717. "/monsters/polar_bear": "\u5317\u6781\u718a",
  1718. "/monsters/porcupine": "\u8c6a\u732a",
  1719. "/monsters/rabid_rabbit": "\u75af\u9b54\u5154",
  1720. "/monsters/red_panda": "\u5c0f\u718a\u732b",
  1721. "/monsters/alligator": "\u590f\u6d1b\u514b",
  1722. "/monsters/gobo_shooty": "\u54bb\u54bb",
  1723. "/monsters/skunk": "\u81ed\u9f2c",
  1724. "/monsters/gobo_slashy": "\u780d\u780d",
  1725. "/monsters/slimy": "\u53f2\u83b1\u59c6",
  1726. "/monsters/gobo_smashy": "\u9524\u9524",
  1727. "/monsters/soul_hunter": "\u7075\u9b42\u730e\u624b",
  1728. "/monsters/squawker": "\u9e66\u9e49",
  1729. "/monsters/gobo_stabby": "\u523a\u523a",
  1730. "/monsters/stalactite_golem": "\u949f\u4e73\u77f3\u9b54\u50cf",
  1731. "/monsters/swampy": "\u6cbc\u6cfd\u866b",
  1732. "/monsters/the_kraken": "\u514b\u62c9\u80af",
  1733. "/monsters/the_watcher": "\u89c2\u5bdf\u8005",
  1734. "/monsters/snake": "\u86c7",
  1735. "/monsters/tidal_conjuror": "\u6f6e\u6c50\u53ec\u5524\u5e08",
  1736. "/monsters/treant": "\u6811\u4eba",
  1737. "/monsters/turtle": "\u5fcd\u8005\u9f9f",
  1738. "/monsters/vampire": "\u5438\u8840\u9b3c",
  1739. "/monsters/veyes": "\u590d\u773c",
  1740. "/monsters/werewolf": "\u72fc\u4eba",
  1741. "/monsters/zombie": "\u50f5\u5c38",
  1742. "/monsters/zombie_bear": "\u50f5\u5c38\u718a",
  1743.  
  1744. // abilityNames
  1745. "/abilities/poke": "\u7834\u80c6\u4e4b\u523a",
  1746. "/abilities/impale": "\u900f\u9aa8\u4e4b\u523a",
  1747. "/abilities/puncture": "\u7834\u7532\u4e4b\u523a",
  1748. "/abilities/penetrating_strike": "\u8d2f\u5fc3\u4e4b\u523a",
  1749. "/abilities/scratch": "\u722a\u5f71\u65a9",
  1750. "/abilities/cleave": "\u5206\u88c2\u65a9",
  1751. "/abilities/maim": "\u8840\u5203\u65a9",
  1752. "/abilities/crippling_slash": "\u81f4\u6b8b\u65a9",
  1753. "/abilities/smack": "\u91cd\u78be",
  1754. "/abilities/sweep": "\u91cd\u626b",
  1755. "/abilities/stunning_blow": "\u91cd\u9524",
  1756. "/abilities/fracturing_impact": "\u788e\u88c2\u51b2\u51fb",
  1757. "/abilities/shield_bash": "\u76fe\u51fb",
  1758. "/abilities/quick_shot": "\u5feb\u901f\u5c04\u51fb",
  1759. "/abilities/aqua_arrow": "\u6d41\u6c34\u7bad",
  1760. "/abilities/flame_arrow": "\u70c8\u7130\u7bad",
  1761. "/abilities/rain_of_arrows": "\u7bad\u96e8",
  1762. "/abilities/silencing_shot": "\u6c89\u9ed8\u4e4b\u7bad",
  1763. "/abilities/steady_shot": "\u7a33\u5b9a\u5c04\u51fb",
  1764. "/abilities/pestilent_shot": "\u75ab\u75c5\u5c04\u51fb",
  1765. "/abilities/penetrating_shot": "\u8d2f\u7a7f\u5c04\u51fb",
  1766. "/abilities/water_strike": "\u6d41\u6c34\u51b2\u51fb",
  1767. "/abilities/ice_spear": "\u51b0\u67aa\u672f",
  1768. "/abilities/frost_surge": "\u51b0\u971c\u7206\u88c2",
  1769. "/abilities/mana_spring": "\u6cd5\u529b\u55b7\u6cc9",
  1770. "/abilities/entangle": "\u7f20\u7ed5",
  1771. "/abilities/toxic_pollen": "\u5267\u6bd2\u7c89\u5c18",
  1772. "/abilities/natures_veil": "\u81ea\u7136\u83cc\u5e55",
  1773. "/abilities/life_drain": "\u751f\u547d\u5438\u53d6",
  1774. "/abilities/fireball": "\u706b\u7403",
  1775. "/abilities/flame_blast": "\u7194\u5ca9\u7206\u88c2",
  1776. "/abilities/firestorm": "\u706b\u7130\u98ce\u66b4",
  1777. "/abilities/smoke_burst": "\u70df\u7206\u706d\u5f71",
  1778. "/abilities/minor_heal": "\u521d\u7ea7\u81ea\u6108\u672f",
  1779. "/abilities/heal": "\u81ea\u6108\u672f",
  1780. "/abilities/quick_aid": "\u5feb\u901f\u6cbb\u7597\u672f",
  1781. "/abilities/rejuvenate": "\u7fa4\u4f53\u6cbb\u7597\u672f",
  1782. "/abilities/taunt": "\u5632\u8bbd",
  1783. "/abilities/provoke": "\u6311\u8845",
  1784. "/abilities/toughness": "\u575a\u97e7",
  1785. "/abilities/elusiveness": "\u95ea\u907f",
  1786. "/abilities/precision": "\u7cbe\u786e",
  1787. "/abilities/berserk": "\u72c2\u66b4",
  1788. "/abilities/frenzy": "\u72c2\u901f",
  1789. "/abilities/elemental_affinity": "\u5143\u7d20\u589e\u5e45",
  1790. "/abilities/spike_shell": "\u5c16\u523a\u9632\u62a4",
  1791. "/abilities/arcane_reflection": "\u5965\u672f\u53cd\u5c04",
  1792. "/abilities/vampirism": "\u5438\u8840",
  1793. "/abilities/revive": "\u590d\u6d3b",
  1794. "/abilities/insanity": "\u75af\u72c2",
  1795. "/abilities/invincible": "\u65e0\u654c",
  1796. "/abilities/fierce_aura": "\u7269\u7406\u5149\u73af",
  1797. "/abilities/aqua_aura": "\u6d41\u6c34\u5149\u73af",
  1798. "/abilities/sylvan_aura": "\u81ea\u7136\u5149\u73af",
  1799. "/abilities/flame_aura": "\u706b\u7130\u5149\u73af",
  1800. "/abilities/speed_aura": "\u901f\u5ea6\u5149\u73af",
  1801. "/abilities/critical_aura": "\u66b4\u51fb\u5149\u73af",
  1802. "/abilities/promote": "\u664b\u5347",
  1803. };
  1804.  
  1805. function inverseKV(obj) {
  1806. const retobj = {};
  1807. for (const key in obj) {
  1808. retobj[obj[key]] = key;
  1809. }
  1810. return retobj;
  1811. }
  1812.  
  1813. const ZHToItemHridMap = inverseKV(ZHitemNames);
  1814. const ZHToActionHridMap = inverseKV(ZHActionNames);
  1815. const ZHToOthersMap = inverseKV(ZHOthersDic);
  1816.  
  1817. function getItemEnNameFromZhName(zhName) {
  1818. const itemHrid = ZHToItemHridMap[zhName];
  1819. if (!itemHrid) {
  1820. console.log("Can not find EN name for item " + zhName);
  1821. return "";
  1822. }
  1823. const enName = initData_itemDetailMap[itemHrid]?.name;
  1824. if (!enName) {
  1825. console.log("Can not find EN name for itemHrid " + itemHrid);
  1826. return "";
  1827. }
  1828. return enName;
  1829. }
  1830.  
  1831. function getActionEnNameFromZhName(zhName) {
  1832. const actionHrid = ZHToActionHridMap[zhName];
  1833. if (!actionHrid) {
  1834. console.log("Can not find EN name for action " + zhName);
  1835. return "";
  1836. }
  1837. const enName = initData_actionDetailMap[actionHrid]?.name;
  1838. if (!enName) {
  1839. console.log("Can not find EN name for actionHrid " + actionHrid);
  1840. return "";
  1841. }
  1842. return enName;
  1843. }
  1844.  
  1845. function getOthersFromZhName(zhName) {
  1846. const key = ZHToOthersMap[zhName];
  1847. if (!key) {
  1848. // console.log("Can not find EN key for " + zhName);
  1849. return "";
  1850. }
  1851. return key;
  1852. }
  1853.  
  1854. const itemEnNameToHridMap = {};
  1855.  
  1856. const MARKET_JSON_LOCAL_BACKUP = `{"marketData":{"/items/abyssal_essence":{"0":{"a":310,"b":300}},"/items/acrobatic_hood":{"0":{"a":80000000,"b":74000000},"1":{"a":-1,"b":5200000},"2":{"a":-1,"b":4400000},"3":{"a":-1,"b":12000000},"5":{"a":82000000,"b":74000000},"6":{"a":88000000,"b":6000000},"7":{"a":94000000,"b":92000000},"8":{"a":130000000,"b":115000000},"9":{"a":-1,"b":140000000},"10":{"a":300000000,"b":290000000},"11":{"a":-1,"b":330000000},"12":{"a":-1,"b":920000000},"13":{"a":-1,"b":78000000}},"/items/acrobats_ribbon":{"0":{"a":7600000,"b":7400000}},"/items/alchemists_bottoms":{"0":{"a":-1,"b":56000000},"5":{"a":185000000,"b":170000000},"6":{"a":3500000000,"b":-1},"7":{"a":205000000,"b":190000000},"8":{"a":235000000,"b":-1},"10":{"a":460000000,"b":250000000}},"/items/alchemists_top":{"0":{"a":-1,"b":92000000},"5":{"a":-1,"b":145000000},"6":{"a":-1,"b":5000000},"7":{"a":185000000,"b":-1},"8":{"a":235000000,"b":-1},"10":{"a":420000000,"b":250000000}},"/items/alchemy_essence":{"0":{"a":270,"b":265}},"/items/alchemy_tea":{"0":{"a":620,"b":600}},"/items/amber":{"0":{"a":22000,"b":21500}},"/items/amethyst":{"0":{"a":35000,"b":34000}},"/items/anchorbound_plate_body":{"0":{"a":98000000,"b":90000000},"1":{"a":-1,"b":74000000},"2":{"a":-1,"b":74000000},"3":{"a":-1,"b":74000000},"4":{"a":-1,"b":74000000},"5":{"a":105000000,"b":98000000},"6":{"a":-1,"b":78000000},"7":{"a":130000000,"b":120000000},"8":{"a":-1,"b":155000000},"9":{"a":-1,"b":120000000},"10":{"a":480000000,"b":340000000},"12":{"a":-1,"b":800000000}},"/items/anchorbound_plate_legs":{"0":{"a":78000000,"b":72000000},"1":{"a":-1,"b":66000000},"2":{"a":-1,"b":66000000},"3":{"a":-1,"b":66000000},"4":{"a":-1,"b":66000000},"5":{"a":82000000,"b":72000000},"6":{"a":100000000,"b":70000000},"7":{"a":110000000,"b":76000000},"8":{"a":-1,"b":135000000},"9":{"a":-1,"b":105000000},"10":{"a":370000000,"b":280000000},"12":{"a":-1,"b":700000000}},"/items/apple":{"0":{"a":12,"b":11}},"/items/apple_gummy":{"0":{"a":11,"b":10}},"/items/apple_yogurt":{"0":{"a":400,"b":350}},"/items/aqua_arrow":{"0":{"a":27500,"b":27000}},"/items/aqua_aura":{"0":{"a":1250000,"b":1200000}},"/items/aqua_essence":{"0":{"a":27,"b":23}},"/items/arabica_coffee_bean":{"0":{"a":160,"b":150}},"/items/arcane_bow":{"0":{"a":680000,"b":620000},"5":{"a":980000,"b":-1},"6":{"a":3000000,"b":-1}},"/items/arcane_crossbow":{"0":{"a":540000,"b":520000},"1":{"a":-1,"b":350000},"2":{"a":560000,"b":105000},"3":{"a":580000,"b":105000},"4":{"a":620000,"b":110000},"5":{"a":680000,"b":400000},"6":{"a":2800000,"b":-1},"7":{"a":9600000,"b":-1},"8":{"a":25000000,"b":-1}},"/items/arcane_fire_staff":{"0":{"a":560000,"b":540000},"1":{"a":580000,"b":105000},"2":{"a":640000,"b":105000},"3":{"a":660000,"b":105000},"4":{"a":840000,"b":-1},"5":{"a":940000,"b":600000},"7":{"a":15000000,"b":-1},"8":{"a":25000000,"b":-1},"10":{"a":58000000,"b":1050000}},"/items/arcane_log":{"0":{"a":300,"b":295}},"/items/arcane_lumber":{"0":{"a":1800,"b":1750}},"/items/arcane_nature_staff":{"0":{"a":520000,"b":500000},"1":{"a":600000,"b":100000},"2":{"a":640000,"b":100000},"3":{"a":780000,"b":105000},"5":{"a":1250000,"b":900000},"7":{"a":8400000,"b":-1}},"/items/arcane_reflection":{"0":{"a":40000,"b":39000}},"/items/arcane_shield":{"0":{"a":330000,"b":320000},"1":{"a":350000,"b":100000},"2":{"a":-1,"b":100000},"3":{"a":680000,"b":100000},"4":{"a":680000,"b":100000},"5":{"a":620000,"b":330000},"6":{"a":2450000,"b":-1},"8":{"a":7000000,"b":-1}},"/items/arcane_water_staff":{"0":{"a":540000,"b":500000},"2":{"a":620000,"b":105000},"3":{"a":580000,"b":105000},"4":{"a":660000,"b":-1},"5":{"a":860000,"b":310000},"8":{"a":10000000,"b":-1},"10":{"a":-1,"b":4000000}},"/items/artisan_tea":{"0":{"a":1700,"b":1650}},"/items/attack_coffee":{"0":{"a":600,"b":580}},"/items/azure_alembic":{"0":{"a":30000,"b":29000},"1":{"a":320000,"b":-1},"2":{"a":440000,"b":-1},"3":{"a":390000,"b":-1},"5":{"a":400000,"b":-1}},"/items/azure_boots":{"0":{"a":22000,"b":19500},"4":{"a":125000,"b":-1}},"/items/azure_brush":{"0":{"a":26000,"b":20500},"1":{"a":34000,"b":-1},"2":{"a":68000,"b":-1},"4":{"a":3000000,"b":-1},"5":{"a":100000,"b":40000},"6":{"a":125000,"b":-1}},"/items/azure_buckler":{"0":{"a":28000,"b":23000},"2":{"a":880000,"b":-1},"3":{"a":200000,"b":-1},"4":{"a":240000,"b":-1},"5":{"a":295000,"b":-1},"6":{"a":440000,"b":-1}},"/items/azure_bulwark":{"0":{"a":26500,"b":21500},"2":{"a":31000,"b":-1},"5":{"a":7000000,"b":-1}},"/items/azure_cheese":{"0":{"a":660,"b":640}},"/items/azure_chisel":{"0":{"a":27500,"b":22500},"1":{"a":10000000,"b":-1},"3":{"a":2000000,"b":-1},"4":{"a":235000,"b":-1},"5":{"a":-1,"b":2050},"6":{"a":600000,"b":2050}},"/items/azure_enhancer":{"0":{"a":28500,"b":24500},"1":{"a":2200000,"b":-1},"3":{"a":62000,"b":-1},"4":{"a":660000,"b":-1},"5":{"a":310000,"b":-1},"6":{"a":350000,"b":-1},"8":{"a":400000,"b":-1},"9":{"a":1300000,"b":-1},"10":{"a":2500000,"b":-1}},"/items/azure_gauntlets":{"0":{"a":22500,"b":13000},"1":{"a":5000000,"b":-1},"5":{"a":200000,"b":-1},"8":{"a":700000,"b":-1},"10":{"a":1200000,"b":-1}},"/items/azure_hammer":{"0":{"a":26500,"b":24000},"1":{"a":10000000,"b":-1}},"/items/azure_hatchet":{"0":{"a":27000,"b":22500},"1":{"a":10000000,"b":-1},"5":{"a":700000,"b":-1},"6":{"a":1400000,"b":-1}},"/items/azure_helmet":{"0":{"a":27000,"b":22500},"1":{"a":13500000,"b":-1},"2":{"a":100000,"b":-1},"3":{"a":135000,"b":-1},"5":{"a":200000,"b":-1}},"/items/azure_mace":{"0":{"a":40000,"b":33000},"1":{"a":5000000,"b":-1},"5":{"a":9800000,"b":-1}},"/items/azure_milk":{"0":{"a":115,"b":105}},"/items/azure_needle":{"0":{"a":29000,"b":21500},"1":{"a":10000000,"b":2100},"3":{"a":-1,"b":2050}},"/items/azure_plate_body":{"0":{"a":37000,"b":30000},"1":{"a":40000,"b":-1},"2":{"a":64000,"b":-1}},"/items/azure_plate_legs":{"0":{"a":33000,"b":32000},"1":{"a":98000,"b":-1},"2":{"a":-1,"b":2050},"3":{"a":120000,"b":2050},"5":{"a":220000,"b":2050}},"/items/azure_pot":{"0":{"a":32000,"b":29500},"2":{"a":86000,"b":-1}},"/items/azure_shears":{"0":{"a":38000,"b":25500},"1":{"a":78000,"b":-1},"4":{"a":175000000,"b":-1}},"/items/azure_spatula":{"0":{"a":29500,"b":26000},"3":{"a":175000,"b":-1}},"/items/azure_spear":{"0":{"a":37000,"b":34000},"1":{"a":76000,"b":-1},"3":{"a":130000,"b":-1}},"/items/azure_sword":{"0":{"a":43000,"b":37000},"1":{"a":10000000,"b":-1},"2":{"a":4800000,"b":-1},"3":{"a":320000,"b":-1}},"/items/bag_of_10_cowbells":{"0":{"a":310000,"b":300000}},"/items/bamboo_boots":{"0":{"a":10500,"b":9800},"1":{"a":20000,"b":-1},"3":{"a":100000,"b":-1},"4":{"a":125000,"b":-1},"5":{"a":130000,"b":-1},"7":{"a":450000,"b":-1}},"/items/bamboo_branch":{"0":{"a":17,"b":16}},"/items/bamboo_fabric":{"0":{"a":165,"b":160}},"/items/bamboo_gloves":{"0":{"a":12000,"b":9800},"1":{"a":340000,"b":-1},"2":{"a":145000,"b":-1},"3":{"a":140000,"b":-1},"5":{"a":125000,"b":-1},"6":{"a":130000,"b":-1},"7":{"a":280000,"b":-1}},"/items/bamboo_hat":{"0":{"a":19000,"b":14500},"1":{"a":20000,"b":-1},"2":{"a":45000,"b":-1},"3":{"a":74000,"b":-1},"4":{"a":105000,"b":-1},"5":{"a":135000,"b":-1}},"/items/bamboo_robe_bottoms":{"0":{"a":26500,"b":23500},"1":{"a":32000,"b":-1},"2":{"a":100000,"b":-1},"3":{"a":120000,"b":-1},"4":{"a":160000,"b":-1},"5":{"a":185000,"b":-1},"6":{"a":660000,"b":-1}},"/items/bamboo_robe_top":{"0":{"a":35000,"b":27000},"1":{"a":41000,"b":-1},"2":{"a":42000,"b":-1},"3":{"a":72000,"b":-1},"4":{"a":110000,"b":-1},"5":{"a":130000,"b":-1},"6":{"a":190000,"b":-1},"7":{"a":240000,"b":-1}},"/items/bear_essence":{"0":{"a":120,"b":115}},"/items/beast_boots":{"0":{"a":42000,"b":40000},"1":{"a":43000,"b":-1},"2":{"a":74000,"b":-1},"3":{"a":88000,"b":-1},"4":{"a":150000,"b":-1},"5":{"a":175000,"b":-1}},"/items/beast_bracers":{"0":{"a":66000,"b":62000},"1":{"a":100000,"b":-1},"2":{"a":105000,"b":-1},"3":{"a":100000,"b":-1},"4":{"a":185000,"b":-1},"5":{"a":195000,"b":-1}},"/items/beast_chaps":{"0":{"a":125000,"b":90000},"1":{"a":140000,"b":-1},"2":{"a":150000,"b":-1},"3":{"a":160000,"b":-1},"4":{"a":195000,"b":-1},"5":{"a":265000,"b":200000},"6":{"a":1050000,"b":-1},"8":{"a":5000000,"b":-1}},"/items/beast_hide":{"0":{"a":21,"b":20}},"/items/beast_hood":{"0":{"a":88000,"b":82000},"2":{"a":96000,"b":-1},"3":{"a":98000,"b":-1},"5":{"a":185000,"b":-1},"7":{"a":-1,"b":275000}},"/items/beast_leather":{"0":{"a":900,"b":880}},"/items/beast_tunic":{"0":{"a":115000,"b":110000},"1":{"a":120000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":140000,"b":-1},"4":{"a":185000,"b":-1},"5":{"a":290000,"b":105000}},"/items/berserk":{"0":{"a":160000,"b":155000}},"/items/birch_bow":{"0":{"a":21500,"b":18000},"1":{"a":10000000,"b":-1},"2":{"a":10000000,"b":-1},"8":{"a":1200000,"b":-1}},"/items/birch_crossbow":{"0":{"a":17000,"b":14500},"1":{"a":10000000,"b":-1},"2":{"a":1000000,"b":-1},"3":{"a":640000,"b":-1},"5":{"a":230000,"b":-1}},"/items/birch_fire_staff":{"0":{"a":17500,"b":13500},"1":{"a":40000,"b":-1},"2":{"a":10000000,"b":720},"3":{"a":62000,"b":-1},"5":{"a":170000,"b":-1},"10":{"a":-1,"b":860000}},"/items/birch_log":{"0":{"a":60,"b":54}},"/items/birch_lumber":{"0":{"a":420,"b":410}},"/items/birch_nature_staff":{"0":{"a":16000,"b":15000},"1":{"a":9800000,"b":-1}},"/items/birch_shield":{"0":{"a":10000,"b":4500},"1":{"a":15000000,"b":-1}},"/items/birch_water_staff":{"0":{"a":17500,"b":15000},"1":{"a":255000,"b":-1},"2":{"a":700000,"b":-1},"4":{"a":500000,"b":-1},"5":{"a":150000,"b":-1}},"/items/bishops_codex":{"0":{"a":86000000,"b":82000000},"1":{"a":-1,"b":78000000},"2":{"a":-1,"b":78000000},"3":{"a":-1,"b":76000000},"4":{"a":-1,"b":78000000},"5":{"a":90000000,"b":86000000},"6":{"a":96000000,"b":86000000},"7":{"a":110000000,"b":105000000},"8":{"a":-1,"b":140000000},"9":{"a":-1,"b":180000000},"10":{"a":360000000,"b":340000000},"11":{"a":-1,"b":400000000},"12":{"a":1350000000,"b":700000000},"14":{"a":5200000000,"b":-1}},"/items/bishops_scroll":{"0":{"a":8200000,"b":8000000}},"/items/black_bear_fluff":{"0":{"a":80000,"b":78000}},"/items/black_bear_shoes":{"0":{"a":440000,"b":380000},"1":{"a":450000,"b":-1},"2":{"a":490000,"b":-1},"3":{"a":560000,"b":-1},"5":{"a":740000,"b":540000},"6":{"a":1100000,"b":-1},"7":{"a":2000000,"b":1000000},"8":{"a":4000000,"b":-1},"9":{"a":7800000,"b":760000},"10":{"a":11500000,"b":8600000},"11":{"a":29000000,"b":14000000},"12":{"a":46000000,"b":-1},"14":{"a":170000000,"b":-1}},"/items/black_tea_leaf":{"0":{"a":18,"b":17}},"/items/blackberry":{"0":{"a":62,"b":56}},"/items/blackberry_cake":{"0":{"a":540,"b":500}},"/items/blackberry_donut":{"0":{"a":460,"b":400}},"/items/blazing_trident":{"0":{"a":295000000,"b":275000000},"1":{"a":-1,"b":110000000},"5":{"a":300000000,"b":290000000},"6":{"a":-1,"b":300000000},"7":{"a":340000000,"b":330000000},"8":{"a":400000000,"b":260000000},"9":{"a":-1,"b":400000000},"10":{"a":680000000,"b":660000000},"12":{"a":1950000000,"b":1700000000},"14":{"a":6800000000,"b":-1},"15":{"a":13000000000,"b":-1},"19":{"a":-1,"b":5000000}},"/items/blessed_tea":{"0":{"a":1700,"b":1650}},"/items/blooming_trident":{"0":{"a":-1,"b":330000000},"1":{"a":-1,"b":13000000},"3":{"a":-1,"b":17000000},"4":{"a":-1,"b":40000000},"5":{"a":350000000,"b":330000000},"6":{"a":-1,"b":310000000},"7":{"a":390000000,"b":380000000},"8":{"a":440000000,"b":430000000},"10":{"a":740000000,"b":700000000},"12":{"a":2000000000,"b":1350000000},"14":{"a":-1,"b":70000000},"20":{"a":-1,"b":10000000}},"/items/blue_key_fragment":{"0":{"a":660000,"b":640000}},"/items/blueberry":{"0":{"a":40,"b":36}},"/items/blueberry_cake":{"0":{"a":410,"b":390}},"/items/blueberry_donut":{"0":{"a":430,"b":400}},"/items/branch_of_insight":{"0":{"a":14500000,"b":14000000}},"/items/brewers_bottoms":{"0":{"a":245000000,"b":80000000},"5":{"a":175000000,"b":150000000},"6":{"a":180000000,"b":17500000},"7":{"a":195000000,"b":180000000},"8":{"a":235000000,"b":-1},"10":{"a":390000000,"b":-1}},"/items/brewers_top":{"0":{"a":-1,"b":50000000},"5":{"a":-1,"b":145000000},"6":{"a":160000000,"b":-1},"7":{"a":175000000,"b":160000000},"8":{"a":205000000,"b":50000000},"9":{"a":295000000,"b":-1},"10":{"a":370000000,"b":300000000}},"/items/brewing_essence":{"0":{"a":210,"b":205}},"/items/brewing_tea":{"0":{"a":490,"b":480}},"/items/brown_key_fragment":{"0":{"a":1050000,"b":1000000}},"/items/burble_alembic":{"0":{"a":66000,"b":58000},"1":{"a":9800000,"b":-1},"2":{"a":580000,"b":-1},"3":{"a":520000,"b":-1}},"/items/burble_boots":{"0":{"a":43000,"b":30000},"2":{"a":100000,"b":-1},"3":{"a":250000,"b":-1},"6":{"a":400000,"b":-1},"7":{"a":640000,"b":-1},"8":{"a":600000,"b":-1},"10":{"a":2000000,"b":-1}},"/items/burble_brush":{"0":{"a":64000,"b":56000},"1":{"a":100000,"b":-1},"2":{"a":160000,"b":-1},"3":{"a":280000,"b":-1},"4":{"a":430000,"b":-1},"5":{"a":2200000,"b":-1},"8":{"a":7000000,"b":-1}},"/items/burble_buckler":{"0":{"a":66000,"b":49000},"1":{"a":64000,"b":-1},"2":{"a":80000,"b":-1},"3":{"a":110000,"b":-1},"5":{"a":400000,"b":-1},"6":{"a":280000,"b":-1}},"/items/burble_bulwark":{"0":{"a":54000,"b":47000},"1":{"a":10000000,"b":-1},"3":{"a":155000,"b":-1}},"/items/burble_cheese":{"0":{"a":820,"b":800}},"/items/burble_chisel":{"0":{"a":62000,"b":47000},"1":{"a":115000,"b":-1},"3":{"a":10000000,"b":-1},"5":{"a":200000,"b":-1}},"/items/burble_enhancer":{"0":{"a":68000,"b":58000},"2":{"a":70000,"b":-1},"3":{"a":76000,"b":-1},"4":{"a":84000,"b":-1},"5":{"a":150000,"b":-1}},"/items/burble_gauntlets":{"0":{"a":47000,"b":28000},"1":{"a":60000,"b":-1},"2":{"a":680000,"b":-1},"3":{"a":310000,"b":-1},"5":{"a":145000,"b":-1},"6":{"a":390000,"b":-1}},"/items/burble_hammer":{"0":{"a":64000,"b":56000},"2":{"a":135000,"b":-1},"3":{"a":270000,"b":-1},"4":{"a":320000,"b":-1},"5":{"a":400000,"b":-1},"7":{"a":1000000,"b":-1}},"/items/burble_hatchet":{"0":{"a":62000,"b":56000},"1":{"a":120000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":74000000,"b":-1},"5":{"a":500000,"b":-1}},"/items/burble_helmet":{"0":{"a":54000,"b":48000},"2":{"a":54000,"b":-1},"3":{"a":110000,"b":-1},"4":{"a":200000,"b":-1},"5":{"a":520000,"b":-1},"6":{"a":600000,"b":-1},"7":{"a":500000,"b":-1},"10":{"a":1450000,"b":1000000}},"/items/burble_mace":{"0":{"a":72000,"b":68000},"1":{"a":105000,"b":-1},"5":{"a":430000,"b":58000},"7":{"a":12500000,"b":-1}},"/items/burble_milk":{"0":{"a":170,"b":165}},"/items/burble_needle":{"0":{"a":66000,"b":58000},"1":{"a":100000,"b":-1},"3":{"a":400000,"b":-1}},"/items/burble_plate_body":{"0":{"a":80000,"b":76000},"1":{"a":820000,"b":-1},"2":{"a":340000,"b":-1},"3":{"a":300000,"b":-1},"5":{"a":740000,"b":86000}},"/items/burble_plate_legs":{"0":{"a":70000,"b":60000},"1":{"a":78000,"b":-1},"2":{"a":110000,"b":-1},"3":{"a":290000,"b":-1},"6":{"a":940000,"b":-1}},"/items/burble_pot":{"0":{"a":68000,"b":58000},"1":{"a":100000,"b":-1},"2":{"a":130000,"b":-1},"5":{"a":520000,"b":100000}},"/items/burble_shears":{"0":{"a":66000,"b":56000},"1":{"a":150000,"b":-1},"2":{"a":245000,"b":-1},"3":{"a":340000,"b":90000},"5":{"a":450000,"b":-1}},"/items/burble_spatula":{"0":{"a":70000,"b":54000},"1":{"a":2500000,"b":-1},"5":{"a":150000,"b":-1},"6":{"a":-1,"b":260000}},"/items/burble_spear":{"0":{"a":80000,"b":70000},"4":{"a":440000,"b":-1},"5":{"a":190000,"b":-1},"9":{"a":7000000,"b":-1}},"/items/burble_sword":{"0":{"a":88000,"b":78000},"1":{"a":86000,"b":-1},"3":{"a":120000,"b":-1},"5":{"a":215000,"b":100000},"6":{"a":400000,"b":-1},"8":{"a":410000,"b":-1}},"/items/burble_tea_leaf":{"0":{"a":26,"b":24}},"/items/burning_key_fragment":{"0":{"a":1850000,"b":1800000}},"/items/butter_of_proficiency":{"0":{"a":11000000,"b":10500000}},"/items/catalyst_of_coinification":{"0":{"a":2950,"b":2900}},"/items/catalyst_of_decomposition":{"0":{"a":3300,"b":3200}},"/items/catalyst_of_transmutation":{"0":{"a":7200,"b":7000}},"/items/catalytic_tea":{"0":{"a":1700,"b":1650}},"/items/cedar_bow":{"0":{"a":52000,"b":50000},"1":{"a":105000,"b":-1},"2":{"a":190000,"b":-1},"4":{"a":400000,"b":-1},"8":{"a":2300000,"b":-1}},"/items/cedar_crossbow":{"0":{"a":39000,"b":36000},"2":{"a":10000000,"b":-1},"4":{"a":160000,"b":-1},"5":{"a":350000,"b":-1}},"/items/cedar_fire_staff":{"0":{"a":42000,"b":39000},"1":{"a":3000000,"b":-1},"4":{"a":280000,"b":-1},"5":{"a":125000,"b":-1},"8":{"a":1000000,"b":-1}},"/items/cedar_log":{"0":{"a":84,"b":82}},"/items/cedar_lumber":{"0":{"a":640,"b":620}},"/items/cedar_nature_staff":{"0":{"a":41000,"b":36000},"2":{"a":60000,"b":-1},"5":{"a":125000,"b":31000}},"/items/cedar_shield":{"0":{"a":26500,"b":13500},"2":{"a":190000,"b":-1},"3":{"a":82000,"b":-1},"4":{"a":9800000,"b":-1}},"/items/cedar_water_staff":{"0":{"a":41000,"b":38000},"1":{"a":100000000,"b":-1},"3":{"a":240000,"b":-1},"4":{"a":240000,"b":-1},"5":{"a":300000,"b":-1},"8":{"a":6800000,"b":-1}},"/items/celestial_alembic":{"0":{"a":-1,"b":150000000},"5":{"a":-1,"b":150000000},"6":{"a":300000000,"b":98000000},"7":{"a":330000000,"b":310000000},"10":{"a":680000000,"b":300000000}},"/items/celestial_brush":{"0":{"a":400000000,"b":150000000},"2":{"a":-1,"b":100000000},"3":{"a":-1,"b":110000000},"5":{"a":275000000,"b":260000000},"6":{"a":290000000,"b":-1},"7":{"a":310000000,"b":-1},"10":{"a":620000000,"b":-1},"11":{"a":-1,"b":78000000},"20":{"a":-1,"b":7000000}},"/items/celestial_chisel":{"0":{"a":-1,"b":150000000},"2":{"a":-1,"b":14500000},"5":{"a":-1,"b":250000000},"6":{"a":-1,"b":32000000},"7":{"a":320000000,"b":275000000},"10":{"a":680000000,"b":580000000}},"/items/celestial_enhancer":{"5":{"a":-1,"b":200000000},"8":{"a":480000000,"b":6800000},"9":{"a":620000000,"b":125000000},"10":{"a":880000000,"b":780000000},"12":{"a":-1,"b":1900000000}},"/items/celestial_hammer":{"1":{"a":-1,"b":29500000},"2":{"a":-1,"b":29500000},"3":{"a":-1,"b":29500000},"4":{"a":-1,"b":29500000},"5":{"a":285000000,"b":220000000},"6":{"a":-1,"b":23000000},"7":{"a":320000000,"b":300000000},"10":{"a":-1,"b":580000000}},"/items/celestial_hatchet":{"0":{"a":-1,"b":150000000},"5":{"a":285000000,"b":74000000},"7":{"a":310000000,"b":90000000},"10":{"a":-1,"b":500000000}},"/items/celestial_needle":{"0":{"a":-1,"b":150000000},"1":{"a":-1,"b":6200000},"5":{"a":270000000,"b":220000000},"6":{"a":-1,"b":5000000},"7":{"a":310000000,"b":-1},"10":{"a":640000000,"b":500000000}},"/items/celestial_pot":{"0":{"a":-1,"b":150000000},"5":{"a":-1,"b":250000000},"6":{"a":290000000,"b":280000000},"7":{"a":310000000,"b":-1},"10":{"a":660000000,"b":400000000},"12":{"a":-1,"b":1500000000},"20":{"a":-1,"b":5000000}},"/items/celestial_shears":{"0":{"a":-1,"b":150000000},"3":{"a":-1,"b":120000000},"4":{"a":-1,"b":105000000},"5":{"a":285000000,"b":190000000},"6":{"a":290000000,"b":160000000},"7":{"a":300000000,"b":-1},"10":{"a":640000000,"b":600000000},"20":{"a":-1,"b":10500000}},"/items/celestial_spatula":{"0":{"a":-1,"b":150000000},"5":{"a":285000000,"b":240000000},"6":{"a":-1,"b":10000000},"7":{"a":310000000,"b":-1},"10":{"a":-1,"b":600000000},"20":{"a":-1,"b":6000000}},"/items/centaur_boots":{"0":{"a":1700000,"b":900000},"1":{"a":3800000,"b":125000},"2":{"a":1600000,"b":98000},"3":{"a":-1,"b":80000},"4":{"a":2700000,"b":-1},"5":{"a":1250000,"b":1050000},"6":{"a":1700000,"b":1250000},"7":{"a":2400000,"b":2150000},"8":{"a":4600000,"b":3100000},"9":{"a":11000000,"b":5200000},"10":{"a":13500000,"b":12500000},"11":{"a":-1,"b":20000000},"12":{"a":50000000,"b":45000000},"13":{"a":110000000,"b":80000000},"14":{"a":360000000,"b":100000000}},"/items/centaur_hoof":{"0":{"a":175000,"b":170000}},"/items/channeling_coffee":{"0":{"a":1900,"b":1850}},"/items/chaotic_chain":{"0":{"a":11500000,"b":11000000}},"/items/chaotic_flail":{"0":{"a":245000000,"b":220000000},"3":{"a":-1,"b":54000000},"4":{"a":-1,"b":58000000},"5":{"a":255000000,"b":220000000},"6":{"a":-1,"b":42000000},"7":{"a":280000000,"b":250000000},"8":{"a":-1,"b":300000000},"10":{"a":580000000,"b":540000000},"12":{"a":1600000000,"b":1250000000}},"/items/cheese":{"0":{"a":290,"b":285}},"/items/cheese_alembic":{"0":{"a":4900,"b":4100},"1":{"a":290000,"b":-1},"2":{"a":220000,"b":-1},"5":{"a":400000,"b":-1},"6":{"a":4800000,"b":-1},"20":{"a":-1,"b":115}},"/items/cheese_boots":{"0":{"a":2450,"b":2350},"1":{"a":10000000000,"b":-1},"4":{"a":-1,"b":8000},"5":{"a":680000,"b":-1},"6":{"a":1750000,"b":8200},"8":{"a":500000,"b":-1},"10":{"a":-1,"b":800000},"11":{"a":-1,"b":1600000},"12":{"a":3600000,"b":3000000},"13":{"a":7400000,"b":6000000},"14":{"a":14000000,"b":10500000},"15":{"a":-1,"b":17500000}},"/items/cheese_brush":{"0":{"a":3400,"b":2900},"1":{"a":3500,"b":-1},"2":{"a":9800,"b":-1},"3":{"a":12000,"b":-1},"4":{"a":135000,"b":-1},"5":{"a":100000,"b":-1},"7":{"a":1000000,"b":-1},"8":{"a":1500000,"b":-1},"10":{"a":1900000,"b":280000},"20":{"a":-1,"b":115}},"/items/cheese_buckler":{"0":{"a":3500,"b":2550},"4":{"a":30000,"b":-1},"5":{"a":43000,"b":-1},"7":{"a":5200000,"b":-1},"10":{"a":12000000,"b":-1}},"/items/cheese_bulwark":{"0":{"a":6400,"b":3500},"1":{"a":8000,"b":-1},"2":{"a":10000000,"b":-1},"3":{"a":15000,"b":-1},"5":{"a":2400000,"b":-1},"6":{"a":600000,"b":-1}},"/items/cheese_chisel":{"0":{"a":4300,"b":3600},"1":{"a":10000000,"b":-1},"2":{"a":8200000,"b":-1}},"/items/cheese_enhancer":{"0":{"a":4800,"b":3600},"2":{"a":10000000,"b":-1},"4":{"a":98000,"b":-1},"5":{"a":-1,"b":35000},"8":{"a":500000,"b":-1},"10":{"a":1000000,"b":-1},"11":{"a":4000000,"b":-1}},"/items/cheese_gauntlets":{"0":{"a":2400,"b":2350},"1":{"a":225000,"b":-1},"2":{"a":9600000,"b":-1},"3":{"a":9600000,"b":-1},"4":{"a":500000,"b":-1},"6":{"a":4000000,"b":8600},"9":{"a":470000,"b":-1},"10":{"a":980000,"b":-1},"12":{"a":3600000,"b":2700000},"13":{"a":-1,"b":4900000},"14":{"a":-1,"b":10500000},"15":{"a":-1,"b":15000000}},"/items/cheese_hammer":{"0":{"a":3700,"b":3100},"1":{"a":12500000,"b":-1},"2":{"a":3500000,"b":-1}},"/items/cheese_hatchet":{"0":{"a":4100,"b":3400},"1":{"a":10000000,"b":-1}},"/items/cheese_helmet":{"0":{"a":2950,"b":2450},"4":{"a":9800000,"b":80}},"/items/cheese_mace":{"0":{"a":4300,"b":4000},"1":{"a":10000000,"b":1350},"5":{"a":1900000,"b":-1},"8":{"a":8800000,"b":-1}},"/items/cheese_needle":{"0":{"a":4300,"b":3500},"1":{"a":4200000,"b":-1},"2":{"a":10000000,"b":-1},"3":{"a":10000000,"b":-1},"10":{"a":28000000,"b":-1}},"/items/cheese_plate_body":{"0":{"a":5600,"b":5400},"1":{"a":11000,"b":360},"2":{"a":10500,"b":250},"4":{"a":250000,"b":-1},"5":{"a":245000,"b":-1}},"/items/cheese_plate_legs":{"0":{"a":4300,"b":4200},"2":{"a":92000000,"b":-1},"3":{"a":125000,"b":-1},"4":{"a":115000,"b":-1},"5":{"a":145000,"b":-1},"8":{"a":300000,"b":-1}},"/items/cheese_pot":{"0":{"a":4900,"b":3800},"1":{"a":10000000,"b":-1},"5":{"a":400000,"b":-1},"8":{"a":960000,"b":-1}},"/items/cheese_shears":{"0":{"a":3500,"b":2800},"1":{"a":8000000,"b":-1},"6":{"a":8800000,"b":-1},"7":{"a":14000000,"b":-1},"15":{"a":-1,"b":115},"20":{"a":-1,"b":3300}},"/items/cheese_spatula":{"0":{"a":4300,"b":4000}},"/items/cheese_spear":{"0":{"a":4300,"b":3900},"1":{"a":430000,"b":-1},"2":{"a":980000,"b":-1},"5":{"a":4400000,"b":-1},"6":{"a":17500000,"b":-1}},"/items/cheese_sword":{"0":{"a":5200,"b":4900},"1":{"a":76000,"b":2250},"2":{"a":880000000,"b":460},"3":{"a":14000000,"b":450},"4":{"a":-1,"b":1050},"5":{"a":4900000,"b":-1},"6":{"a":-1,"b":4300},"8":{"a":-1,"b":295},"10":{"a":-1,"b":240000}},"/items/cheesemakers_bottoms":{"0":{"a":-1,"b":84000000},"5":{"a":185000000,"b":155000000},"6":{"a":190000000,"b":-1},"7":{"a":205000000,"b":-1},"8":{"a":245000000,"b":-1},"10":{"a":420000000,"b":310000000}},"/items/cheesemakers_top":{"0":{"a":250000000,"b":80000000},"5":{"a":160000000,"b":130000000},"6":{"a":-1,"b":130000000},"7":{"a":180000000,"b":170000000},"8":{"a":225000000,"b":-1},"10":{"a":420000000,"b":320000000}},"/items/cheesesmithing_essence":{"0":{"a":245,"b":240}},"/items/cheesesmithing_tea":{"0":{"a":560,"b":540}},"/items/chefs_bottoms":{"1":{"a":-1,"b":29500000},"5":{"a":170000000,"b":160000000},"6":{"a":180000000,"b":100000000},"7":{"a":195000000,"b":56000000},"8":{"a":235000000,"b":205000000},"10":{"a":480000000,"b":-1},"20":{"a":-1,"b":3500000}},"/items/chefs_top":{"0":{"a":250000000,"b":40000000},"5":{"a":155000000,"b":125000000},"6":{"a":160000000,"b":145000000},"7":{"a":165000000,"b":155000000},"8":{"a":215000000,"b":170000000},"10":{"a":460000000,"b":300000000}},"/items/chimerical_chest_key":{"0":{"a":2900000,"b":2850000}},"/items/chimerical_entry_key":{"0":{"a":295000,"b":290000}},"/items/chimerical_essence":{"0":{"a":600,"b":580}},"/items/chrono_gloves":{"0":{"a":9800000,"b":9600000},"1":{"a":10000000,"b":-1},"3":{"a":10000000,"b":2850000},"4":{"a":-1,"b":6000000},"5":{"a":11000000,"b":10000000},"6":{"a":12500000,"b":10500000},"7":{"a":16500000,"b":15000000},"8":{"a":40000000,"b":22000000},"9":{"a":-1,"b":31000000},"10":{"a":66000000,"b":62000000},"11":{"a":115000000,"b":-1},"12":{"a":235000000,"b":220000000},"14":{"a":-1,"b":940000000},"15":{"a":1900000000,"b":-1}},"/items/chrono_sphere":{"0":{"a":1050000,"b":1000000}},"/items/cleave":{"0":{"a":28500,"b":27000}},"/items/cocoon":{"0":{"a":225,"b":210}},"/items/collectors_boots":{"0":{"a":3800000,"b":3600000},"1":{"a":4100000,"b":410000},"2":{"a":4100000,"b":215000},"3":{"a":4500000,"b":390000},"5":{"a":4600000,"b":4100000},"6":{"a":6000000,"b":-1},"7":{"a":8400000,"b":7200000},"8":{"a":15000000,"b":9000000},"9":{"a":28000000,"b":13000000},"10":{"a":37000000,"b":35000000},"11":{"a":-1,"b":50000000},"12":{"a":145000000,"b":66000000},"13":{"a":-1,"b":125000000},"15":{"a":-1,"b":175000000},"18":{"a":-1,"b":350000000}},"/items/colossus_core":{"0":{"a":1100000,"b":1050000}},"/items/colossus_plate_body":{"0":{"a":-1,"b":7400000},"1":{"a":-1,"b":1750000},"2":{"a":-1,"b":1750000},"3":{"a":10500000,"b":1950000},"4":{"a":1050000000,"b":2150000},"5":{"a":11000000,"b":10000000},"6":{"a":15500000,"b":11500000},"7":{"a":19000000,"b":-1},"8":{"a":32000000,"b":17000000},"9":{"a":-1,"b":400000},"10":{"a":64000000,"b":40000000},"12":{"a":205000000,"b":-1}},"/items/colossus_plate_legs":{"0":{"a":8400000,"b":-1},"1":{"a":-1,"b":2050000},"2":{"a":-1,"b":2050000},"3":{"a":-1,"b":2000000},"4":{"a":-1,"b":1900000},"5":{"a":10000000,"b":9000000},"6":{"a":12000000,"b":-1},"7":{"a":18000000,"b":330000},"8":{"a":28000000,"b":330000},"9":{"a":-1,"b":320000},"10":{"a":50000000,"b":36000000}},"/items/cooking_essence":{"0":{"a":215,"b":210}},"/items/cooking_tea":{"0":{"a":490,"b":480}},"/items/corsair_crest":{"0":{"a":8800000,"b":8600000}},"/items/corsair_helmet":{"0":{"a":94000000,"b":88000000},"1":{"a":-1,"b":80000000},"2":{"a":-1,"b":80000000},"3":{"a":-1,"b":80000000},"4":{"a":-1,"b":88000000},"5":{"a":110000000,"b":86000000},"6":{"a":-1,"b":88000000},"7":{"a":120000000,"b":110000000},"8":{"a":155000000,"b":130000000},"9":{"a":-1,"b":160000000},"10":{"a":370000000,"b":340000000},"11":{"a":-1,"b":450000000},"12":{"a":1300000000,"b":1000000000}},"/items/cotton":{"0":{"a":45,"b":40}},"/items/cotton_boots":{"0":{"a":2500,"b":2450},"1":{"a":15000,"b":-1},"2":{"a":150000,"b":-1},"4":{"a":240000,"b":7600},"5":{"a":490000,"b":-1},"6":{"a":12500000,"b":-1},"10":{"a":4500000,"b":-1},"12":{"a":-1,"b":2400000},"13":{"a":7000000,"b":4800000},"14":{"a":16000000,"b":10000000},"15":{"a":26500000,"b":-1}},"/items/cotton_fabric":{"0":{"a":290,"b":285}},"/items/cotton_gloves":{"0":{"a":2450,"b":2400},"1":{"a":86000,"b":-1},"2":{"a":86000,"b":-1},"3":{"a":86000,"b":-1},"4":{"a":88000,"b":-1},"5":{"a":460000,"b":-1},"10":{"a":1100000,"b":340000},"12":{"a":-1,"b":2400000},"13":{"a":-1,"b":4900000}},"/items/cotton_hat":{"0":{"a":2550,"b":2350},"1":{"a":100000,"b":185},"2":{"a":-1,"b":420},"4":{"a":430000,"b":-1},"5":{"a":640000,"b":-1},"6":{"a":700000,"b":-1},"8":{"a":2350000,"b":-1}},"/items/cotton_robe_bottoms":{"0":{"a":4100,"b":2650}},"/items/cotton_robe_top":{"0":{"a":4100,"b":3100},"2":{"a":16000000,"b":-1},"3":{"a":9800000,"b":-1},"5":{"a":500000,"b":-1}},"/items/crab_pincer":{"0":{"a":8800,"b":8200}},"/items/crafters_bottoms":{"0":{"a":-1,"b":60000000},"5":{"a":185000000,"b":130000000},"6":{"a":195000000,"b":-1},"7":{"a":205000000,"b":-1},"8":{"a":245000000,"b":-1},"10":{"a":-1,"b":350000000}},"/items/crafters_top":{"0":{"a":-1,"b":16500000},"5":{"a":165000000,"b":145000000},"6":{"a":170000000,"b":4000000},"7":{"a":180000000,"b":170000000},"8":{"a":225000000,"b":-1},"10":{"a":-1,"b":350000000}},"/items/crafting_essence":{"0":{"a":255,"b":250}},"/items/crafting_tea":{"0":{"a":640,"b":600}},"/items/crimson_alembic":{"0":{"a":115000,"b":100000},"1":{"a":145000,"b":-1},"2":{"a":185000,"b":-1},"3":{"a":200000,"b":-1},"5":{"a":500000,"b":200000}},"/items/crimson_boots":{"0":{"a":52000,"b":44000},"1":{"a":98000,"b":-1},"2":{"a":160000,"b":-1},"5":{"a":840000,"b":-1},"6":{"a":4000000,"b":-1}},"/items/crimson_brush":{"0":{"a":88000,"b":84000},"2":{"a":135000,"b":-1},"3":{"a":175000,"b":-1},"4":{"a":255000,"b":-1},"5":{"a":450000,"b":150000},"6":{"a":1300000,"b":-1}},"/items/crimson_buckler":{"0":{"a":110000,"b":92000},"1":{"a":115000,"b":-1},"4":{"a":145000,"b":-1},"5":{"a":330000,"b":-1},"7":{"a":10000000,"b":-1},"9":{"a":7000000,"b":-1}},"/items/crimson_bulwark":{"0":{"a":105000,"b":96000},"1":{"a":115000,"b":-1},"2":{"a":135000,"b":-1},"3":{"a":160000,"b":-1},"4":{"a":320000,"b":-1},"5":{"a":4900000,"b":-1},"6":{"a":1900000,"b":-1}},"/items/crimson_cheese":{"0":{"a":980,"b":960}},"/items/crimson_chisel":{"0":{"a":98000,"b":96000},"1":{"a":130000,"b":-1},"3":{"a":380000,"b":-1},"5":{"a":520000,"b":160000}},"/items/crimson_enhancer":{"0":{"a":110000,"b":105000},"1":{"a":125000,"b":-1},"3":{"a":160000,"b":-1},"4":{"a":350000,"b":-1},"5":{"a":410000,"b":62000},"6":{"a":1100000,"b":-1},"7":{"a":1450000,"b":13500},"10":{"a":5600000,"b":-1}},"/items/crimson_gauntlets":{"0":{"a":66000,"b":56000},"1":{"a":170000,"b":-1},"3":{"a":150000,"b":-1},"4":{"a":290000,"b":-1},"10":{"a":8000000,"b":-1}},"/items/crimson_hammer":{"0":{"a":100000,"b":96000},"1":{"a":150000,"b":-1},"5":{"a":540000,"b":110000}},"/items/crimson_hatchet":{"0":{"a":96000,"b":84000},"1":{"a":115000,"b":-1},"3":{"a":120000,"b":-1},"4":{"a":340000,"b":-1},"5":{"a":420000,"b":120000}},"/items/crimson_helmet":{"0":{"a":105000,"b":90000},"1":{"a":100000,"b":-1},"2":{"a":150000,"b":-1},"3":{"a":215000,"b":-1},"5":{"a":430000,"b":110000},"6":{"a":1250000,"b":-1}},"/items/crimson_mace":{"0":{"a":175000,"b":110000},"1":{"a":130000,"b":-1},"2":{"a":2250000,"b":-1},"5":{"a":640000,"b":52000}},"/items/crimson_milk":{"0":{"a":200,"b":190}},"/items/crimson_needle":{"0":{"a":125000,"b":105000},"3":{"a":380000,"b":-1},"4":{"a":420000,"b":-1},"5":{"a":640000,"b":380000}},"/items/crimson_plate_body":{"0":{"a":150000,"b":105000},"1":{"a":150000,"b":-1},"2":{"a":100000,"b":-1},"4":{"a":390000,"b":-1},"5":{"a":-1,"b":105000}},"/items/crimson_plate_legs":{"0":{"a":135000,"b":98000},"1":{"a":200000,"b":-1},"2":{"a":11000000,"b":-1},"5":{"a":490000,"b":105000}},"/items/crimson_pot":{"0":{"a":90000,"b":68000},"1":{"a":120000,"b":-1},"2":{"a":125000,"b":-1},"3":{"a":165000,"b":72000},"4":{"a":310000,"b":78000},"5":{"a":540000,"b":90000}},"/items/crimson_shears":{"0":{"a":105000,"b":100000},"1":{"a":135000,"b":-1},"2":{"a":205000,"b":-1},"3":{"a":390000,"b":-1},"5":{"a":720000,"b":115000}},"/items/crimson_spatula":{"0":{"a":120000,"b":110000},"1":{"a":120000,"b":-1},"3":{"a":175000,"b":-1},"5":{"a":295000,"b":145000},"6":{"a":-1,"b":320000}},"/items/crimson_spear":{"0":{"a":170000,"b":120000},"1":{"a":120000,"b":-1},"3":{"a":135000,"b":-1},"4":{"a":170000,"b":-1},"5":{"a":640000,"b":-1}},"/items/crimson_sword":{"0":{"a":160000,"b":88000},"1":{"a":130000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":180000,"b":-1},"4":{"a":195000,"b":-1},"5":{"a":-1,"b":80000}},"/items/crippling_slash":{"0":{"a":41000,"b":40000}},"/items/critical_aura":{"0":{"a":1650000,"b":1600000}},"/items/critical_coffee":{"0":{"a":2100,"b":2050}},"/items/crushed_amber":{"0":{"a":1400,"b":1350}},"/items/crushed_amethyst":{"0":{"a":2150,"b":2100}},"/items/crushed_garnet":{"0":{"a":2200,"b":2150}},"/items/crushed_jade":{"0":{"a":2200,"b":2150}},"/items/crushed_moonstone":{"0":{"a":3300,"b":3200}},"/items/crushed_pearl":{"0":{"a":880,"b":860}},"/items/crushed_philosophers_stone":{"0":{"a":2100000,"b":2050000}},"/items/crushed_sunstone":{"0":{"a":7800,"b":7600}},"/items/cupcake":{"0":{"a":310,"b":280}},"/items/cursed_ball":{"0":{"a":8400000,"b":8200000}},"/items/cursed_bow":{"0":{"a":175000000,"b":165000000},"2":{"a":-1,"b":18000000},"5":{"a":-1,"b":100000000},"6":{"a":-1,"b":5000000},"7":{"a":195000000,"b":135000000},"8":{"a":270000000,"b":180000000},"10":{"a":-1,"b":440000000},"12":{"a":1700000000,"b":1400000000}},"/items/dairyhands_bottoms":{"0":{"a":-1,"b":100000000},"5":{"a":170000000,"b":155000000},"6":{"a":175000000,"b":160000000},"7":{"a":195000000,"b":50000000},"8":{"a":230000000,"b":-1},"10":{"a":390000000,"b":230000000}},"/items/dairyhands_top":{"0":{"a":-1,"b":96000000},"1":{"a":-1,"b":3700000},"2":{"a":-1,"b":4100000},"5":{"a":155000000,"b":3500000},"6":{"a":155000000,"b":-1},"7":{"a":160000000,"b":-1},"8":{"a":225000000,"b":-1},"9":{"a":-1,"b":185000000},"10":{"a":-1,"b":200000000}},"/items/damaged_anchor":{"0":{"a":8000000,"b":7800000}},"/items/dark_key_fragment":{"0":{"a":1700000,"b":1650000}},"/items/defense_coffee":{"0":{"a":540,"b":500}},"/items/demonic_core":{"0":{"a":1100000,"b":1050000}},"/items/demonic_plate_body":{"0":{"a":-1,"b":5800000},"1":{"a":-1,"b":900000},"2":{"a":34000000,"b":900000},"3":{"a":-1,"b":2250000},"5":{"a":11000000,"b":9600000},"6":{"a":18500000,"b":14000000},"7":{"a":21000000,"b":9800000},"8":{"a":-1,"b":22500000},"9":{"a":-1,"b":25000000},"10":{"a":60000000,"b":54000000},"12":{"a":125000000,"b":400000}},"/items/demonic_plate_legs":{"0":{"a":9200000,"b":7200000},"5":{"a":9800000,"b":9000000},"7":{"a":18000000,"b":10000000},"8":{"a":28000000,"b":10000000},"10":{"a":54000000,"b":30000000},"12":{"a":130000000,"b":38000000},"13":{"a":-1,"b":20500000}},"/items/dodocamel_gauntlets":{"0":{"a":62000000,"b":52000000},"3":{"a":-1,"b":5200000},"5":{"a":58000000,"b":52000000},"7":{"a":-1,"b":66000000},"8":{"a":98000000,"b":80000000},"10":{"a":260000000,"b":230000000},"11":{"a":450000000,"b":-1},"12":{"a":-1,"b":3000000}},"/items/dodocamel_plume":{"0":{"a":8400000,"b":8000000}},"/items/donut":{"0":{"a":150,"b":120}},"/items/dragon_fruit":{"0":{"a":205,"b":200}},"/items/dragon_fruit_gummy":{"0":{"a":700,"b":680}},"/items/dragon_fruit_yogurt":{"0":{"a":860,"b":840}},"/items/earrings_of_armor":{"0":{"a":6000000,"b":5400000},"2":{"a":12000000,"b":-1},"3":{"a":17500000,"b":-1},"4":{"a":38000000,"b":-1}},"/items/earrings_of_critical_strike":{"0":{"a":7800000,"b":7200000},"1":{"a":12000000,"b":6200000},"2":{"a":13000000,"b":9400000},"3":{"a":19000000,"b":18500000},"4":{"a":36000000,"b":31000000},"5":{"a":72000000,"b":64000000}},"/items/earrings_of_essence_find":{"0":{"a":5800000,"b":5200000},"1":{"a":9800000,"b":94000},"2":{"a":10500000,"b":185000},"3":{"a":16000000,"b":195000},"4":{"a":33000000,"b":270000},"5":{"a":49000000,"b":-1}},"/items/earrings_of_gathering":{"0":{"a":5600000,"b":5000000},"1":{"a":9800000,"b":340000},"5":{"a":-1,"b":215000}},"/items/earrings_of_rare_find":{"0":{"a":6800000,"b":6400000},"1":{"a":8200000,"b":7000000},"2":{"a":12000000,"b":9000000},"3":{"a":19500000,"b":16000000},"4":{"a":36000000,"b":30000000},"5":{"a":84000000,"b":50000000},"6":{"a":-1,"b":1100000},"7":{"a":-1,"b":120000000},"8":{"a":-1,"b":41000},"9":{"a":-1,"b":41000},"10":{"a":-1,"b":100000000}},"/items/earrings_of_regeneration":{"0":{"a":6000000,"b":5800000},"1":{"a":9800000,"b":3000000},"2":{"a":-1,"b":9200000},"3":{"a":17000000,"b":16000000},"4":{"a":31000000,"b":27000000},"5":{"a":58000000,"b":54000000},"6":{"a":105000000,"b":90000000},"7":{"a":215000000,"b":160000000},"8":{"a":285000000,"b":-1},"9":{"a":-1,"b":31000000},"20":{"a":-1,"b":48000}},"/items/earrings_of_resistance":{"0":{"a":5400000,"b":5000000},"1":{"a":9600000,"b":110000},"2":{"a":20500000,"b":165000},"3":{"a":-1,"b":125000},"4":{"a":-1,"b":220000},"5":{"a":98000000,"b":400000},"6":{"a":-1,"b":105000}},"/items/efficiency_tea":{"0":{"a":1050,"b":1000}},"/items/egg":{"0":{"a":32,"b":31}},"/items/elemental_affinity":{"0":{"a":220000,"b":215000}},"/items/elusiveness":{"0":{"a":42000,"b":40000}},"/items/emp_tea_leaf":{"0":{"a":360,"b":350}},"/items/enchanted_chest_key":{"0":{"a":5400000,"b":5200000}},"/items/enchanted_entry_key":{"0":{"a":540000,"b":520000}},"/items/enchanted_essence":{"0":{"a":1650,"b":1600}},"/items/enchanted_gloves":{"0":{"a":10000000,"b":8800000},"1":{"a":-1,"b":8600000},"2":{"a":-1,"b":8600000},"3":{"a":11000000,"b":8600000},"4":{"a":-1,"b":255000},"5":{"a":11500000,"b":10500000},"6":{"a":14000000,"b":1800000},"8":{"a":38000000,"b":25000000},"10":{"a":72000000,"b":70000000},"12":{"a":290000000,"b":220000000},"13":{"a":600000000,"b":-1}},"/items/enhancers_bottoms":{"0":{"a":-1,"b":11000000},"5":{"a":-1,"b":15500000},"8":{"a":320000000,"b":280000000},"10":{"a":520000000,"b":-1}},"/items/enhancers_top":{"0":{"a":235000000,"b":-1},"5":{"a":-1,"b":12500000},"8":{"a":-1,"b":3500000}},"/items/enhancing_essence":{"0":{"a":820,"b":800}},"/items/enhancing_tea":{"0":{"a":1100,"b":1000}},"/items/entangle":{"0":{"a":15500,"b":15000}},"/items/excelsa_coffee_bean":{"0":{"a":480,"b":460}},"/items/eye_of_the_watcher":{"0":{"a":330000,"b":320000}},"/items/eye_watch":{"0":{"a":3600000,"b":3200000},"1":{"a":12000000,"b":-1},"4":{"a":-1,"b":3200000},"5":{"a":4800000,"b":4500000},"6":{"a":-1,"b":5600000},"7":{"a":10000000,"b":8600000},"8":{"a":16000000,"b":13500000},"9":{"a":28500000,"b":245000},"10":{"a":40000000,"b":35000000},"11":{"a":78000000,"b":66000000},"12":{"a":-1,"b":62000000}},"/items/eyessence":{"0":{"a":60,"b":58}},"/items/fierce_aura":{"0":{"a":3300000,"b":3200000}},"/items/fieriosa_coffee_bean":{"0":{"a":540,"b":520}},"/items/fighter_necklace":{"0":{"a":10500000,"b":9600000},"1":{"a":12500000,"b":12000000},"2":{"a":-1,"b":10000000},"3":{"a":-1,"b":18500000},"4":{"a":74000000,"b":270000},"5":{"a":98000000,"b":30000000},"6":{"a":-1,"b":370000},"7":{"a":-1,"b":2450000}},"/items/fireball":{"0":{"a":7600,"b":7400}},"/items/firestorm":{"0":{"a":260000,"b":255000}},"/items/flame_arrow":{"0":{"a":27500,"b":27000}},"/items/flame_aura":{"0":{"a":1150000,"b":1100000}},"/items/flame_blast":{"0":{"a":46000,"b":45000}},"/items/flaming_cloth":{"0":{"a":58000,"b":56000}},"/items/flaming_robe_bottoms":{"0":{"a":230000,"b":190000},"1":{"a":220000,"b":-1},"2":{"a":245000,"b":-1},"3":{"a":275000,"b":-1},"4":{"a":340000,"b":-1},"5":{"a":340000,"b":310000},"6":{"a":820000,"b":-1},"7":{"a":1500000,"b":600000},"8":{"a":2200000,"b":1650000},"9":{"a":4800000,"b":2800000},"10":{"a":6800000,"b":6200000},"11":{"a":-1,"b":8400000},"12":{"a":20000000,"b":-1}},"/items/flaming_robe_top":{"0":{"a":360000,"b":300000},"1":{"a":310000,"b":105000},"2":{"a":320000,"b":100000},"3":{"a":320000,"b":105000},"4":{"a":330000,"b":-1},"5":{"a":350000,"b":-1},"6":{"a":940000,"b":390000},"7":{"a":1100000,"b":900000},"8":{"a":2350000,"b":1900000},"9":{"a":5200000,"b":3200000},"10":{"a":7400000,"b":6600000},"11":{"a":-1,"b":9400000},"12":{"a":24000000,"b":-1},"13":{"a":54000000,"b":-1}},"/items/flax":{"0":{"a":49,"b":45}},"/items/fluffy_red_hat":{"0":{"a":5000000,"b":4200000},"3":{"a":5600000,"b":540000},"5":{"a":5400000,"b":5000000},"6":{"a":7000000,"b":5400000},"7":{"a":11500000,"b":10000000},"8":{"a":18500000,"b":13000000},"9":{"a":35000000,"b":19000000},"10":{"a":40000000,"b":37000000},"11":{"a":-1,"b":310000},"12":{"a":92000000,"b":-1},"13":{"a":200000000,"b":-1}},"/items/foragers_bottoms":{"0":{"a":250000000,"b":105000000},"4":{"a":-1,"b":115000000},"5":{"a":175000000,"b":160000000},"6":{"a":180000000,"b":170000000},"7":{"a":195000000,"b":180000000},"8":{"a":235000000,"b":-1},"10":{"a":480000000,"b":4200000}},"/items/foragers_top":{"0":{"a":-1,"b":18500000},"4":{"a":-1,"b":100000000},"5":{"a":160000000,"b":145000000},"6":{"a":160000000,"b":20500000},"7":{"a":180000000,"b":-1},"8":{"a":215000000,"b":26000000},"10":{"a":450000000,"b":300000000},"11":{"a":-1,"b":320000000},"12":{"a":1350000000,"b":-1}},"/items/foraging_essence":{"0":{"a":215,"b":205}},"/items/foraging_tea":{"0":{"a":430,"b":400}},"/items/fracturing_impact":{"0":{"a":80000,"b":70000}},"/items/frenzy":{"0":{"a":225000,"b":220000}},"/items/frost_sphere":{"0":{"a":580000,"b":560000}},"/items/frost_staff":{"0":{"a":12000000,"b":11000000},"1":{"a":-1,"b":1250000},"2":{"a":-1,"b":1450000},"3":{"a":-1,"b":3600000},"4":{"a":-1,"b":1850000},"5":{"a":12000000,"b":10500000},"6":{"a":15000000,"b":1500000},"7":{"a":18000000,"b":-1},"8":{"a":26000000,"b":13000000},"9":{"a":32000000,"b":-1},"10":{"a":50000000,"b":38000000},"11":{"a":-1,"b":70000000},"12":{"a":165000000,"b":100000000},"14":{"a":760000000,"b":12000000}},"/items/frost_surge":{"0":{"a":300000,"b":295000}},"/items/furious_spear":{"0":{"a":255000000,"b":240000000},"5":{"a":285000000,"b":165000000},"6":{"a":-1,"b":250000000},"7":{"a":295000000,"b":270000000},"8":{"a":370000000,"b":38000000},"10":{"a":680000000,"b":600000000},"12":{"a":1950000000,"b":1700000000}},"/items/garnet":{"0":{"a":35000,"b":34000}},"/items/gathering_tea":{"0":{"a":420,"b":390}},"/items/gator_vest":{"0":{"a":18000,"b":17500},"1":{"a":19000,"b":17000},"2":{"a":19000,"b":16500},"3":{"a":19000,"b":16500},"4":{"a":21000,"b":16500},"5":{"a":27000,"b":25500},"6":{"a":66000,"b":47000},"7":{"a":115000,"b":105000},"8":{"a":260000,"b":205000},"9":{"a":840000,"b":440000},"10":{"a":880000,"b":860000},"11":{"a":2900000,"b":-1},"13":{"a":21500000,"b":-1},"15":{"a":90000000,"b":5000},"20":{"a":-1,"b":5200}},"/items/giant_pouch":{"0":{"a":6000000,"b":5800000},"1":{"a":-1,"b":2150000},"2":{"a":6800000,"b":1350000},"3":{"a":7400000,"b":4500000},"4":{"a":9000000,"b":7000000},"5":{"a":11500000,"b":9400000},"6":{"a":20000000,"b":1050000},"7":{"a":90000000,"b":20000000},"8":{"a":-1,"b":1000000},"10":{"a":-1,"b":90000000},"20":{"a":-1,"b":2200000}},"/items/ginkgo_bow":{"0":{"a":165000,"b":145000},"2":{"a":150000,"b":-1},"4":{"a":230000,"b":-1},"5":{"a":190000,"b":-1}},"/items/ginkgo_crossbow":{"0":{"a":150000,"b":130000},"1":{"a":150000,"b":-1},"2":{"a":135000,"b":-1},"3":{"a":140000,"b":-1},"4":{"a":175000,"b":-1},"5":{"a":210000,"b":-1},"6":{"a":300000,"b":-1},"7":{"a":400000,"b":-1}},"/items/ginkgo_fire_staff":{"0":{"a":145000,"b":130000},"1":{"a":150000,"b":-1},"2":{"a":160000,"b":-1},"3":{"a":170000,"b":-1},"4":{"a":225000,"b":-1},"5":{"a":250000,"b":-1},"6":{"a":1250000,"b":-1}},"/items/ginkgo_log":{"0":{"a":27,"b":24}},"/items/ginkgo_lumber":{"0":{"a":820,"b":800}},"/items/ginkgo_nature_staff":{"0":{"a":155000,"b":130000},"1":{"a":-1,"b":14000},"2":{"a":160000,"b":14000},"3":{"a":170000,"b":14000},"4":{"a":200000,"b":-1},"5":{"a":470000,"b":110000},"7":{"a":1100000,"b":-1},"10":{"a":10000000,"b":-1}},"/items/ginkgo_shield":{"0":{"a":68000,"b":62000},"1":{"a":74000,"b":-1},"3":{"a":130000,"b":-1},"4":{"a":125000,"b":-1},"5":{"a":100000,"b":84000},"6":{"a":250000,"b":-1},"10":{"a":2950000,"b":1500000}},"/items/ginkgo_water_staff":{"0":{"a":145000,"b":115000},"1":{"a":130000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":170000,"b":-1},"4":{"a":310000,"b":-1},"5":{"a":430000,"b":-1}},"/items/gluttonous_energy":{"0":{"a":11500000,"b":9000000}},"/items/gluttonous_pouch":{"0":{"a":-1,"b":31000000},"1":{"a":-1,"b":7000000},"2":{"a":-1,"b":7000000},"3":{"a":-1,"b":7000000},"4":{"a":310000000,"b":7000000},"5":{"a":-1,"b":5200000}},"/items/gobo_boomstick":{"0":{"a":82000,"b":80000},"1":{"a":92000,"b":20000},"2":{"a":-1,"b":20000},"3":{"a":2250000,"b":20000},"4":{"a":135000,"b":-1},"5":{"a":100000,"b":82000},"6":{"a":145000,"b":-1},"7":{"a":340000,"b":-1},"8":{"a":660000,"b":-1},"10":{"a":2650000,"b":880000}},"/items/gobo_boots":{"0":{"a":25000,"b":20500},"1":{"a":9800000,"b":-1},"2":{"a":31000,"b":-1},"3":{"a":29500,"b":-1},"4":{"a":48000,"b":-1},"5":{"a":80000,"b":-1},"8":{"a":12500000,"b":-1}},"/items/gobo_bracers":{"0":{"a":31000,"b":27000},"1":{"a":145000,"b":-1},"2":{"a":84000,"b":-1},"3":{"a":90000,"b":-1},"4":{"a":115000,"b":-1},"5":{"a":245000,"b":-1},"6":{"a":300000,"b":-1},"7":{"a":700000,"b":-1}},"/items/gobo_chaps":{"0":{"a":45000,"b":44000},"1":{"a":58000,"b":-1},"2":{"a":70000,"b":-1},"3":{"a":70000,"b":-1},"4":{"a":120000,"b":-1},"5":{"a":160000,"b":-1},"8":{"a":5000000,"b":-1}},"/items/gobo_defender":{"0":{"a":420000,"b":410000},"2":{"a":430000,"b":-1},"4":{"a":450000,"b":-1},"5":{"a":460000,"b":380000},"6":{"a":500000,"b":390000},"7":{"a":600000,"b":-1},"8":{"a":900000,"b":800000},"9":{"a":2150000,"b":900000},"10":{"a":3300000,"b":2450000},"11":{"a":-1,"b":3500000},"12":{"a":-1,"b":100000}},"/items/gobo_essence":{"0":{"a":45,"b":41}},"/items/gobo_hide":{"0":{"a":22,"b":14}},"/items/gobo_hood":{"0":{"a":31000,"b":29500},"1":{"a":39000,"b":-1},"3":{"a":45000,"b":-1},"4":{"a":82000,"b":-1},"5":{"a":135000,"b":-1},"6":{"a":900000,"b":-1},"7":{"a":6600000,"b":-1}},"/items/gobo_leather":{"0":{"a":580,"b":560}},"/items/gobo_rag":{"0":{"a":370000,"b":360000}},"/items/gobo_shooter":{"0":{"a":82000,"b":80000},"2":{"a":100000,"b":-1},"3":{"a":98000,"b":-1},"4":{"a":110000,"b":-1},"5":{"a":105000,"b":90000},"6":{"a":140000,"b":-1},"7":{"a":260000,"b":-1},"8":{"a":1000000,"b":-1},"10":{"a":2750000,"b":1050000}},"/items/gobo_slasher":{"0":{"a":82000,"b":80000},"1":{"a":82000,"b":-1},"2":{"a":84000,"b":-1},"3":{"a":86000,"b":-1},"4":{"a":98000,"b":-1},"5":{"a":100000,"b":-1},"6":{"a":160000,"b":120000},"7":{"a":340000,"b":205000},"8":{"a":1000000,"b":-1},"9":{"a":2850000,"b":1600000},"10":{"a":4000000,"b":2400000},"11":{"a":19500000,"b":760000},"12":{"a":20000000,"b":-1}},"/items/gobo_smasher":{"0":{"a":82000,"b":80000},"1":{"a":84000,"b":-1},"2":{"a":86000,"b":-1},"3":{"a":86000,"b":-1},"5":{"a":98000,"b":82000},"6":{"a":275000,"b":-1},"7":{"a":580000,"b":-1},"10":{"a":7400000,"b":-1},"14":{"a":245000000,"b":-1}},"/items/gobo_stabber":{"0":{"a":82000,"b":80000},"1":{"a":88000,"b":-1},"2":{"a":5000000,"b":-1},"3":{"a":100000,"b":-1},"4":{"a":100000,"b":-1},"5":{"a":105000,"b":-1},"6":{"a":180000,"b":-1},"7":{"a":400000,"b":-1},"8":{"a":2500000,"b":-1},"10":{"a":4700000,"b":-1},"11":{"a":5800000,"b":-1}},"/items/gobo_tunic":{"0":{"a":49000,"b":47000},"1":{"a":150000,"b":-1},"2":{"a":70000,"b":-1},"3":{"a":105000,"b":-1},"4":{"a":80000,"b":-1},"5":{"a":54000,"b":-1},"9":{"a":13000000,"b":-1}},"/items/goggles":{"0":{"a":58000,"b":56000}},"/items/golem_essence":{"0":{"a":300,"b":295}},"/items/gourmet_tea":{"0":{"a":540,"b":520}},"/items/granite_bludgeon":{"0":{"a":12000000,"b":11000000},"1":{"a":-1,"b":5400000},"2":{"a":-1,"b":5400000},"3":{"a":-1,"b":6400000},"4":{"a":-1,"b":2650000},"5":{"a":12000000,"b":11500000},"6":{"a":-1,"b":8000000},"7":{"a":20000000,"b":16500000},"8":{"a":30000000,"b":19500000},"10":{"a":74000000,"b":58000000},"14":{"a":400000000,"b":-1}},"/items/green_key_fragment":{"0":{"a":680000,"b":660000}},"/items/green_tea_leaf":{"0":{"a":10,"b":9}},"/items/griffin_bulwark":{"0":{"a":170000000,"b":145000000},"4":{"a":-1,"b":5000000},"5":{"a":170000000,"b":160000000},"6":{"a":170000000,"b":-1},"7":{"a":195000000,"b":170000000},"8":{"a":-1,"b":195000000},"10":{"a":440000000,"b":-1},"11":{"a":-1,"b":5000000},"12":{"a":-1,"b":350000000}},"/items/griffin_chaps":{"0":{"a":7000000,"b":5600000},"1":{"a":6400000,"b":-1},"5":{"a":6200000,"b":6000000},"7":{"a":14000000,"b":10000000},"10":{"a":39000000,"b":30000000}},"/items/griffin_leather":{"0":{"a":780000,"b":740000}},"/items/griffin_talon":{"0":{"a":7000000,"b":6200000}},"/items/griffin_tunic":{"0":{"a":7800000,"b":7400000},"5":{"a":8000000,"b":7200000},"6":{"a":11500000,"b":-1},"7":{"a":21500000,"b":11000000},"8":{"a":30000000,"b":-1},"10":{"a":72000000,"b":60000000}},"/items/grizzly_bear_fluff":{"0":{"a":82000,"b":80000}},"/items/grizzly_bear_shoes":{"0":{"a":400000,"b":380000},"1":{"a":500000,"b":-1},"3":{"a":520000,"b":-1},"4":{"a":620000,"b":-1},"5":{"a":680000,"b":540000},"6":{"a":-1,"b":820000},"7":{"a":1850000,"b":1500000},"8":{"a":4000000,"b":2050000},"9":{"a":9200000,"b":4000000},"10":{"a":10500000,"b":9800000},"11":{"a":22000000,"b":1550000},"12":{"a":44000000,"b":33000000},"13":{"a":80000000,"b":35000000},"14":{"a":160000000,"b":80000000},"15":{"a":360000000,"b":185000000}},"/items/gummy":{"0":{"a":38,"b":36}},"/items/guzzling_energy":{"0":{"a":22500000,"b":22000000}},"/items/guzzling_pouch":{"0":{"a":280000000,"b":250000000},"1":{"a":-1,"b":32000000},"2":{"a":-1,"b":180000000},"4":{"a":-1,"b":40000000},"5":{"a":280000000,"b":275000000},"6":{"a":300000000,"b":290000000},"7":{"a":360000000,"b":350000000},"8":{"a":460000000,"b":240000000},"10":{"a":940000000,"b":880000000}},"/items/heal":{"0":{"a":31000,"b":27500}},"/items/holy_alembic":{"0":{"a":400000,"b":390000},"1":{"a":-1,"b":62000},"3":{"a":600000,"b":340000},"4":{"a":1000000,"b":500000},"5":{"a":1550000,"b":1500000},"6":{"a":3200000,"b":2900000},"7":{"a":7000000,"b":5800000},"8":{"a":12000000,"b":10000000},"9":{"a":23500000,"b":19000000},"10":{"a":39000000,"b":35000000},"12":{"a":-1,"b":340000},"20":{"a":-1,"b":90000}},"/items/holy_boots":{"0":{"a":160000,"b":150000},"1":{"a":160000,"b":-1},"2":{"a":225000,"b":-1},"3":{"a":300000,"b":-1},"4":{"a":540000,"b":-1},"5":{"a":490000,"b":300000},"6":{"a":3200000,"b":-1},"10":{"a":20500000,"b":2700000}},"/items/holy_brush":{"0":{"a":370000,"b":350000},"1":{"a":410000,"b":300000},"2":{"a":580000,"b":160000},"3":{"a":760000,"b":360000},"4":{"a":1000000,"b":500000},"5":{"a":1550000,"b":1450000},"6":{"a":3500000,"b":3000000},"7":{"a":6800000,"b":5800000},"8":{"a":12000000,"b":10500000},"9":{"a":23500000,"b":17000000},"10":{"a":36000000,"b":34000000},"11":{"a":66000000,"b":-1}},"/items/holy_buckler":{"0":{"a":380000,"b":370000},"1":{"a":340000,"b":-1},"2":{"a":350000,"b":-1},"4":{"a":700000,"b":-1},"5":{"a":1200000,"b":300000},"6":{"a":3000000,"b":-1},"7":{"a":6400000,"b":-1}},"/items/holy_bulwark":{"0":{"a":490000,"b":470000},"1":{"a":-1,"b":330000},"2":{"a":800000,"b":-1},"4":{"a":920000,"b":300000},"5":{"a":1750000,"b":1200000}},"/items/holy_cheese":{"0":{"a":1650,"b":1600}},"/items/holy_chisel":{"0":{"a":380000,"b":370000},"2":{"a":-1,"b":380000},"3":{"a":660000,"b":410000},"4":{"a":1000000,"b":520000},"5":{"a":1550000,"b":1500000},"6":{"a":4500000,"b":2250000},"7":{"a":7000000,"b":6200000},"8":{"a":12000000,"b":9200000},"9":{"a":25000000,"b":16500000},"10":{"a":37000000,"b":36000000},"11":{"a":70000000,"b":50000000},"12":{"a":155000000,"b":-1}},"/items/holy_enhancer":{"0":{"a":410000,"b":380000},"1":{"a":420000,"b":-1},"2":{"a":520000,"b":260000},"3":{"a":600000,"b":320000},"4":{"a":820000,"b":500000},"5":{"a":1550000,"b":1450000},"6":{"a":3200000,"b":2200000},"7":{"a":6400000,"b":5200000},"8":{"a":12500000,"b":9200000},"9":{"a":22000000,"b":18500000},"10":{"a":36000000,"b":34000000},"11":{"a":78000000,"b":38000000},"12":{"a":140000000,"b":-1},"13":{"a":-1,"b":100000000}},"/items/holy_gauntlets":{"0":{"a":260000,"b":250000},"1":{"a":280000,"b":-1},"2":{"a":300000,"b":-1},"4":{"a":860000,"b":-1},"5":{"a":640000,"b":-1},"6":{"a":1950000,"b":-1}},"/items/holy_hammer":{"0":{"a":390000,"b":360000},"1":{"a":-1,"b":62000},"2":{"a":600000,"b":320000},"3":{"a":640000,"b":340000},"4":{"a":980000,"b":490000},"5":{"a":1550000,"b":1500000},"6":{"a":3600000,"b":2400000},"7":{"a":6800000,"b":4700000},"8":{"a":12000000,"b":-1},"9":{"a":22500000,"b":17000000},"10":{"a":37000000,"b":35000000},"15":{"a":880000000,"b":-1}},"/items/holy_hatchet":{"0":{"a":380000,"b":370000},"1":{"a":500000,"b":330000},"2":{"a":500000,"b":360000},"3":{"a":780000,"b":330000},"4":{"a":-1,"b":540000},"5":{"a":1550000,"b":1400000},"6":{"a":3800000,"b":2400000},"7":{"a":6400000,"b":5800000},"8":{"a":12500000,"b":9200000},"9":{"a":23500000,"b":-1},"10":{"a":36000000,"b":32000000},"11":{"a":66000000,"b":-1},"14":{"a":600000000,"b":-1}},"/items/holy_helmet":{"0":{"a":310000,"b":300000},"3":{"a":680000,"b":-1},"4":{"a":760000,"b":-1},"5":{"a":1400000,"b":100000},"6":{"a":2950000,"b":-1},"7":{"a":6000000,"b":-1}},"/items/holy_mace":{"0":{"a":470000,"b":460000},"1":{"a":520000,"b":-1},"2":{"a":600000,"b":-1},"3":{"a":660000,"b":-1},"4":{"a":780000,"b":-1},"5":{"a":980000,"b":-1},"6":{"a":3400000,"b":960000},"7":{"a":7600000,"b":84000},"8":{"a":-1,"b":105000},"10":{"a":22500000,"b":-1}},"/items/holy_milk":{"0":{"a":260,"b":250}},"/items/holy_needle":{"0":{"a":390000,"b":380000},"1":{"a":450000,"b":300000},"2":{"a":490000,"b":330000},"3":{"a":780000,"b":370000},"4":{"a":1100000,"b":160000},"5":{"a":1600000,"b":1500000},"6":{"a":3500000,"b":2350000},"7":{"a":6600000,"b":5600000},"8":{"a":13000000,"b":9400000},"9":{"a":21500000,"b":3500000},"10":{"a":38000000,"b":37000000}},"/items/holy_plate_body":{"0":{"a":500000,"b":470000},"1":{"a":540000,"b":-1},"2":{"a":540000,"b":-1},"3":{"a":800000,"b":-1},"4":{"a":940000,"b":-1},"5":{"a":1500000,"b":820000},"6":{"a":2800000,"b":-1},"10":{"a":-1,"b":3000000}},"/items/holy_plate_legs":{"0":{"a":450000,"b":410000},"2":{"a":500000,"b":-1},"3":{"a":640000,"b":-1},"4":{"a":740000,"b":-1},"5":{"a":940000,"b":-1},"6":{"a":1800000,"b":-1}},"/items/holy_pot":{"0":{"a":400000,"b":390000},"2":{"a":-1,"b":340000},"3":{"a":700000,"b":350000},"4":{"a":1000000,"b":760000},"5":{"a":1550000,"b":1500000},"6":{"a":3500000,"b":-1},"7":{"a":6800000,"b":5400000},"8":{"a":12000000,"b":9400000},"9":{"a":23500000,"b":18500000},"10":{"a":36000000,"b":34000000},"13":{"a":330000000,"b":32000000},"14":{"a":490000000,"b":-1}},"/items/holy_shears":{"0":{"a":400000,"b":380000},"1":{"a":480000,"b":62000},"2":{"a":540000,"b":130000},"3":{"a":680000,"b":390000},"4":{"a":980000,"b":490000},"5":{"a":1550000,"b":1500000},"6":{"a":3000000,"b":2150000},"7":{"a":6600000,"b":6200000},"8":{"a":12500000,"b":9200000},"9":{"a":23500000,"b":18500000},"10":{"a":39000000,"b":37000000},"11":{"a":80000000,"b":200000},"16":{"a":-1,"b":880000}},"/items/holy_spatula":{"0":{"a":400000,"b":370000},"1":{"a":-1,"b":320000},"2":{"a":450000,"b":340000},"3":{"a":700000,"b":340000},"4":{"a":1100000,"b":520000},"5":{"a":1550000,"b":1500000},"6":{"a":3400000,"b":2400000},"7":{"a":6600000,"b":4500000},"8":{"a":-1,"b":9400000},"9":{"a":22500000,"b":-1},"10":{"a":36000000,"b":35000000},"11":{"a":78000000,"b":50000000},"12":{"a":-1,"b":66000000}},"/items/holy_spear":{"0":{"a":490000,"b":450000},"3":{"a":700000,"b":80000},"4":{"a":1200000,"b":80000},"5":{"a":1800000,"b":-1},"6":{"a":4800000,"b":84000},"7":{"a":6200000,"b":-1},"8":{"a":9800000,"b":96000},"9":{"a":-1,"b":100000},"10":{"a":-1,"b":110000}},"/items/holy_sword":{"0":{"a":540000,"b":520000},"1":{"a":520000,"b":-1},"2":{"a":580000,"b":-1},"3":{"a":600000,"b":-1},"4":{"a":820000,"b":-1},"5":{"a":1150000,"b":-1},"6":{"a":3800000,"b":-1},"7":{"a":-1,"b":480000},"8":{"a":-1,"b":480000},"9":{"a":-1,"b":480000},"10":{"a":-1,"b":8000000},"20":{"a":-1,"b":10000000}},"/items/ice_spear":{"0":{"a":27500,"b":27000}},"/items/icy_cloth":{"0":{"a":58000,"b":56000}},"/items/icy_robe_bottoms":{"0":{"a":205000,"b":180000},"3":{"a":235000,"b":-1},"4":{"a":370000,"b":-1},"5":{"a":220000,"b":130000},"6":{"a":390000,"b":200000},"7":{"a":1100000,"b":400000},"8":{"a":1750000,"b":450000},"10":{"a":5400000,"b":5000000}},"/items/icy_robe_top":{"0":{"a":320000,"b":300000},"3":{"a":300000,"b":-1},"4":{"a":470000,"b":-1},"5":{"a":320000,"b":130000},"6":{"a":580000,"b":-1},"7":{"a":1700000,"b":-1},"8":{"a":1950000,"b":-1},"9":{"a":4200000,"b":-1},"10":{"a":6600000,"b":6000000},"11":{"a":13500000,"b":3100000}},"/items/impale":{"0":{"a":27500,"b":27000}},"/items/infernal_battlestaff":{"0":{"a":12500000,"b":11000000},"1":{"a":-1,"b":1500000},"2":{"a":-1,"b":1350000},"3":{"a":-1,"b":1850000},"5":{"a":11500000,"b":11000000},"6":{"a":14000000,"b":10000000},"7":{"a":19000000,"b":15000000},"8":{"a":-1,"b":23000000},"9":{"a":-1,"b":40000000},"10":{"a":68000000,"b":62000000},"11":{"a":100000000,"b":-1},"12":{"a":165000000,"b":-1},"13":{"a":-1,"b":20500000}},"/items/infernal_ember":{"0":{"a":640000,"b":620000}},"/items/insanity":{"0":{"a":2150000,"b":2100000}},"/items/intelligence_coffee":{"0":{"a":460,"b":450}},"/items/invincible":{"0":{"a":1150000,"b":1100000}},"/items/jackalope_antler":{"0":{"a":3300000,"b":3200000}},"/items/jackalope_staff":{"0":{"a":58000000,"b":56000000},"3":{"a":-1,"b":9800000},"4":{"a":-1,"b":9800000},"5":{"a":62000000,"b":58000000},"6":{"a":68000000,"b":-1},"7":{"a":74000000,"b":66000000},"8":{"a":92000000,"b":72000000},"9":{"a":-1,"b":11500000},"10":{"a":170000000,"b":155000000}},"/items/jade":{"0":{"a":35000,"b":34000}},"/items/jungle_essence":{"0":{"a":40,"b":36}},"/items/knights_aegis":{"0":{"a":86000000,"b":84000000},"1":{"a":-1,"b":80000000},"2":{"a":-1,"b":80000000},"3":{"a":-1,"b":82000000},"4":{"a":-1,"b":84000000},"5":{"a":90000000,"b":84000000},"6":{"a":96000000,"b":84000000},"7":{"a":110000000,"b":105000000},"8":{"a":150000000,"b":135000000},"9":{"a":-1,"b":170000000},"10":{"a":370000000,"b":330000000},"11":{"a":-1,"b":400000000},"12":{"a":-1,"b":600000000}},"/items/knights_ingot":{"0":{"a":8200000,"b":8000000}},"/items/kraken_chaps":{"0":{"a":84000000,"b":80000000},"1":{"a":-1,"b":74000000},"2":{"a":-1,"b":74000000},"3":{"a":-1,"b":74000000},"4":{"a":-1,"b":76000000},"5":{"a":88000000,"b":84000000},"6":{"a":-1,"b":82000000},"7":{"a":110000000,"b":105000000},"8":{"a":-1,"b":140000000},"9":{"a":-1,"b":145000000},"10":{"a":-1,"b":380000000},"11":{"a":-1,"b":420000000},"12":{"a":-1,"b":900000000}},"/items/kraken_fang":{"0":{"a":14000000,"b":13500000}},"/items/kraken_leather":{"0":{"a":9200000,"b":9000000}},"/items/kraken_tunic":{"0":{"a":-1,"b":96000000},"1":{"a":-1,"b":84000000},"2":{"a":-1,"b":84000000},"3":{"a":-1,"b":84000000},"4":{"a":-1,"b":86000000},"5":{"a":110000000,"b":98000000},"6":{"a":-1,"b":100000000},"7":{"a":130000000,"b":125000000},"8":{"a":-1,"b":165000000},"9":{"a":260000000,"b":235000000},"10":{"a":430000000,"b":400000000},"11":{"a":-1,"b":500000000},"12":{"a":-1,"b":900000000}},"/items/large_pouch":{"0":{"a":580000,"b":560000},"1":{"a":600000,"b":110000},"2":{"a":680000,"b":100000},"3":{"a":980000,"b":-1},"4":{"a":8800000,"b":105000},"5":{"a":4300000,"b":1200000}},"/items/liberica_coffee_bean":{"0":{"a":380,"b":370}},"/items/life_drain":{"0":{"a":68000,"b":64000}},"/items/linen_boots":{"0":{"a":9600,"b":8400},"1":{"a":580,"b":-1},"3":{"a":86000,"b":-1},"5":{"a":90000,"b":-1},"7":{"a":1650000,"b":-1},"10":{"a":6400000,"b":-1}},"/items/linen_fabric":{"0":{"a":360,"b":350}},"/items/linen_gloves":{"0":{"a":9400,"b":8400},"3":{"a":40000,"b":-1},"4":{"a":130000,"b":-1},"5":{"a":240000,"b":-1},"6":{"a":200000,"b":-1},"7":{"a":980000,"b":-1}},"/items/linen_hat":{"0":{"a":11000,"b":9000},"1":{"a":30000,"b":-1},"3":{"a":1600000,"b":-1},"5":{"a":170000,"b":-1},"7":{"a":400000,"b":-1}},"/items/linen_robe_bottoms":{"0":{"a":15500,"b":12500},"1":{"a":50000,"b":-1},"2":{"a":480000,"b":-1},"5":{"a":245000,"b":-1}},"/items/linen_robe_top":{"0":{"a":16000,"b":13500},"1":{"a":33000,"b":-1},"2":{"a":40000,"b":-1},"3":{"a":88000,"b":-1},"4":{"a":180000,"b":-1},"5":{"a":500000,"b":-1},"6":{"a":760000,"b":-1},"7":{"a":1000000,"b":-1},"8":{"a":1200000,"b":-1},"10":{"a":1900000,"b":-1}},"/items/living_granite":{"0":{"a":640000,"b":620000}},"/items/log":{"0":{"a":13,"b":12}},"/items/lucky_coffee":{"0":{"a":1550,"b":1500}},"/items/lumber":{"0":{"a":235,"b":225}},"/items/lumberjacks_bottoms":{"0":{"a":-1,"b":100000000},"5":{"a":175000000,"b":130000000},"6":{"a":180000000,"b":160000000},"7":{"a":195000000,"b":-1},"8":{"a":235000000,"b":-1},"10":{"a":-1,"b":330000000}},"/items/lumberjacks_top":{"0":{"a":-1,"b":100000000},"5":{"a":155000000,"b":135000000},"7":{"a":175000000,"b":-1},"8":{"a":215000000,"b":-1},"10":{"a":-1,"b":300000000}},"/items/luna_robe_bottoms":{"0":{"a":1550000,"b":1450000},"1":{"a":2050000,"b":-1},"3":{"a":-1,"b":210000},"4":{"a":-1,"b":185000},"5":{"a":-1,"b":1750000},"6":{"a":3000000,"b":1500000},"7":{"a":5400000,"b":4600000},"8":{"a":8000000,"b":3200000},"9":{"a":-1,"b":5000000},"10":{"a":21500000,"b":21000000}},"/items/luna_robe_top":{"0":{"a":2150000,"b":1900000},"1":{"a":2250000,"b":235000},"2":{"a":-1,"b":255000},"3":{"a":-1,"b":280000},"4":{"a":-1,"b":260000},"5":{"a":2600000,"b":2500000},"6":{"a":4500000,"b":2500000},"7":{"a":6400000,"b":5400000},"8":{"a":13000000,"b":6600000},"9":{"a":16000000,"b":7800000},"10":{"a":24000000,"b":22000000},"12":{"a":86000000,"b":78000000}},"/items/luna_wing":{"0":{"a":205000,"b":200000}},"/items/maelstrom_plate_body":{"0":{"a":110000000,"b":100000000},"1":{"a":-1,"b":90000000},"2":{"a":-1,"b":90000000},"3":{"a":-1,"b":90000000},"4":{"a":-1,"b":90000000},"5":{"a":110000000,"b":98000000},"6":{"a":-1,"b":94000000},"7":{"a":140000000,"b":110000000},"8":{"a":200000000,"b":180000000},"9":{"a":-1,"b":175000000},"10":{"a":500000000,"b":410000000},"12":{"a":-1,"b":800000000}},"/items/maelstrom_plate_legs":{"0":{"a":86000000,"b":80000000},"1":{"a":-1,"b":78000000},"2":{"a":-1,"b":78000000},"3":{"a":-1,"b":78000000},"4":{"a":-1,"b":80000000},"5":{"a":96000000,"b":82000000},"6":{"a":-1,"b":88000000},"7":{"a":115000000,"b":110000000},"8":{"a":-1,"b":150000000},"9":{"a":-1,"b":140000000},"10":{"a":410000000,"b":380000000},"12":{"a":1600000000,"b":700000000}},"/items/maelstrom_plating":{"0":{"a":9200000,"b":9000000}},"/items/magic_coffee":{"0":{"a":780,"b":760}},"/items/magicians_cloth":{"0":{"a":7600000,"b":7400000}},"/items/magicians_hat":{"0":{"a":82000000,"b":72000000},"1":{"a":-1,"b":72000000},"2":{"a":-1,"b":72000000},"3":{"a":-1,"b":72000000},"4":{"a":-1,"b":74000000},"5":{"a":105000000,"b":84000000},"6":{"a":92000000,"b":82000000},"7":{"a":105000000,"b":100000000},"8":{"a":135000000,"b":125000000},"9":{"a":-1,"b":175000000},"10":{"a":310000000,"b":295000000},"11":{"a":-1,"b":400000000},"12":{"a":1150000000,"b":1050000000}},"/items/magnet":{"0":{"a":320000,"b":310000}},"/items/magnetic_gloves":{"0":{"a":3200000,"b":2900000},"2":{"a":-1,"b":320000},"3":{"a":4200000,"b":310000},"4":{"a":3300000,"b":1000000},"5":{"a":3800000,"b":3400000},"6":{"a":5400000,"b":-1},"7":{"a":7400000,"b":5800000},"8":{"a":12000000,"b":9400000},"9":{"a":19500000,"b":13500000},"10":{"a":33000000,"b":29000000},"11":{"a":-1,"b":300000},"12":{"a":125000000,"b":1050000},"20":{"a":-1,"b":2000000}},"/items/magnifying_glass":{"0":{"a":155000,"b":150000}},"/items/maim":{"0":{"a":145000,"b":140000}},"/items/mana_spring":{"0":{"a":115000,"b":110000}},"/items/manticore_shield":{"0":{"a":25500000,"b":23500000},"2":{"a":-1,"b":3600000},"3":{"a":-1,"b":3600000},"4":{"a":-1,"b":4200000},"5":{"a":26000000,"b":25000000},"7":{"a":35000000,"b":33000000},"8":{"a":48000000,"b":29000000},"10":{"a":120000000,"b":115000000},"11":{"a":230000000,"b":100000000},"12":{"a":470000000,"b":400000}},"/items/manticore_sting":{"0":{"a":2750000,"b":2700000}},"/items/marine_chaps":{"0":{"a":440000,"b":400000},"3":{"a":520000,"b":-1},"4":{"a":600000,"b":-1},"5":{"a":720000,"b":-1},"10":{"a":9000000,"b":-1},"11":{"a":6000000,"b":-1}},"/items/marine_scale":{"0":{"a":68000,"b":64000}},"/items/marine_tunic":{"0":{"a":520000,"b":480000},"5":{"a":1150000,"b":-1},"6":{"a":1150000,"b":-1},"9":{"a":3800000,"b":-1},"10":{"a":9000000,"b":-1}},"/items/marksman_bracers":{"0":{"a":92000000,"b":86000000},"1":{"a":-1,"b":9000000},"2":{"a":-1,"b":11000000},"3":{"a":-1,"b":17000000},"5":{"a":100000000,"b":92000000},"6":{"a":-1,"b":17000000},"7":{"a":110000000,"b":105000000},"8":{"a":145000000,"b":130000000},"10":{"a":370000000,"b":310000000},"11":{"a":-1,"b":29500000},"12":{"a":-1,"b":900000000},"15":{"a":-1,"b":13000000}},"/items/marksman_brooch":{"0":{"a":9200000,"b":9000000}},"/items/marsberry":{"0":{"a":110,"b":105}},"/items/marsberry_cake":{"0":{"a":900,"b":880}},"/items/marsberry_donut":{"0":{"a":800,"b":760}},"/items/medium_pouch":{"0":{"a":105000,"b":96000},"1":{"a":100000,"b":-1},"2":{"a":110000,"b":-1},"3":{"a":175000,"b":-1},"4":{"a":225000,"b":-1},"5":{"a":500000,"b":-1}},"/items/milk":{"0":{"a":54,"b":52}},"/items/milking_essence":{"0":{"a":180,"b":170}},"/items/milking_tea":{"0":{"a":470,"b":390}},"/items/minor_heal":{"0":{"a":4500,"b":3800}},"/items/mirror_of_protection":{"0":{"a":10500000,"b":10000000}},"/items/mooberry":{"0":{"a":110,"b":100}},"/items/mooberry_cake":{"0":{"a":780,"b":760}},"/items/mooberry_donut":{"0":{"a":520,"b":480}},"/items/moolong_tea_leaf":{"0":{"a":33,"b":32}},"/items/moonstone":{"0":{"a":52000,"b":50000}},"/items/natures_veil":{"0":{"a":620000,"b":600000}},"/items/necklace_of_efficiency":{"0":{"a":10000000,"b":9400000},"1":{"a":17500000,"b":2350000},"2":{"a":20500000,"b":11500000},"3":{"a":-1,"b":1450000},"4":{"a":-1,"b":35000000},"5":{"a":120000000,"b":90000000},"6":{"a":-1,"b":190000},"7":{"a":-1,"b":420000},"20":{"a":-1,"b":62000}},"/items/necklace_of_speed":{"0":{"a":13000000,"b":12000000},"1":{"a":16000000,"b":13500000},"2":{"a":21500000,"b":16500000},"3":{"a":30000000,"b":27500000},"4":{"a":58000000,"b":42000000},"5":{"a":100000000,"b":80000000},"6":{"a":-1,"b":235000},"10":{"a":-1,"b":300000000}},"/items/necklace_of_wisdom":{"0":{"a":9400000,"b":9200000},"1":{"a":12000000,"b":10000000},"2":{"a":16500000,"b":14000000},"3":{"a":-1,"b":22000000},"4":{"a":52000000,"b":30000000},"5":{"a":94000000,"b":54000000},"7":{"a":205000000,"b":110000000},"8":{"a":350000000,"b":260000000},"9":{"a":700000000,"b":800000},"10":{"a":-1,"b":300000}},"/items/orange":{"0":{"a":7,"b":6}},"/items/orange_gummy":{"0":{"a":31,"b":28}},"/items/orange_key_fragment":{"0":{"a":1050000,"b":1000000}},"/items/orange_yogurt":{"0":{"a":470,"b":420}},"/items/panda_fluff":{"0":{"a":80000,"b":78000}},"/items/panda_gloves":{"0":{"a":500000,"b":490000},"1":{"a":500000,"b":-1},"2":{"a":540000,"b":-1},"3":{"a":620000,"b":-1},"4":{"a":780000,"b":-1},"5":{"a":760000,"b":420000},"6":{"a":1000000,"b":-1},"7":{"a":2500000,"b":-1},"8":{"a":4800000,"b":2500000},"9":{"a":9400000,"b":980000},"10":{"a":9600000,"b":8200000},"11":{"a":15000000,"b":1900000},"12":{"a":29000000,"b":-1}},"/items/peach":{"0":{"a":100,"b":94}},"/items/peach_gummy":{"0":{"a":400,"b":370}},"/items/peach_yogurt":{"0":{"a":660,"b":640}},"/items/pearl":{"0":{"a":14000,"b":13500}},"/items/penetrating_shot":{"0":{"a":215000,"b":210000}},"/items/penetrating_strike":{"0":{"a":45000,"b":44000}},"/items/pestilent_shot":{"0":{"a":42000,"b":40000}},"/items/philosophers_earrings":{"1":{"a":-1,"b":90000000},"2":{"a":700000000,"b":-1},"3":{"a":-1,"b":41000000},"5":{"a":940000000,"b":900000000},"7":{"a":1500000000,"b":1100000000},"10":{"a":-1,"b":64000000}},"/items/philosophers_necklace":{"0":{"a":-1,"b":600000000},"1":{"a":-1,"b":450000000},"2":{"a":-1,"b":560000000},"3":{"a":720000000,"b":580000000},"4":{"a":-1,"b":660000000},"5":{"a":1050000000,"b":1000000000},"6":{"a":-1,"b":1150000000},"7":{"a":1750000000,"b":1350000000},"8":{"a":-1,"b":88000000},"10":{"a":5800000000,"b":900000000},"11":{"a":-1,"b":31000000},"20":{"a":-1,"b":410000000}},"/items/philosophers_ring":{"0":{"a":-1,"b":200000000},"1":{"a":-1,"b":145000000},"2":{"a":-1,"b":17000000},"4":{"a":-1,"b":540000000},"5":{"a":940000000,"b":920000000},"6":{"a":-1,"b":1100000000},"7":{"a":1500000000,"b":1350000000},"10":{"a":-1,"b":12000000}},"/items/philosophers_stone":{"0":{"a":580000000,"b":560000000}},"/items/pincer_gloves":{"0":{"a":23500,"b":22000},"1":{"a":29500,"b":28500},"2":{"a":34000,"b":16000},"3":{"a":60000,"b":-1},"4":{"a":110000,"b":28000},"5":{"a":100000,"b":43000},"6":{"a":270000,"b":60000},"7":{"a":450000,"b":-1},"8":{"a":1150000,"b":-1},"10":{"a":1600000,"b":1250000},"12":{"a":6800000,"b":-1}},"/items/pirate_chest_key":{"0":{"a":6000000,"b":5800000}},"/items/pirate_entry_key":{"0":{"a":540000,"b":520000}},"/items/pirate_essence":{"0":{"a":2050,"b":2000}},"/items/plum":{"0":{"a":78,"b":76}},"/items/plum_gummy":{"0":{"a":190,"b":185}},"/items/plum_yogurt":{"0":{"a":760,"b":620}},"/items/poke":{"0":{"a":3200,"b":3000}},"/items/polar_bear_fluff":{"0":{"a":80000,"b":78000}},"/items/polar_bear_shoes":{"0":{"a":450000,"b":370000},"1":{"a":500000,"b":-1},"4":{"a":600000,"b":-1},"5":{"a":680000,"b":580000},"6":{"a":1150000,"b":620000},"9":{"a":980000000,"b":-1},"10":{"a":11500000,"b":10500000},"11":{"a":-1,"b":15000000},"12":{"a":41000000,"b":24500000},"13":{"a":480000000,"b":-1}},"/items/power_coffee":{"0":{"a":720,"b":700}},"/items/precision":{"0":{"a":60000,"b":58000}},"/items/prime_catalyst":{"0":{"a":105000,"b":100000}},"/items/processing_tea":{"0":{"a":1700,"b":1600}},"/items/provoke":{"0":{"a":42000,"b":41000}},"/items/puncture":{"0":{"a":150000,"b":145000}},"/items/purple_key_fragment":{"0":{"a":720000,"b":700000}},"/items/purpleheart_bow":{"0":{"a":120000,"b":105000},"1":{"a":540000,"b":-1},"3":{"a":105000,"b":-1},"5":{"a":600000,"b":-1}},"/items/purpleheart_crossbow":{"0":{"a":78000,"b":72000},"3":{"a":100000,"b":6600},"4":{"a":240000,"b":-1},"5":{"a":255000,"b":105000},"7":{"a":400000,"b":-1}},"/items/purpleheart_fire_staff":{"0":{"a":84000,"b":74000},"1":{"a":78000,"b":-1},"2":{"a":90000,"b":-1},"3":{"a":150000,"b":-1},"4":{"a":195000,"b":-1},"5":{"a":200000,"b":66000},"8":{"a":1600000,"b":-1}},"/items/purpleheart_log":{"0":{"a":62,"b":58}},"/items/purpleheart_lumber":{"0":{"a":740,"b":720}},"/items/purpleheart_nature_staff":{"0":{"a":84000,"b":74000},"1":{"a":80000,"b":-1},"2":{"a":-1,"b":6600},"3":{"a":90000,"b":6600},"4":{"a":160000,"b":6600},"5":{"a":275000,"b":6600},"7":{"a":9800000,"b":-1}},"/items/purpleheart_shield":{"0":{"a":56000,"b":38000},"2":{"a":94000,"b":-1},"3":{"a":98000,"b":-1},"4":{"a":125000,"b":-1},"5":{"a":190000,"b":-1}},"/items/purpleheart_water_staff":{"0":{"a":94000,"b":74000},"1":{"a":120000,"b":-1},"2":{"a":170000,"b":-1}},"/items/quick_aid":{"0":{"a":245000,"b":240000}},"/items/quick_shot":{"0":{"a":3200,"b":3100}},"/items/radiant_boots":{"0":{"a":135000,"b":125000},"1":{"a":210000,"b":-1},"2":{"a":200000,"b":-1},"3":{"a":310000,"b":-1},"5":{"a":1200000,"b":250000},"6":{"a":2950000,"b":-1},"7":{"a":-1,"b":2000000}},"/items/radiant_fabric":{"0":{"a":2100,"b":2050}},"/items/radiant_fiber":{"0":{"a":450,"b":430}},"/items/radiant_gloves":{"0":{"a":145000,"b":130000},"2":{"a":205000,"b":-1},"3":{"a":230000,"b":-1},"4":{"a":430000,"b":-1},"5":{"a":660000,"b":500000},"6":{"a":1300000,"b":-1},"7":{"a":9600000,"b":2000000},"10":{"a":175000000,"b":-1}},"/items/radiant_hat":{"0":{"a":290000,"b":285000},"1":{"a":330000,"b":200000},"2":{"a":350000,"b":230000},"3":{"a":440000,"b":310000},"4":{"a":620000,"b":-1},"5":{"a":660000,"b":410000},"6":{"a":3000000,"b":800000},"7":{"a":-1,"b":2400000},"8":{"a":8400000,"b":-1},"9":{"a":-1,"b":21000000},"10":{"a":40000000,"b":15000000}},"/items/radiant_robe_bottoms":{"0":{"a":400000,"b":370000},"2":{"a":660000,"b":110000},"3":{"a":840000,"b":-1},"4":{"a":1100000,"b":760000},"5":{"a":1650000,"b":1000000},"7":{"a":-1,"b":2000000},"8":{"a":9000000,"b":-1},"10":{"a":60000000,"b":-1},"12":{"a":120000000,"b":-1}},"/items/radiant_robe_top":{"0":{"a":450000,"b":440000},"1":{"a":-1,"b":120000},"2":{"a":520000,"b":105000},"3":{"a":680000,"b":-1},"4":{"a":1000000,"b":-1},"5":{"a":1650000,"b":720000},"7":{"a":-1,"b":2000000},"8":{"a":15000000,"b":-1},"9":{"a":22000000,"b":-1},"10":{"a":31000000,"b":-1},"12":{"a":110000000,"b":300000}},"/items/rain_of_arrows":{"0":{"a":160000,"b":150000}},"/items/rainbow_alembic":{"0":{"a":220000,"b":190000},"1":{"a":300000,"b":-1},"2":{"a":310000,"b":-1},"3":{"a":350000,"b":100000},"4":{"a":680000,"b":-1},"5":{"a":560000,"b":330000},"7":{"a":-1,"b":700000},"8":{"a":12500000,"b":-1},"10":{"a":8800000000,"b":-1}},"/items/rainbow_boots":{"0":{"a":100000,"b":-1},"1":{"a":115000,"b":-1},"2":{"a":195000,"b":-1},"3":{"a":250000,"b":-1},"5":{"a":310000,"b":82000}},"/items/rainbow_brush":{"0":{"a":195000,"b":165000},"1":{"a":265000,"b":-1},"2":{"a":275000,"b":-1},"3":{"a":300000,"b":100000},"4":{"a":660000,"b":-1},"5":{"a":700000,"b":580000},"6":{"a":1600000,"b":25000},"7":{"a":5800000,"b":155000},"8":{"a":-1,"b":1200000}},"/items/rainbow_buckler":{"0":{"a":180000,"b":155000},"5":{"a":1950000,"b":115000}},"/items/rainbow_bulwark":{"0":{"a":200000,"b":180000},"1":{"a":205000,"b":-1},"2":{"a":200000,"b":-1},"3":{"a":860000,"b":-1},"5":{"a":960000,"b":125000}},"/items/rainbow_cheese":{"0":{"a":1200,"b":1150}},"/items/rainbow_chisel":{"0":{"a":195000,"b":170000},"1":{"a":260000,"b":-1},"2":{"a":260000,"b":-1},"3":{"a":420000,"b":185000},"4":{"a":580000,"b":-1},"5":{"a":640000,"b":400000},"6":{"a":980000,"b":-1}},"/items/rainbow_enhancer":{"0":{"a":225000,"b":200000},"1":{"a":230000,"b":-1},"2":{"a":245000,"b":-1},"3":{"a":-1,"b":100000},"4":{"a":580000,"b":25000},"5":{"a":880000,"b":370000},"6":{"a":1900000,"b":-1},"8":{"a":12500000,"b":-1},"9":{"a":14000000,"b":-1}},"/items/rainbow_gauntlets":{"0":{"a":130000,"b":125000},"1":{"a":10000000,"b":-1},"2":{"a":225000,"b":-1},"3":{"a":300000,"b":-1},"5":{"a":490000,"b":-1}},"/items/rainbow_hammer":{"0":{"a":195000,"b":155000},"1":{"a":225000,"b":-1},"2":{"a":340000,"b":25000},"3":{"a":350000,"b":100000},"4":{"a":-1,"b":25000},"5":{"a":880000,"b":540000},"6":{"a":2150000,"b":490000}},"/items/rainbow_hatchet":{"0":{"a":185000,"b":180000},"1":{"a":235000,"b":-1},"2":{"a":-1,"b":25000},"3":{"a":-1,"b":100000},"5":{"a":1050000,"b":680000},"6":{"a":-1,"b":25000},"7":{"a":-1,"b":780000}},"/items/rainbow_helmet":{"0":{"a":165000,"b":150000},"1":{"a":175000,"b":18000},"2":{"a":210000,"b":18000},"3":{"a":-1,"b":18000},"5":{"a":780000,"b":230000},"6":{"a":-1,"b":200000}},"/items/rainbow_mace":{"0":{"a":245000,"b":220000},"1":{"a":140000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":275000,"b":-1},"4":{"a":310000,"b":-1},"5":{"a":390000,"b":155000},"6":{"a":500000,"b":-1}},"/items/rainbow_milk":{"0":{"a":180,"b":175}},"/items/rainbow_needle":{"0":{"a":180000,"b":175000},"1":{"a":190000,"b":-1},"2":{"a":240000,"b":-1},"3":{"a":400000,"b":100000},"4":{"a":740000,"b":130000},"5":{"a":1350000,"b":520000}},"/items/rainbow_plate_body":{"0":{"a":235000,"b":230000},"2":{"a":290000,"b":-1},"3":{"a":295000,"b":-1},"4":{"a":1650000,"b":-1},"5":{"a":640000,"b":225000},"6":{"a":2700000,"b":320000},"10":{"a":56000000,"b":430000}},"/items/rainbow_plate_legs":{"0":{"a":255000,"b":190000},"1":{"a":270000,"b":-1},"3":{"a":380000,"b":-1},"4":{"a":-1,"b":225000},"5":{"a":580000,"b":235000}},"/items/rainbow_pot":{"0":{"a":200000,"b":190000},"2":{"a":230000,"b":180000},"3":{"a":340000,"b":100000},"4":{"a":320000,"b":25000},"5":{"a":580000,"b":210000},"6":{"a":-1,"b":25500}},"/items/rainbow_shears":{"0":{"a":190000,"b":175000},"2":{"a":250000,"b":-1},"3":{"a":380000,"b":100000},"4":{"a":600000,"b":-1},"5":{"a":800000,"b":300000},"7":{"a":-1,"b":700000}},"/items/rainbow_spatula":{"0":{"a":295000,"b":185000},"2":{"a":220000,"b":-1},"3":{"a":260000,"b":100000},"4":{"a":390000,"b":28500},"5":{"a":680000,"b":480000},"6":{"a":980000,"b":25500}},"/items/rainbow_spear":{"0":{"a":320000,"b":230000},"1":{"a":225000,"b":-1},"2":{"a":350000,"b":-1},"3":{"a":1000000,"b":-1},"4":{"a":500000,"b":-1},"5":{"a":700000,"b":450000}},"/items/rainbow_sword":{"0":{"a":295000,"b":265000},"1":{"a":280000,"b":-1},"3":{"a":295000,"b":-1},"4":{"a":310000,"b":-1},"5":{"a":450000,"b":195000},"6":{"a":1850000,"b":-1},"10":{"a":20000000,"b":-1},"20":{"a":-1,"b":700000}},"/items/ranged_coffee":{"0":{"a":760,"b":740}},"/items/ranger_necklace":{"0":{"a":9600000,"b":9000000},"1":{"a":13000000,"b":98000},"2":{"a":22500000,"b":1250000},"3":{"a":29000000,"b":25500000},"5":{"a":78000000,"b":-1},"6":{"a":-1,"b":350000}},"/items/red_culinary_hat":{"0":{"a":5200000,"b":4900000},"3":{"a":-1,"b":3100000},"5":{"a":6400000,"b":5600000},"6":{"a":7800000,"b":6200000},"7":{"a":13000000,"b":10000000},"8":{"a":16000000,"b":14500000},"9":{"a":34000000,"b":-1},"10":{"a":52000000,"b":47000000},"11":{"a":-1,"b":50000000},"12":{"a":150000000,"b":-1}},"/items/red_panda_fluff":{"0":{"a":520000,"b":500000}},"/items/red_tea_leaf":{"0":{"a":49,"b":48}},"/items/redwood_bow":{"0":{"a":310000,"b":295000},"1":{"a":290000,"b":43000},"2":{"a":-1,"b":43000},"3":{"a":620000,"b":-1},"5":{"a":860000,"b":43000},"7":{"a":5000000,"b":-1}},"/items/redwood_crossbow":{"0":{"a":265000,"b":230000},"1":{"a":240000,"b":-1},"2":{"a":250000,"b":-1},"3":{"a":270000,"b":-1},"4":{"a":310000,"b":-1},"5":{"a":410000,"b":50000},"6":{"a":1000000,"b":-1},"7":{"a":2150000,"b":170000},"10":{"a":24000000,"b":-1}},"/items/redwood_fire_staff":{"0":{"a":255000,"b":240000},"1":{"a":280000,"b":-1},"2":{"a":235000,"b":-1},"3":{"a":300000,"b":-1},"4":{"a":410000,"b":-1},"5":{"a":500000,"b":-1},"6":{"a":1300000,"b":-1}},"/items/redwood_log":{"0":{"a":40,"b":37}},"/items/redwood_lumber":{"0":{"a":980,"b":960}},"/items/redwood_nature_staff":{"0":{"a":250000,"b":205000},"1":{"a":275000,"b":100000},"2":{"a":275000,"b":100000},"3":{"a":320000,"b":100000},"4":{"a":360000,"b":-1},"5":{"a":480000,"b":98000}},"/items/redwood_shield":{"0":{"a":135000,"b":120000},"2":{"a":155000,"b":-1},"3":{"a":160000,"b":-1},"4":{"a":210000,"b":-1},"5":{"a":210000,"b":82000}},"/items/redwood_water_staff":{"0":{"a":235000,"b":210000},"1":{"a":250000,"b":-1},"5":{"a":620000,"b":-1},"6":{"a":840000,"b":-1}},"/items/regal_jewel":{"0":{"a":12000000,"b":11500000}},"/items/regal_sword":{"0":{"a":265000000,"b":250000000},"4":{"a":-1,"b":120000000},"5":{"a":-1,"b":260000000},"7":{"a":300000000,"b":280000000},"8":{"a":-1,"b":320000000},"9":{"a":-1,"b":50000000},"10":{"a":-1,"b":580000000},"12":{"a":1900000000,"b":1300000000}},"/items/rejuvenate":{"0":{"a":390000,"b":380000}},"/items/reptile_boots":{"0":{"a":9400,"b":8000},"2":{"a":29500,"b":-1},"4":{"a":68000,"b":-1}},"/items/reptile_bracers":{"0":{"a":9800,"b":8800},"1":{"a":25000,"b":-1},"2":{"a":90000,"b":-1},"3":{"a":180000,"b":-1},"5":{"a":185000,"b":64000}},"/items/reptile_chaps":{"0":{"a":16500,"b":13000},"2":{"a":94000,"b":-1},"3":{"a":10000000,"b":-1},"4":{"a":100000,"b":-1},"5":{"a":94000,"b":-1}},"/items/reptile_hide":{"0":{"a":13,"b":9}},"/items/reptile_hood":{"0":{"a":11500,"b":9000},"2":{"a":88000,"b":-1},"3":{"a":100000,"b":-1},"4":{"a":100000,"b":-1},"5":{"a":245000,"b":-1},"7":{"a":500000,"b":-1}},"/items/reptile_leather":{"0":{"a":400,"b":380}},"/items/reptile_tunic":{"0":{"a":15500,"b":12500},"1":{"a":110000,"b":-1},"2":{"a":120000,"b":-1},"3":{"a":215000,"b":-1},"5":{"a":-1,"b":70000}},"/items/revenant_anima":{"0":{"a":1100000,"b":1050000}},"/items/revenant_chaps":{"0":{"a":8200000,"b":6200000},"1":{"a":-1,"b":1150000},"2":{"a":-1,"b":920000},"3":{"a":-1,"b":1500000},"4":{"a":-1,"b":1700000},"5":{"a":9000000,"b":8400000},"6":{"a":10500000,"b":9400000},"7":{"a":17500000,"b":15500000},"8":{"a":29000000,"b":1950000},"10":{"a":62000000,"b":56000000},"12":{"a":130000000,"b":-1}},"/items/revenant_tunic":{"0":{"a":9800000,"b":5000000},"3":{"a":-1,"b":1150000},"5":{"a":9600000,"b":8800000},"6":{"a":13000000,"b":7600000},"7":{"a":24500000,"b":21000000},"8":{"a":30000000,"b":-1},"9":{"a":-1,"b":25500000},"10":{"a":64000000,"b":-1},"11":{"a":94000000,"b":-1},"12":{"a":105000000,"b":-1}},"/items/revive":{"0":{"a":1200000,"b":1100000}},"/items/ring_of_armor":{"0":{"a":6000000,"b":4200000},"1":{"a":-1,"b":230000},"3":{"a":-1,"b":270000},"4":{"a":50000000,"b":-1}},"/items/ring_of_critical_strike":{"0":{"a":7800000,"b":6800000},"1":{"a":9600000,"b":7800000},"2":{"a":13000000,"b":9400000},"3":{"a":19000000,"b":18000000},"4":{"a":-1,"b":20000000},"5":{"a":72000000,"b":62000000},"10":{"a":-1,"b":125000}},"/items/ring_of_essence_find":{"0":{"a":5400000,"b":5000000},"1":{"a":9800000,"b":20000},"2":{"a":11500000,"b":-1},"3":{"a":23000000,"b":310000}},"/items/ring_of_gathering":{"0":{"a":5400000,"b":4500000},"1":{"a":9200000,"b":210000},"2":{"a":-1,"b":205000},"4":{"a":36000000,"b":20000000},"5":{"a":-1,"b":40000000},"7":{"a":-1,"b":100000}},"/items/ring_of_rare_find":{"0":{"a":6800000,"b":6400000},"1":{"a":9000000,"b":7200000},"2":{"a":12000000,"b":9800000},"3":{"a":17000000,"b":13500000},"4":{"a":39000000,"b":30000000},"5":{"a":84000000,"b":50000000},"6":{"a":-1,"b":4400000},"7":{"a":-1,"b":120000000},"8":{"a":-1,"b":41000},"9":{"a":-1,"b":41000},"10":{"a":-1,"b":100000000},"20":{"a":-1,"b":420000}},"/items/ring_of_regeneration":{"0":{"a":6000000,"b":5800000},"1":{"a":-1,"b":6200000},"2":{"a":12000000,"b":9600000},"3":{"a":18500000,"b":16000000},"4":{"a":31000000,"b":28500000},"5":{"a":60000000,"b":58000000},"6":{"a":105000000,"b":86000000},"7":{"a":195000000,"b":165000000},"8":{"a":295000000,"b":30000000}},"/items/ring_of_resistance":{"0":{"a":5600000,"b":4900000},"1":{"a":8000000,"b":100000},"5":{"a":60000000,"b":-1}},"/items/rippling_trident":{"0":{"a":290000000,"b":280000000},"5":{"a":320000000,"b":200000000},"7":{"a":-1,"b":330000000},"8":{"a":430000000,"b":370000000},"10":{"a":680000000,"b":640000000},"11":{"a":1100000000,"b":-1},"12":{"a":2050000000,"b":1750000000}},"/items/robusta_coffee_bean":{"0":{"a":215,"b":205}},"/items/rough_boots":{"0":{"a":2500,"b":2450},"1":{"a":250000,"b":-1},"4":{"a":49000,"b":-1},"5":{"a":50000,"b":-1}},"/items/rough_bracers":{"0":{"a":2500,"b":2400},"1":{"a":47000,"b":-1},"2":{"a":74000,"b":-1},"5":{"a":100000,"b":-1},"12":{"a":-1,"b":2400000},"13":{"a":-1,"b":4800000},"14":{"a":-1,"b":8000000}},"/items/rough_chaps":{"0":{"a":4300,"b":3800},"1":{"a":30000,"b":-1},"3":{"a":98000,"b":-1}},"/items/rough_hide":{"0":{"a":46,"b":44}},"/items/rough_hood":{"0":{"a":3000,"b":2450},"1":{"a":56000,"b":-1},"3":{"a":100000,"b":-1},"4":{"a":6000000,"b":6400}},"/items/rough_leather":{"0":{"a":295,"b":285}},"/items/rough_tunic":{"0":{"a":4200,"b":3800},"1":{"a":100000,"b":-1},"2":{"a":130000,"b":-1},"3":{"a":48000,"b":-1},"5":{"a":140000,"b":-1},"8":{"a":500000,"b":-1}},"/items/royal_cloth":{"0":{"a":8200000,"b":8000000}},"/items/royal_fire_robe_bottoms":{"0":{"a":78000000,"b":64000000},"1":{"a":-1,"b":25000000},"2":{"a":-1,"b":5000000},"5":{"a":78000000,"b":74000000},"6":{"a":92000000,"b":-1},"7":{"a":98000000,"b":96000000},"8":{"a":170000000,"b":100000000},"9":{"a":-1,"b":215000000},"10":{"a":-1,"b":330000000},"12":{"a":1350000000,"b":1100000000}},"/items/royal_fire_robe_top":{"0":{"a":94000000,"b":82000000},"5":{"a":96000000,"b":90000000},"6":{"a":105000000,"b":90000000},"7":{"a":120000000,"b":115000000},"8":{"a":-1,"b":50000000},"9":{"a":-1,"b":245000000},"10":{"a":430000000,"b":390000000},"12":{"a":1450000000,"b":1350000000}},"/items/royal_nature_robe_bottoms":{"0":{"a":68000000,"b":66000000},"5":{"a":78000000,"b":70000000},"6":{"a":84000000,"b":-1},"7":{"a":96000000,"b":90000000},"8":{"a":140000000,"b":120000000},"9":{"a":215000000,"b":4000000},"10":{"a":370000000,"b":350000000},"12":{"a":1350000000,"b":1150000000}},"/items/royal_nature_robe_top":{"0":{"a":86000000,"b":76000000},"5":{"a":-1,"b":80000000},"6":{"a":105000000,"b":80000000},"7":{"a":115000000,"b":110000000},"8":{"a":160000000,"b":140000000},"9":{"a":-1,"b":4500000},"10":{"a":400000000,"b":360000000},"12":{"a":1600000000,"b":1250000000}},"/items/royal_water_robe_bottoms":{"0":{"a":74000000,"b":62000000},"1":{"a":72000000,"b":-1},"4":{"a":-1,"b":8400000},"5":{"a":90000000,"b":70000000},"6":{"a":84000000,"b":76000000},"7":{"a":98000000,"b":90000000},"8":{"a":135000000,"b":35000000},"10":{"a":380000000,"b":320000000},"12":{"a":1300000000,"b":-1}},"/items/royal_water_robe_top":{"0":{"a":88000000,"b":82000000},"1":{"a":-1,"b":11000000},"2":{"a":-1,"b":9800000},"4":{"a":-1,"b":9800000},"5":{"a":96000000,"b":84000000},"6":{"a":105000000,"b":86000000},"7":{"a":120000000,"b":115000000},"8":{"a":175000000,"b":125000000},"10":{"a":400000000,"b":390000000},"11":{"a":700000000,"b":-1},"12":{"a":1450000000,"b":1150000000}},"/items/scratch":{"0":{"a":3200,"b":3100}},"/items/shard_of_protection":{"0":{"a":60000,"b":58000}},"/items/shield_bash":{"0":{"a":40000,"b":39000}},"/items/shoebill_feather":{"0":{"a":66000,"b":64000}},"/items/shoebill_shoes":{"0":{"a":520000,"b":480000},"1":{"a":-1,"b":290000},"4":{"a":620000,"b":-1},"5":{"a":800000,"b":300000},"6":{"a":1950000,"b":-1},"7":{"a":2000000,"b":-1},"8":{"a":4800000,"b":-1},"9":{"a":5200000,"b":-1},"10":{"a":7800000,"b":7200000},"12":{"a":31000000,"b":16000000},"14":{"a":160000000,"b":50000000},"20":{"a":-1,"b":32000}},"/items/sighted_bracers":{"0":{"a":185000,"b":165000},"1":{"a":200000,"b":-1},"2":{"a":200000,"b":-1},"3":{"a":190000,"b":-1},"4":{"a":230000,"b":-1},"5":{"a":230000,"b":160000},"6":{"a":500000,"b":280000},"7":{"a":1350000,"b":760000},"8":{"a":2100000,"b":1650000},"9":{"a":4800000,"b":2300000},"10":{"a":6600000,"b":5800000},"11":{"a":16500000,"b":1050000},"12":{"a":27500000,"b":-1}},"/items/silencing_shot":{"0":{"a":145000,"b":140000}},"/items/silk_boots":{"0":{"a":47000,"b":46000},"1":{"a":82000,"b":-1},"2":{"a":76000,"b":-1},"3":{"a":195000,"b":50000},"4":{"a":340000,"b":-1},"5":{"a":380000,"b":100000},"6":{"a":580000,"b":-1},"7":{"a":600000,"b":-1},"10":{"a":25000000,"b":-1}},"/items/silk_fabric":{"0":{"a":1350,"b":1250}},"/items/silk_gloves":{"0":{"a":49000,"b":45000},"1":{"a":60000,"b":-1},"2":{"a":98000,"b":-1},"3":{"a":170000,"b":50000},"4":{"a":450000,"b":-1},"5":{"a":580000,"b":100000},"6":{"a":660000,"b":-1},"7":{"a":1200000,"b":-1},"10":{"a":2500000,"b":330000}},"/items/silk_hat":{"0":{"a":94000,"b":92000},"1":{"a":100000,"b":-1},"2":{"a":115000,"b":-1},"3":{"a":150000,"b":50000},"4":{"a":280000,"b":-1},"5":{"a":450000,"b":130000},"6":{"a":3500000,"b":-1},"7":{"a":5000000,"b":-1}},"/items/silk_robe_bottoms":{"0":{"a":140000,"b":130000},"1":{"a":150000,"b":-1},"2":{"a":200000,"b":-1},"3":{"a":185000,"b":-1},"4":{"a":300000,"b":-1},"5":{"a":490000,"b":-1},"6":{"a":600000,"b":-1},"7":{"a":680000,"b":-1},"8":{"a":7600000,"b":-1}},"/items/silk_robe_top":{"0":{"a":160000,"b":150000},"1":{"a":160000,"b":-1},"2":{"a":160000,"b":-1},"3":{"a":195000,"b":-1},"4":{"a":280000,"b":-1},"5":{"a":280000,"b":-1},"6":{"a":300000,"b":-1},"7":{"a":6600000,"b":-1}},"/items/sinister_chest_key":{"0":{"a":4200000,"b":4100000}},"/items/sinister_entry_key":{"0":{"a":390000,"b":380000}},"/items/sinister_essence":{"0":{"a":920,"b":900}},"/items/smack":{"0":{"a":3200,"b":3100}},"/items/small_pouch":{"0":{"a":15000,"b":14000},"1":{"a":21000,"b":-1},"2":{"a":50000,"b":-1},"3":{"a":130000,"b":-1},"4":{"a":100000,"b":-1},"5":{"a":115000,"b":-1},"6":{"a":700000,"b":-1}},"/items/smoke_burst":{"0":{"a":80000,"b":76000}},"/items/snail_shell":{"0":{"a":9400,"b":9000}},"/items/snail_shell_helmet":{"0":{"a":25500,"b":22500},"1":{"a":25500,"b":-1},"3":{"a":32000,"b":-1},"4":{"a":58000,"b":-1},"5":{"a":84000,"b":-1},"7":{"a":1000000,"b":-1},"8":{"a":2700000,"b":-1},"9":{"a":3000000,"b":-1},"10":{"a":5400000,"b":960000}},"/items/snake_fang":{"0":{"a":3100,"b":3000}},"/items/snake_fang_dirk":{"0":{"a":56000,"b":15000},"1":{"a":48000,"b":10000},"2":{"a":9600000,"b":-1},"3":{"a":31000,"b":-1},"5":{"a":84000,"b":27500},"6":{"a":130000,"b":-1},"7":{"a":620000,"b":-1},"8":{"a":740000,"b":-1},"9":{"a":2450000,"b":-1},"10":{"a":1000000,"b":760000},"11":{"a":94000000,"b":-1},"13":{"a":96000000,"b":5800000},"15":{"a":500000000,"b":-1},"16":{"a":2000000000,"b":-1}},"/items/sorcerer_boots":{"0":{"a":560000,"b":540000},"1":{"a":600000,"b":105000},"2":{"a":620000,"b":105000},"3":{"a":660000,"b":105000},"4":{"a":720000,"b":580000},"5":{"a":900000,"b":880000},"6":{"a":1400000,"b":1250000},"7":{"a":2200000,"b":2150000},"8":{"a":4400000,"b":3900000},"9":{"a":8000000,"b":6600000},"10":{"a":13000000,"b":12000000},"11":{"a":24000000,"b":21000000},"12":{"a":46000000,"b":44000000},"13":{"a":94000000,"b":-1},"14":{"a":185000000,"b":170000000},"15":{"a":390000000,"b":-1},"16":{"a":1100000000,"b":4400000},"17":{"a":-1,"b":1000000000}},"/items/sorcerer_essence":{"0":{"a":130,"b":125}},"/items/sorcerers_sole":{"0":{"a":110000,"b":105000}},"/items/soul_fragment":{"0":{"a":640000,"b":620000}},"/items/soul_hunter_crossbow":{"0":{"a":12500000,"b":11500000},"3":{"a":15500000,"b":4200000},"4":{"a":12500000,"b":-1},"5":{"a":13000000,"b":11500000},"6":{"a":14500000,"b":1050000},"7":{"a":17500000,"b":6000000},"8":{"a":22500000,"b":17500000},"9":{"a":48000000,"b":20500000},"10":{"a":56000000,"b":52000000},"12":{"a":-1,"b":190000000}},"/items/spaceberry":{"0":{"a":185,"b":180}},"/items/spaceberry_cake":{"0":{"a":1200,"b":1150}},"/items/spaceberry_donut":{"0":{"a":960,"b":940}},"/items/spacia_coffee_bean":{"0":{"a":540,"b":500}},"/items/speed_aura":{"0":{"a":2650000,"b":2550000}},"/items/spike_shell":{"0":{"a":56000,"b":48000}},"/items/spiked_bulwark":{"0":{"a":12000000,"b":10500000},"1":{"a":12500000,"b":1000000},"5":{"a":14500000,"b":13000000},"6":{"a":19000000,"b":-1},"7":{"a":-1,"b":17500000},"8":{"a":48000000,"b":2600000},"10":{"a":84000000,"b":40000000},"12":{"a":-1,"b":2900000}},"/items/stalactite_shard":{"0":{"a":640000,"b":620000}},"/items/stalactite_spear":{"0":{"a":13000000,"b":10500000},"5":{"a":14500000,"b":12500000},"10":{"a":60000000,"b":-1},"11":{"a":130000000,"b":12500000},"12":{"a":230000000,"b":-1},"14":{"a":500000000,"b":50000000}},"/items/stamina_coffee":{"0":{"a":430,"b":410}},"/items/star_fragment":{"0":{"a":11500,"b":11000}},"/items/star_fruit":{"0":{"a":360,"b":350}},"/items/star_fruit_gummy":{"0":{"a":960,"b":940}},"/items/star_fruit_yogurt":{"0":{"a":1150,"b":1100}},"/items/steady_shot":{"0":{"a":145000,"b":140000}},"/items/stone_key_fragment":{"0":{"a":1900000,"b":1850000}},"/items/strawberry":{"0":{"a":96,"b":94}},"/items/strawberry_cake":{"0":{"a":640,"b":620}},"/items/strawberry_donut":{"0":{"a":460,"b":420}},"/items/stunning_blow":{"0":{"a":145000,"b":140000}},"/items/sugar":{"0":{"a":11,"b":10}},"/items/sundering_crossbow":{"0":{"a":270000000,"b":250000000},"1":{"a":-1,"b":220000000},"2":{"a":-1,"b":220000000},"3":{"a":-1,"b":225000000},"4":{"a":-1,"b":225000000},"5":{"a":275000000,"b":245000000},"6":{"a":-1,"b":240000000},"7":{"a":300000000,"b":295000000},"8":{"a":370000000,"b":320000000},"9":{"a":-1,"b":380000000},"10":{"a":640000000,"b":620000000},"11":{"a":-1,"b":760000000},"12":{"a":1850000000,"b":1800000000},"13":{"a":-1,"b":1000000000},"14":{"a":-1,"b":2400000000},"15":{"a":-1,"b":20000000},"16":{"a":-1,"b":10000000},"17":{"a":-1,"b":10000000}},"/items/sundering_jewel":{"0":{"a":12000000,"b":11500000}},"/items/sunstone":{"0":{"a":520000,"b":500000}},"/items/super_alchemy_tea":{"0":{"a":3100,"b":3000}},"/items/super_attack_coffee":{"0":{"a":3300,"b":2950}},"/items/super_brewing_tea":{"0":{"a":2800,"b":2750}},"/items/super_cheesesmithing_tea":{"0":{"a":4100,"b":4000}},"/items/super_cooking_tea":{"0":{"a":2800,"b":2750}},"/items/super_crafting_tea":{"0":{"a":4200,"b":3700}},"/items/super_defense_coffee":{"0":{"a":2850,"b":2800}},"/items/super_enhancing_tea":{"0":{"a":4100,"b":4000}},"/items/super_foraging_tea":{"0":{"a":2050,"b":1850}},"/items/super_intelligence_coffee":{"0":{"a":2100,"b":2000}},"/items/super_magic_coffee":{"0":{"a":4000,"b":3900}},"/items/super_milking_tea":{"0":{"a":2050,"b":1850}},"/items/super_power_coffee":{"0":{"a":3800,"b":3700}},"/items/super_ranged_coffee":{"0":{"a":3900,"b":3800}},"/items/super_stamina_coffee":{"0":{"a":2150,"b":2100}},"/items/super_tailoring_tea":{"0":{"a":4200,"b":4100}},"/items/super_woodcutting_tea":{"0":{"a":2350,"b":2150}},"/items/swamp_essence":{"0":{"a":27,"b":25}},"/items/sweep":{"0":{"a":29000,"b":28000}},"/items/swiftness_coffee":{"0":{"a":1850,"b":1800}},"/items/sylvan_aura":{"0":{"a":2750000,"b":2600000}},"/items/tailoring_essence":{"0":{"a":150,"b":145}},"/items/tailoring_tea":{"0":{"a":640,"b":620}},"/items/tailors_bottoms":{"0":{"a":250000000,"b":82000000},"5":{"a":170000000,"b":140000000},"6":{"a":175000000,"b":-1},"7":{"a":190000000,"b":-1},"8":{"a":225000000,"b":-1}},"/items/tailors_top":{"0":{"a":-1,"b":50000000},"1":{"a":-1,"b":5600000},"5":{"a":150000000,"b":125000000},"6":{"a":155000000,"b":135000000},"7":{"a":170000000,"b":140000000}},"/items/taunt":{"0":{"a":60000,"b":58000}},"/items/thread_of_expertise":{"0":{"a":9200000,"b":9000000}},"/items/tome_of_healing":{"0":{"a":39000,"b":38000},"2":{"a":42000,"b":25000},"3":{"a":50000,"b":23500},"4":{"a":60000,"b":23500},"5":{"a":68000,"b":62000},"6":{"a":105000,"b":100000},"7":{"a":210000,"b":200000},"8":{"a":440000,"b":400000},"9":{"a":840000,"b":-1},"10":{"a":1700000,"b":1450000},"11":{"a":4900000,"b":2000000},"12":{"a":9000000,"b":5200000},"14":{"a":35000000,"b":17500000},"15":{"a":80000000,"b":12000000}},"/items/tome_of_the_elements":{"0":{"a":460000,"b":450000},"1":{"a":470000,"b":310000},"2":{"a":450000,"b":310000},"3":{"a":540000,"b":410000},"4":{"a":520000,"b":460000},"5":{"a":580000,"b":520000},"6":{"a":760000,"b":560000},"7":{"a":1000000,"b":860000},"8":{"a":1600000,"b":1500000},"9":{"a":4000000,"b":2000000},"10":{"a":9400000,"b":7800000},"11":{"a":20000000,"b":2000000},"12":{"a":45000000,"b":5800000},"15":{"a":200000000,"b":100000000}},"/items/toughness":{"0":{"a":62000,"b":60000}},"/items/toxic_pollen":{"0":{"a":155000,"b":150000}},"/items/treant_bark":{"0":{"a":28000,"b":27000}},"/items/treant_shield":{"0":{"a":135000,"b":130000},"1":{"a":-1,"b":90000},"2":{"a":195000,"b":92000},"3":{"a":165000,"b":96000},"4":{"a":200000,"b":100000},"5":{"a":190000,"b":125000},"6":{"a":450000,"b":150000},"7":{"a":580000,"b":-1},"8":{"a":840000,"b":-1},"9":{"a":2000000,"b":-1},"10":{"a":2550000,"b":1350000},"12":{"a":19500000,"b":-1}},"/items/turtle_shell":{"0":{"a":12000,"b":11000}},"/items/turtle_shell_body":{"0":{"a":46000,"b":44000},"1":{"a":50000,"b":-1},"2":{"a":78000,"b":36000},"3":{"a":170000,"b":-1},"4":{"a":500000,"b":50000},"5":{"a":125000,"b":-1},"6":{"a":-1,"b":90000}},"/items/turtle_shell_legs":{"0":{"a":44000,"b":31000},"1":{"a":40000,"b":-1},"2":{"a":56000,"b":-1},"3":{"a":92000,"b":-1},"4":{"a":105000,"b":-1},"5":{"a":150000,"b":-1}},"/items/twilight_essence":{"0":{"a":300,"b":295}},"/items/ultra_alchemy_tea":{"0":{"a":7000,"b":6600}},"/items/ultra_attack_coffee":{"0":{"a":11000,"b":9600}},"/items/ultra_brewing_tea":{"0":{"a":6800,"b":6600}},"/items/ultra_cheesesmithing_tea":{"0":{"a":8200,"b":8000}},"/items/ultra_cooking_tea":{"0":{"a":6800,"b":6600}},"/items/ultra_crafting_tea":{"0":{"a":8200,"b":8000}},"/items/ultra_defense_coffee":{"0":{"a":9800,"b":9600}},"/items/ultra_enhancing_tea":{"0":{"a":10000,"b":9800}},"/items/ultra_foraging_tea":{"0":{"a":6000,"b":5000}},"/items/ultra_intelligence_coffee":{"0":{"a":8600,"b":8000}},"/items/ultra_magic_coffee":{"0":{"a":11000,"b":10500}},"/items/ultra_milking_tea":{"0":{"a":6000,"b":5400}},"/items/ultra_power_coffee":{"0":{"a":11000,"b":10500}},"/items/ultra_ranged_coffee":{"0":{"a":11000,"b":10500}},"/items/ultra_stamina_coffee":{"0":{"a":9000,"b":8800}},"/items/ultra_tailoring_tea":{"0":{"a":8200,"b":8000}},"/items/ultra_woodcutting_tea":{"0":{"a":6200,"b":5800}},"/items/umbral_boots":{"0":{"a":115000,"b":100000},"1":{"a":150000,"b":-1},"2":{"a":295000,"b":-1},"3":{"a":410000,"b":-1},"4":{"a":500000,"b":-1},"5":{"a":800000,"b":-1}},"/items/umbral_bracers":{"0":{"a":165000,"b":150000},"1":{"a":165000,"b":-1},"2":{"a":500000,"b":-1},"3":{"a":250000,"b":-1},"4":{"a":900000,"b":-1},"5":{"a":-1,"b":600000},"7":{"a":2550000,"b":-1}},"/items/umbral_chaps":{"0":{"a":295000,"b":290000},"1":{"a":295000,"b":-1},"2":{"a":320000,"b":170000},"3":{"a":430000,"b":100000},"4":{"a":560000,"b":76000},"5":{"a":640000,"b":390000}},"/items/umbral_hide":{"0":{"a":76,"b":74}},"/items/umbral_hood":{"0":{"a":200000,"b":190000},"1":{"a":295000,"b":-1},"3":{"a":520000,"b":135000},"4":{"a":660000,"b":-1},"5":{"a":880000,"b":700000},"6":{"a":3500000,"b":-1},"8":{"a":-1,"b":2500000},"10":{"a":-1,"b":9000000}},"/items/umbral_leather":{"0":{"a":1350,"b":1300}},"/items/umbral_tunic":{"0":{"a":310000,"b":300000},"1":{"a":-1,"b":100000},"2":{"a":390000,"b":-1},"3":{"a":450000,"b":190000},"4":{"a":640000,"b":380000},"5":{"a":700000,"b":600000}},"/items/vampire_fang":{"0":{"a":640000,"b":620000}},"/items/vampire_fang_dirk":{"0":{"a":12500000,"b":10000000},"3":{"a":13500000,"b":1000000},"5":{"a":13500000,"b":12500000},"6":{"a":17500000,"b":-1},"7":{"a":21000000,"b":17500000},"8":{"a":31000000,"b":22500000},"10":{"a":78000000,"b":22000000},"12":{"a":-1,"b":120000000}},"/items/vampiric_bow":{"0":{"a":12000000,"b":9000000},"2":{"a":-1,"b":1650000},"3":{"a":-1,"b":1650000},"4":{"a":12000000,"b":1650000},"5":{"a":13500000,"b":5000000},"6":{"a":13500000,"b":-1},"7":{"a":13500000,"b":-1},"10":{"a":66000000,"b":20000000},"12":{"a":200000000,"b":19500000}},"/items/vampirism":{"0":{"a":58000,"b":56000}},"/items/verdant_alembic":{"0":{"a":12000,"b":11000},"1":{"a":1000000,"b":-1},"2":{"a":105000,"b":-1},"3":{"a":500000,"b":-1},"4":{"a":840000,"b":-1},"10":{"a":1400000,"b":-1}},"/items/verdant_boots":{"0":{"a":9600,"b":9000},"1":{"a":20500,"b":-1},"5":{"a":620000,"b":-1}},"/items/verdant_brush":{"0":{"a":12000,"b":9800},"1":{"a":520000,"b":-1},"5":{"a":190000,"b":-1},"6":{"a":10000000,"b":-1}},"/items/verdant_buckler":{"0":{"a":12000,"b":9400},"1":{"a":37000,"b":-1}},"/items/verdant_bulwark":{"0":{"a":12000,"b":9800},"1":{"a":300000,"b":-1},"2":{"a":10000000,"b":-1}},"/items/verdant_cheese":{"0":{"a":450,"b":440}},"/items/verdant_chisel":{"0":{"a":12500,"b":10500},"1":{"a":100000,"b":-1},"8":{"a":40000000,"b":-1}},"/items/verdant_enhancer":{"0":{"a":13000,"b":11000},"1":{"a":16000,"b":-1},"2":{"a":12500,"b":-1},"3":{"a":44000,"b":-1},"4":{"a":140000,"b":-1},"5":{"a":205000,"b":-1}},"/items/verdant_gauntlets":{"0":{"a":10000,"b":6000},"1":{"a":200000,"b":-1},"5":{"a":200000,"b":-1}},"/items/verdant_hammer":{"0":{"a":11500,"b":10500},"1":{"a":10000000,"b":-1}},"/items/verdant_hatchet":{"0":{"a":11500,"b":11000},"1":{"a":2200000,"b":-1},"2":{"a":100000,"b":-1},"5":{"a":200000,"b":-1}},"/items/verdant_helmet":{"0":{"a":12000,"b":9800},"1":{"a":16000,"b":-1},"2":{"a":42000000,"b":-1},"3":{"a":200000,"b":-1},"4":{"a":660000,"b":-1},"5":{"a":1550000,"b":800}},"/items/verdant_mace":{"0":{"a":20000,"b":15000},"1":{"a":4900000,"b":-1},"2":{"a":100000000000,"b":-1},"4":{"a":5800000,"b":-1},"5":{"a":1000000,"b":-1},"7":{"a":3800000,"b":-1}},"/items/verdant_milk":{"0":{"a":88,"b":84}},"/items/verdant_needle":{"0":{"a":13500,"b":10000},"1":{"a":10000000,"b":-1},"5":{"a":105000,"b":-1}},"/items/verdant_plate_body":{"0":{"a":16000,"b":15000},"1":{"a":27000,"b":-1},"2":{"a":34000,"b":8800},"5":{"a":98000,"b":800},"6":{"a":110000,"b":-1}},"/items/verdant_plate_legs":{"0":{"a":15500,"b":14500},"1":{"a":500000,"b":-1},"5":{"a":-1,"b":800}},"/items/verdant_pot":{"0":{"a":14000,"b":9400},"1":{"a":40000,"b":-1},"3":{"a":2150000,"b":-1}},"/items/verdant_shears":{"0":{"a":12500,"b":10000},"1":{"a":15500,"b":-1},"2":{"a":10000000,"b":-1}},"/items/verdant_spatula":{"0":{"a":12000,"b":8000},"2":{"a":21500000,"b":-1}},"/items/verdant_spear":{"0":{"a":17500,"b":14500},"1":{"a":18000000,"b":-1},"2":{"a":1350000,"b":-1},"3":{"a":4800000,"b":-1},"5":{"a":960000,"b":-1}},"/items/verdant_sword":{"0":{"a":19000,"b":16000},"1":{"a":500000,"b":-1},"2":{"a":9800000,"b":-1},"3":{"a":2800000,"b":-1},"5":{"a":185000,"b":-1},"6":{"a":-1,"b":720}},"/items/vision_helmet":{"0":{"a":140000,"b":100000},"1":{"a":140000,"b":-1},"2":{"a":140000,"b":-1},"3":{"a":150000,"b":-1},"4":{"a":-1,"b":110000},"5":{"a":300000,"b":76000},"6":{"a":440000,"b":150000},"7":{"a":800000,"b":580000},"8":{"a":2800000,"b":1000000},"10":{"a":-1,"b":6000000}},"/items/vision_shield":{"0":{"a":245000,"b":220000},"1":{"a":290000,"b":-1},"2":{"a":310000,"b":-1},"3":{"a":255000,"b":-1},"4":{"a":350000,"b":-1},"5":{"a":450000,"b":265000},"8":{"a":5200000,"b":-1},"10":{"a":28000000,"b":-1}},"/items/watchful_relic":{"0":{"a":3800000,"b":2850000},"1":{"a":4600000,"b":540000},"2":{"a":4400000,"b":460000},"4":{"a":4300000,"b":-1},"5":{"a":3800000,"b":3500000},"6":{"a":5200000,"b":500000},"7":{"a":6000000,"b":5000000},"8":{"a":18000000,"b":3000000},"9":{"a":24000000,"b":14000000},"10":{"a":-1,"b":25000000},"12":{"a":-1,"b":4000000}},"/items/water_strike":{"0":{"a":10000,"b":9800}},"/items/werewolf_claw":{"0":{"a":640000,"b":620000}},"/items/werewolf_slasher":{"0":{"a":12000000,"b":10000000},"1":{"a":12000000,"b":500000},"2":{"a":-1,"b":1400000},"3":{"a":11500000,"b":3000000},"4":{"a":-1,"b":4000000},"5":{"a":12000000,"b":11000000},"6":{"a":16000000,"b":-1},"7":{"a":19000000,"b":17500000},"8":{"a":25500000,"b":22000000},"9":{"a":78000000,"b":34000000},"10":{"a":66000000,"b":56000000},"12":{"a":230000000,"b":-1},"13":{"a":-1,"b":80000000}},"/items/wheat":{"0":{"a":29,"b":28}},"/items/white_key_fragment":{"0":{"a":1100000,"b":1050000}},"/items/wisdom_coffee":{"0":{"a":1250,"b":1200}},"/items/wisdom_tea":{"0":{"a":760,"b":720}},"/items/wizard_necklace":{"0":{"a":10500000,"b":9800000},"1":{"a":14000000,"b":11000000},"2":{"a":18000000,"b":17000000},"3":{"a":29000000,"b":27500000},"4":{"a":49000000,"b":440000},"5":{"a":96000000,"b":92000000},"6":{"a":-1,"b":98000000},"7":{"a":200000000,"b":145000000},"8":{"a":-1,"b":680000},"10":{"a":460000000,"b":-1}},"/items/woodcutting_essence":{"0":{"a":180,"b":175}},"/items/woodcutting_tea":{"0":{"a":520,"b":450}},"/items/wooden_bow":{"0":{"a":3800,"b":3500},"1":{"a":370000000,"b":2800},"2":{"a":10000000,"b":1300},"3":{"a":68000,"b":4200},"4":{"a":-1,"b":6400},"5":{"a":92000,"b":6400},"6":{"a":120000,"b":-1}},"/items/wooden_crossbow":{"0":{"a":4800,"b":3700},"1":{"a":34000,"b":-1},"3":{"a":80000,"b":-1},"4":{"a":98000,"b":-1},"5":{"a":90000,"b":-1},"8":{"a":660000,"b":-1}},"/items/wooden_fire_staff":{"0":{"a":4100,"b":3000},"1":{"a":9600000,"b":-1},"3":{"a":72000,"b":-1},"6":{"a":150,"b":-1}},"/items/wooden_nature_staff":{"0":{"a":3800,"b":3500},"1":{"a":9800000,"b":-1},"3":{"a":49000,"b":-1},"5":{"a":1200000,"b":-1}},"/items/wooden_shield":{"0":{"a":3200,"b":2050},"1":{"a":9800000,"b":-1},"2":{"a":9800000,"b":-1},"3":{"a":10000000,"b":-1}},"/items/wooden_water_staff":{"0":{"a":4700,"b":3400},"1":{"a":2500000,"b":580},"2":{"a":98000,"b":560},"5":{"a":195000,"b":430}},"/items/yogurt":{"0":{"a":115,"b":110}}},"timestamp":1751706566}`;
  1857.  
  1858. let isUsingExpiredMarketJson = false;
  1859. let reasonForUsingExpiredMarketJson = "";
  1860.  
  1861. let initData_characterSkills = null;
  1862. let initData_characterItems = null;
  1863. let initData_combatAbilities = null;
  1864. let initData_characterHouseRoomMap = null;
  1865. let initData_actionTypeDrinkSlotsMap = null;
  1866. let initData_actionDetailMap = null;
  1867. let initData_levelExperienceTable = null;
  1868. let initData_itemDetailMap = null;
  1869. let initData_actionCategoryDetailMap = null;
  1870. let initData_abilityDetailMap = null;
  1871. let initData_characterAbilities = null;
  1872. let initData_myMarketListings = null;
  1873.  
  1874. let currentActionsHridList = [];
  1875. let currentEquipmentMap = {};
  1876.  
  1877. if (localStorage.getItem("initClientData")) {
  1878. const obj = JSON.parse(localStorage.getItem("initClientData"));
  1879. console.log(obj);
  1880. GM_setValue("init_client_data", localStorage.getItem("initClientData"));
  1881.  
  1882. initData_actionDetailMap = obj.actionDetailMap;
  1883. initData_levelExperienceTable = obj.levelExperienceTable;
  1884. initData_itemDetailMap = obj.itemDetailMap;
  1885. initData_actionCategoryDetailMap = obj.actionCategoryDetailMap;
  1886. initData_abilityDetailMap = obj.abilityDetailMap;
  1887.  
  1888. for (const [key, value] of Object.entries(initData_itemDetailMap)) {
  1889. itemEnNameToHridMap[value.name] = key;
  1890. }
  1891. }
  1892.  
  1893. hookWS();
  1894.  
  1895. const currentApiVersion = 2;
  1896. const ApiVersion = localStorage.getItem("MWITools_marketAPI_ApiVersion");
  1897. if (!ApiVersion || parseInt(ApiVersion) < currentApiVersion) {
  1898. console.log("Clearing API cache due to ApiVersion update");
  1899. localStorage.setItem("MWITools_marketAPI_timestamp", JSON.stringify(0));
  1900. localStorage.setItem("MWITools_marketAPI_json", JSON.stringify(null));
  1901. localStorage.setItem("MWITools_marketAPI_ApiVersion", JSON.stringify(currentApiVersion));
  1902. }
  1903. fetchMarketJSON(true);
  1904.  
  1905. function hookWS() {
  1906. const dataProperty = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data");
  1907. const oriGet = dataProperty.get;
  1908.  
  1909. dataProperty.get = hookedGet;
  1910. Object.defineProperty(MessageEvent.prototype, "data", dataProperty);
  1911.  
  1912. function hookedGet() {
  1913. const socket = this.currentTarget;
  1914. if (!(socket instanceof WebSocket)) {
  1915. return oriGet.call(this);
  1916. }
  1917. if (socket.url.indexOf("api.milkywayidle.com/ws") <= -1 && socket.url.indexOf("api-test.milkywayidle.com/ws") <= -1) {
  1918. return oriGet.call(this);
  1919. }
  1920.  
  1921. const message = oriGet.call(this);
  1922. Object.defineProperty(this, "data", { value: message }); // Anti-loop
  1923.  
  1924. return handleMessage(message);
  1925. }
  1926. }
  1927.  
  1928. function handleMessage(message) {
  1929. let obj = JSON.parse(message);
  1930. if (obj && obj.type === "init_character_data") {
  1931. console.log(obj);
  1932. GM_setValue("init_character_data", message);
  1933.  
  1934. initData_characterSkills = obj.characterSkills;
  1935. initData_characterItems = obj.characterItems;
  1936. initData_characterHouseRoomMap = obj.characterHouseRoomMap;
  1937. initData_actionTypeDrinkSlotsMap = obj.actionTypeDrinkSlotsMap;
  1938. initData_characterAbilities = obj.characterAbilities;
  1939. initData_myMarketListings = obj.myMarketListings;
  1940. initData_combatAbilities = obj.combatUnit.combatAbilities;
  1941. currentActionsHridList = [...obj.characterActions];
  1942. if (settingsMap.totalActionTime.isTrue) {
  1943. showTotalActionTime();
  1944. }
  1945. waitForActionPanelParent();
  1946. if (settingsMap.skillbook.isTrue) {
  1947. waitForItemDict();
  1948. }
  1949. if (settingsMap.ThirdPartyLinks.isTrue) {
  1950. add3rdPartyLinks();
  1951. }
  1952. if (settingsMap.networth.isTrue) {
  1953. calculateNetworth();
  1954. }
  1955. for (const item of obj.characterItems) {
  1956. if (item.itemLocationHrid !== "/item_locations/inventory") {
  1957. currentEquipmentMap[item.itemLocationHrid] = item;
  1958. }
  1959. }
  1960. if (settingsMap.checkEquipment.isTrue) {
  1961. checkEquipment();
  1962. }
  1963. if (settingsMap.notifiEmptyAction.isTrue) {
  1964. notificate();
  1965. }
  1966. if (settingsMap.fillMarketOrderPrice.isTrue) {
  1967. waitForMarketOrders();
  1968. }
  1969. } else if (obj && obj.type === "init_client_data") {
  1970. console.log(obj);
  1971. GM_setValue("init_client_data", message);
  1972.  
  1973. initData_actionDetailMap = obj.actionDetailMap;
  1974. initData_levelExperienceTable = obj.levelExperienceTable;
  1975. initData_itemDetailMap = obj.itemDetailMap;
  1976. initData_actionCategoryDetailMap = obj.actionCategoryDetailMap;
  1977. initData_abilityDetailMap = obj.abilityDetailMap;
  1978.  
  1979. for (const [key, value] of Object.entries(initData_itemDetailMap)) {
  1980. itemEnNameToHridMap[value.name] = key;
  1981. }
  1982. } else if (obj && obj.type === "actions_updated") {
  1983. for (const action of obj.endCharacterActions) {
  1984. if (action.isDone === false) {
  1985. currentActionsHridList.push(action);
  1986. } else {
  1987. currentActionsHridList = currentActionsHridList.filter((o) => {
  1988. return o.id !== action.id;
  1989. });
  1990. }
  1991. }
  1992. if (settingsMap.checkEquipment.isTrue) {
  1993. checkEquipment();
  1994. }
  1995. if (settingsMap.notifiEmptyAction.isTrue) {
  1996. setTimeout(notificate, 1000);
  1997. }
  1998. if (settingsMap.showDamage.isTrue) {
  1999. if (currentActionsHridList.length === 0 || !currentActionsHridList[0].actionHrid.startsWith("/actions/combat/")) {
  2000. // Clear damage statistics panel
  2001. players = [];
  2002. monsters = [];
  2003. monstersHP = [];
  2004. playersMP = [];
  2005. startTime = null;
  2006. endTime = null;
  2007. totalDuration = 0;
  2008. totalDamage = new Array(players.length).fill(0);
  2009. monsterCounts = {};
  2010. monsterEvasion = {};
  2011. monsterHrids = {};
  2012. }
  2013. }
  2014. } else if (obj && obj.type === "action_completed") {
  2015. const action = obj.endCharacterAction;
  2016. if (action.isDone === false) {
  2017. for (const a of currentActionsHridList) {
  2018. if (a.id === action.id) {
  2019. a.currentCount = action.currentCount;
  2020. }
  2021. }
  2022. }
  2023. } else if (obj && obj.type === "battle_unit_fetched") {
  2024. if (settingsMap.battlePanel.isTrue) {
  2025. handleBattleSummary(obj);
  2026. }
  2027. } else if (obj && obj.type === "items_updated" && obj.endCharacterItems) {
  2028. for (const item of obj.endCharacterItems) {
  2029. if (item.itemLocationHrid !== "/item_locations/inventory") {
  2030. if (item.count === 0) {
  2031. currentEquipmentMap[item.itemLocationHrid] = null;
  2032. } else {
  2033. currentEquipmentMap[item.itemLocationHrid] = item;
  2034. }
  2035. }
  2036. }
  2037. if (settingsMap.checkEquipment.isTrue) {
  2038. checkEquipment();
  2039. }
  2040. } else if (obj && obj.type === "new_battle") {
  2041. GM_setValue("new_battle", message); // This is the only place to get other party members' equipted consumables.
  2042.  
  2043. if (settingsMap.showDamage.isTrue) {
  2044. if (startTime && endTime) {
  2045. totalDuration += (endTime - startTime) / 1000;
  2046. }
  2047. startTime = Date.now();
  2048. endTime = null;
  2049. monstersHP = obj.monsters.map((monster) => monster.currentHitpoints);
  2050. playersMP = obj.players.map((player) => player.currentManapoints);
  2051. if (!players || players.length === 0) {
  2052. players = obj.players;
  2053. }
  2054. const playerIndices = Object.keys(players);
  2055. playerIndices.forEach((userIndex) => {
  2056. players[userIndex].currentAction = players[userIndex].preparingAbilityHrid
  2057. ? players[userIndex].preparingAbilityHrid
  2058. : players[userIndex].isPreparingAutoAttack
  2059. ? "auto"
  2060. : "idle";
  2061. });
  2062. monsters = obj.monsters;
  2063. if (!totalDamage.length) {
  2064. totalDamage = new Array(players.length).fill(0);
  2065. }
  2066. // Accumulate monster counts and store evasion ratings by combat style
  2067. obj.monsters.forEach((monster) => {
  2068. const name = monster.name;
  2069. monsterHrids[name] = monster.hrid;
  2070. monsterCounts[name] = (monsterCounts[name] || 0) + 1;
  2071. if (!monsterEvasion[name]) {
  2072. monsterEvasion[name] = {};
  2073. }
  2074. players.forEach((player) => {
  2075. if (player.combatDetails && player.combatDetails.combatStats.combatStyleHrids) {
  2076. player.combatDetails.combatStats.combatStyleHrids.forEach((styleHrid) => {
  2077. const style = styleHrid.split("/").pop(); // Get the combat style (e.g., "ranged")
  2078. const evasionRating = monster.combatDetails[`${style}EvasionRating`];
  2079. monsterEvasion[name][player.name + "-" + style] = evasionRating;
  2080. });
  2081. }
  2082. });
  2083. });
  2084. }
  2085. } else if (obj && obj.type === "profile_shared") {
  2086. let profileExportListString = GM_getValue("profile_export_list", null);
  2087. let profileExportList = null;
  2088. // Remove invalid
  2089. // GM_setValue("profile_export_list", JSON.stringify(new Array())); // Remove stored profiles. Only for testing.
  2090. if (profileExportListString) {
  2091. profileExportList = JSON.parse(profileExportListString);
  2092. if (!profileExportList || !profileExportList.filter) {
  2093. console.error("Found invalid profileExportList in store. profileExportList cleared.");
  2094. GM_setValue("profile_export_list", JSON.stringify(new Array()));
  2095. }
  2096. } else {
  2097. GM_setValue("profile_export_list", JSON.stringify(new Array()));
  2098. }
  2099.  
  2100. obj.characterID = obj.profile.characterSkills[0].characterID;
  2101. obj.characterName = obj.profile.sharableCharacter.name;
  2102. obj.timestamp = Date.now();
  2103.  
  2104. profileExportListString = GM_getValue("profile_export_list", null) || JSON.stringify(new Array());
  2105. profileExportList = JSON.parse(profileExportListString);
  2106. profileExportList = profileExportList.filter((item) => item.characterID !== obj.characterID);
  2107. profileExportList.unshift(obj);
  2108. if (profileExportList.length > 20) {
  2109. profileExportList.pop();
  2110. }
  2111. // console.log(profileExportList);
  2112. GM_setValue("profile_export_list", JSON.stringify(profileExportList));
  2113.  
  2114. addExportButton(obj);
  2115.  
  2116. if (settingsMap.profileBuildScore.isTrue) {
  2117. showBuildScoreOnProfile(obj);
  2118. }
  2119. } else if (obj && obj.type === "battle_updated" && monstersHP.length) {
  2120. if (settingsMap.showDamage.isTrue) {
  2121. const mMap = obj.mMap;
  2122. const pMap = obj.pMap;
  2123. const playerIndices = Object.keys(obj.pMap);
  2124.  
  2125. // Decide which player cast a spell by MP decrease.
  2126. let castPlayer = -1;
  2127. playerIndices.forEach((userIndex) => {
  2128. if (pMap[userIndex].cMP < playersMP[userIndex]) {
  2129. castPlayer = userIndex;
  2130. }
  2131. playersMP[userIndex] = pMap[userIndex].cMP;
  2132. });
  2133.  
  2134. monstersHP.forEach((mHP, mIndex) => {
  2135. const monster = mMap[mIndex];
  2136. if (monster) {
  2137. const hpDiff = mHP - monster.cHP;
  2138. monstersHP[mIndex] = monster.cHP;
  2139. if (hpDiff > 0) {
  2140. if (playerIndices.length > 1) {
  2141. // Damage is resulted by ManaSpring or Bloom from one of the players.
  2142. playerIndices.forEach((userIndex) => {
  2143. if (userIndex === castPlayer) {
  2144. if (!players[userIndex].damageMap) {
  2145. players[userIndex].damageMap = new Map();
  2146. }
  2147. players[userIndex].damageMap.set(
  2148. players[userIndex].currentAction,
  2149. players[userIndex].damageMap.has(players[userIndex].currentAction)
  2150. ? players[userIndex].damageMap.get(players[userIndex].currentAction) + hpDiff
  2151. : hpDiff
  2152. );
  2153. totalDamage[userIndex] += hpDiff;
  2154. }
  2155. });
  2156. } else {
  2157. if (!players[playerIndices[0]].damageMap) {
  2158. players[playerIndices[0]].damageMap = new Map();
  2159. }
  2160. players[playerIndices[0]].damageMap.set(
  2161. players[playerIndices[0]].currentAction,
  2162. players[playerIndices[0]].damageMap.has(players[playerIndices[0]].currentAction)
  2163. ? players[playerIndices[0]].damageMap.get(players[playerIndices[0]].currentAction) + hpDiff
  2164. : hpDiff
  2165. );
  2166. totalDamage[playerIndices[0]] += hpDiff;
  2167. }
  2168. }
  2169. }
  2170. });
  2171.  
  2172. playerIndices.forEach((userIndex) => {
  2173. players[userIndex].currentAction = pMap[userIndex].abilityHrid
  2174. ? pMap[userIndex].abilityHrid
  2175. : pMap[userIndex].isAutoAtk
  2176. ? "auto"
  2177. : "idle";
  2178. });
  2179. endTime = Date.now();
  2180. updateStatisticsPanel();
  2181. }
  2182. }
  2183. return message;
  2184. }
  2185.  
  2186. /* 计算Networth */
  2187. async function calculateNetworth() {
  2188. const marketAPIJson = await fetchMarketJSON();
  2189. if (!marketAPIJson) {
  2190. console.error("calculateNetworth marketAPIJson is null");
  2191. return;
  2192. }
  2193.  
  2194. let networthAsk = 0;
  2195. let networthBid = 0;
  2196. let marketListingsNetworthAsk = 0;
  2197. let marketListingsNetworthBid = 0;
  2198. let equippedNetworthAsk = 0;
  2199. let equippedNetworthBid = 0;
  2200. let inventoryNetworthAsk = 0;
  2201. let inventoryNetworthBid = 0;
  2202.  
  2203. for (const item of initData_characterItems) {
  2204. const enhanceLevel = item.enhancementLevel;
  2205. const marketPrices = marketAPIJson.marketData[item.itemHrid];
  2206.  
  2207. if (enhanceLevel && enhanceLevel > 1) {
  2208. input_data.item_hrid = item.itemHrid;
  2209. input_data.stop_at = enhanceLevel;
  2210. const best = await findBestEnhanceStrat(input_data);
  2211. let totalCost = best?.totalCost;
  2212. totalCost = totalCost ? Math.round(totalCost) : 0;
  2213. if (item.itemLocationHrid !== "/item_locations/inventory") {
  2214. equippedNetworthAsk += item.count * (totalCost > 0 ? totalCost : 0);
  2215. equippedNetworthBid += item.count * (totalCost > 0 ? totalCost : 0);
  2216. } else {
  2217. inventoryNetworthAsk += item.count * (totalCost > 0 ? totalCost : 0);
  2218. inventoryNetworthBid += item.count * (totalCost > 0 ? totalCost : 0);
  2219. }
  2220. } else if (marketPrices && marketPrices[0]) {
  2221. if (item.itemLocationHrid !== "/item_locations/inventory") {
  2222. equippedNetworthAsk += item.count * (marketPrices[0].a > 0 ? marketPrices[0].a : 0);
  2223. equippedNetworthBid += item.count * (marketPrices[0].b > 0 ? marketPrices[0].b : 0);
  2224. } else {
  2225. inventoryNetworthAsk += item.count * (marketPrices[0].a > 0 ? marketPrices[0].a : 0);
  2226. inventoryNetworthBid += item.count * (marketPrices[0].b > 0 ? marketPrices[0].b : 0);
  2227. }
  2228. } else {
  2229. console.log("calculateNetworth cannot find price of " + item.itemHrid);
  2230. }
  2231. }
  2232.  
  2233. for (const item of initData_myMarketListings) {
  2234. const quantity = item.orderQuantity - item.filledQuantity;
  2235. const enhancementLevel = item.enhancementLevel;
  2236. const marketPrices = marketAPIJson.marketData[item.itemHrid];
  2237. if (!marketPrices || !marketPrices[0]) {
  2238. console.log("calculateNetworth cannot get marketPrices of " + item.itemHrid);
  2239. return;
  2240. }
  2241. if (item.isSell) {
  2242. if (item.itemHrid === "/items/bag_of_10_cowbells") {
  2243. marketPrices[0].a *= 1 - 18 / 100;
  2244. marketPrices[0].b *= 1 - 18 / 100;
  2245. } else {
  2246. marketPrices[0].a *= 1 - 2 / 100;
  2247. marketPrices[0].b *= 1 - 2 / 100;
  2248. }
  2249. if (!enhancementLevel || enhancementLevel <= 1) {
  2250. marketListingsNetworthAsk += quantity * (marketPrices[0].a > 0 ? marketPrices[0].a : 0);
  2251. marketListingsNetworthBid += quantity * (marketPrices[0].b > 0 ? marketPrices[0].b : 0);
  2252. } else {
  2253. input_data.item_hrid = item.itemHrid;
  2254. input_data.stop_at = enhancementLevel;
  2255. const best = await findBestEnhanceStrat(input_data);
  2256. let totalCost = best?.totalCost;
  2257. totalCost = totalCost ? Math.round(totalCost) : 0;
  2258. marketListingsNetworthAsk += quantity * (totalCost > 0 ? totalCost : 0);
  2259. marketListingsNetworthBid += quantity * (totalCost > 0 ? totalCost : 0);
  2260. }
  2261. marketListingsNetworthAsk += item.unclaimedCoinCount;
  2262. marketListingsNetworthBid += item.unclaimedCoinCount;
  2263. } else {
  2264. marketListingsNetworthAsk += quantity * item.price;
  2265. marketListingsNetworthBid += quantity * item.price;
  2266. marketListingsNetworthAsk += item.unclaimedItemCount * (marketPrices[0].a > 0 ? marketPrices[0].a : 0);
  2267. marketListingsNetworthBid += item.unclaimedItemCount * (marketPrices[0].b > 0 ? marketPrices[0].b : 0);
  2268. }
  2269. }
  2270.  
  2271. networthAsk = equippedNetworthAsk + inventoryNetworthAsk + marketListingsNetworthAsk;
  2272. networthBid = equippedNetworthBid + inventoryNetworthBid + marketListingsNetworthBid;
  2273.  
  2274. /* 仓库搜索栏下方显示人物总结 */
  2275. // Some code of networth summery is by Stella.
  2276. const addInventorySummery = async (invElem) => {
  2277. const [battleHouseScore, nonBattleHouseScore, abilityScore, equipmentScore] = await getSelfBuildScores(
  2278. equippedNetworthAsk * 0.5 + equippedNetworthBid * 0.5
  2279. );
  2280. const totalScore = battleHouseScore + abilityScore + equipmentScore;
  2281. const totalHouseScore = battleHouseScore + nonBattleHouseScore;
  2282. const totalNetworth = networthAsk * 0.5 + networthBid * 0.5 + (totalHouseScore + abilityScore) * 1000000;
  2283.  
  2284. invElem.insertAdjacentHTML(
  2285. "beforebegin",
  2286. `<div style="text-align: left; color: ${SCRIPT_COLOR_MAIN}; font-size: 14px;">
  2287. <!-- 战力打造分 -->
  2288. <div style="cursor: pointer; font-weight: bold" id="toggleScores">${
  2289. isZH ? "+ 战力打造分: " : "+ Character Build Score: "
  2290. }${totalScore.toFixed(1)}</div>
  2291. <div id="buildScores" style="display: none; margin-left: 20px;">
  2292. <div>${isZH ? "房子分:" : "House score: "}${battleHouseScore.toFixed(1)}</div>
  2293. <div>${isZH ? "技能分:" : "Ability score: "}${abilityScore.toFixed(1)}</div>
  2294. <div>${isZH ? "装备分:" : "Equipment score: "}${equipmentScore.toFixed(1)}</div>
  2295. </div>
  2296.  
  2297. <!-- NetWorth -->
  2298. <div style="cursor: pointer; font-weight: bold;" id="toggleNetWorth">
  2299. ${isZH ? "+ 总NetWorth:" : "+ Total NetWorth: "}${numberFormatter(totalNetworth)}
  2300. </div>
  2301.  
  2302. <div id="netWorthDetails" style="display: none; margin-left: 20px;">
  2303. <!-- 流动资产 -->
  2304. <div style="cursor: pointer;" id="toggleCurrentAssets">
  2305. ${isZH ? "+ 流动资产价值" : "+ Current assets value"}
  2306. </div>
  2307. <div id="currentAssets" style="display: none; margin-left: 20px;">
  2308. <div>${isZH ? "装备价值:" : "Equipment value: "}${numberFormatter(equippedNetworthAsk)}</div>
  2309. <div>${isZH ? "库存价值:" : "Inventory value: "}${numberFormatter(inventoryNetworthAsk)}</div>
  2310. <div>${isZH ? "订单价值:" : "Market listing value: "}${numberFormatter(marketListingsNetworthAsk)}</div>
  2311. </div>
  2312.  
  2313. <!-- 非流动资产 -->
  2314. <div style="cursor: pointer;" id="toggleNonCurrentAssets">
  2315. ${isZH ? "+ 非流动资产价值" : "+ Fixed assets value"}
  2316. </div>
  2317. <div id="nonCurrentAssets" style="display: none; margin-left: 20px;">
  2318. <div>${isZH ? "房子价值:" : "Houses value: "}${numberFormatter(totalHouseScore * 1000000)}</div>
  2319. <div>${isZH ? "技能价值:" : "Abilities value: "}${numberFormatter(abilityScore * 1000000)}</div>
  2320. </div>
  2321. </div>
  2322. </div>`
  2323. );
  2324.  
  2325. // 监听点击事件,控制折叠和展开
  2326. const toggleScores = document.getElementById("toggleScores");
  2327. const ScoreDetails = document.getElementById("buildScores");
  2328. const toggleButton = document.getElementById("toggleNetWorth");
  2329. const netWorthDetails = document.getElementById("netWorthDetails");
  2330. const toggleCurrentAssets = document.getElementById("toggleCurrentAssets");
  2331. const currentAssets = document.getElementById("currentAssets");
  2332. const toggleNonCurrentAssets = document.getElementById("toggleNonCurrentAssets");
  2333. const nonCurrentAssets = document.getElementById("nonCurrentAssets");
  2334.  
  2335. toggleScores.addEventListener("click", () => {
  2336. const isCollapsed = ScoreDetails.style.display === "none";
  2337. ScoreDetails.style.display = isCollapsed ? "block" : "none";
  2338. toggleScores.textContent = (isCollapsed ? "↓ " : "+ ") + (isZH ? "战力打造分: " : "Character Build Score: ") + totalScore.toFixed(1);
  2339. });
  2340.  
  2341. toggleButton.addEventListener("click", () => {
  2342. const isCollapsed = netWorthDetails.style.display === "none";
  2343. netWorthDetails.style.display = isCollapsed ? "block" : "none";
  2344. toggleButton.textContent =
  2345. (isCollapsed ? "↓ " : "+ ") + (isZH ? "总NetWorth:" : "Total NetWorth: ") + numberFormatter(totalNetworth);
  2346. currentAssets.style.display = isCollapsed ? "block" : "none";
  2347. toggleCurrentAssets.textContent = (isCollapsed ? "↓ " : "+ ") + (isZH ? "流动资产价值" : "Current assets value");
  2348. nonCurrentAssets.style.display = isCollapsed ? "block" : "none";
  2349. toggleNonCurrentAssets.textContent = (isCollapsed ? "↓ " : "+ ") + (isZH ? "非流动资产价值" : "Fixed assets value");
  2350. });
  2351.  
  2352. toggleCurrentAssets.addEventListener("click", () => {
  2353. const isCollapsed = currentAssets.style.display === "none";
  2354. currentAssets.style.display = isCollapsed ? "block" : "none";
  2355. toggleCurrentAssets.textContent = (isCollapsed ? "↓ " : "+ ") + (isZH ? "流动资产价值" : "Current assets value");
  2356. });
  2357.  
  2358. toggleNonCurrentAssets.addEventListener("click", () => {
  2359. const isCollapsed = nonCurrentAssets.style.display === "none";
  2360. nonCurrentAssets.style.display = isCollapsed ? "block" : "none";
  2361. toggleNonCurrentAssets.textContent = (isCollapsed ? "↓ " : "+ ") + (isZH ? "非流动资产价值" : "Fixed assets value");
  2362. });
  2363. };
  2364.  
  2365. const waitForHeader = () => {
  2366. const targetNode = document.querySelector("div.Header_totalLevel__8LY3Q");
  2367. if (targetNode) {
  2368. targetNode.insertAdjacentHTML(
  2369. "afterend",
  2370. `<div style="font-size: 13px; font-weight: 500; color: ${SCRIPT_COLOR_MAIN}; text-wrap: nowrap;">Current Assets: ${numberFormatter(
  2371. networthAsk
  2372. )} / ${numberFormatter(networthBid)}${`<div id="script_api_fail_alert" style="color: ${SCRIPT_COLOR_ALERT};">${
  2373. isZH ? "无法从API更新市场数据" : "Can't update market prices"
  2374. }</div>`}</div>`
  2375. );
  2376.  
  2377. const alertDiv = document.querySelector("div#script_api_fail_alert");
  2378. if (alertDiv) {
  2379. alertDiv.style.cursor = "pointer";
  2380. alertDiv.addEventListener("click", () => {
  2381. showApiFailAlertPopup();
  2382. });
  2383.  
  2384. if (isUsingExpiredMarketJson && settingsMap.networkAlert.isTrue) {
  2385. alertDiv.style.display = "block";
  2386. } else {
  2387. alertDiv.style.display = "none";
  2388. }
  2389. }
  2390.  
  2391. document.body.insertAdjacentHTML(
  2392. "beforeend",
  2393. `<div id="script_api_fail_popout" style="display: none; position: absolute; top: 50px; left: 0; padding: 10px; background: white; border: 1px solid black; box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.2); border-radius: 8px; white-space: pre-wrap;"></div>`
  2394. );
  2395.  
  2396. const popout = document.querySelector("#script_api_fail_popout");
  2397. if (popout) {
  2398. popout.addEventListener("click", function () {
  2399. const popout = document.querySelector("#script_api_fail_popout");
  2400. popout.style.display = popout.style.display === "block" ? "none" : "block";
  2401. });
  2402. }
  2403. } else {
  2404. setTimeout(waitForHeader, 200);
  2405. }
  2406. };
  2407. waitForHeader();
  2408.  
  2409. function showApiFailAlertPopup() {
  2410. console.log(reasonForUsingExpiredMarketJson);
  2411. const popout = document.querySelector("#script_api_fail_popout");
  2412. if (popout) {
  2413. popout.textContent = reasonForUsingExpiredMarketJson;
  2414. popout.style.display = "block";
  2415. }
  2416. }
  2417.  
  2418. const waitForInv = () => {
  2419. const targetNodes = document.querySelectorAll("div.Inventory_items__6SXv0");
  2420. for (const node of targetNodes) {
  2421. if (settingsMap.invWorth.isTrue) {
  2422. if (!node.classList.contains("script_buildScore_added")) {
  2423. node.classList.add("script_buildScore_added");
  2424. addInventorySummery(node);
  2425. }
  2426. }
  2427. if (settingsMap.invSort.isTrue) {
  2428. if (!node.classList.contains("script_invSort_added")) {
  2429. node.classList.add("script_invSort_added");
  2430. addInvSortButton(node);
  2431. }
  2432. }
  2433. }
  2434. setTimeout(waitForInv, 1000);
  2435. };
  2436. waitForInv();
  2437. }
  2438.  
  2439. /* 仓库物品排序 */
  2440. // by daluo, bot7420
  2441. async function addInvSortButton(invElem) {
  2442. const price_data = await fetchMarketJSON();
  2443. if (!price_data || !price_data.marketData) {
  2444. console.error("addInvSortButton fetchMarketJSON null");
  2445. return;
  2446. }
  2447.  
  2448. const askButton = `<button
  2449. id="script_sortByAsk_btn"
  2450. style="border-radius: 3px; background-color: ${SCRIPT_COLOR_MAIN}; color: black;">
  2451. ${isZH ? "出售价" : "Ask"}
  2452. </button>`;
  2453. const bidButton = `<button
  2454. id="script_sortByBid_btn"
  2455. style="border-radius: 3px; background-color: ${SCRIPT_COLOR_MAIN}; color: black;">
  2456. ${isZH ? "收购价" : "Bid"}
  2457. </button>`;
  2458. const noneButton = `<button
  2459. id="script_sortByNone_btn"
  2460. style="border-radius: 3px; background-color: ${SCRIPT_COLOR_MAIN}; color: black;">
  2461. ${isZH ? "无" : "None"}
  2462. </button>`;
  2463. const buttonsDiv = `<div style="color: ${SCRIPT_COLOR_MAIN}; font-size: 14px; text-align: left; ">${
  2464. isZH ? "物品排序:" : "Sort items by: "
  2465. }${askButton} ${bidButton} ${noneButton}</div>`;
  2466. invElem.insertAdjacentHTML("beforebegin", buttonsDiv);
  2467.  
  2468. invElem.parentElement.querySelector("button#script_sortByAsk_btn").addEventListener("click", function (e) {
  2469. sortItemsBy("ask");
  2470. });
  2471. invElem.parentElement.querySelector("button#script_sortByBid_btn").addEventListener("click", function (e) {
  2472. sortItemsBy("bid");
  2473. });
  2474. invElem.parentElement.querySelector("button#script_sortByNone_btn").addEventListener("click", function (e) {
  2475. sortItemsBy("none");
  2476. });
  2477.  
  2478. const sortItemsBy = (order) => {
  2479. for (const typeDiv of invElem.children) {
  2480. const typeName = getOriTextFromElement(typeDiv.getElementsByClassName("Inventory_categoryButton__35s1x")[0]);
  2481. const notNeedSortTypes = ["Loots", "Currencies", "Equipment"];
  2482. if (notNeedSortTypes.includes(typeName)) {
  2483. continue;
  2484. }
  2485.  
  2486. typeDiv.querySelector(".Inventory_label__XEOAx").style.order = Number.MIN_SAFE_INTEGER;
  2487.  
  2488. const itemElems = typeDiv.querySelectorAll(".Item_itemContainer__x7kH1");
  2489. for (const itemElem of itemElems) {
  2490. let itemName = itemElem.querySelector("svg").attributes["aria-label"].value;
  2491. if (isZHInGameSetting) {
  2492. itemName = getItemEnNameFromZhName(itemName);
  2493. }
  2494. const itemHrid = itemEnNameToHridMap[itemName];
  2495. let itemCount = itemElem.querySelector(".Item_count__1HVvv").innerText;
  2496. itemCount = Number(itemCount.toLowerCase().replaceAll("k", "000").replaceAll("m", "000000"));
  2497. const askPrice =
  2498. price_data.marketData[itemHrid] && price_data.marketData[itemHrid][0].a > 0 ? price_data.marketData[itemHrid][0].a : 0;
  2499. const bidPrice =
  2500. price_data.marketData[itemHrid] && price_data.marketData[itemHrid][0].b > 0 ? price_data.marketData[itemHrid][0].b : 0;
  2501. const itemAskmWorth = askPrice * itemCount;
  2502. const itemBidWorth = bidPrice * itemCount;
  2503.  
  2504. // 价格角标
  2505. if (!itemElem.querySelector("#script_stack_price")) {
  2506. itemElem.style.position = "relative";
  2507. const priceElemHTML = `<div
  2508. id="script_stack_price"
  2509. style="z-index: 1; position: absolute; top: 2px; left: 2px; text-align: left;">
  2510. </div>`;
  2511. itemElem.querySelector(".Item_item__2De2O.Item_clickable__3viV6").insertAdjacentHTML("beforeend", priceElemHTML);
  2512. }
  2513. const priceElem = itemElem.querySelector("#script_stack_price");
  2514.  
  2515. // 排序
  2516. if (order === "ask") {
  2517. itemElem.style.order = -itemAskmWorth;
  2518. priceElem.textContent = numberFormatter(itemAskmWorth);
  2519. } else if (order === "bid") {
  2520. itemElem.style.order = -itemBidWorth;
  2521. priceElem.textContent = numberFormatter(itemBidWorth);
  2522. } else if (order === "none") {
  2523. itemElem.style.order = 0;
  2524. priceElem.textContent = "";
  2525. }
  2526. }
  2527. }
  2528. };
  2529. }
  2530.  
  2531. /* 计算打造分 */
  2532. // BuildScore algorithm by Ratatatata (https://greasyfork.org/zh-CN/scripts/511240)
  2533. async function getSelfBuildScores(equippedNetworth) {
  2534. // 房子分:战斗相关房子升级所需总金币
  2535. const battleHouses = ["dining_room", "library", "dojo", "gym", "armory", "archery_range", "mystical_study"];
  2536. let battleHouseScore = 0;
  2537. let nonBattleHouseScore = 0;
  2538. for (const key in initData_characterHouseRoomMap) {
  2539. if (battleHouses.some((house) => initData_characterHouseRoomMap[key].houseRoomHrid.includes(house))) {
  2540. battleHouseScore += (await getHouseFullBuildPrice(initData_characterHouseRoomMap[key])) / 1000000;
  2541. } else {
  2542. nonBattleHouseScore += (await getHouseFullBuildPrice(initData_characterHouseRoomMap[key])) / 1000000;
  2543. }
  2544. }
  2545.  
  2546. // 技能分:当前使用的战斗技能所需技能书总价,单位M
  2547. let abilityScore = 0;
  2548. try {
  2549. abilityScore = await calculateAbilityScore();
  2550. } catch (error) {
  2551. console.error("Error in calculateAbilityScore()", error);
  2552. }
  2553. // console.log("abilityScore " + abilityScore);
  2554.  
  2555. // 装备分:当前身上装备总价,单位M
  2556. let equipmentScore = equippedNetworth / 1000000;
  2557. // console.log("equipmentScore " + equipmentScore);
  2558.  
  2559. return [battleHouseScore, nonBattleHouseScore, abilityScore, equipmentScore];
  2560. }
  2561.  
  2562. // 计算单个房子完整造价
  2563. async function getHouseFullBuildPrice(house) {
  2564. const marketAPIJson = await fetchMarketJSON();
  2565. if (!marketAPIJson) {
  2566. return 0;
  2567. }
  2568. const clientObj = JSON.parse(GM_getValue("init_client_data", ""));
  2569.  
  2570. const upgradeCostsMap = clientObj.houseRoomDetailMap[house.houseRoomHrid].upgradeCostsMap;
  2571. const level = house.level;
  2572.  
  2573. let cost = 0;
  2574. for (let i = 1; i <= level; i++) {
  2575. for (const item of upgradeCostsMap[i]) {
  2576. const marketPrices = marketAPIJson.marketData[item.itemHrid];
  2577. if (marketPrices && marketPrices[0]) {
  2578. cost += item.count * getWeightedMarketPrice(marketPrices);
  2579. } else {
  2580. console.log("getHouseFullBuildPrice cannot find price of " + item.itemHrid);
  2581. }
  2582. }
  2583. }
  2584. return cost;
  2585. }
  2586.  
  2587. function getWeightedMarketPrice(marketPrices, ratio = 0.5) {
  2588. let ask = marketPrices[0].a;
  2589. let bid = marketPrices[0].b;
  2590. if (ask > 0 && bid < 0) {
  2591. bid = ask;
  2592. }
  2593. if (bid > 0 && ask < 0) {
  2594. ask = bid;
  2595. }
  2596. const weightedPrice = ask * ratio + bid * (1 - ratio);
  2597. return weightedPrice;
  2598. }
  2599.  
  2600. // 技能价格计算
  2601. async function calculateAbilityScore() {
  2602. const marketAPIJson = await fetchMarketJSON();
  2603. if (!marketAPIJson) {
  2604. return 0;
  2605. }
  2606. let exp_50_skill = ["poke", "scratch", "smack", "quick_shot", "water_strike", "fireball", "entangle", "minor_heal"];
  2607. const getNeedBooksToLevel = (targetLevel, abilityPerBookExp) => {
  2608. const needExp = initData_levelExperienceTable[targetLevel];
  2609. let needBooks = needExp / abilityPerBookExp;
  2610. needBooks += 1;
  2611. return needBooks.toFixed(1);
  2612. };
  2613. // 技能净值
  2614. let price = 0;
  2615. initData_combatAbilities.forEach((item) => {
  2616. let numBooks = 0;
  2617. if (exp_50_skill.some((skill) => item.abilityHrid.includes(skill))) {
  2618. numBooks = getNeedBooksToLevel(item.level, 50);
  2619. } else {
  2620. numBooks = getNeedBooksToLevel(item.level, 500);
  2621. }
  2622. const itemHrid = item.abilityHrid.replace("/abilities/", "/items/");
  2623. const marketPrices = marketAPIJson.marketData[itemHrid];
  2624. if (marketPrices && marketPrices[0]) {
  2625. price += numBooks * getWeightedMarketPrice(marketPrices);
  2626. } else {
  2627. console.log("calculateAbilityScore cannot find price of " + itemHrid);
  2628. }
  2629. // console.log(`技能:${itemHrid},价值${numBooks * (marketPrices[0].b > 0 ? marketPrices[0].b : 0)}`)
  2630. });
  2631.  
  2632. return (price /= 1000000);
  2633. }
  2634.  
  2635. /* 查看人物面板显示打造分 */
  2636. // by Ratatatata (https://greasyfork.org/zh-CN/scripts/511240)
  2637. function getInfoPanel() {
  2638. const selectedElement = document.querySelector(`div.SharableProfile_overviewTab__W4dCV`);
  2639. if (selectedElement) {
  2640. return selectedElement;
  2641. } else {
  2642. return new Promise((resolve) => {
  2643. setTimeout(() => resolve(getInfoPanel()), 500);
  2644. });
  2645. }
  2646. }
  2647.  
  2648. async function showBuildScoreOnProfile(profile_shared_obj) {
  2649. const [battleHouseScore, abilityScore, equipmentScore] = await getBuildScoreByProfile(profile_shared_obj);
  2650. const totalBuildScore = battleHouseScore + abilityScore + equipmentScore;
  2651. const isEquipmentHiddenText = abilityScore + equipmentScore <= 0 ? (isZH ? " (装备隐藏)" : " (Equipment hidden)") : " ";
  2652.  
  2653. const panel = await getInfoPanel();
  2654. panel.insertAdjacentHTML(
  2655. "beforeend",
  2656. `<div style="text-align: left; color: ${SCRIPT_COLOR_MAIN}; font-size: 14px;">
  2657. <div style="cursor: pointer; font-weight: bold" id="toggleScores_profile">${
  2658. isZH ? "+ 战力打造分: " : "+ Character Build Score: "
  2659. }${totalBuildScore.toFixed(1)}${isEquipmentHiddenText}</div>
  2660. <div id="buildScores_profile" style="display: none; margin-left: 20px;">
  2661. <div>${isZH ? "房子分:" : "House score: "}${battleHouseScore.toFixed(1)}</div>
  2662. <div>${isZH ? "技能分:" : "Ability score: "}${abilityScore.toFixed(1)}</div>
  2663. <div>${isZH ? "装备分:" : "Equipment score: "}${equipmentScore.toFixed(1)}</div>
  2664. </div>
  2665. </div>`
  2666. );
  2667. // 监听点击事件,控制折叠和展开
  2668. const toggleScores = document.getElementById("toggleScores_profile");
  2669. const ScoreDetails = document.getElementById("buildScores_profile");
  2670. toggleScores.addEventListener("click", () => {
  2671. const isCollapsed = ScoreDetails.style.display === "none";
  2672. ScoreDetails.style.display = isCollapsed ? "block" : "none";
  2673. toggleScores.textContent =
  2674. (isCollapsed ? "↓ " : "+ ") +
  2675. (isZH ? "战力打造分: " : "Character Build Score: ") +
  2676. totalBuildScore.toFixed(1) +
  2677. isEquipmentHiddenText;
  2678. });
  2679. }
  2680.  
  2681. // 计算打造分
  2682. async function getBuildScoreByProfile(profile_shared_obj) {
  2683. // 房子分:战斗相关房子升级所需总金币
  2684. const battleHouses = ["dining_room", "library", "dojo", "gym", "armory", "archery_range", "mystical_study"];
  2685. let battleHouseScore = 0;
  2686. for (const key in profile_shared_obj.profile.characterHouseRoomMap) {
  2687. if (battleHouses.some((house) => profile_shared_obj.profile.characterHouseRoomMap[key].houseRoomHrid.includes(house))) {
  2688. battleHouseScore += (await getHouseFullBuildPrice(profile_shared_obj.profile.characterHouseRoomMap[key])) / 1000000;
  2689. }
  2690. }
  2691. // console.log("房屋分:" + battleHouseScore);
  2692. if (profile_shared_obj.profile.hideWearableItems) {
  2693. // 对方未展示装备
  2694. return [battleHouseScore, 0, 0];
  2695. }
  2696.  
  2697. // 技能分:当前使用的战斗技能所需技能书总价,单位M
  2698. let abilityScore = 0;
  2699. try {
  2700. abilityScore = await calculateSkill(profile_shared_obj);
  2701. // console.log("技能分:" + abilityScore);
  2702. } catch (error) {
  2703. console.error("Error in calculate skill:", error);
  2704. }
  2705.  
  2706. // 装备分:当前身上装备总价,单位M
  2707. let equipmentScore = 0;
  2708. try {
  2709. equipmentScore = await calculateEquipment(profile_shared_obj);
  2710. // console.log("装备分:" + equipmentScore);
  2711. } catch (error) {
  2712. console.error("Error in calculateEquipmen:", error);
  2713. }
  2714.  
  2715. return [battleHouseScore, abilityScore, equipmentScore];
  2716. }
  2717.  
  2718. // 技能价格计算
  2719. async function calculateSkill(profile_shared_obj) {
  2720. const marketAPIJson = await fetchMarketJSON();
  2721. if (!marketAPIJson) {
  2722. return 0;
  2723. }
  2724. let obj = profile_shared_obj.profile;
  2725. let exp_50_skill = ["poke", "scratch", "smack", "quick_shot", "water_strike", "fireball", "entangle", "minor_heal"];
  2726. const getNeedBooksToLevel = (targetLevel, abilityPerBookExp) => {
  2727. const needExp = initData_levelExperienceTable[targetLevel];
  2728. let needBooks = needExp / abilityPerBookExp;
  2729. needBooks += 1;
  2730. return needBooks.toFixed(1);
  2731. };
  2732. // 技能净值
  2733. let price = 0;
  2734. obj.equippedAbilities.forEach((item) => {
  2735. let numBooks = 0;
  2736. if (exp_50_skill.some((skill) => item.abilityHrid.includes(skill))) {
  2737. numBooks = getNeedBooksToLevel(item.level, 50);
  2738. } else {
  2739. numBooks = getNeedBooksToLevel(item.level, 500);
  2740. }
  2741. const itemHrid = item.abilityHrid.replace("/abilities/", "/items/");
  2742. const marketPrices = marketAPIJson.marketData[itemHrid];
  2743. if (marketPrices && marketPrices[0]) {
  2744. price += numBooks * getWeightedMarketPrice(marketPrices);
  2745. } else {
  2746. console.log("calculateSkill cannot find price of " + itemHrid);
  2747. }
  2748. // console.log(`技能:${itemHrid},价值${numBooks * (marketPrices[0].b > 0 ? marketPrices[0].b : 0)}`)
  2749. });
  2750.  
  2751. return (price /= 1000000);
  2752. }
  2753.  
  2754. // 装备价格计算
  2755. async function calculateEquipment(profile_shared_obj) {
  2756. const marketAPIJson = await fetchMarketJSON();
  2757. if (!marketAPIJson) {
  2758. return 0;
  2759. }
  2760. let obj = profile_shared_obj.profile;
  2761. // 装备净值
  2762. let networthAsk = 0;
  2763. let networthBid = 0;
  2764. for (const key in obj.wearableItemMap) {
  2765. let item = obj.wearableItemMap[key];
  2766. const enhanceLevel = obj.wearableItemMap[key].enhancementLevel;
  2767. const itemHrid = obj.wearableItemMap[key].itemHrid;
  2768. const marketPrices = marketAPIJson.marketData[itemHrid];
  2769.  
  2770. if (enhanceLevel && enhanceLevel > 1) {
  2771. input_data.item_hrid = item.itemHrid;
  2772. input_data.stop_at = enhanceLevel;
  2773. const best = await findBestEnhanceStrat(input_data);
  2774. let totalCost = best?.totalCost;
  2775. totalCost = totalCost ? Math.round(totalCost) : 0;
  2776. networthAsk += item.count * (totalCost > 0 ? totalCost : 0);
  2777. networthBid += item.count * (totalCost > 0 ? totalCost : 0);
  2778. } else if (marketPrices && marketPrices[0]) {
  2779. networthAsk += item.count * (marketPrices[0].a > 0 ? marketPrices[0].a : 0);
  2780. networthBid += item.count * (marketPrices[0].b > 0 ? marketPrices[0].b : 0);
  2781. } else {
  2782. console.log("calculateEquipment cannot find price of " + itemHrid);
  2783. }
  2784. }
  2785.  
  2786. return (networthAsk * 0.5 + networthBid * 0.5) / 1000000;
  2787. }
  2788.  
  2789. /* 显示当前动作总时间 */
  2790. const showTotalActionTime = () => {
  2791. const targetNode = document.querySelector("div.Header_actionName__31-L2");
  2792. if (targetNode) {
  2793. console.log("start observe action progress bar");
  2794. calculateTotalTime(targetNode);
  2795. new MutationObserver((mutationsList) =>
  2796. mutationsList.forEach((mutation) => {
  2797. calculateTotalTime();
  2798. })
  2799. ).observe(targetNode, { characterData: true, subtree: true, childList: true });
  2800. } else {
  2801. setTimeout(showTotalActionTime, 200);
  2802. }
  2803. };
  2804.  
  2805. function calculateTotalTime() {
  2806. const targetNode = document.querySelector("div.Header_actionName__31-L2 > div.Header_displayName__1hN09");
  2807. if (targetNode.textContent.includes("[")) {
  2808. return;
  2809. }
  2810.  
  2811. let totalTimeStr = "Error";
  2812. const content = targetNode.innerText;
  2813. const match = content.match(/\((\d+)\)/);
  2814. if (match) {
  2815. const numOfTimes = +match[1];
  2816. const timePerActionSec = +getOriTextFromElement(document.querySelector(".ProgressBar_text__102Yn")).match(/[\d\.]+/)[0];
  2817. const actionHrid = currentActionsHridList[0].actionHrid;
  2818. let effBuff = 1 + getTotalEffiPercentage(actionHrid) / 100;
  2819. if (actionHrid.includes("enhanc")) {
  2820. effBuff = 1;
  2821. }
  2822. const actualNumberOfTimes = Math.round(numOfTimes / effBuff);
  2823. const totalTimeSeconds = actualNumberOfTimes * timePerActionSec;
  2824. totalTimeStr = " [" + timeReadable(totalTimeSeconds) + "]";
  2825.  
  2826. const currentTime = new Date();
  2827. currentTime.setSeconds(currentTime.getSeconds() + totalTimeSeconds);
  2828. totalTimeStr += ` ${String(currentTime.getHours()).padStart(2, "0")}:${String(currentTime.getMinutes()).padStart(2, "0")}:${String(
  2829. currentTime.getSeconds()
  2830. ).padStart(2, "0")}`;
  2831. } else {
  2832. totalTimeStr = " [∞]";
  2833. }
  2834.  
  2835. targetNode.textContent += totalTimeStr;
  2836. }
  2837.  
  2838. function timeReadable(sec) {
  2839. if (sec >= 86400) {
  2840. return Number(sec / 86400).toFixed(1) + (isZH ? " 天" : " days");
  2841. }
  2842. const d = new Date(Math.round(sec * 1000));
  2843. function pad(i) {
  2844. return ("0" + i).slice(-2);
  2845. }
  2846. let str = d.getUTCHours() + "h " + pad(d.getUTCMinutes()) + "m " + pad(d.getUTCSeconds()) + "s";
  2847. return str;
  2848. }
  2849.  
  2850. GM_addStyle(`div.Header_actionName__31-L2 {
  2851. overflow: visible !important;
  2852. white-space: normal !important;
  2853. height: auto !important;
  2854. }`);
  2855.  
  2856. GM_addStyle(`span.NavigationBar_label__1uH-y {
  2857. width: 10px !important;
  2858. }`);
  2859.  
  2860. /* 物品 ToolTips */
  2861. const tooltipObserver = new MutationObserver(async function (mutations) {
  2862. for (const mutation of mutations) {
  2863. for (const added of mutation.addedNodes) {
  2864. if (added.classList.contains("MuiTooltip-popper")) {
  2865. if (added.querySelector("div.ItemTooltipText_name__2JAHA")) {
  2866. await handleTooltipItem(added);
  2867. } else if (added.querySelector("div.QueuedActions_queuedActionsEditMenu__3OoQH")) {
  2868. handleActionQueueMenue(added.querySelector("div.QueuedActions_queuedActionsEditMenu__3OoQH"));
  2869. }
  2870. }
  2871. }
  2872. }
  2873. });
  2874. tooltipObserver.observe(document.body, { attributes: false, childList: true, characterData: false });
  2875.  
  2876. const actionHridToToolsSpeedBuffNamesMap = {
  2877. "/action_types/brewing": "brewingSpeed",
  2878. "/action_types/cheesesmithing": "cheesesmithingSpeed",
  2879. "/action_types/cooking": "cookingSpeed",
  2880. "/action_types/crafting": "craftingSpeed",
  2881. "/action_types/foraging": "foragingSpeed",
  2882. "/action_types/milking": "milkingSpeed",
  2883. "/action_types/tailoring": "tailoringSpeed",
  2884. "/action_types/woodcutting": "woodcuttingSpeed",
  2885. "/action_types/alchemy": "alchemySpeed",
  2886. };
  2887.  
  2888. const actionHridToHouseNamesMap = {
  2889. "/action_types/brewing": "/house_rooms/brewery",
  2890. "/action_types/cheesesmithing": "/house_rooms/forge",
  2891. "/action_types/cooking": "/house_rooms/kitchen",
  2892. "/action_types/crafting": "/house_rooms/workshop",
  2893. "/action_types/foraging": "/house_rooms/garden",
  2894. "/action_types/milking": "/house_rooms/dairy_barn",
  2895. "/action_types/tailoring": "/house_rooms/sewing_parlor",
  2896. "/action_types/woodcutting": "/house_rooms/log_shed",
  2897. "/action_types/alchemy": "/house_rooms/laboratory",
  2898. };
  2899.  
  2900. const itemEnhanceLevelToBuffBonusMap = {
  2901. 0: 0,
  2902. 1: 2,
  2903. 2: 4.2,
  2904. 3: 6.6,
  2905. 4: 9.2,
  2906. 5: 12.0,
  2907. 6: 15.0,
  2908. 7: 18.2,
  2909. 8: 21.6,
  2910. 9: 25.2,
  2911. 10: 29.0,
  2912. 11: 33.0,
  2913. 12: 37.2,
  2914. 13: 41.6,
  2915. 14: 46.2,
  2916. 15: 51.0,
  2917. 16: 56.0,
  2918. 17: 61.2,
  2919. 18: 66.6,
  2920. 19: 72.2,
  2921. 20: 78.0,
  2922. };
  2923.  
  2924. function getToolsSpeedBuffByActionHrid(actionHrid) {
  2925. let totalBuff = 0;
  2926. for (const item of initData_characterItems) {
  2927. if (item.itemLocationHrid.includes("_tool")) {
  2928. const buffName = actionHridToToolsSpeedBuffNamesMap[initData_actionDetailMap[actionHrid].type];
  2929. const enhanceBonus = 1 + itemEnhanceLevelToBuffBonusMap[item.enhancementLevel] / 100;
  2930. const buff = initData_itemDetailMap[item.itemHrid].equipmentDetail.noncombatStats[buffName] || 0;
  2931. totalBuff += buff * enhanceBonus;
  2932. }
  2933. }
  2934. return Number(totalBuff * 100).toFixed(1);
  2935. }
  2936.  
  2937. function getItemEffiBuffByActionHrid(actionHrid) {
  2938. let buff = 0;
  2939. const propertyName = initData_actionDetailMap[actionHrid].type.replace("/action_types/", "") + "Efficiency";
  2940. for (const item of initData_characterItems) {
  2941. if (item.itemLocationHrid === "/item_locations/inventory") {
  2942. continue;
  2943. }
  2944. const itemDetail = initData_itemDetailMap[item.itemHrid];
  2945.  
  2946. const specificStat = itemDetail?.equipmentDetail?.noncombatStats[propertyName];
  2947. if (specificStat && specificStat > 0) {
  2948. let enhanceBonus = 1;
  2949. if (item.itemLocationHrid.includes("earrings") || item.itemLocationHrid.includes("ring") || item.itemLocationHrid.includes("neck")) {
  2950. enhanceBonus = 1 + (itemEnhanceLevelToBuffBonusMap[item.enhancementLevel] * 5) / 100;
  2951. } else {
  2952. enhanceBonus = 1 + itemEnhanceLevelToBuffBonusMap[item.enhancementLevel] / 100;
  2953. }
  2954. buff += specificStat * enhanceBonus;
  2955. }
  2956.  
  2957. const skillingStat = itemDetail?.equipmentDetail?.noncombatStats["skillingEfficiency"];
  2958. if (skillingStat && skillingStat > 0) {
  2959. let enhanceBonus = 1;
  2960. if (item.itemLocationHrid.includes("earrings") || item.itemLocationHrid.includes("ring") || item.itemLocationHrid.includes("neck")) {
  2961. enhanceBonus = 1 + (itemEnhanceLevelToBuffBonusMap[item.enhancementLevel] * 5) / 100;
  2962. } else {
  2963. enhanceBonus = 1 + itemEnhanceLevelToBuffBonusMap[item.enhancementLevel] / 100;
  2964. }
  2965. buff += skillingStat * enhanceBonus;
  2966. }
  2967. }
  2968. return Number(buff * 100).toFixed(1);
  2969. }
  2970.  
  2971. function getHousesEffBuffByActionHrid(actionHrid) {
  2972. const houseName = actionHridToHouseNamesMap[initData_actionDetailMap[actionHrid].type];
  2973. if (!houseName) {
  2974. return 0;
  2975. }
  2976. const house = initData_characterHouseRoomMap[houseName];
  2977. if (!house) {
  2978. return 0;
  2979. }
  2980. return house.level * 1.5;
  2981. }
  2982.  
  2983. function getTeaBuffsByActionHrid(actionHrid) {
  2984. const teaBuffs = {
  2985. efficiency: 0, // Efficiency tea, specific teas, -Artisan tea.
  2986. quantity: 0, // Gathering tea, Gourmet tea.
  2987. lessResource: 0, // Artisan tea.
  2988. extraExp: 0, // Wisdom tea. Not used.
  2989. upgradedProduct: 0, // Processing tea. Not used.
  2990. };
  2991.  
  2992. const actionTypeId = initData_actionDetailMap[actionHrid].type;
  2993. const teaList = initData_actionTypeDrinkSlotsMap[actionTypeId];
  2994. for (const tea of teaList) {
  2995. if (!tea || !tea.itemHrid) {
  2996. continue;
  2997. }
  2998.  
  2999. for (const buff of initData_itemDetailMap[tea.itemHrid].consumableDetail.buffs) {
  3000. if (buff.typeHrid === "/buff_types/artisan") {
  3001. teaBuffs.lessResource += buff.flatBoost * 100;
  3002. } else if (buff.typeHrid === "/buff_types/action_level") {
  3003. teaBuffs.efficiency -= buff.flatBoost;
  3004. } else if (buff.typeHrid === "/buff_types/gathering") {
  3005. teaBuffs.quantity += buff.flatBoost * 100;
  3006. } else if (buff.typeHrid === "/buff_types/gourmet") {
  3007. teaBuffs.quantity += buff.flatBoost * 100;
  3008. } else if (buff.typeHrid === "/buff_types/wisdom") {
  3009. teaBuffs.extraExp += buff.flatBoost * 100;
  3010. } else if (buff.typeHrid === "/buff_types/processing") {
  3011. teaBuffs.upgradedProduct += buff.flatBoost * 100;
  3012. } else if (buff.typeHrid === "/buff_types/efficiency") {
  3013. teaBuffs.efficiency += buff.flatBoost * 100;
  3014. } else if (buff.typeHrid === `/buff_types/${actionTypeId.replace("/action_types/", "")}_level`) {
  3015. teaBuffs.efficiency += buff.flatBoost;
  3016. }
  3017. }
  3018. }
  3019.  
  3020. return teaBuffs;
  3021. }
  3022.  
  3023. async function handleTooltipItem(tooltip) {
  3024. const itemNameElems = tooltip.querySelectorAll("div.ItemTooltipText_name__2JAHA span");
  3025.  
  3026. // 带强化等级的物品单独处理
  3027. if (itemNameElems.length > 1) {
  3028. handleItemTooltipWithEnhancementLevel(tooltip);
  3029. return;
  3030. }
  3031.  
  3032. const itemNameElem = itemNameElems[0];
  3033. let itemName = getOriTextFromElement(itemNameElem);
  3034. if (isZHInGameSetting) {
  3035. itemName = getItemEnNameFromZhName(itemName);
  3036. }
  3037. const itemHrid = itemEnNameToHridMap[itemName];
  3038.  
  3039. let amount = 0;
  3040. let insertAfterElem = null;
  3041. const amountSpan = tooltip.querySelectorAll("span")[1];
  3042. if (amountSpan) {
  3043. amount = +getOriTextFromElement(amountSpan).split(": ")[1].replaceAll(THOUSAND_SEPERATOR, "");
  3044. insertAfterElem = amountSpan.parentNode.nextSibling;
  3045. } else {
  3046. insertAfterElem = tooltip.querySelectorAll("span")[0].parentNode.nextSibling;
  3047. }
  3048.  
  3049. let appendHTMLStr = "";
  3050. let marketJson = null;
  3051. let ask = null;
  3052. let bid = null;
  3053.  
  3054. // 物品市场价格
  3055. if (settingsMap.itemTooltip_prices.isTrue) {
  3056. marketJson = await fetchMarketJSON();
  3057. if (!marketJson || !marketJson.marketData) {
  3058. console.error("jsonObj null");
  3059. }
  3060.  
  3061. ask = marketJson?.marketData[itemHrid]?.[0].a;
  3062. bid = marketJson?.marketData[itemHrid]?.[0].b;
  3063. appendHTMLStr += `
  3064. <div style="color: ${SCRIPT_COLOR_TOOLTIP};">${isZH ? "价格: " : "Price: "}${numberFormatter(ask)} / ${numberFormatter(bid)} (${
  3065. ask && ask > 0 ? numberFormatter(ask * amount) : ""
  3066. } / ${bid && bid > 0 ? numberFormatter(bid * amount) : ""})</div>
  3067. `;
  3068. }
  3069.  
  3070. // 消耗品回复计算
  3071. if (settingsMap.showConsumTips.isTrue) {
  3072. let itemDetail = initData_itemDetailMap[itemHrid];
  3073. const hp = itemDetail?.consumableDetail?.hitpointRestore;
  3074. const mp = itemDetail?.consumableDetail?.manapointRestore;
  3075. const cd = itemDetail?.consumableDetail?.cooldownDuration;
  3076. if (hp && cd) {
  3077. const hpPerMiniute = (60 / (cd / 1000000000)) * hp;
  3078. const pricePer100Hp = ask ? ask / (hp / 100) : null;
  3079. const usePerday = (24 * 60 * 60) / (cd / 1000000000);
  3080. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${
  3081. pricePer100Hp ? pricePer100Hp.toFixed(0) + (isZH ? "金/100血, " : "coins/100hp, ") : ""
  3082. }${hpPerMiniute.toFixed(0) + (isZH ? "血/分" : "hp/min")}, ${usePerday.toFixed(0)}${isZH ? "个/天" : "/day"}</div>`;
  3083. } else if (mp && cd) {
  3084. const mpPerMiniute = (60 / (cd / 1000000000)) * mp;
  3085. const pricePer100Mp = ask ? ask / (mp / 100) : null;
  3086. const usePerday = (24 * 60 * 60) / (cd / 1000000000);
  3087. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${
  3088. pricePer100Mp ? pricePer100Mp.toFixed(0) + (isZH ? "金/100蓝, " : "coins/100hp, ") : ""
  3089. }${mpPerMiniute.toFixed(0) + (isZH ? "蓝/分" : "hp/min")}, ${usePerday.toFixed(0)}${isZH ? "个/天" : "/day"}</div>`;
  3090. } else if (cd) {
  3091. const usePerday = (24 * 60 * 60) / (cd / 1000000000);
  3092. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}">${usePerday.toFixed(0)}${isZH ? "个/天" : "/day"}</div>`;
  3093. }
  3094. }
  3095.  
  3096. // 生产利润计算
  3097. if (
  3098. settingsMap.itemTooltip_profit.isTrue &&
  3099. marketJson &&
  3100. getActionHridFromItemName(itemName) &&
  3101. initData_actionDetailMap &&
  3102. initData_itemDetailMap
  3103. ) {
  3104. // 区分生产类动作和采集类动作
  3105. const isProduction =
  3106. initData_actionDetailMap[getActionHridFromItemName(itemName)].inputItems &&
  3107. initData_actionDetailMap[getActionHridFromItemName(itemName)].inputItems.length > 0;
  3108.  
  3109. const actionHrid = getActionHridFromItemName(itemName);
  3110. // 茶效率
  3111. const teaBuffs = getTeaBuffsByActionHrid(actionHrid);
  3112.  
  3113. // 原料信息
  3114. let inputItems = [];
  3115. let totalResourcesAskPricePerAction = 0;
  3116. let totalResourcesBidPricePerAction = 0;
  3117.  
  3118. if (isProduction) {
  3119. inputItems = JSON.parse(JSON.stringify(initData_actionDetailMap[actionHrid].inputItems));
  3120. for (const item of inputItems) {
  3121. item.name = initData_itemDetailMap[item.itemHrid].name;
  3122. item.zhName = ZHitemNames[item.itemHrid];
  3123. item.perAskPrice = marketJson?.marketData[item.itemHrid]?.[0].a;
  3124. item.perBidPrice = marketJson?.marketData[item.itemHrid]?.[0].b;
  3125. totalResourcesAskPricePerAction += item.perAskPrice * item.count;
  3126. totalResourcesBidPricePerAction += item.perBidPrice * item.count;
  3127. }
  3128.  
  3129. // 茶减少原料消耗(对于升级物品,不影响上一级物品消耗)
  3130. const lessResourceBuff = teaBuffs.lessResource;
  3131. totalResourcesAskPricePerAction *= 1 - lessResourceBuff / 100;
  3132. totalResourcesBidPricePerAction *= 1 - lessResourceBuff / 100;
  3133.  
  3134. // 上级物品作为原料
  3135. const upgradedFromItemHrid = initData_actionDetailMap[actionHrid]?.upgradeItemHrid;
  3136. let upgradedFromItemName = null;
  3137. let upgradedFromItemZhName = null;
  3138. let upgradedFromItemAsk = null;
  3139. let upgradedFromItemBid = null;
  3140. if (upgradedFromItemHrid) {
  3141. upgradedFromItemName = initData_itemDetailMap[upgradedFromItemHrid].name;
  3142. upgradedFromItemZhName = ZHitemNames[upgradedFromItemHrid];
  3143. upgradedFromItemAsk += marketJson?.marketData[upgradedFromItemHrid]?.[0].a;
  3144. upgradedFromItemBid += marketJson?.marketData[upgradedFromItemHrid]?.[0].b;
  3145. totalResourcesAskPricePerAction += upgradedFromItemAsk;
  3146. totalResourcesBidPricePerAction += upgradedFromItemBid;
  3147. }
  3148.  
  3149. // 使用表格显示原料信息
  3150. appendHTMLStr += `
  3151. <div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">
  3152. <table style="width:100%; border-collapse: collapse;">
  3153. <tr style="border-bottom: 1px solid ${SCRIPT_COLOR_TOOLTIP};">
  3154. <th style="text-align: left;">${isZH ? "原料" : "Material"}</th>
  3155. <th style="text-align: center;">${isZH ? "数量" : "Count"}</th>
  3156. <th style="text-align: right;">${isZH ? "出售价" : "Ask"}</th>
  3157. <th style="text-align: right;">${isZH ? "收购价" : "Bid"}</th>
  3158. </tr>
  3159. <tr style="border-bottom: 1px solid ${SCRIPT_COLOR_TOOLTIP};">
  3160. <td style="text-align: left;"><b>${isZH ? "合计" : "Total"}</b></td>
  3161. <td style="text-align: center;"><b>${inputItems.reduce((sum, item) => sum + item.count, 0)}</b></td>
  3162. <td style="text-align: right;"><b>${numberFormatter(totalResourcesAskPricePerAction)}</b></td>
  3163. <td style="text-align: right;"><b>${numberFormatter(totalResourcesBidPricePerAction)}</b></td>
  3164. </tr>`;
  3165.  
  3166. for (const item of inputItems) {
  3167. appendHTMLStr += `
  3168. <tr>
  3169. <td style="text-align: left;">${isZH ? item.zhName : item.name}</td>
  3170. <td style="text-align: center;">${item.count}</td>
  3171. <td style="text-align: right;">${numberFormatter(item.perAskPrice)}</td>
  3172. <td style="text-align: right;">${numberFormatter(item.perBidPrice)}</td>
  3173. </tr>`;
  3174. }
  3175. appendHTMLStr += `</table></div>`;
  3176.  
  3177. if (upgradedFromItemHrid) {
  3178. appendHTMLStr += `
  3179. <div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;"> ${
  3180. isZH ? upgradedFromItemZhName : upgradedFromItemName
  3181. }: ${numberFormatter(upgradedFromItemAsk)} / ${numberFormatter(upgradedFromItemBid)}</div>
  3182. `;
  3183. }
  3184. }
  3185.  
  3186. // 消耗饮料
  3187. let drinksConsumedPerHourAskPrice = 0;
  3188. let drinksConsumedPerHourBidPrice = 0;
  3189.  
  3190. const drinksList = initData_actionTypeDrinkSlotsMap[initData_actionDetailMap[actionHrid].type];
  3191. for (const drink of drinksList) {
  3192. if (!drink || !drink.itemHrid) {
  3193. continue;
  3194. }
  3195. drinksConsumedPerHourAskPrice += (marketJson?.marketData[drink.itemHrid]?.[0].a ?? 0) * 12;
  3196. drinksConsumedPerHourBidPrice += (marketJson?.marketData[drink.itemHrid]?.[0].b ?? 0) * 12;
  3197. }
  3198.  
  3199. // 每小时动作数(包含工具缩减动作时间)
  3200. const baseTimePerActionSec = initData_actionDetailMap[actionHrid].baseTimeCost / 1000000000;
  3201. const toolPercent = getToolsSpeedBuffByActionHrid(actionHrid);
  3202. const actualTimePerActionSec = baseTimePerActionSec / (1 + toolPercent / 100);
  3203.  
  3204. let actionPerHour = 3600 / actualTimePerActionSec;
  3205.  
  3206. // 每小时产品数
  3207. let droprate = null;
  3208. if (isProduction) {
  3209. droprate = initData_actionDetailMap[actionHrid].outputItems[0].count;
  3210. } else {
  3211. droprate =
  3212. (initData_actionDetailMap[actionHrid].dropTable[0].minCount + initData_actionDetailMap[actionHrid].dropTable[0].maxCount) / 2;
  3213. }
  3214. let itemPerHour = actionPerHour * droprate;
  3215.  
  3216. // 等级碾压提高效率(人物等级不及最低要求等级时,按最低要求等级计算)
  3217. const requiredLevel = initData_actionDetailMap[actionHrid].levelRequirement.level;
  3218. let currentLevel = requiredLevel;
  3219. for (const skill of initData_characterSkills) {
  3220. if (skill.skillHrid === initData_actionDetailMap[actionHrid].levelRequirement.skillHrid) {
  3221. currentLevel = skill.level;
  3222. break;
  3223. }
  3224. }
  3225. const levelEffBuff = currentLevel - requiredLevel > 0 ? currentLevel - requiredLevel : 0;
  3226.  
  3227. // 房子效率
  3228. const houseEffBuff = getHousesEffBuffByActionHrid(actionHrid);
  3229.  
  3230. // 特殊装备效率
  3231. const itemEffiBuff = Number(getItemEffiBuffByActionHrid(actionHrid));
  3232.  
  3233. // 总效率影响动作数/生产物品数
  3234. actionPerHour *= 1 + (levelEffBuff + houseEffBuff + teaBuffs.efficiency + itemEffiBuff) / 100;
  3235. itemPerHour *= 1 + (levelEffBuff + houseEffBuff + teaBuffs.efficiency + itemEffiBuff) / 100;
  3236.  
  3237. // 茶额外产品数量(不消耗原料)
  3238. const extraFreeItemPerHour = (itemPerHour * teaBuffs.quantity) / 100;
  3239.  
  3240. // 出售市场税
  3241. const bidAfterTax = bid * 0.98;
  3242.  
  3243. // 每小时利润
  3244. const profitPerHour =
  3245. itemPerHour * (bidAfterTax - totalResourcesAskPricePerAction / droprate) +
  3246. extraFreeItemPerHour * bidAfterTax -
  3247. drinksConsumedPerHourAskPrice;
  3248.  
  3249. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${
  3250. isZH
  3251. ? "生产利润(卖单价进、买单价出,包含销售税;不包括加工茶、社区增益、稀有掉落、袋子饮食增益;刷新网页更新人物数据):"
  3252. : "Production profit(Sell price in, bid price out, including sales tax; Not including processing tea, comm buffs, rare drops, pouch consumables buffs; Refresh page to update player data): "
  3253. }</div>`;
  3254.  
  3255. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${baseTimePerActionSec.toFixed(2)}s ${
  3256. isZH ? "基础速度" : "base speed,"
  3257. } x${droprate} ${isZH ? "基础掉率" : "base drop rate,"} +${toolPercent}%${isZH ? "工具速度" : " tool speed,"} +${levelEffBuff}%${
  3258. isZH ? "等级效率" : " level eff,"
  3259. } +${houseEffBuff}%${isZH ? "房子效率" : " house eff,"} +${teaBuffs.efficiency}%${isZH ? "茶效率" : " tea eff,"} +${itemEffiBuff}%${
  3260. isZH ? "装备效率" : " equipment eff,"
  3261. } +${teaBuffs.quantity}%${isZH ? "茶额外数量" : " tea extra outcome,"} +${teaBuffs.lessResource}%${
  3262. isZH ? "茶减少消耗" : " tea lower resource"
  3263. }</div>`;
  3264.  
  3265. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${
  3266. isZH ? "每小时饮料消耗: " : "Drinks consumed per hour: "
  3267. }${numberFormatter(drinksConsumedPerHourAskPrice)} / ${numberFormatter(drinksConsumedPerHourBidPrice)}</div>`;
  3268.  
  3269. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP}; font-size: 10px;">${isZH ? "每小时动作" : "Actions per hour"} ${Number(
  3270. actionPerHour
  3271. ).toFixed(1)}${isZH ? " 次" : " times"}, ${isZH ? "每小时生产" : "Production per hour"} ${Number(
  3272. itemPerHour + extraFreeItemPerHour
  3273. ).toFixed(1)}${isZH ? " 个" : " items"}</div>`;
  3274.  
  3275. appendHTMLStr += `<div style="color: ${SCRIPT_COLOR_TOOLTIP};">${isZH ? "利润: " : "Profit: "}${numberFormatter(
  3276. profitPerHour / actionPerHour
  3277. )}${isZH ? "/动作" : "/action"}, ${numberFormatter(profitPerHour)}${isZH ? "/小时" : "/hour"}, ${numberFormatter(24 * profitPerHour)}${
  3278. isZH ? "/天" : "/day"
  3279. }</div>`;
  3280. }
  3281.  
  3282. insertAfterElem.insertAdjacentHTML("afterend", appendHTMLStr);
  3283.  
  3284. // Make sure the tooltip is fully visible in the viewport
  3285. const tootip = insertAfterElem.closest(".MuiTooltip-popper");
  3286. const fixOverflow = (tootip) => {
  3287. if (!tootip.isConnected) {
  3288. return;
  3289. }
  3290. const bBox = tootip.getBoundingClientRect();
  3291. if (bBox.top < 0 || bBox.bottom > window.innerHeight) {
  3292. const transformString = tootip.style.transform.split(/\w+\(|\);?/);
  3293. const transformValues = transformString[1].split(/,\s?/g).map((numStr) => parseInt(numStr));
  3294. tootip.style.transform = `translate3d(${transformValues[0]}px, 0px, ${transformValues[2]}px)`;
  3295. }
  3296. };
  3297. setTimeout(fixOverflow, 100, tootip); // A delay is added because the game seems to reset the style if applied immediately.
  3298. }
  3299.  
  3300. function validateMarketJsonFetch(jsonStr, isSave) {
  3301. if (!jsonStr) {
  3302. console.error("validateMarketJson jsonStr is null");
  3303. return null;
  3304. }
  3305.  
  3306. let jsonObj = null;
  3307. try {
  3308. jsonObj = JSON.parse(jsonStr);
  3309. } catch (error) {
  3310. console.error("validateMarketJson failed to parse JSON:", error.message);
  3311. }
  3312.  
  3313. if (jsonObj && jsonObj.timestamp && jsonObj.marketData) {
  3314. // Add modifications to API data
  3315. jsonObj.marketData["/items/coin"] = { 0: { a: 1, b: 1 } };
  3316. jsonObj.marketData["/items/task_token"] = { 0: { a: 0, b: 0 } };
  3317. jsonObj.marketData["/items/cowbell"] = { 0: { a: 0, b: 0 } };
  3318.  
  3319. jsonObj.marketData["/items/small_treasure_chest"] = { 0: { a: 0, b: 0 } };
  3320. jsonObj.marketData["/items/medium_treasure_chest"] = { 0: { a: 0, b: 0 } };
  3321. jsonObj.marketData["/items/large_treasure_chest"] = { 0: { a: 0, b: 0 } };
  3322.  
  3323. jsonObj.marketData["/items/basic_task_badge"] = { 0: { a: 0, b: 0 } };
  3324. jsonObj.marketData["/items/advanced_task_badge"] = { 0: { a: 0, b: 0 } };
  3325. jsonObj.marketData["/items/expert_task_badge"] = { 0: { a: 0, b: 0 } };
  3326.  
  3327. if (isSave) {
  3328. console.log(jsonObj);
  3329. localStorage.setItem("MWITools_marketAPI_timestamp", Date.now());
  3330. localStorage.setItem("MWITools_marketAPI_json", JSON.stringify(jsonObj));
  3331. }
  3332.  
  3333. return jsonObj;
  3334. } else {
  3335. console.error("validateMarketJson invalid json structure");
  3336. return null;
  3337. }
  3338. }
  3339.  
  3340. async function fetchMarketJSON(forceFetch = false) {
  3341. // console.log(GM_xmlhttpRequest); // Tampermonkey
  3342. // console.log(GM.xmlHttpRequest); // Tampermonkey promise based, Greasemonkey 4.0+
  3343.  
  3344. // Has recently fetched
  3345. if (
  3346. !forceFetch &&
  3347. localStorage.getItem("MWITools_marketAPI_timestamp") &&
  3348. Date.now() - localStorage.getItem("MWITools_marketAPI_timestamp") < 3600000 // 1 hr
  3349. ) {
  3350. return JSON.parse(localStorage.getItem("MWITools_marketAPI_json"));
  3351. }
  3352.  
  3353. // Broswer does not support fetch
  3354. const sendRequest =
  3355. typeof GM.xmlHttpRequest === "function" ? GM.xmlHttpRequest : typeof GM_xmlhttpRequest === "function" ? GM_xmlhttpRequest : null;
  3356. if (typeof sendRequest != "function") {
  3357. console.error("fetchMarketJSON null GM xmlHttpRequest function");
  3358. if (!isUsingExpiredMarketJson) {
  3359. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " Setting isUsingExpiredMarketJson to true:\n";
  3360. reasonForUsingExpiredMarketJson += "GM_xmlhttpRequest " + typeof GM_xmlhttpRequest + "\n";
  3361. reasonForUsingExpiredMarketJson += "GM.xmlHttpRequest " + typeof GM.xmlHttpRequest + "\n";
  3362. }
  3363. isUsingExpiredMarketJson = true;
  3364. const alertDiv = document.querySelector("div#script_api_fail_alert");
  3365. if (alertDiv) {
  3366. alertDiv.style.display = "block";
  3367. }
  3368. reasonForUsingExpiredMarketJson += "\nusing hard-coded backup version\n";
  3369.  
  3370. const jsonStr = MARKET_JSON_LOCAL_BACKUP;
  3371. return validateMarketJsonFetch(jsonStr, false);
  3372. }
  3373.  
  3374. // Start fetch
  3375. console.log("fetchMarketJSON fetch start");
  3376. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch start \n";
  3377. const response = await sendRequest({
  3378. url: MARKET_API_URL,
  3379. method: "GET",
  3380. synchronous: true,
  3381. timeout: 5000,
  3382. onload: (response) => {
  3383. if (response.status == 200) {
  3384. console.log("fetchMarketJSON fetch success 200");
  3385. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch onload 200 \n";
  3386. } else {
  3387. console.error("fetchMarketJSON fetch onload with HTTP status failure " + response.status);
  3388. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch onload NOT 200 \n";
  3389. }
  3390. },
  3391. onabort: () => {
  3392. console.error("fetchMarketJSON fetch onabort");
  3393. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch onabort \n";
  3394. },
  3395. onerror: () => {
  3396. console.error("fetchMarketJSON fetch onerror");
  3397. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch onerror \n";
  3398. },
  3399. ontimeout: () => {
  3400. console.error("fetchMarketJSON fetch ontimeout");
  3401. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch ontimeout \n";
  3402. },
  3403. });
  3404. console.log("fetchMarketJSON fetch end with response status: " + response?.status);
  3405. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " fetch end with response status " + response?.status + "\n";
  3406.  
  3407. let jsonStr = response?.status === 200 ? response.responseText : null;
  3408. let jsonObj = validateMarketJsonFetch(jsonStr, true);
  3409.  
  3410. if (jsonObj) {
  3411. isUsingExpiredMarketJson = false;
  3412. reasonForUsingExpiredMarketJson = "";
  3413. const alertDiv = document.querySelector("div#script_api_fail_alert");
  3414. if (alertDiv) {
  3415. alertDiv.style.display = "none";
  3416. }
  3417. return jsonObj;
  3418. }
  3419.  
  3420. // Fetch failed
  3421. isUsingExpiredMarketJson = true;
  3422. reasonForUsingExpiredMarketJson += new Date().toUTCString() + " Setting isUsingExpiredMarketJson to true:\n";
  3423. reasonForUsingExpiredMarketJson += "Failed fetch";
  3424. const alertDiv = document.querySelector("div#script_api_fail_alert");
  3425. if (alertDiv) {
  3426. alertDiv.style.display = "block";
  3427. }
  3428.  
  3429. // Try previously fetched version
  3430. if (
  3431. localStorage.getItem("MWITools_marketAPI_json") &&
  3432. localStorage.getItem("MWITools_marketAPI_timestamp") &&
  3433. JSON.parse(MARKET_JSON_LOCAL_BACKUP).timestamp * 1000 < localStorage.getItem("MWITools_marketAPI_timestamp")
  3434. ) {
  3435. console.error("fetchMarketJSON network error, using previously fetched version");
  3436. const jsonStr = localStorage.getItem("MWITools_marketAPI_json");
  3437. const jsonObj = validateMarketJsonFetch(jsonStr, false);
  3438. if (jsonObj) {
  3439. reasonForUsingExpiredMarketJson += "\nusing previously fetched version\n";
  3440. return jsonObj;
  3441. }
  3442. }
  3443.  
  3444. // Use hard-coded backup version
  3445. reasonForUsingExpiredMarketJson += "\nusing hard-coded backup version\n";
  3446. return validateMarketJsonFetch(MARKET_JSON_LOCAL_BACKUP, false);
  3447. }
  3448.  
  3449. function numberFormatter(num, digits = 1) {
  3450. if (num === null || num === undefined) {
  3451. return null;
  3452. }
  3453. if (num < 0) {
  3454. return "-" + numberFormatter(-num);
  3455. }
  3456. const lookup = [
  3457. { value: 1, symbol: "" },
  3458. { value: 1e3, symbol: "k" },
  3459. { value: 1e6, symbol: "M" },
  3460. { value: 1e9, symbol: "B" },
  3461. ];
  3462. const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
  3463. var item = lookup
  3464. .slice()
  3465. .reverse()
  3466. .find(function (item) {
  3467. return num >= item.value;
  3468. });
  3469. return item ? (num / item.value).toFixed(digits).replace(rx, "$1") + item.symbol : "0";
  3470. }
  3471.  
  3472. function getActionHridFromItemName(name) {
  3473. let newName = name.replace("Milk", "Cow");
  3474. newName = newName.replace("Log", "Tree");
  3475. newName = newName.replace("Cowing", "Milking");
  3476. newName = newName.replace("Rainbow Cow", "Unicow");
  3477. newName = newName.replace("Collector's Boots", "Collectors Boots");
  3478. newName = newName.replace("Knight's Aegis", "Knights Aegis");
  3479. if (!initData_actionDetailMap) {
  3480. console.error("getActionHridFromItemName no initData_actionDetailMap: " + name);
  3481. return null;
  3482. }
  3483. for (const action of Object.values(initData_actionDetailMap)) {
  3484. if (action.name === newName) {
  3485. return action.hrid;
  3486. }
  3487. }
  3488. return null;
  3489. }
  3490.  
  3491. /* 动作面板 */
  3492. const waitForActionPanelParent = () => {
  3493. const targetNode = document.querySelector("div.GamePage_mainPanel__2njyb");
  3494. if (targetNode) {
  3495. console.log("start observe action panel");
  3496. const actionPanelObserver = new MutationObserver(async function (mutations) {
  3497. for (const mutation of mutations) {
  3498. for (const added of mutation.addedNodes) {
  3499. if (
  3500. added?.classList?.contains("Modal_modalContainer__3B80m") &&
  3501. added.querySelector("div.SkillActionDetail_regularComponent__3oCgr")
  3502. ) {
  3503. handleActionPanel(added.querySelector("div.SkillActionDetail_regularComponent__3oCgr"));
  3504. }
  3505. }
  3506. }
  3507. });
  3508. actionPanelObserver.observe(targetNode, { attributes: false, childList: true, subtree: true });
  3509. } else {
  3510. setTimeout(waitForActionPanelParent, 200);
  3511. }
  3512. };
  3513.  
  3514. async function handleActionPanel(panel) {
  3515. if (!settingsMap.actionPanel_totalTime.isTrue) {
  3516. return;
  3517. }
  3518.  
  3519. if (!panel.querySelector("div.SkillActionDetail_expGain__F5xHu")) {
  3520. return; // 不处理战斗ActionPanel
  3521. }
  3522. let actionName = getOriTextFromElement(panel.querySelector("div.SkillActionDetail_name__3erHV"));
  3523. if (isZHInGameSetting) {
  3524. actionName = getActionEnNameFromZhName(actionName);
  3525. }
  3526.  
  3527. const exp = Number(
  3528. getOriTextFromElement(panel.querySelector("div.SkillActionDetail_expGain__F5xHu"))
  3529. .replaceAll(THOUSAND_SEPERATOR, "")
  3530. .replaceAll(DECIMAL_SEPERATOR, ".")
  3531. );
  3532.  
  3533. const elems = panel.querySelectorAll("div.SkillActionDetail_value__dQjYH");
  3534. const duration = Number(
  3535. getOriTextFromElement(elems[elems.length - 2])
  3536. .replaceAll(THOUSAND_SEPERATOR, "")
  3537. .replaceAll(DECIMAL_SEPERATOR, ".")
  3538. .replace("s", "")
  3539. );
  3540. const inputElem = panel.querySelector("div.SkillActionDetail_maxActionCountInput__1C0Pw input");
  3541.  
  3542. const actionHrid = initData_actionDetailMap[getActionHridFromItemName(actionName)].hrid;
  3543. const effBuff = 1 + getTotalEffiPercentage(actionHrid, false) / 100;
  3544.  
  3545. // 显示总时间
  3546. let hTMLStr = `<div id="showTotalTime" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${getTotalTimeStr(
  3547. inputElem.value,
  3548. duration,
  3549. effBuff
  3550. )}</div>`;
  3551. const gatherDiv = inputElem.parentNode.parentNode.parentNode;
  3552. gatherDiv.insertAdjacentHTML("afterend", hTMLStr);
  3553. const showTotalTimeDiv = panel.querySelector("div#showTotalTime");
  3554.  
  3555. panel.addEventListener("click", function (evt) {
  3556. setTimeout(() => {
  3557. showTotalTimeDiv.textContent = getTotalTimeStr(inputElem.value, duration, effBuff);
  3558. }, 50);
  3559. });
  3560. inputElem.addEventListener("keyup", function (evt) {
  3561. if (inputElem.value.toLowerCase().includes("k") || inputElem.value.toLowerCase().includes("m")) {
  3562. reactInputTriggerHack(inputElem, inputElem.value.toLowerCase().replaceAll("k", "000").replaceAll("m", "000000"));
  3563. }
  3564. showTotalTimeDiv.textContent = getTotalTimeStr(inputElem.value, duration, effBuff);
  3565. });
  3566.  
  3567. let appendAfterElem = showTotalTimeDiv;
  3568.  
  3569. // 显示快捷按钮
  3570. if (settingsMap.actionPanel_totalTime_quickInputs.isTrue) {
  3571. hTMLStr = `<div id="quickInputButtons" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${isZH ? "做 " : "Do "}</div>`;
  3572. showTotalTimeDiv.insertAdjacentHTML("afterend", hTMLStr);
  3573. const quickInputButtonsDiv = panel.querySelector("div#quickInputButtons");
  3574.  
  3575. const presetHours = [0.5, 1, 2, 3, 4, 5, 6, 10, 12, 24];
  3576. for (const value of presetHours) {
  3577. const btn = document.createElement("button");
  3578. btn.style.backgroundColor = "white";
  3579. btn.style.color = "black";
  3580. btn.style.padding = "1px 6px 1px 6px";
  3581. btn.style.margin = "1px";
  3582. btn.innerText = value === 0.5 ? 0.5 : numberFormatter(value);
  3583. btn.onclick = () => {
  3584. reactInputTriggerHack(inputElem, Math.round((value * 60 * 60 * effBuff) / duration));
  3585. };
  3586. quickInputButtonsDiv.append(btn);
  3587. }
  3588. quickInputButtonsDiv.append(document.createTextNode(isZH ? " 小时" : " hours"));
  3589.  
  3590. quickInputButtonsDiv.append(document.createElement("div"));
  3591. quickInputButtonsDiv.append(document.createTextNode(isZH ? "做 " : "Do "));
  3592. const presetTimes = [10, 100, 300, 500, 1000, 2000];
  3593. for (const value of presetTimes) {
  3594. const btn = document.createElement("button");
  3595. btn.style.backgroundColor = "white";
  3596. btn.style.color = "black";
  3597. btn.style.padding = "1px 6px 1px 6px";
  3598. btn.style.margin = "1px";
  3599. btn.innerText = numberFormatter(value);
  3600. btn.onclick = () => {
  3601. reactInputTriggerHack(inputElem, value);
  3602. };
  3603. quickInputButtonsDiv.append(btn);
  3604. }
  3605. quickInputButtonsDiv.append(document.createTextNode(isZH ? " 次" : " times"));
  3606.  
  3607. appendAfterElem = quickInputButtonsDiv;
  3608. }
  3609.  
  3610. // 还有多久到多少技能等级
  3611. const skillHrid = initData_actionDetailMap[getActionHridFromItemName(actionName)].experienceGain.skillHrid;
  3612. let currentExp = null;
  3613. let currentLevel = null;
  3614. for (const skill of initData_characterSkills) {
  3615. if (skill.skillHrid === skillHrid) {
  3616. currentExp = skill.experience;
  3617. currentLevel = skill.level;
  3618. break;
  3619. }
  3620. }
  3621. if (currentExp && currentLevel) {
  3622. const calculateNeedToLevel = (currentLevel, targetLevel, effBuff, duration, exp) => {
  3623. let needTotalTimeSec = 0;
  3624. let needTotalNumOfActions = 0;
  3625. for (let level = currentLevel; level < targetLevel; level++) {
  3626. let needExpToNextLevel = null;
  3627. if (level === currentLevel) {
  3628. needExpToNextLevel = initData_levelExperienceTable[level + 1] - currentExp;
  3629. } else {
  3630. needExpToNextLevel = initData_levelExperienceTable[level + 1] - initData_levelExperienceTable[level];
  3631. }
  3632. const extraLevelEffBuff = (level - currentLevel) * 0.01; // 升级过程中,每升一级,额外多1%效率
  3633. const needNumOfActionsToNextLevel = Math.round(needExpToNextLevel / exp);
  3634. needTotalNumOfActions += needNumOfActionsToNextLevel;
  3635. needTotalTimeSec += (needNumOfActionsToNextLevel / (effBuff + extraLevelEffBuff)) * duration;
  3636. }
  3637. return { numOfActions: needTotalNumOfActions, timeSec: needTotalTimeSec };
  3638. };
  3639.  
  3640. const need = calculateNeedToLevel(currentLevel, currentLevel + 1, effBuff, duration, exp);
  3641. hTMLStr = `<div id="tillLevel" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${
  3642. isZH ? "到 " : "To reach level "
  3643. }<input id="tillLevelInput" type="number" value="${currentLevel + 1}" min="${currentLevel + 1}" max="200">${
  3644. isZH ? " 级还需做 " : ", need to do "
  3645. }<span id="tillLevelNumber">${need.numOfActions}${isZH ? " 次" : " times "}[${timeReadable(need.timeSec)}]${
  3646. isZH ? " (刷新网页更新当前等级)" : " (Refresh page to update current level)"
  3647. }</span></div>`;
  3648.  
  3649. appendAfterElem.insertAdjacentHTML("afterend", hTMLStr);
  3650. const tillLevelInput = panel.querySelector("input#tillLevelInput");
  3651. const tillLevelNumber = panel.querySelector("span#tillLevelNumber");
  3652. tillLevelInput.onchange = () => {
  3653. const targetLevel = Number(tillLevelInput.value);
  3654. if (targetLevel > currentLevel && targetLevel <= 200) {
  3655. const need = calculateNeedToLevel(currentLevel, targetLevel, effBuff, duration, exp);
  3656. tillLevelNumber.textContent = `${need.numOfActions}${isZH ? " 次" : " times "}[${timeReadable(need.timeSec)}]${
  3657. isZH ? " (刷新网页更新当前等级)" : " (Refresh page to update current level)"
  3658. }`;
  3659. } else {
  3660. tillLevelNumber.textContent = "Error";
  3661. }
  3662. };
  3663. tillLevelInput.addEventListener("keyup", function (evt) {
  3664. const targetLevel = Number(tillLevelInput.value);
  3665. if (targetLevel > currentLevel && targetLevel <= 200) {
  3666. const need = calculateNeedToLevel(currentLevel, targetLevel, effBuff, duration, exp);
  3667. tillLevelNumber.textContent = `${need.numOfActions}${isZH ? " 次" : " times "}[${timeReadable(need.timeSec)}]${
  3668. isZH ? " (刷新网页更新当前等级)" : " (Refresh page to update current level)"
  3669. }`;
  3670. } else {
  3671. tillLevelNumber.textContent = "Error";
  3672. }
  3673. });
  3674. }
  3675.  
  3676. // 显示每小时经验
  3677. panel
  3678. .querySelector("div#tillLevel")
  3679. .insertAdjacentHTML(
  3680. "afterend",
  3681. `<div id="expPerHour" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${isZH ? "每小时经验: " : "Exp/hour: "}${numberFormatter(
  3682. Math.round((3600 / duration) * exp * effBuff)
  3683. )} (+${Number((effBuff - 1) * 100).toFixed(1)}%${isZH ? "效率" : " eff"})</div>`
  3684. );
  3685.  
  3686. // 显示Foraging最后一个图综合收益
  3687. if (panel.querySelector("div.SkillActionDetail_dropTable__3ViVp").children.length > 1 && settingsMap.actionPanel_foragingTotal.isTrue) {
  3688. const marketJson = await fetchMarketJSON();
  3689. const actionHrid = "/actions/foraging/" + actionName.toLowerCase().replaceAll(" ", "_");
  3690.  
  3691. // 茶效率
  3692. const teaBuffs = getTeaBuffsByActionHrid(actionHrid);
  3693.  
  3694. // 消耗饮料
  3695. let drinksConsumedPerHourAskPrice = 0;
  3696. let drinksConsumedPerHourBidPrice = 0;
  3697.  
  3698. const drinksList = initData_actionTypeDrinkSlotsMap[initData_actionDetailMap[actionHrid].type];
  3699. for (const drink of drinksList) {
  3700. if (!drink || !drink.itemHrid) {
  3701. continue;
  3702. }
  3703. drinksConsumedPerHourAskPrice += (marketJson?.marketData[drink.itemHrid]?.[0].a ?? 0) * 12;
  3704. drinksConsumedPerHourBidPrice += (marketJson?.marketData[drink.itemHrid]?.[0].b ?? 0) * 12;
  3705. }
  3706.  
  3707. // 每小时动作数(包含工具缩减动作时间)
  3708. const baseTimePerActionSec = initData_actionDetailMap[actionHrid].baseTimeCost / 1000000000;
  3709. const toolPercent = getToolsSpeedBuffByActionHrid(actionHrid);
  3710. const actualTimePerActionSec = baseTimePerActionSec / (1 + toolPercent / 100);
  3711. let actionPerHour = 3600 / actualTimePerActionSec;
  3712.  
  3713. // 将掉落表看作每次动作掉落一件虚拟物品
  3714. const dropTable = initData_actionDetailMap[actionHrid].dropTable;
  3715. let virtualItemBid = 0;
  3716. for (const drop of dropTable) {
  3717. const bid = marketJson?.marketData[drop.itemHrid]?.[0].b;
  3718. const amount = drop.dropRate * ((drop.minCount + drop.maxCount) / 2);
  3719. virtualItemBid += bid * amount;
  3720. }
  3721. let droprate = 1;
  3722. let itemPerHour = actionPerHour * droprate;
  3723.  
  3724. // 等级碾压提高效率(人物等级不及最低要求等级时,按最低要求等级计算)
  3725. const requiredLevel = initData_actionDetailMap[actionHrid].levelRequirement.level;
  3726. let currentLevel = requiredLevel;
  3727. for (const skill of initData_characterSkills) {
  3728. if (skill.skillHrid === initData_actionDetailMap[actionHrid].levelRequirement.skillHrid) {
  3729. currentLevel = skill.level;
  3730. break;
  3731. }
  3732. }
  3733. const levelEffBuff = currentLevel - requiredLevel > 0 ? currentLevel - requiredLevel : 0;
  3734.  
  3735. // 房子效率
  3736. const houseEffBuff = getHousesEffBuffByActionHrid(actionHrid);
  3737.  
  3738. // 特殊装备效率
  3739. const itemEffiBuff = Number(getItemEffiBuffByActionHrid(actionHrid));
  3740.  
  3741. // 总效率影响动作数/生产物品数
  3742. actionPerHour *= 1 + (levelEffBuff + houseEffBuff + teaBuffs.efficiency + itemEffiBuff) / 100;
  3743. itemPerHour *= 1 + (levelEffBuff + houseEffBuff + teaBuffs.efficiency + itemEffiBuff) / 100;
  3744.  
  3745. // 茶额外产品数量(不消耗原料)
  3746. const extraFreeItemPerHour = (itemPerHour * teaBuffs.quantity) / 100;
  3747.  
  3748. // 出售市场税
  3749. const bidAfterTax = virtualItemBid * 0.98;
  3750.  
  3751. // 每小时利润
  3752. const profitPerHour = itemPerHour * bidAfterTax + extraFreeItemPerHour * bidAfterTax - drinksConsumedPerHourAskPrice;
  3753.  
  3754. let htmlStr = `<div id="totalProfit" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${
  3755. isZH ? "综合利润: " : "Overall profit: "
  3756. }${numberFormatter(profitPerHour)}${isZH ? "/小时" : "/hour"}, ${numberFormatter(24 * profitPerHour)}${isZH ? "/天" : "/day"}</div>`;
  3757. panel.querySelector("div#expPerHour").insertAdjacentHTML("afterend", htmlStr);
  3758. }
  3759. }
  3760.  
  3761. function getTotalEffiPercentage(actionHrid, debug = false) {
  3762. if (debug) {
  3763. console.log("----- getTotalEffiPercentage " + actionHrid);
  3764. }
  3765. // 等级碾压效率
  3766. const requiredLevel = initData_actionDetailMap[actionHrid].levelRequirement.level;
  3767. let currentLevel = requiredLevel;
  3768. for (const skill of initData_characterSkills) {
  3769. if (skill.skillHrid === initData_actionDetailMap[actionHrid].levelRequirement.skillHrid) {
  3770. currentLevel = skill.level;
  3771. break;
  3772. }
  3773. }
  3774. const levelEffBuff = currentLevel - requiredLevel > 0 ? currentLevel - requiredLevel : 0;
  3775. if (debug) {
  3776. console.log("等级碾压 " + levelEffBuff);
  3777. }
  3778. // 房子效率
  3779. const houseEffBuff = getHousesEffBuffByActionHrid(actionHrid);
  3780. if (debug) {
  3781. console.log("房子 " + houseEffBuff);
  3782. }
  3783. // 茶
  3784. const teaBuffs = getTeaBuffsByActionHrid(actionHrid);
  3785. if (debug) {
  3786. console.log("茶 " + teaBuffs.efficiency);
  3787. }
  3788. // 特殊装备
  3789. const itemEffiBuff = getItemEffiBuffByActionHrid(actionHrid);
  3790. if (debug) {
  3791. console.log("特殊装备 " + itemEffiBuff);
  3792. }
  3793. // 总效率
  3794. const total = levelEffBuff + houseEffBuff + teaBuffs.efficiency + Number(itemEffiBuff);
  3795. if (debug) {
  3796. console.log("总计 " + total);
  3797. }
  3798. return total;
  3799. }
  3800.  
  3801. function getTotalTimeStr(input, duration, effBuff) {
  3802. if (input === "∞") {
  3803. return "[∞]";
  3804. } else if (isNaN(input)) {
  3805. return "Error";
  3806. }
  3807. return "[" + timeReadable(Math.round(input / effBuff) * duration) + "]";
  3808. }
  3809.  
  3810. function reactInputTriggerHack(inputElem, value) {
  3811. let lastValue = inputElem.value;
  3812. inputElem.value = value;
  3813. let event = new Event("input", { bubbles: true });
  3814. event.simulated = true;
  3815. let tracker = inputElem._valueTracker;
  3816. if (tracker) {
  3817. tracker.setValue(lastValue);
  3818. }
  3819. inputElem.dispatchEvent(event);
  3820. }
  3821.  
  3822. /* 左侧栏显示技能百分比 */
  3823. const waitForProgressBar = () => {
  3824. const elements = document.querySelectorAll(".NavigationBar_currentExperience__3GDeX");
  3825. if (elements.length) {
  3826. removeInsertedDivs();
  3827. elements.forEach((element) => {
  3828. let text = element.style.width;
  3829. text = Number(text.replace("%", "")).toFixed(2) + "%";
  3830.  
  3831. const span = document.createElement("span");
  3832. span.textContent = text;
  3833. span.classList.add("insertedSpan");
  3834. span.style.fontSize = "13px";
  3835. span.style.color = SCRIPT_COLOR_MAIN;
  3836.  
  3837. element.parentNode.parentNode.querySelector("span.NavigationBar_level__3C7eR").style.width = "auto";
  3838.  
  3839. const insertParent = element.parentNode.parentNode.children[0];
  3840. insertParent.insertBefore(span, insertParent.children[1]);
  3841. });
  3842. } else {
  3843. setTimeout(waitForProgressBar, 200);
  3844. }
  3845. };
  3846.  
  3847. const removeInsertedDivs = () => document.querySelectorAll("span.insertedSpan").forEach((div) => div.parentNode.removeChild(div));
  3848.  
  3849. if (settingsMap.expPercentage.isTrue) {
  3850. window.setInterval(() => {
  3851. removeInsertedDivs();
  3852. waitForProgressBar();
  3853. }, 1000);
  3854. }
  3855.  
  3856. /* 战斗总结 */
  3857. async function handleBattleSummary(message) {
  3858. const marketJson = await fetchMarketJSON();
  3859. let hasMarketJson = true;
  3860. if (!marketJson) {
  3861. console.error("handleBattleSummary null marketAPI");
  3862. hasMarketJson = false;
  3863. }
  3864. let totalPriceAsk = 0;
  3865. let totalPriceAskBid = 0;
  3866. let totalRawCoins = 0; // For IC
  3867.  
  3868. if (hasMarketJson) {
  3869. for (const loot of Object.values(message.unit.totalLootMap)) {
  3870. const itemCount = loot.count;
  3871. if (loot.itemHrid === "/items/coin") {
  3872. totalRawCoins += itemCount;
  3873. }
  3874. if (marketJson.marketData[loot.itemHrid]) {
  3875. totalPriceAsk += marketJson.marketData[loot.itemHrid][0].a * itemCount;
  3876. totalPriceAskBid += marketJson.marketData[loot.itemHrid][0].b * itemCount;
  3877. } else {
  3878. console.log("handleBattleSummary failed to read price of " + loot.itemHrid);
  3879. }
  3880. }
  3881. }
  3882.  
  3883. let totalSkillsExp = 0;
  3884. for (const exp of Object.values(message.unit.totalSkillExperienceMap)) {
  3885. totalSkillsExp += exp;
  3886. }
  3887.  
  3888. let tryTimes = 0;
  3889. findElem();
  3890. function findElem() {
  3891. tryTimes++;
  3892. let elem = document.querySelector(".BattlePanel_gainedExp__3SaCa")?.parentElement;
  3893. if (elem) {
  3894. // 战斗时长和次数
  3895. let battleDurationSec = null;
  3896. const combatInfoElement = document.querySelector(".BattlePanel_combatInfo__sHGCe");
  3897. if (combatInfoElement) {
  3898. let matches = combatInfoElement.innerHTML.match(
  3899. /(战斗时间|战斗时长|Combat Duration): (?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s).*?(交战|战斗|Battles): (\d+).*?(战败|死亡次数|Deaths): (\d+)/
  3900. );
  3901. if (matches) {
  3902. let days = parseInt(matches[2], 10) || 0;
  3903. let hours = parseInt(matches[3], 10) || 0;
  3904. let minutes = parseInt(matches[4], 10) || 0;
  3905. let seconds = parseInt(matches[5], 10) || 0;
  3906. let battles = parseInt(matches[7], 10) - 1; // 排除当前战斗
  3907. battleDurationSec = days * 86400 + hours * 3600 + minutes * 60 + seconds;
  3908. let efficiencyPerHour = ((battles / battleDurationSec) * 3600).toFixed(1);
  3909. elem.insertAdjacentHTML(
  3910. "beforeend",
  3911. `<div id="script_battleNumbers" style="color: ${SCRIPT_COLOR_MAIN};">${
  3912. isZH ? "每小时战斗: " : "Encounters/hour: "
  3913. }${efficiencyPerHour}${isZH ? " 次" : ""}</div>`
  3914. );
  3915. }
  3916. }
  3917. // 总收入
  3918. document
  3919. .querySelector("div#script_battleNumbers")
  3920. .insertAdjacentHTML(
  3921. "afterend",
  3922. `<div id="script_totalIncome" style="color: ${SCRIPT_COLOR_MAIN};">${isZH ? "总收获: " : "Total revenue: "}${numberFormatter(
  3923. totalPriceAsk
  3924. )} / ${numberFormatter(totalPriceAskBid)}</div>`
  3925. );
  3926. // 平均收入
  3927. if (battleDurationSec) {
  3928. document
  3929. .querySelector("div#script_totalIncome")
  3930. .insertAdjacentHTML(
  3931. "afterend",
  3932. `<div id="script_averageIncome" style="color: ${SCRIPT_COLOR_MAIN};">${
  3933. isZH ? "每小时收获: " : "Revenue/hour: "
  3934. }${numberFormatter(totalPriceAsk / (battleDurationSec / 60 / 60))} / ${numberFormatter(
  3935. totalPriceAskBid / (battleDurationSec / 60 / 60)
  3936. )}</div>`
  3937. );
  3938. document
  3939. .querySelector("div#script_averageIncome")
  3940. .insertAdjacentHTML(
  3941. "afterend",
  3942. `<div id="script_totalIncomeDay" style="color: ${SCRIPT_COLOR_MAIN};">${
  3943. isZH ? "每天收获: " : "Revenue/day: "
  3944. }${numberFormatter((totalPriceAsk / (battleDurationSec / 60 / 60)) * 24)} / ${numberFormatter(
  3945. (totalPriceAskBid / (battleDurationSec / 60 / 60)) * 24
  3946. )}</div>`
  3947. );
  3948. document
  3949. .querySelector("div#script_totalIncomeDay")
  3950. .insertAdjacentHTML(
  3951. "afterend",
  3952. `<div id="script_avgRawCoinHour" style="color: ${SCRIPT_COLOR_MAIN};">${
  3953. isZH ? "每小时仅金币收获: " : "Raw coins/hour: "
  3954. }${numberFormatter(totalRawCoins / (battleDurationSec / 60 / 60))}</div>`
  3955. );
  3956. }
  3957. // 总经验
  3958. document
  3959. .querySelector("div#script_avgRawCoinHour")
  3960. .insertAdjacentHTML(
  3961. "afterend",
  3962. `<div id="script_totalSkillsExp" style="color: ${SCRIPT_COLOR_MAIN};">${isZH ? "总经验: " : "Total exp: "}${numberFormatter(
  3963. totalSkillsExp
  3964. )}</div>`
  3965. );
  3966. // 平均经验
  3967. if (battleDurationSec) {
  3968. document
  3969. .querySelector("div#script_totalSkillsExp")
  3970. .insertAdjacentHTML(
  3971. "afterend",
  3972. `<div id="script_averageSkillsExp" style="color: ${SCRIPT_COLOR_MAIN};">${
  3973. isZH ? "每小时总经验: " : "Total exp/hour: "
  3974. }${numberFormatter(totalSkillsExp / (battleDurationSec / 60 / 60))}</div>`
  3975. );
  3976.  
  3977. [
  3978. { skillHrid: "/skills/magic", zhName: "魔法", enName: "Magic" },
  3979. { skillHrid: "/skills/ranged", zhName: "远程", enName: "Ranged" },
  3980. { skillHrid: "/skills/defense", zhName: "防御", enName: "Defense" },
  3981. { skillHrid: "/skills/power", zhName: "力量", enName: "Power" },
  3982. { skillHrid: "/skills/attack", zhName: "攻击", enName: "Attack" },
  3983. { skillHrid: "/skills/intelligence", zhName: "智力", enName: "Intelligence" },
  3984. { skillHrid: "/skills/stamina", zhName: "耐力", enName: "Stamina" },
  3985. ].forEach((skill) => {
  3986. const expGained = message.unit.totalSkillExperienceMap[skill.skillHrid];
  3987. if (expGained) {
  3988. document
  3989. .querySelector("div#script_totalSkillsExp")
  3990. .insertAdjacentHTML(
  3991. "afterend",
  3992. `<div style="color: ${SCRIPT_COLOR_MAIN};">${isZH ? "每小时" : ""}${isZH ? skill.zhName : skill.enName}${
  3993. isZH ? "经验: " : " exp/hour: "
  3994. }${numberFormatter(expGained / (battleDurationSec / 60 / 60))}</div>`
  3995. );
  3996. }
  3997. });
  3998. } else {
  3999. console.error("handleBattleSummary unable to display average exp due to null battleDurationSec");
  4000. }
  4001. } else if (tryTimes <= 10) {
  4002. setTimeout(findElem, 200);
  4003. } else {
  4004. console.error("handleBattleSummary: Elem not found after 10 tries.");
  4005. }
  4006. }
  4007. }
  4008.  
  4009. /* 图标上显示装备等级 */
  4010. function addItemLevels() {
  4011. const iconDivs = document.querySelectorAll("div.Item_itemContainer__x7kH1 div.Item_item__2De2O.Item_clickable__3viV6");
  4012. for (const div of iconDivs) {
  4013. if (div.querySelector("div.Item_name__2C42x")) {
  4014. continue;
  4015. }
  4016. const href = div.querySelector("use").getAttribute("href");
  4017. const hrefName = href.split("#")[1];
  4018. const itemHrid = "/items/" + hrefName;
  4019. const itemLevel = initData_itemDetailMap[itemHrid]?.itemLevel;
  4020. const itemAbilityLevel = initData_itemDetailMap[itemHrid]?.abilityBookDetail?.levelRequirements?.[0]?.level;
  4021.  
  4022. if (initData_itemDetailMap[itemHrid]?.equipmentDetail && itemLevel && itemLevel > 0) {
  4023. if (!div.querySelector("div.script_itemLevel")) {
  4024. div.style.position = "relative";
  4025. div.insertAdjacentHTML(
  4026. "beforeend",
  4027. `<div class="script_itemLevel" style="z-index: 1; position: absolute; top: 2px; right: 2px; text-align: right; color: ${SCRIPT_COLOR_MAIN};">${itemLevel}</div>`
  4028. );
  4029. }
  4030. if (
  4031. !initData_itemDetailMap[itemHrid]?.equipmentDetail?.type?.includes("_tool") &&
  4032. div.parentElement.parentElement.parentElement.className.includes("MarketplacePanel_marketItems__D4k7e")
  4033. ) {
  4034. handleMarketItemFilter(div, initData_itemDetailMap[itemHrid]);
  4035. }
  4036. } else if (itemAbilityLevel && itemAbilityLevel > 0) {
  4037. if (!div.querySelector("div.script_itemLevel")) {
  4038. div.style.position = "relative";
  4039. div.insertAdjacentHTML(
  4040. "beforeend",
  4041. `<div class="script_itemLevel" style="z-index: 1; position: absolute; top: 2px; right: 2px; text-align: right; color: ${SCRIPT_COLOR_MAIN};">${itemAbilityLevel}</div>`
  4042. );
  4043. }
  4044. } else if (settingsMap.showsKeyInfoInIcon.isTrue && (itemHrid.includes("_key_fragment") || itemHrid.includes("_key"))) {
  4045. const map = new Map();
  4046. map.set("/items/blue_key_fragment", isZH ? "图3" : "Z3");
  4047. map.set("/items/green_key_fragment", isZH ? "图4" : "Z4");
  4048. map.set("/items/purple_key_fragment", isZH ? "图5" : "Z5");
  4049. map.set("/items/white_key_fragment", isZH ? "图6" : "Z6");
  4050. map.set("/items/orange_key_fragment", isZH ? "图7" : "Z7");
  4051. map.set("/items/brown_key_fragment", isZH ? "图8" : "Z8");
  4052. map.set("/items/stone_key_fragment", isZH ? "图9" : "Z9");
  4053. map.set("/items/dark_key_fragment", isZH ? "图10" : "Z10");
  4054. map.set("/items/burning_key_fragment", isZH ? "图11" : "Z11");
  4055.  
  4056. map.set("/items/chimerical_entry_key", isZH ? "牢1" : "D1");
  4057. map.set("/items/sinister_entry_key", isZH ? "牢2" : "D2");
  4058. map.set("/items/enchanted_entry_key", isZH ? "牢3" : "D3");
  4059. map.set("/items/pirate_entry_key", isZH ? "牢4" : "D4");
  4060.  
  4061. map.set("/items/chimerical_chest_key", "3.4.5.6");
  4062. map.set("/items/sinister_chest_key", "5.7.8.10");
  4063. map.set("/items/enchanted_chest_key", "7.8.9.11");
  4064. map.set("/items/pirate_chest_key", "6.9.10.11");
  4065.  
  4066. if (!div.querySelector("div.script_key")) {
  4067. div.style.position = "relative";
  4068. div.insertAdjacentHTML(
  4069. "beforeend",
  4070. `<div class="script_key" style="z-index: 1; position: absolute; top: 2px; right: 2px; text-align: right; color: ${SCRIPT_COLOR_MAIN};">${map.get(
  4071. itemHrid
  4072. )}</div>`
  4073. );
  4074. }
  4075. }
  4076. }
  4077. }
  4078. if (settingsMap.itemIconLevel.isTrue) {
  4079. setInterval(addItemLevels, 500);
  4080. }
  4081.  
  4082. /* 市场物品筛选 */
  4083. let onlyShowItemsAboveLevel = 1;
  4084. let onlyShowItemsBelowLevel = 1000;
  4085. let onlyShowItemsType = "all";
  4086. let onlyShowItemsSkillReq = "all";
  4087.  
  4088. function addMarketFilterButtons() {
  4089. const oriFilter = document.querySelector(".MarketplacePanel_itemFilterContainer__3F3td");
  4090. let filters = document.querySelector("#script_filters");
  4091. if (oriFilter && !filters) {
  4092. oriFilter.insertAdjacentHTML("afterend", `<div id="script_filters" style="float: left; color: ${SCRIPT_COLOR_MAIN};"></div>`);
  4093. filters = document.querySelector("#script_filters");
  4094. filters.insertAdjacentHTML(
  4095. "beforeend",
  4096. `<span id="script_filter_level" style="float: left; color: ${SCRIPT_COLOR_MAIN};">${isZH ? "等级: 大于等于 " : "Equipment level: >= "}
  4097. <select name="script_filter_level_select" id="script_filter_level_select">
  4098. <option value="1">All</option>
  4099. <option value="10">10</option>
  4100. <option value="20">20</option>
  4101. <option value="30">30</option>
  4102. <option value="40">40</option>
  4103. <option value="50">50</option>
  4104. <option value="60">60</option>
  4105. <option value="65">65</option>
  4106. <option value="70">70</option>
  4107. <option value="75">75</option>
  4108. <option value="80">80</option>
  4109. <option value="85">85</option>
  4110. <option value="90">90</option>
  4111. <option value="95">95</option>
  4112. <option value="100">100</option>
  4113. </select>&nbsp;</span>`
  4114. );
  4115. filters.insertAdjacentHTML(
  4116. "beforeend",
  4117. `<span id="script_filter_level_to" style="float: left; color: ${SCRIPT_COLOR_MAIN};">${isZH ? "小于 " : "< "}
  4118. <select name="script_filter_level_select_to" id="script_filter_level_select_to">
  4119. <option value="1000">All</option>
  4120. <option value="10">10</option>
  4121. <option value="20">20</option>
  4122. <option value="30">30</option>
  4123. <option value="40">40</option>
  4124. <option value="50">50</option>
  4125. <option value="60">60</option>
  4126. <option value="65">65</option>
  4127. <option value="70">70</option>
  4128. <option value="75">75</option>
  4129. <option value="80">80</option>
  4130. <option value="85">85</option>
  4131. <option value="90">90</option>
  4132. <option value="95">95</option>
  4133. <option value="100">100</option>
  4134. </select>&emsp;</span>`
  4135. );
  4136. filters.insertAdjacentHTML(
  4137. "beforeend",
  4138. `<span id="script_filter_skill" style="float: left; color: ${SCRIPT_COLOR_MAIN};">${isZH ? "职业: " : "Class: "}
  4139. <select name="script_filter_skill_select" id="script_filter_skill_select">
  4140. <option value="all">All</option>
  4141. <option value="attack">Attack</option>
  4142. <option value="power">Power</option>
  4143. <option value="defense">Defense</option>
  4144. <option value="ranged">Ranged</option>
  4145. <option value="magic">Magic</option>
  4146. <option value="others">Others</option>
  4147. </select>&emsp;</span>`
  4148. );
  4149. filters.insertAdjacentHTML(
  4150. "beforeend",
  4151. `<span id="script_filter_location" style="float: left; color: ${SCRIPT_COLOR_MAIN};">${isZH ? "部位: " : "Slot: "}
  4152. <select name="script_filter_location_select" id="script_filter_location_select">
  4153. <option value="all">All</option>
  4154. <option value="main_hand">Main Hand</option>
  4155. <option value="off_hand">Off Hand</option>
  4156. <option value="two_hand">Two Hand</option>
  4157. <option value="head">Head</option>
  4158. <option value="body">Body</option>
  4159. <option value="hands">Hands</option>
  4160. <option value="legs">Legs</option>
  4161. <option value="feet">Feet</option>
  4162. <option value="neck">Neck</option>
  4163. <option value="earrings">Earrings</option>
  4164. <option value="ring">Ring</option>
  4165. <option value="pouch">Pouch</option>
  4166. <option value="back">Back</option>
  4167. </select>&emsp;</span>`
  4168. );
  4169.  
  4170. const levelFilter = document.querySelector("#script_filter_level_select");
  4171. levelFilter.addEventListener("change", function () {
  4172. if (levelFilter.value && !isNaN(levelFilter.value)) {
  4173. onlyShowItemsAboveLevel = Number(levelFilter.value);
  4174. }
  4175. });
  4176. const levelToFilter = document.querySelector("#script_filter_level_select_to");
  4177. levelToFilter.addEventListener("change", function () {
  4178. if (levelToFilter.value && !isNaN(levelToFilter.value)) {
  4179. onlyShowItemsBelowLevel = Number(levelToFilter.value);
  4180. }
  4181. });
  4182. const skillFilter = document.querySelector("#script_filter_skill_select");
  4183. skillFilter.addEventListener("change", function () {
  4184. if (skillFilter.value) {
  4185. onlyShowItemsSkillReq = skillFilter.value;
  4186. }
  4187. });
  4188. const locationFilter = document.querySelector("#script_filter_location_select");
  4189. locationFilter.addEventListener("change", function () {
  4190. if (locationFilter.value) {
  4191. onlyShowItemsType = locationFilter.value;
  4192. }
  4193. });
  4194. }
  4195. }
  4196. if (settingsMap.marketFilter.isTrue) {
  4197. setInterval(addMarketFilterButtons, 500);
  4198. }
  4199.  
  4200. function handleMarketItemFilter(div, itemDetal) {
  4201. if (!itemDetal.equipmentDetail) {
  4202. return;
  4203. }
  4204.  
  4205. const itemLevel = itemDetal.itemLevel;
  4206. const type = itemDetal.equipmentDetail.type;
  4207. const levelRequirements = itemDetal.equipmentDetail.levelRequirements;
  4208.  
  4209. let isType = false;
  4210. isType = type && type.includes(onlyShowItemsType);
  4211. if (onlyShowItemsType === "all") {
  4212. isType = true;
  4213. }
  4214.  
  4215. let isRequired = false;
  4216. for (const requirement of levelRequirements) {
  4217. if (requirement.skillHrid.includes(onlyShowItemsSkillReq)) {
  4218. isRequired = true;
  4219. }
  4220. }
  4221. if (onlyShowItemsSkillReq === "others") {
  4222. const combatTypes = ["attack", "power", "defense", "ranged", "magic"];
  4223. isRequired = !combatTypes.some((type) => {
  4224. for (const requirement of levelRequirements) {
  4225. if (requirement.skillHrid.includes(type)) {
  4226. return true;
  4227. }
  4228. }
  4229. });
  4230. }
  4231. if (onlyShowItemsSkillReq === "all") {
  4232. isRequired = true;
  4233. }
  4234.  
  4235. if (itemLevel >= onlyShowItemsAboveLevel && itemLevel < onlyShowItemsBelowLevel && isType && isRequired) {
  4236. div.style.display = "block";
  4237. } else {
  4238. div.style.display = "none";
  4239. }
  4240. }
  4241.  
  4242. /* 任务卡片显示战斗地图序号 */
  4243. function handleTaskCard() {
  4244. const taskNameDivs = document.querySelectorAll("div.RandomTask_randomTask__3B9fA div.RandomTask_name__1hl1b");
  4245. for (const div of taskNameDivs) {
  4246. if (div.querySelector("span.script_taskMapIndex")) {
  4247. continue;
  4248. }
  4249.  
  4250. const taskStr = getOriTextFromElement(div);
  4251. if (!taskStr.startsWith("Defeat - ") && !taskStr.startsWith("击败 - ")) {
  4252. continue;
  4253. }
  4254.  
  4255. let monsterName = taskStr.replace("Defeat - ", "").replace("击败 - ", "");
  4256. let actionHrid = null;
  4257. if (isZHInGameSetting) {
  4258. actionHrid = (
  4259. getOthersFromZhName(monsterName) ? getOthersFromZhName(monsterName) : getActionEnNameFromZhName(monsterName)
  4260. )?.replaceAll("/monsters/", "/actions/combat/");
  4261. }
  4262.  
  4263. let actionObj = null;
  4264. for (const action of Object.values(initData_actionDetailMap)) {
  4265. if (action.hrid.includes("/combat/")) {
  4266. if (action.hrid === actionHrid || action.name.toLowerCase() === monsterName.toLowerCase()) {
  4267. actionObj = action;
  4268. break;
  4269. } else if (action.combatZoneInfo.fightInfo.battlesPerBoss === 10) {
  4270. if (
  4271. actionHrid?.replaceAll("/actions/combat/", "/monsters/") ===
  4272. action.combatZoneInfo.fightInfo.bossSpawns[0].combatMonsterHrid ||
  4273. "/monsters/" + monsterName.toLowerCase().replaceAll(" ", "_") ===
  4274. action.combatZoneInfo.fightInfo.bossSpawns[0].combatMonsterHrid
  4275. ) {
  4276. actionObj = action;
  4277. break;
  4278. }
  4279. }
  4280. }
  4281. }
  4282. const actionCategoryHrid = actionObj?.category;
  4283. const index = initData_actionCategoryDetailMap?.[actionCategoryHrid]?.sortIndex;
  4284. if (index) {
  4285. div.insertAdjacentHTML(
  4286. "beforeend",
  4287. `<span class="script_taskMapIndex" style="text-align: right; color: ${SCRIPT_COLOR_MAIN};"> ${isZH ? "图" : "Z"}${index}</span>`
  4288. );
  4289. }
  4290. }
  4291. }
  4292. if (settingsMap.taskMapIndex.isTrue) {
  4293. setInterval(handleTaskCard, 500);
  4294. }
  4295.  
  4296. /* 显示战斗地图序号 */
  4297. function addIndexToMaps() {
  4298. const buttons = document.querySelectorAll(
  4299. "div.MainPanel_subPanelContainer__1i-H9 div.CombatPanel_tabsComponentContainer__GsQlg div.MuiTabs-root.MuiTabs-vertical.css-6x4ics button.MuiButtonBase-root.MuiTab-root.MuiTab-textColorPrimary.css-1q2h7u5 span.MuiBadge-root.TabsComponent_badge__1Du26.css-1rzb3uu"
  4300. );
  4301. let index = 1;
  4302. for (const button of buttons) {
  4303. if (!button.querySelector("span.script_mapIndex")) {
  4304. button.insertAdjacentHTML("afterbegin", `<span class="script_mapIndex" style="color: ${SCRIPT_COLOR_MAIN};">${index++}. </span>`);
  4305. }
  4306. }
  4307. }
  4308. if (settingsMap.mapIndex.isTrue) {
  4309. setInterval(addIndexToMaps, 500);
  4310. }
  4311.  
  4312. /* 物品词典窗口显示还需多少技能书到X级 */
  4313. const waitForItemDict = () => {
  4314. const targetNode = document.querySelector("div.GamePage_gamePage__ixiPl");
  4315. if (targetNode) {
  4316. console.log("start observe item dict");
  4317. const itemDictPanelObserver = new MutationObserver(async function (mutations) {
  4318. for (const mutation of mutations) {
  4319. for (const added of mutation.addedNodes) {
  4320. if (
  4321. added?.classList?.contains("Modal_modalContainer__3B80m") &&
  4322. added.querySelector("div.ItemDictionary_modalContent__WvEBY")
  4323. ) {
  4324. handleItemDict(added.querySelector("div.ItemDictionary_modalContent__WvEBY"));
  4325. }
  4326. }
  4327. }
  4328. });
  4329. itemDictPanelObserver.observe(targetNode, { attributes: false, childList: true, subtree: true });
  4330. } else {
  4331. setTimeout(waitForItemDict, 200);
  4332. }
  4333. };
  4334.  
  4335. async function handleItemDict(panel) {
  4336. let abilityHrid = null;
  4337. if (isZHInGameSetting) {
  4338. abilityHrid = getOthersFromZhName(panel.querySelector("h1.ItemDictionary_title__27cTd").textContent);
  4339. } else {
  4340. const itemName = getOriTextFromElement(panel.querySelector("h1.ItemDictionary_title__27cTd"))
  4341. .toLowerCase()
  4342. .replaceAll(" ", "_")
  4343. .replaceAll("'", "");
  4344. for (const skillHrid of Object.keys(initData_abilityDetailMap)) {
  4345. if (skillHrid.includes("/" + itemName)) {
  4346. abilityHrid = skillHrid;
  4347. }
  4348. }
  4349. }
  4350. if (!abilityHrid) {
  4351. return;
  4352. }
  4353.  
  4354. const itemHrid = abilityHrid.replace("/abilities/", "/items/");
  4355. const abilityPerBookExp = initData_itemDetailMap[itemHrid]?.abilityBookDetail?.experienceGain;
  4356.  
  4357. let currentLevel = 0;
  4358. let currentExp = 0;
  4359. for (const a of Object.values(initData_characterAbilities)) {
  4360. if (a.abilityHrid === abilityHrid) {
  4361. currentLevel = a.level;
  4362. currentExp = a.experience;
  4363. }
  4364. }
  4365.  
  4366. const getNeedBooksToLevel = (currentLevel, currentExp, targetLevel, abilityPerBookExp) => {
  4367. const needExp = initData_levelExperienceTable[targetLevel] - currentExp;
  4368. let needBooks = needExp / abilityPerBookExp;
  4369. if (currentLevel === 0) {
  4370. needBooks += 1;
  4371. }
  4372. return needBooks.toFixed(1);
  4373. };
  4374.  
  4375. let numBooks = getNeedBooksToLevel(currentLevel, currentExp, currentLevel + 1, abilityPerBookExp);
  4376.  
  4377. const marketAPIJson = await fetchMarketJSON();
  4378. const ask = marketAPIJson.marketData[itemHrid][0].a || 0;
  4379. const bid = marketAPIJson.marketData[itemHrid][0].b || 0;
  4380.  
  4381. let hTMLStr = `<div id="tillLevel" style="color: ${SCRIPT_COLOR_MAIN}; text-align: left;">${
  4382. isZH ? "到 " : "To "
  4383. }<input id="tillLevelInput" type="number" value="${currentLevel + 1}" min="${currentLevel + 1}" max="200">${
  4384. isZH ? " 级还需 " : " level need "
  4385. }
  4386. <span id="tillLevelNumber">${numBooks} (${numberFormatter(numBooks * ask)} / ${numberFormatter(numBooks * bid)})</span>
  4387. <div>${isZH ? " 本书 (刷新网页更新当前等级)" : " books (Refresh page to update current level.)"}</div>
  4388. </div>`;
  4389. panel.insertAdjacentHTML("beforeend", hTMLStr);
  4390.  
  4391. const tillLevelInput = panel.querySelector("input#tillLevelInput");
  4392. const tillLevelNumber = panel.querySelector("span#tillLevelNumber");
  4393. tillLevelInput.onchange = () => {
  4394. const targetLevel = Number(tillLevelInput.value);
  4395. if (targetLevel > currentLevel && targetLevel <= 200) {
  4396. let numBooks = getNeedBooksToLevel(currentLevel, currentExp, targetLevel, abilityPerBookExp);
  4397. tillLevelNumber.textContent = `${numBooks} (${numberFormatter(numBooks * ask)} / ${numberFormatter(numBooks * bid)})`;
  4398. } else {
  4399. tillLevelNumber.textContent = "Error";
  4400. }
  4401. };
  4402. tillLevelInput.addEventListener("keyup", function (evt) {
  4403. const targetLevel = Number(tillLevelInput.value);
  4404. if (targetLevel > currentLevel && targetLevel <= 200) {
  4405. let numBooks = getNeedBooksToLevel(currentLevel, currentExp, targetLevel, abilityPerBookExp);
  4406. tillLevelNumber.textContent = `${numBooks} (${numberFormatter(numBooks * ask)} / ${numberFormatter(numBooks * bid)})`;
  4407. } else {
  4408. tillLevelNumber.textContent = "Error";
  4409. }
  4410. });
  4411. }
  4412.  
  4413. /* 添加第三方网站链接 */
  4414. function add3rdPartyLinks() {
  4415. const waitForNavi = () => {
  4416. const targetNode = document.querySelector("div.NavigationBar_minorNavigationLinks__dbxh7");
  4417. if (targetNode) {
  4418. let div = document.createElement("div");
  4419. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4420. div.style.color = SCRIPT_COLOR_MAIN;
  4421. div.innerHTML = isZH ? "插件设置" : "Script settings";
  4422. div.addEventListener("click", () => {
  4423. const array = document.querySelectorAll(".NavigationBar_navigationLink__3eAHA");
  4424. array[array.length - 1]?.click();
  4425. });
  4426. targetNode.insertAdjacentElement("afterbegin", div);
  4427.  
  4428. if (isZH) {
  4429. div = document.createElement("div");
  4430. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4431. div.style.color = SCRIPT_COLOR_MAIN;
  4432. div.innerHTML = isZH ? "9战模拟" : "9战模拟";
  4433. div.addEventListener("click", () => {
  4434. window.open("https://shykai.github.io/mwisim.github.io/", "_blank");
  4435. });
  4436. targetNode.insertAdjacentElement("afterbegin", div);
  4437.  
  4438. div = document.createElement("div");
  4439. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4440. div.style.color = SCRIPT_COLOR_MAIN;
  4441. div.innerHTML = isZH ? "利润网站 Mooneycalc" : "利润网站 Mooneycalc";
  4442. div.addEventListener("click", () => {
  4443. window.open("https://mooneycalc.netlify.app/", "_blank");
  4444. });
  4445. targetNode.insertAdjacentElement("afterbegin", div);
  4446.  
  4447. div = document.createElement("div");
  4448. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4449. div.style.color = SCRIPT_COLOR_MAIN;
  4450. div.innerHTML = isZH ? "利润网站 Milkonomy" : "利润网站 Milkonomy";
  4451. div.addEventListener("click", () => {
  4452. window.open("https://milkonomy.pages.dev/", "_blank");
  4453. });
  4454. targetNode.insertAdjacentElement("afterbegin", div);
  4455.  
  4456. div = document.createElement("div");
  4457. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4458. div.style.color = SCRIPT_COLOR_MAIN;
  4459. div.innerHTML = isZH ? "牛牛手册" : "牛牛手册";
  4460. div.addEventListener("click", () => {
  4461. window.open("https://test-ctmd6jnzo6t9.feishu.cn/docx/KG9ddER6Eo2uPoxJFkicsvbEnCe", "_blank");
  4462. });
  4463. targetNode.insertAdjacentElement("afterbegin", div);
  4464. }
  4465.  
  4466. div = document.createElement("div");
  4467. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4468. div.style.color = SCRIPT_COLOR_MAIN;
  4469. div.innerHTML = isZH ? "强化模拟 Enhancelator" : "Enhancement sim Enhancelator";
  4470. div.addEventListener("click", () => {
  4471. window.open("https://doh-nuts.github.io/Enhancelator/", "_blank");
  4472. });
  4473. targetNode.insertAdjacentElement("afterbegin", div);
  4474.  
  4475. div = document.createElement("div");
  4476. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4477. div.style.color = SCRIPT_COLOR_MAIN;
  4478. div.innerHTML = isZH ? "利润计算 Cowculator" : "Profit calc Cowculator";
  4479. div.addEventListener("click", () => {
  4480. window.open("https://danthegoodman.github.io/cowculator/", "_blank");
  4481. });
  4482. targetNode.insertAdjacentElement("afterbegin", div);
  4483.  
  4484. div = document.createElement("div");
  4485. div.setAttribute("class", "NavigationBar_minorNavigationLink__31K7Y");
  4486. div.style.color = SCRIPT_COLOR_MAIN;
  4487. div.innerHTML = isZH ? "战斗模拟 shykai" : "Combat sim shykai";
  4488. div.addEventListener("click", () => {
  4489. window.open("https://shykai.github.io/MWICombatSimulatorTest/dist/", "_blank");
  4490. });
  4491. targetNode.insertAdjacentElement("afterbegin", div);
  4492. } else {
  4493. setTimeout(add3rdPartyLinks, 200);
  4494. }
  4495. };
  4496. waitForNavi();
  4497. }
  4498.  
  4499. /* 动作列表菜单计算时间 */
  4500. function handleActionQueueMenue(added) {
  4501. if (!settingsMap.actionQueue.isTrue) {
  4502. return;
  4503. }
  4504.  
  4505. handleActionQueueMenueCalculateTime(added);
  4506.  
  4507. const listDiv = added.querySelector(".QueuedActions_actions__2Lur6");
  4508. new MutationObserver((mutationsList) => {
  4509. handleActionQueueMenueCalculateTime(added);
  4510. }).observe(listDiv, { characterData: false, subtree: false, childList: true });
  4511. }
  4512.  
  4513. function handleActionQueueMenueCalculateTime(added) {
  4514. const actionDivList = added.querySelectorAll("div.QueuedActions_action__r3HlD");
  4515. if (!actionDivList || actionDivList.length === 0) {
  4516. return;
  4517. }
  4518. if (actionDivList.length !== currentActionsHridList.length - 1) {
  4519. console.error("handleActionQueueTooltip action queue length inconsistency");
  4520. return;
  4521. }
  4522.  
  4523. let actionDivListIndex = 0;
  4524. let hasSkippedfirstActionObj = false;
  4525. let accumulatedTimeSec = 0;
  4526. let isAccumulatedTimeInfinite = false;
  4527. for (const actionObj of currentActionsHridList) {
  4528. const actionHrid = actionObj.actionHrid;
  4529. const count = actionObj.maxCount - actionObj.currentCount;
  4530. let isInfinit = false;
  4531. if (count === 0 || actionHrid.includes("/combat/")) {
  4532. isInfinit = true;
  4533. isAccumulatedTimeInfinite = true;
  4534. }
  4535.  
  4536. const baseTimePerActionSec = initData_actionDetailMap[actionHrid].baseTimeCost / 1000000000;
  4537. const totalEffBuff = getTotalEffiPercentage(actionHrid);
  4538. const toolSpeedBuff = getToolsSpeedBuffByActionHrid(actionHrid);
  4539.  
  4540. let timePerActionSec = baseTimePerActionSec / (1 + toolSpeedBuff / 100);
  4541. timePerActionSec /= 1 + totalEffBuff / 100;
  4542. let totalTimeSec = count * timePerActionSec;
  4543.  
  4544. let str = isZH ? "到 ∞ " : "Complete at ∞ ";
  4545. if (!isAccumulatedTimeInfinite) {
  4546. accumulatedTimeSec += totalTimeSec;
  4547. const currentTime = new Date();
  4548. currentTime.setSeconds(currentTime.getSeconds() + accumulatedTimeSec);
  4549. str = `${isZH ? "到 " : "Complete at "}${String(currentTime.getHours()).padStart(2, "0")}:${String(currentTime.getMinutes()).padStart(
  4550. 2,
  4551. "0"
  4552. )}:${String(currentTime.getSeconds()).padStart(2, "0")}`;
  4553. }
  4554.  
  4555. if (hasSkippedfirstActionObj) {
  4556. const html = `<div class="script_actionTime" style="color: ${SCRIPT_COLOR_MAIN};">${
  4557. isInfinit ? "[ ∞ ] " : `[${timeReadable(totalTimeSec)}]`
  4558. } ${str}</div>`;
  4559. if (actionDivList[actionDivListIndex].querySelector("div div.script_actionTime")) {
  4560. actionDivList[actionDivListIndex].querySelector("div div.script_actionTime").innerHTML = html;
  4561. } else {
  4562. actionDivList[actionDivListIndex].querySelector("div").insertAdjacentHTML("beforeend", html);
  4563. }
  4564. actionDivListIndex++;
  4565. }
  4566. hasSkippedfirstActionObj = true;
  4567. }
  4568. const html = `<div id="script_queueTotalTime" style="color: ${SCRIPT_COLOR_MAIN};">${isZH ? "总时间:" : "Total time: "}${
  4569. isAccumulatedTimeInfinite ? "[ ∞ ] " : `[${timeReadable(accumulatedTimeSec)}]`
  4570. }</div>`;
  4571. if (document.querySelector("div#script_queueTotalTime")) {
  4572. document.querySelector("div#script_queueTotalTime").innerHTML = html;
  4573. } else {
  4574. document.querySelector("div.QueuedActions_queuedActionsEditMenu__3OoQH").insertAdjacentHTML("afterend", html);
  4575. }
  4576. }
  4577.  
  4578. /* 支持修改版汉化插件 */
  4579. function getOriTextFromElement(elem) {
  4580. if (!elem) {
  4581. console.error("getTextFromElement null elem");
  4582. return "";
  4583. }
  4584. const translatedfrom = elem.getAttribute("script_translatedfrom");
  4585. if (translatedfrom) {
  4586. return translatedfrom;
  4587. }
  4588. return elem.textContent;
  4589. }
  4590.  
  4591. /* 强化模拟器 */
  4592. async function handleItemTooltipWithEnhancementLevel(tooltip) {
  4593. if (!settingsMap.enhanceSim.isTrue) {
  4594. return;
  4595. }
  4596.  
  4597. if (typeof math === "undefined") {
  4598. console.error(`handleItemTooltipWithEnhancementLevel no math lib`);
  4599. tooltip
  4600. .querySelector(".ItemTooltipText_itemTooltipText__zFq3A")
  4601. .insertAdjacentHTML(
  4602. "beforeend",
  4603. `<div style="color: ${SCRIPT_COLOR_ALERT};">${
  4604. isZH ? "由于网络问题无法强化模拟: 1. 手机可能不支持脚本联网;2. 请尝试科学网络;" : "Enhancement sim Internet error"
  4605. }</div>`
  4606. );
  4607. return;
  4608. }
  4609.  
  4610. const itemNameElems = tooltip.querySelectorAll("div.ItemTooltipText_name__2JAHA span");
  4611. let itemName = getOriTextFromElement(itemNameElems[0]);
  4612. if (isZHInGameSetting) {
  4613. itemName = getItemEnNameFromZhName(itemName);
  4614. }
  4615. const enhancementLevel = Number(itemNameElems[1].textContent.replace("+", ""));
  4616.  
  4617. let itemHrid = itemEnNameToHridMap[itemName];
  4618. if (!itemHrid || !initData_itemDetailMap[itemHrid]) {
  4619. console.error(`handleItemTooltipWithEnhancementLevel invalid itemHrid ${itemName} ${itemHrid}`);
  4620. return;
  4621. }
  4622.  
  4623. input_data.item_hrid = itemHrid;
  4624. input_data.stop_at = enhancementLevel;
  4625. const best = await findBestEnhanceStrat(input_data);
  4626.  
  4627. let appendHTMLStr = `<div style="color: ${SCRIPT_COLOR_TOOLTIP};">${
  4628. isZH ? "不支持模拟+1装备" : "Enhancement sim of +1 equipments not supported"
  4629. }</div>`;
  4630. if (best) {
  4631. let needMatStr = "";
  4632. for (const [key, value] of Object.entries(best.costs.needMap)) {
  4633. needMatStr += `<div>${key} ${isZH ? "单价: " : "price per item: "}${numberFormatter(value)}<div>`;
  4634. }
  4635. appendHTMLStr = `<div style="color: ${SCRIPT_COLOR_TOOLTIP};"><div>${
  4636. isZH
  4637. ? "强化模拟(默认125级强化,6级房子,10级星空工具,10级手套,究极茶,幸运茶,卖单价收货,不包括工时费,不包括市场税):"
  4638. : "Enhancement simulator: Default level 12 enhancing, level 6 house, level 10 celestial tool, level 10 gloves, ultra tea, blessed tea, sell order price in, no player time fee, no market tax: "
  4639. }</div><div>${isZH ? "总成本 " : "Total cost "}${numberFormatter(best.totalCost.toFixed(0))}</div><div>${isZH ? "耗时 " : "Time spend "}${
  4640. best.simResult.totalActionTimeStr
  4641. }</div>${
  4642. best.protect_count > 0
  4643. ? `<div>${isZH ? "从 " : "Use protection from level "}` + best.protect_at + `${isZH ? " 级开始保护" : ""}</div>`
  4644. : `<div>${isZH ? "不需要保护" : "No protection use"}</div>`
  4645. }<div>${isZH ? "保护 " : "Protection "}${best.protect_count.toFixed(1)}${isZH ? " 次" : " times"}</div><div>${
  4646. isZH ? "+0底子: " : "+0 Base item: "
  4647. }${numberFormatter(best.costs.baseCost)}</div><div>${
  4648. best.protect_count > 0
  4649. ? (isZH ? "保护单价: " : "Price per protection: ") +
  4650. initData_itemDetailMap[best.costs.choiceOfProtection].name +
  4651. " " +
  4652. numberFormatter(best.costs.minProtectionCost)
  4653. : ""
  4654. }
  4655. </div>${needMatStr}</div>`;
  4656. }
  4657.  
  4658. tooltip.querySelector(".ItemTooltipText_itemTooltipText__zFq3A").insertAdjacentHTML("beforeend", appendHTMLStr);
  4659. }
  4660.  
  4661. async function findBestEnhanceStrat(input_data) {
  4662. const price_data = await fetchMarketJSON();
  4663. if (!price_data || !price_data.marketData) {
  4664. console.error("findBestEnhanceStrat fetchMarketJSON null");
  4665. return [];
  4666. }
  4667.  
  4668. const allResults = [];
  4669. for (let protect_at = 2; protect_at <= input_data.stop_at; protect_at++) {
  4670. const simResult = Enhancelate(input_data, protect_at);
  4671. const costs = getCosts(input_data.item_hrid, price_data);
  4672. const totalCost = costs.baseCost + costs.minProtectionCost * simResult.protect_count + costs.perActionCost * simResult.actions;
  4673. const r = {};
  4674. r.protect_at = protect_at;
  4675. r.protect_count = simResult.protect_count;
  4676. r.simResult = simResult;
  4677. r.costs = costs;
  4678. r.totalCost = totalCost;
  4679. allResults.push(r);
  4680. }
  4681.  
  4682. let best = null;
  4683. for (const r of allResults) {
  4684. if (best === null || r.totalCost < best.totalCost) {
  4685. best = r;
  4686. }
  4687. }
  4688. return best;
  4689. }
  4690.  
  4691. // Source: https://doh-nuts.github.io/Enhancelator/
  4692. function Enhancelate(input_data, protect_at) {
  4693. const success_rate = [
  4694. 50, //+1
  4695. 45, //+2
  4696. 45, //+3
  4697. 40, //+4
  4698. 40, //+5
  4699. 40, //+6
  4700. 35, //+7
  4701. 35, //+8
  4702. 35, //+9
  4703. 35, //+10
  4704. 30, //+11
  4705. 30, //+12
  4706. 30, //+13
  4707. 30, //+14
  4708. 30, //+15
  4709. 30, //+16
  4710. 30, //+17
  4711. 30, //+18
  4712. 30, //+19
  4713. 30, //+20
  4714. ];
  4715.  
  4716. // 物品等级
  4717. const itemLevel = initData_itemDetailMap[input_data.item_hrid].itemLevel;
  4718.  
  4719. // 总强化buff
  4720. let total_bonus = null;
  4721. const effective_level =
  4722. input_data.enhancing_level +
  4723. (input_data.tea_enhancing ? 3 : 0) +
  4724. (input_data.tea_super_enhancing ? 6 : 0) +
  4725. (input_data.tea_ultra_enhancing ? 8 : 0);
  4726. if (effective_level >= itemLevel) {
  4727. total_bonus = 1 + (0.05 * (effective_level + input_data.laboratory_level - itemLevel) + input_data.enhancer_bonus) / 100;
  4728. } else {
  4729. total_bonus = 1 - 0.5 * (1 - effective_level / itemLevel) + (0.05 * input_data.laboratory_level + input_data.enhancer_bonus) / 100;
  4730. }
  4731.  
  4732. // 模拟
  4733. let markov = math.zeros(20, 20);
  4734. for (let i = 0; i < input_data.stop_at; i++) {
  4735. const success_chance = (success_rate[i] / 100.0) * total_bonus;
  4736. const destination = i >= protect_at ? i - 1 : 0;
  4737. if (input_data.tea_blessed) {
  4738. markov.set([i, i + 2], success_chance * 0.01);
  4739. markov.set([i, i + 1], success_chance * 0.99);
  4740. markov.set([i, destination], 1 - success_chance);
  4741. } else {
  4742. markov.set([i, i + 1], success_chance);
  4743. markov.set([i, destination], 1.0 - success_chance);
  4744. }
  4745. }
  4746. markov.set([input_data.stop_at, input_data.stop_at], 1.0);
  4747. let Q = markov.subset(math.index(math.range(0, input_data.stop_at), math.range(0, input_data.stop_at)));
  4748. const M = math.inv(math.subtract(math.identity(input_data.stop_at), Q));
  4749. const attemptsArray = M.subset(math.index(math.range(0, 1), math.range(0, input_data.stop_at)));
  4750. const attempts = math.flatten(math.row(attemptsArray, 0).valueOf()).reduce((a, b) => a + b, 0);
  4751. const protectAttempts = M.subset(math.index(math.range(0, 1), math.range(protect_at, input_data.stop_at)));
  4752. const protectAttemptsArray = typeof protectAttempts === "number" ? [protectAttempts] : math.flatten(math.row(protectAttempts, 0).valueOf());
  4753. const protects = protectAttemptsArray.map((a, i) => a * markov.get([i + protect_at, i + protect_at - 1])).reduce((a, b) => a + b, 0);
  4754.  
  4755. // 动作时间
  4756. const perActionTimeSec = (
  4757. 12 /
  4758. (1 +
  4759. (input_data.enhancing_level > itemLevel
  4760. ? (effective_level + input_data.laboratory_level - itemLevel + input_data.glove_bonus) / 100
  4761. : (input_data.laboratory_level + input_data.glove_bonus) / 100))
  4762. ).toFixed(2);
  4763.  
  4764. const result = {};
  4765. result.actions = attempts;
  4766. result.protect_count = protects;
  4767. result.totalActionTimeSec = perActionTimeSec * attempts;
  4768. result.totalActionTimeStr = timeReadable(result.totalActionTimeSec);
  4769. return result;
  4770. }
  4771.  
  4772. // 自定义强化模拟输入参数
  4773. // Customization
  4774. let input_data = {
  4775. item_hrid: null,
  4776. stop_at: null,
  4777.  
  4778. enhancing_level: 125, // 人物 Enhancing 技能等级
  4779. laboratory_level: 6, // 房子等级
  4780. enhancer_bonus: 5.42, // 工具提高成功率,10级星空强化工具
  4781. glove_bonus: 12.9, // 手套提高强化速度,0级=10,5级=11.2,10级=12.9
  4782.  
  4783. tea_enhancing: false, // 强化茶
  4784. tea_super_enhancing: false, // 超级强化茶
  4785. tea_ultra_enhancing: true,
  4786. tea_blessed: true, // 祝福茶
  4787.  
  4788. priceAskBidRatio: 1, // 取市场卖单价买单价比例,1=只用卖单价,0=只用买单价
  4789. };
  4790.  
  4791. function getCosts(hrid, price_data) {
  4792. const itemDetailObj = initData_itemDetailMap[hrid];
  4793.  
  4794. // +0本体成本
  4795. const baseCost = getRealisticBaseItemPrice(hrid, price_data);
  4796.  
  4797. // 保护成本
  4798. let minProtectionPrice = null;
  4799. let minProtectionHrid = null;
  4800. let protect_item_hrids =
  4801. itemDetailObj.protectionItemHrids == null
  4802. ? [hrid, "/items/mirror_of_protection"]
  4803. : [hrid, "/items/mirror_of_protection"].concat(itemDetailObj.protectionItemHrids);
  4804. protect_item_hrids.forEach((protection_hrid, i) => {
  4805. const this_cost = getRealisticBaseItemPrice(protection_hrid, price_data);
  4806. if (i === 0) {
  4807. minProtectionPrice = this_cost;
  4808. minProtectionHrid = protection_hrid;
  4809. } else {
  4810. if (this_cost > 0 && (minProtectionPrice < 0 || this_cost < minProtectionPrice)) {
  4811. minProtectionPrice = this_cost;
  4812. minProtectionHrid = protection_hrid;
  4813. }
  4814. }
  4815. });
  4816.  
  4817. // 强化材料成本
  4818. const needMap = {};
  4819. let totalNeedPrice = 0;
  4820. for (const need of itemDetailObj.enhancementCosts) {
  4821. const price = getItemMarketPrice(need.itemHrid, price_data);
  4822. totalNeedPrice += price * need.count;
  4823. if (!need.itemHrid.includes("/coin")) {
  4824. needMap[initData_itemDetailMap[need.itemHrid].name] = price;
  4825. }
  4826. }
  4827.  
  4828. return {
  4829. baseCost: baseCost,
  4830. minProtectionCost: minProtectionPrice,
  4831. perActionCost: totalNeedPrice,
  4832. choiceOfProtection: minProtectionHrid,
  4833. needMap: needMap,
  4834. };
  4835. }
  4836.  
  4837. function getRealisticBaseItemPrice(hrid, price_data) {
  4838. const itemDetailObj = initData_itemDetailMap[hrid];
  4839. const productionCost = getBaseItemProductionCost(itemDetailObj.name, price_data);
  4840.  
  4841. const item_price_data = price_data.marketData[hrid];
  4842. const ask = item_price_data?.[0]?.a;
  4843. const bid = item_price_data?.[0]?.b;
  4844.  
  4845. let result = 0;
  4846.  
  4847. if (ask && ask > 0) {
  4848. if (bid && bid > 0) {
  4849. // Both ask and bid.
  4850. if (ask / bid > 1.3) {
  4851. result = Math.max(bid, productionCost);
  4852. } else {
  4853. result = ask;
  4854. }
  4855. } else {
  4856. // Only ask.
  4857. if (ask / productionCost > 1.3) {
  4858. result = productionCost;
  4859. } else {
  4860. result = Math.max(ask, productionCost);
  4861. }
  4862. }
  4863. } else {
  4864. if (bid && bid > 0) {
  4865. // Only bid.
  4866. result = Math.max(bid, productionCost);
  4867. } else {
  4868. // Neither ask nor bid.
  4869. result = productionCost;
  4870. }
  4871. }
  4872.  
  4873. return result;
  4874. }
  4875.  
  4876. function getItemMarketPrice(hrid, price_data) {
  4877. const item_price_data = price_data.marketData[hrid];
  4878.  
  4879. // Return 0 if the item does not have neither ask nor bid prices.
  4880. if (!item_price_data || (item_price_data[0].a < 0 && item_price_data[0].b < 0)) {
  4881. // console.log("getItemMarketPrice() return 0 due to neither ask nor bid prices: " + hrid);
  4882. return 0;
  4883. }
  4884.  
  4885. // Return the other price if the item does not have ask or bid price.
  4886. let ask = item_price_data[0]?.a;
  4887. let bid = item_price_data[0]?.b;
  4888. if (ask > 0 && bid < 0) {
  4889. return ask;
  4890. }
  4891. if (bid > 0 && ask < 0) {
  4892. return bid;
  4893. }
  4894.  
  4895. let final_cost = ask * input_data.priceAskBidRatio + bid * (1 - input_data.priceAskBidRatio);
  4896. return final_cost;
  4897. }
  4898.  
  4899. // +0底子制作成本,仅单层制作,考虑茶减少消耗
  4900. function getBaseItemProductionCost(itemName, price_data) {
  4901. const actionHrid = getActionHridFromItemName(itemName);
  4902. if (!actionHrid || !initData_actionDetailMap[actionHrid]) {
  4903. return -1;
  4904. }
  4905.  
  4906. let totalPrice = 0;
  4907.  
  4908. const inputItems = JSON.parse(JSON.stringify(initData_actionDetailMap[actionHrid].inputItems));
  4909. for (let item of inputItems) {
  4910. totalPrice += getItemMarketPrice(item.itemHrid, price_data) * item.count;
  4911. }
  4912. totalPrice *= 0.9; // 茶减少消耗
  4913.  
  4914. const upgradedFromItemHrid = initData_actionDetailMap[actionHrid]?.upgradeItemHrid;
  4915. if (upgradedFromItemHrid) {
  4916. totalPrice += getItemMarketPrice(upgradedFromItemHrid, price_data) * 1;
  4917. }
  4918.  
  4919. return totalPrice;
  4920. }
  4921.  
  4922. /* 脚本设置面板 */
  4923. const waitForSetttins = () => {
  4924. const targetNode = document.querySelector("div.SettingsPanel_profileTab__214Bj");
  4925. if (targetNode) {
  4926. if (!targetNode.querySelector("#script_settings")) {
  4927. targetNode.insertAdjacentHTML("beforeend", `<div id="script_settings"></div>`);
  4928. const insertElem = targetNode.querySelector("div#script_settings");
  4929. insertElem.insertAdjacentHTML(
  4930. "beforeend",
  4931. `<div style="float: left; color: ${SCRIPT_COLOR_MAIN}">${
  4932. isZH ? "MWITools 设置 (刷新生效):" : "MWITools Settings (refresh page to apply): "
  4933. }</div></br>`
  4934. );
  4935.  
  4936. for (const setting of Object.values(settingsMap)) {
  4937. insertElem.insertAdjacentHTML(
  4938. "beforeend",
  4939. `<div style="float: left;"><input type="checkbox" id="${setting.id}" ${setting.isTrue ? "checked" : ""}></input>${
  4940. setting.desc
  4941. }</div></br>`
  4942. );
  4943. }
  4944.  
  4945. insertElem.insertAdjacentHTML(
  4946. "beforeend",
  4947. `<div style="float: left;">${
  4948. isZH
  4949. ? "代码里搜索“自定义”可以手动修改字体颜色、强化模拟默认参数"
  4950. : `Search "Customization" in code to customize font colors and default enhancement simulation parameters.`
  4951. }</div></br>`
  4952. );
  4953. insertElem.addEventListener("change", saveSettings);
  4954. }
  4955. }
  4956. setTimeout(waitForSetttins, 500);
  4957. };
  4958. waitForSetttins();
  4959.  
  4960. function saveSettings() {
  4961. for (const checkbox of document.querySelectorAll("div#script_settings input")) {
  4962. settingsMap[checkbox.id].isTrue = checkbox.checked;
  4963. localStorage.setItem("script_settingsMap", JSON.stringify(settingsMap));
  4964. }
  4965. }
  4966.  
  4967. function readSettings() {
  4968. const ls = localStorage.getItem("script_settingsMap");
  4969. if (ls) {
  4970. const lsObj = JSON.parse(ls);
  4971. for (const option of Object.values(lsObj)) {
  4972. if (settingsMap.hasOwnProperty(option.id)) {
  4973. settingsMap[option.id].isTrue = option.isTrue;
  4974. }
  4975. }
  4976. }
  4977.  
  4978. if (settingsMap.forceMWIToolsDisplayZH.isTrue) {
  4979. isZH = true; // For Traditional Chinese users.
  4980. }
  4981.  
  4982. if (settingsMap.useOrangeAsMainColor.isTrue && SCRIPT_COLOR_MAIN === "green") {
  4983. SCRIPT_COLOR_MAIN = "orange";
  4984. }
  4985. if (settingsMap.useOrangeAsMainColor.isTrue && SCRIPT_COLOR_TOOLTIP === "darkgreen") {
  4986. SCRIPT_COLOR_TOOLTIP = "#804600";
  4987. }
  4988. }
  4989.  
  4990. /* 检查是否穿错生产/战斗装备 */
  4991. function checkEquipment() {
  4992. if (currentActionsHridList.length === 0) {
  4993. return;
  4994. }
  4995. const currentActionHrid = currentActionsHridList[0].actionHrid;
  4996. const hasHat = currentEquipmentMap["/item_locations/head"]?.itemHrid === "/items/red_chefs_hat" ? true : false; // Cooking, Brewing
  4997. const hasOffHand = currentEquipmentMap["/item_locations/off_hand"]?.itemHrid === "/items/eye_watch" ? true : false; // Cheesesmithing, Crafting, Tailoring
  4998. const hasBoot = currentEquipmentMap["/item_locations/feet"]?.itemHrid === "/items/collectors_boots" ? true : false; // Milking, Foraging, Woodcutting
  4999. const hasGlove = currentEquipmentMap["/item_locations/hands"]?.itemHrid === "/items/enchanted_gloves" ? true : false; // Enhancing
  5000.  
  5001. let warningStr = null;
  5002. if (currentActionHrid.includes("/actions/combat/")) {
  5003. if (hasHat || hasOffHand || hasBoot || hasGlove) {
  5004. warningStr = isZH ? "正穿着生产装备" : "Production equipment equipted";
  5005. }
  5006. } else if (currentActionHrid.includes("/actions/cooking/") || currentActionHrid.includes("/actions/brewing/")) {
  5007. if (!hasHat && hasItemHridInInv("/items/red_chefs_hat")) {
  5008. warningStr = isZH ? "没穿生产帽" : "Not wearing production hat";
  5009. }
  5010. } else if (
  5011. currentActionHrid.includes("/actions/cheesesmithing/") ||
  5012. currentActionHrid.includes("/actions/crafting/") ||
  5013. currentActionHrid.includes("/actions/tailoring/")
  5014. ) {
  5015. if (!hasOffHand && hasItemHridInInv("/items/eye_watch")) {
  5016. warningStr = isZH ? "没穿生产副手" : "Not wearing production off-hand";
  5017. }
  5018. } else if (
  5019. currentActionHrid.includes("/actions/milking/") ||
  5020. currentActionHrid.includes("/actions/foraging/") ||
  5021. currentActionHrid.includes("/actions/woodcutting/")
  5022. ) {
  5023. if (!hasBoot && hasItemHridInInv("/items/collectors_boots")) {
  5024. warningStr = isZH ? "没穿生产鞋" : "Not wearing production boots";
  5025. }
  5026. } else if (currentActionHrid.includes("/actions/enhancing")) {
  5027. if (!hasGlove && hasItemHridInInv("/items/enchanted_gloves")) {
  5028. warningStr = isZH ? "没穿强化手套" : "Not wearing enhancing gloves";
  5029. }
  5030. }
  5031.  
  5032. document.body.querySelector("#script_item_warning")?.remove();
  5033. if (warningStr) {
  5034. document.body.insertAdjacentHTML(
  5035. "beforeend",
  5036. `<div id="script_item_warning" style="position: fixed; top: 1%; left: 30%; color: ${SCRIPT_COLOR_ALERT}; font-size: 20px;">${warningStr}</div>`
  5037. );
  5038. }
  5039. }
  5040.  
  5041. function hasItemHridInInv(hrid) {
  5042. let result = null;
  5043. for (const item of initData_characterItems) {
  5044. if (item.itemHrid === hrid && item.itemLocationHrid === "/item_locations/inventory") {
  5045. result = item;
  5046. }
  5047. }
  5048. return result ? true : false;
  5049. }
  5050.  
  5051. /* 空闲时弹窗通知 */
  5052. function notificate() {
  5053. if (typeof GM_notification === "undefined" || !GM_notification) {
  5054. console.error("notificate null GM_notification");
  5055. return;
  5056. }
  5057. if (currentActionsHridList.length > 0) {
  5058. return;
  5059. }
  5060. console.log("notificate empty action");
  5061. GM_notification({
  5062. text: isZH ? "动作队列为空" : "Action queue is empty.",
  5063. title: "MWITools",
  5064. });
  5065. }
  5066.  
  5067. /* 市场价格自动输入最小压价 */
  5068. const waitForMarketOrders = () => {
  5069. const element = document.querySelector(".MarketplacePanel_marketListings__1GCyQ");
  5070. if (element) {
  5071. console.log("start observe market order");
  5072. new MutationObserver((mutationsList) => {
  5073. mutationsList.forEach((mutation) => {
  5074. mutation.addedNodes.forEach((node) => {
  5075. if (node.classList.contains("Modal_modalContainer__3B80m")) {
  5076. handleMarketNewOrder(node);
  5077. }
  5078. });
  5079. });
  5080. }).observe(element, {
  5081. characterData: false,
  5082. subtree: false,
  5083. childList: true,
  5084. });
  5085. } else {
  5086. setTimeout(waitForMarketOrders, 500);
  5087. }
  5088. };
  5089.  
  5090. function handleMarketNewOrder(node) {
  5091. const title = getOriTextFromElement(node.querySelector(".MarketplacePanel_header__yahJo"));
  5092. if (!title || title.includes(" Now") || title.includes("立即")) {
  5093. return;
  5094. }
  5095. const label = node.querySelector("span.MarketplacePanel_bestPrice__3bgKp");
  5096. const inputDiv = node.querySelector(".MarketplacePanel_inputContainer__3xmB2 .MarketplacePanel_priceInputs__3iWxy");
  5097. if (!label || !inputDiv) {
  5098. console.error("handleMarketNewOrder can not find elements");
  5099. return;
  5100. }
  5101.  
  5102. label.click();
  5103.  
  5104. if (getOriTextFromElement(label.parentElement).toLowerCase().includes("best buy") || label.parentElement.textContent.includes("购买")) {
  5105. inputDiv.querySelectorAll(".MarketplacePanel_buttonContainer__vJQud")[2]?.querySelector("div button")?.click();
  5106. } else if (
  5107. getOriTextFromElement(label.parentElement).toLowerCase().includes("best sell") ||
  5108. label.parentElement.textContent.includes("出售")
  5109. ) {
  5110. inputDiv.querySelectorAll(".MarketplacePanel_buttonContainer__vJQud")[1]?.querySelector("div button")?.click();
  5111. }
  5112. }
  5113.  
  5114. /* 伤害统计 */
  5115. // 此功能基于以下作者的代码:
  5116. // 伤害统计 by ponchain
  5117. // 图表 by Stella
  5118. // 头像下方显示数字 by Truth_Light
  5119. const lang = {
  5120. toggleButtonHide: isZH ? "收起" : "Hide",
  5121. toggleButtonShow: isZH ? "展开" : "Show",
  5122. players: isZH ? "玩家" : "Players",
  5123. dpsTextDPS: isZH ? "DPS" : "DPS",
  5124. dpsTextTotalDamage: isZH ? "总伤害" : "Total Damage",
  5125. totalRuntime: isZH ? "运行时间" : "Runtime",
  5126. totalTeamDPS: isZH ? "团队DPS" : "Total Team DPS",
  5127. totalTeamDamage: isZH ? "团队总伤害" : "Total Team Damage",
  5128. damagePercentage: isZH ? "伤害占比" : "Damage %",
  5129. monstername: isZH ? "怪物" : "Monster",
  5130. encountertimes: isZH ? "遭遇数" : "Encounter",
  5131. hitChance: isZH ? "命中率" : "Hit Chance",
  5132. aura: isZH ? "光环" : "Aura",
  5133. };
  5134.  
  5135. let totalDamage = [];
  5136. let totalDuration = 0;
  5137. let startTime = null;
  5138. let endTime = null;
  5139. let monstersHP = [];
  5140. let playersMP = [];
  5141. let players = [];
  5142. let monsters = [];
  5143. let dragging = false;
  5144. let chart = null;
  5145. let monsterCounts = {}; // Object to store monster counts
  5146. let monsterEvasion = {}; // Object to store monster evasion ratings by combat style
  5147. let monsterHrids = {};
  5148. const calculateHitChance = (accuracy, evasion) => {
  5149. const hitChance = (Math.pow(accuracy, 1.4) / (Math.pow(accuracy, 1.4) + Math.pow(evasion, 1.4))) * 100;
  5150. return hitChance;
  5151. };
  5152.  
  5153. const getStatisticsDom = () => {
  5154. const numPlayers = players.length;
  5155. const chartHeight = numPlayers * 35 + 20;
  5156.  
  5157. if (!document.querySelector(".script_dps_panel")) {
  5158. let panel = document.createElement("div");
  5159. panel.style.position = "fixed";
  5160. panel.style.top = "50px";
  5161. panel.style.left = "50px";
  5162. panel.style.zIndex = "9999";
  5163. panel.style.fontSize = "14px";
  5164. panel.style.padding = "10px";
  5165. panel.style.borderRadius = "16px";
  5166. panel.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.3)";
  5167. panel.style.overflow = "auto";
  5168. panel.style.width = "auto";
  5169. panel.style.height = "auto";
  5170. panel.style.backdropFilter = "blur(8px)";
  5171. if (settingsMap.damageGraphTransparentBackground.isTrue) {
  5172. panel.style.background = "rgba(0, 0, 0, 0.5)";
  5173. panel.style.border = "1px solid rgba(255, 255, 255, 0.2)";
  5174. panel.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.3)";
  5175. panel.style.backdropFilter = "blur(8px)";
  5176. } else {
  5177. panel.style.background = "rgba(0, 0, 0)";
  5178. panel.style.border = "1px solid rgba(255, 255, 255)";
  5179. panel.style.boxShadow = "0 4px 12px rgba(0, 0, 0)";
  5180. }
  5181.  
  5182. panel.innerHTML = `
  5183. <div id="panelHeader" style="display: flex; justify-content: space-between; align-items: center; cursor: move; width: auto; height: auto;">
  5184. <span style="font-weight: bold; font-size: 16px; color: #0078d4;">DPS</span>
  5185. <button id="script_toggleButton" style="background-color: #0078d4; color: white; border: none; padding: 5px 10px; margin-left: 10px; border-radius: 8px; cursor: pointer;">${lang.toggleButtonHide}</button>
  5186. </div>
  5187. <div id="script_panelContent">
  5188. <div id="script_dpsChart_div" style="width: 400px; height: ${chartHeight}px;">
  5189. <canvas id="script_dpsChart"></canvas></div>
  5190. <div id="script_dpsText"></div>
  5191. <div id="script_hitChanceTable" style="margin-top: 10px;"></div>
  5192. </div>`;
  5193. panel.className = "script_dps_panel";
  5194.  
  5195. let offsetX, offsetY;
  5196. let dragging = false;
  5197.  
  5198. const panelHeader = panel.querySelector("#panelHeader");
  5199.  
  5200. // 鼠标拖动面板
  5201. panelHeader.addEventListener("mousedown", function (e) {
  5202. const rect = panel.getBoundingClientRect();
  5203. const isResizing = e.clientX > rect.right - 10 || e.clientY > rect.bottom - 10;
  5204. if (isResizing || e.target.id === "script_toggleButton") return;
  5205. dragging = true;
  5206. offsetX = e.clientX - panel.offsetLeft;
  5207. offsetY = e.clientY - panel.offsetTop;
  5208. e.preventDefault(); // 阻止默认行为,防止选择文本
  5209. });
  5210.  
  5211. let dragStartTime = 0;
  5212.  
  5213. document.addEventListener("mousemove", function (e) {
  5214. if (dragging) {
  5215. const now = Date.now();
  5216. if (now - dragStartTime < 16) return; // 限制每16毫秒更新一次
  5217. dragStartTime = now;
  5218.  
  5219. var newX = e.clientX - offsetX;
  5220. var newY = e.clientY - offsetY;
  5221. panel.style.left = newX + "px";
  5222. panel.style.top = newY + "px";
  5223. }
  5224. });
  5225.  
  5226. document.addEventListener("mouseup", function () {
  5227. dragging = false;
  5228. });
  5229.  
  5230. panel.addEventListener("touchstart", function (e) {
  5231. const rect = panel.getBoundingClientRect();
  5232. const isResizing = e.clientX > rect.right - 10 || e.clientY > rect.bottom - 10;
  5233. if (isResizing || e.target.id === "script_toggleButton") return;
  5234. dragging = true;
  5235. let touch = e.touches[0];
  5236. offsetX = touch.clientX - panel.offsetLeft;
  5237. offsetY = touch.clientY - panel.offsetTop;
  5238. e.preventDefault();
  5239. });
  5240.  
  5241. document.addEventListener("touchmove", function (e) {
  5242. if (dragging) {
  5243. const now = Date.now();
  5244. if (now - dragStartTime < 16) return; // 限制每16毫秒更新一次
  5245. dragStartTime = now;
  5246.  
  5247. let touch = e.touches[0];
  5248. var newX = touch.clientX - offsetX;
  5249. var newY = touch.clientY - offsetY;
  5250. panel.style.left = newX + "px";
  5251. panel.style.top = newY + "px";
  5252. }
  5253. });
  5254.  
  5255. document.addEventListener("touchend", function () {
  5256. dragging = false;
  5257. });
  5258.  
  5259. document.body.appendChild(panel);
  5260.  
  5261. // Toggle button functionality
  5262. if (!localStorage.getItem("script_dpsPanel_isExpanded")) {
  5263. localStorage.setItem("script_dpsPanel_isExpanded", true);
  5264. }
  5265. if (localStorage.getItem("script_dpsPanel_isExpanded") !== "true") {
  5266. document.getElementById("script_panelContent").style.display = "none";
  5267. document.getElementById("script_toggleButton").textContent = lang.toggleButtonShow;
  5268. }
  5269.  
  5270. document.getElementById("script_toggleButton").addEventListener("click", function () {
  5271. let isExpanded = localStorage.getItem("script_dpsPanel_isExpanded") === "true";
  5272. isExpanded = !isExpanded;
  5273. localStorage.setItem("script_dpsPanel_isExpanded", isExpanded ? true : false);
  5274. this.textContent = isExpanded ? lang.toggleButtonHide : lang.toggleButtonShow;
  5275. const panelContent = document.getElementById("script_panelContent");
  5276. if (isExpanded) {
  5277. panelContent.style.display = "block";
  5278. this.textContent = lang.toggleButtonHide;
  5279. } else {
  5280. panelContent.style.display = "none";
  5281. this.textContent = lang.toggleButtonShow;
  5282. }
  5283. });
  5284.  
  5285. // Create chart
  5286. const ctx = document.getElementById("script_dpsChart").getContext("2d");
  5287. chart = new Chart(ctx, {
  5288. type: "bar",
  5289. data: {
  5290. labels: [],
  5291. datasets: [
  5292. {
  5293. data: [],
  5294. backgroundColor: [
  5295. "rgba(255, 99, 132, 0.6)", // 浅粉色
  5296. "rgba(54, 162, 235, 0.6)", // 浅蓝色
  5297. "rgba(255, 206, 86, 0.6)", // 浅黄色
  5298. "rgba(75, 192, 192, 0.6)", // 浅绿色
  5299. "rgba(153, 102, 255, 0.6)", // 浅紫色
  5300. "rgba(255, 159, 64, 0.6)", // 浅橙色
  5301. ],
  5302. borderColor: [
  5303. "rgba(255, 99, 132, 1)", // 浅粉色边框
  5304. "rgba(54, 162, 235, 1)", // 浅蓝色边框
  5305. "rgba(255, 206, 86, 1)", // 浅黄色边框
  5306. "rgba(75, 192, 192, 1)", // 浅绿色边框
  5307. "rgba(153, 102, 255, 1)", // 浅紫色边框
  5308. "rgba(255, 159, 64, 1)", // 浅橙色边框
  5309. ],
  5310. borderWidth: 1,
  5311. barPercentage: 0.9,
  5312. categoryPercentage: 1.0,
  5313. },
  5314. ],
  5315. },
  5316. options: {
  5317. responsive: true,
  5318. maintainAspectRatio: false,
  5319. indexAxis: "y",
  5320. scales: {
  5321. x: {
  5322. beginAtZero: true,
  5323. grace: "20%",
  5324. display: false,
  5325. grid: {
  5326. display: false,
  5327. },
  5328. },
  5329. y: {
  5330. grid: {
  5331. display: false,
  5332. },
  5333. ticks: {
  5334. font: {
  5335. size: 12, // 字体大小
  5336. weight: "bold", // 加粗字体
  5337. },
  5338. color: "rgba(255, 255, 255, 0.7)", // 浅色字体(你可以根据背景调整颜色)
  5339. },
  5340. },
  5341. },
  5342. layout: {
  5343. padding: {
  5344. left: 0,
  5345. right: 0,
  5346. top: 0,
  5347. bottom: 0,
  5348. },
  5349. },
  5350. plugins: {
  5351. legend: {
  5352. display: false,
  5353. },
  5354. tooltip: {
  5355. enabled: false,
  5356. },
  5357. datalabels: {
  5358. anchor: "end",
  5359. align: "right",
  5360. color: function (context) {
  5361. const value = context.dataset.data[context.dataIndex];
  5362. return value > 0 ? "white" : "transparent";
  5363. },
  5364. font: {
  5365. weight: "bold",
  5366. size: 12,
  5367. },
  5368. formatter: function (value) {
  5369. return `${value.toLocaleString()}`;
  5370. },
  5371. clip: false,
  5372. display: true,
  5373. },
  5374. },
  5375. },
  5376.  
  5377. plugins: [ChartDataLabels],
  5378. });
  5379. } else if (document.getElementById("script_dpsChart_div")) {
  5380. document.getElementById("script_dpsChart_div").style.height = `${chartHeight}px`;
  5381. }
  5382. return document.querySelector(".script_dps_panel");
  5383. };
  5384.  
  5385. const updateStatisticsPanel = () => {
  5386. const totalTime = totalDuration + (endTime - startTime) / 1000;
  5387. const dps = totalDamage.map((damage) => (totalTime ? Math.round(damage / totalTime) : 0));
  5388. const totalTeamDamage = totalDamage.reduce((acc, damage) => acc + damage, 0);
  5389. const totalTeamDPS = totalTime ? Math.round(totalTeamDamage / totalTime) : 0;
  5390.  
  5391. // 人物头像下方显示数字
  5392. const playersContainer = document.querySelector(".BattlePanel_combatUnitGrid__2hTAM");
  5393. if (playersContainer) {
  5394. players.forEach((player, index) => {
  5395. const playerElement = playersContainer.children[index];
  5396. if (playerElement) {
  5397. const statusElement = playerElement.querySelector(".CombatUnit_status__3bH7W");
  5398. if (statusElement) {
  5399. let dpsElement = statusElement.querySelector(".dps-info");
  5400. if (!dpsElement) {
  5401. dpsElement = document.createElement("div");
  5402. dpsElement.className = "dps-info";
  5403. statusElement.appendChild(dpsElement);
  5404. }
  5405. dpsElement.textContent = `DPS: ${dps[index].toLocaleString()} (${numberFormatter(totalDamage[index])})`;
  5406. }
  5407. }
  5408. });
  5409. }
  5410.  
  5411. // 显示图表
  5412. if (settingsMap.showDamageGraph.isTrue && !dragging) {
  5413. const panel = getStatisticsDom();
  5414. chart.data.labels = players.map((player) => player?.name);
  5415. chart.data.datasets[0].data = dps;
  5416. chart.update();
  5417.  
  5418. // Update text information
  5419. const days = Math.floor(totalTime / (24 * 3600));
  5420. const hours = Math.floor((totalTime % (24 * 3600)) / 3600);
  5421. const minutes = Math.floor((totalTime % 3600) / 60);
  5422. const seconds = Math.floor(totalTime % 60);
  5423. const formattedTime = `${days}d ${hours}h ${minutes}m ${seconds}s`;
  5424.  
  5425. const dpsText = document.getElementById("script_dpsText");
  5426. const playerRows = players
  5427. .map((player, index) => {
  5428. const dpsFormatted = dps[index].toLocaleString();
  5429. const totalDamageFormatted = totalDamage[index].toLocaleString();
  5430. const damagePercentage = totalTeamDamage ? ((totalDamage[index] / totalTeamDamage) * 100).toFixed(2) : 0;
  5431.  
  5432. // Get auraskill for the current player
  5433. let auraskill = "N/A";
  5434. let auraskillHrid = null;
  5435. if (player.combatAbilities && Array.isArray(player.combatAbilities)) {
  5436. const firstAbility = player.combatAbilities[0];
  5437. if (firstAbility && firstAbility.abilityHrid) {
  5438. auraskillHrid = firstAbility.abilityHrid;
  5439. auraskill = firstAbility.abilityHrid.split("/").pop().replace(/_/g, " ");
  5440. const validSkills = [
  5441. "revive",
  5442. "insanity",
  5443. "invincible",
  5444. "fierce aura",
  5445. "aqua aura",
  5446. "sylvan aura",
  5447. "flame aura",
  5448. "speed aura",
  5449. "critical aura",
  5450. ];
  5451. if (!validSkills.includes(auraskill)) {
  5452. auraskill = "N/A";
  5453. }
  5454. }
  5455. }
  5456.  
  5457. // Capitalize the first letter of each word in aura skill
  5458. auraskill = auraskill
  5459. .split(" ")
  5460. .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
  5461. .join(" ");
  5462.  
  5463. // Highlight the player with the highest DPS
  5464. const isHighestDPS = dps[index] === Math.max(...dps);
  5465. const dpsPrefix = isHighestDPS ? "🔥" : "";
  5466.  
  5467. return `
  5468. <tr style="color: white;">
  5469. <td style="font-weight: bold;">${dpsPrefix} ${player.name}</td>
  5470. <td>${isZH ? (auraskillHrid ? ZHOthersDic[auraskillHrid] : "无") : auraskill}</td>
  5471. <td>${dpsFormatted}</td>
  5472. <td>${totalDamageFormatted}</td>
  5473. <td>${damagePercentage}%</td>
  5474. </tr>`;
  5475. })
  5476. .join("");
  5477.  
  5478. dpsText.innerHTML = `
  5479. <table style="width: 100%; border-collapse: collapse; font-size: smaller;">
  5480. <thead>
  5481. <tr style="text-align: left; color: white;">
  5482. <th style="font-weight: bold;">${lang.players}</th>
  5483. <th style="font-weight: bold;">${lang.aura}</th>
  5484. <th style="font-weight: bold;">${lang.dpsTextDPS}</th>
  5485. <th style="font-weight: bold;">${lang.dpsTextTotalDamage}</th>
  5486. <th style="font-weight: bold;">${lang.damagePercentage}</th>
  5487. </tr>
  5488. </thead>
  5489. <tbody>
  5490. ${playerRows}
  5491. </tbody>
  5492. <tbody>
  5493. <tr style="border-top: 2px solid white; font-weight: bold; text-align: left; color: white;">
  5494. <td>${formattedTime}</td>
  5495. <td></td>
  5496. <td>${totalTeamDPS.toLocaleString()}</td>
  5497. <td>${totalTeamDamage.toLocaleString()}</td>
  5498. <td>100%</td>
  5499. </tr>
  5500. </tbody>
  5501. </table>`;
  5502.  
  5503. // Update hit chance table
  5504. const hitChanceTable = document.getElementById("script_hitChanceTable");
  5505. const hitChanceRows = players
  5506. .map((player) => {
  5507. const playerName = player.name;
  5508. const playerHitChances = Object.entries(monsterCounts)
  5509. .map(([monsterName, count]) => {
  5510. const combatStyle = player.combatDetails.combatStats.combatStyleHrids[0].split("/").pop(); // Assuming only one combat style for simplicity
  5511. const evasionRating = monsterEvasion[monsterName][`${player.name}-${combatStyle}`];
  5512. const accuracy = player.combatDetails[`${combatStyle}AccuracyRating`];
  5513. const hitChance = calculateHitChance(accuracy, evasionRating);
  5514. return `<td style="color: white;">${hitChance.toFixed(0)}%</td>`;
  5515. })
  5516. .join("");
  5517. return `<tr><td style="color: white;">${playerName}</td>${playerHitChances}</tr>`;
  5518. })
  5519. .join("");
  5520.  
  5521. hitChanceTable.innerHTML = `
  5522. <table style="width: 100%; border-collapse: collapse; font-size: smaller;">
  5523. <thead>
  5524. <tr>
  5525. <th style="font-size: smaller; white-space: normal; text-align: left; color: white;">${lang.hitChance}</th>
  5526. ${Object.entries(monsterCounts)
  5527. .map(
  5528. ([monsterName, count]) =>
  5529. `<th style="font-size: smaller; white-space: normal; text-align: left; color: white;">${
  5530. isZH ? ZHOthersDic[monsterHrids[monsterName]] : monsterName
  5531. } (${count})</th>`
  5532. )
  5533. .join("")}
  5534. </tr>
  5535. </thead>
  5536. <tbody>
  5537. ${hitChanceRows}
  5538. </tbody>
  5539. </table>`;
  5540. }
  5541. };
  5542.  
  5543. /* 为 https://amvoidguy.github.io/MWICombatSimulatorTest/ 添加导入按钮 */
  5544. // Parts of code regarding group export are by Ratatatata (https://greasyfork.org/en/scripts/507255).
  5545. function addImportButtonForAmvoidguy() {
  5546. const checkElem = () => {
  5547. const selectedElement = document.querySelector(`button#buttonImportExport`);
  5548. if (selectedElement) {
  5549. clearInterval(timer);
  5550. let button = document.createElement("button");
  5551. selectedElement.parentNode.parentElement.parentElement.insertBefore(button, selectedElement.parentElement.parentElement.nextSibling);
  5552. button.textContent = isZH
  5553. ? "单人/组队导入(刷新游戏网页更新人物数据)"
  5554. : "Import solo/group (Refresh game page to update character set)";
  5555. button.style.backgroundColor = SCRIPT_COLOR_MAIN;
  5556. button.style.padding = "5px";
  5557. button.onclick = function () {
  5558. console.log("Importer: Import button onclick");
  5559. const getPriceButton = document.querySelector(`button#buttonGetPrices`);
  5560. if (getPriceButton) {
  5561. console.log("Click getPriceButton");
  5562. getPriceButton.click();
  5563. }
  5564. importDataForAmvoidguy(button);
  5565. return false;
  5566. };
  5567. }
  5568. };
  5569. let timer = setInterval(checkElem, 200);
  5570. }
  5571.  
  5572. async function importDataForAmvoidguy(button) {
  5573. const [exportObj, playerIDs, importedPlayerPositions, zone, isZoneDungeon, isParty] = constructGroupExportObj();
  5574. console.log(exportObj);
  5575. console.log(playerIDs);
  5576.  
  5577. document.querySelector(`a#group-combat-tab`).click();
  5578. const importInputElem = document.querySelector(`input#inputSetGroupCombatAll`);
  5579. importInputElem.value = JSON.stringify(exportObj);
  5580. document.querySelector(`button#buttonImportSet`).click();
  5581.  
  5582. document.querySelector(`a#player1-tab`).textContent = playerIDs[0];
  5583. document.querySelector(`a#player2-tab`).textContent = playerIDs[1];
  5584. document.querySelector(`a#player3-tab`).textContent = playerIDs[2];
  5585. document.querySelector(`a#player4-tab`).textContent = playerIDs[3];
  5586. document.querySelector(`a#player5-tab`).textContent = playerIDs[4];
  5587.  
  5588. // Select zone or dungeon
  5589. if (zone) {
  5590. if (isZoneDungeon) {
  5591. document.querySelector(`input#simDungeonToggle`).checked = true;
  5592. document.querySelector(`input#simDungeonToggle`).dispatchEvent(new Event("change"));
  5593. const selectDungeon = document.querySelector(`select#selectDungeon`);
  5594. for (let i = 0; i < selectZone.options.length; i++) {
  5595. if (selectDungeon.options[i].value === zone) {
  5596. selectDungeon.options[i].selected = true;
  5597. break;
  5598. }
  5599. }
  5600. } else {
  5601. document.querySelector(`input#simDungeonToggle`).checked = false;
  5602. document.querySelector(`input#simDungeonToggle`).dispatchEvent(new Event("change"));
  5603. const selectZone = document.querySelector(`select#selectZone`);
  5604. for (let i = 0; i < selectZone.options.length; i++) {
  5605. if (selectZone.options[i].value === zone) {
  5606. selectZone.options[i].selected = true;
  5607. break;
  5608. }
  5609. }
  5610. }
  5611. }
  5612.  
  5613. // Select sim players
  5614. for (let i = 0; i < 5; i++) {
  5615. if (importedPlayerPositions[i]) {
  5616. if (document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`)) {
  5617. document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`).checked = true;
  5618. document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`).dispatchEvent(new Event("change"));
  5619. }
  5620. } else {
  5621. if (document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`)) {
  5622. document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`).checked = false;
  5623. document.querySelector(`input#player${i + 1}.form-check-input.player-checkbox`).dispatchEvent(new Event("change"));
  5624. }
  5625. }
  5626. }
  5627.  
  5628. // Input simulation time
  5629. document.querySelector(`input#inputSimulationTime`).value = 24;
  5630.  
  5631. button.textContent = isZH ? "已导入" : "Imported";
  5632. if (!isParty) {
  5633. setTimeout(() => {
  5634. document.querySelector(`button#buttonStartSimulation`).click();
  5635. }, 500);
  5636. }
  5637. }
  5638.  
  5639. /* 为 9战模拟网站 添加导入按钮 */
  5640. function addImportButtonFor9Battles() {
  5641. const checkElem = () => {
  5642. const selectedElement = document.querySelector(`button#buttonImportExport`);
  5643. if (selectedElement) {
  5644. clearInterval(timer);
  5645. let button = document.createElement("button");
  5646. selectedElement.parentNode.parentElement.parentElement.insertBefore(button, selectedElement.parentElement.parentElement.nextSibling);
  5647. button.textContent = isZH ? "导入自己(刷新游戏网页更新人物数据)" : "Import Self(Refresh game page to update character set)";
  5648. button.style.backgroundColor = SCRIPT_COLOR_MAIN;
  5649. button.style.padding = "5px";
  5650. button.onclick = function () {
  5651. console.log("Importer: Import button onclick");
  5652. const getPriceButton = document.querySelector(`button#buttonGetPrices`);
  5653. if (getPriceButton) {
  5654. console.log("Click getPriceButton");
  5655. getPriceButton.click();
  5656. }
  5657. importDataFor9Battles(button);
  5658. return false;
  5659. };
  5660. }
  5661. };
  5662. let timer = setInterval(checkElem, 200);
  5663. }
  5664.  
  5665. async function importDataFor9Battles(button) {
  5666. const characterObj = JSON.parse(GM_getValue("init_character_data", ""));
  5667. const clientObj = JSON.parse(GM_getValue("init_client_data", ""));
  5668. console.log(characterObj);
  5669. console.log(clientObj);
  5670.  
  5671. const json = constructSelfPlayerExportObjFromInitCharacterData(characterObj, clientObj);
  5672. console.log(json);
  5673.  
  5674. const importInputElem = document.querySelector(`input#inputSet`);
  5675. importInputElem.value = JSON.stringify(json);
  5676. document.querySelector(`button#buttonImportSet`).click();
  5677.  
  5678. button.textContent = isZH ? "已导入" : "Imported";
  5679. // setTimeout(() => {
  5680. // document.querySelector(`button#buttonStartSimulation`).click();
  5681. // }, 500);
  5682. }
  5683.  
  5684. function constructGroupExportObj() {
  5685. const characterObj = JSON.parse(GM_getValue("init_character_data", ""));
  5686. const clientObj = JSON.parse(GM_getValue("init_client_data", ""));
  5687. let battleObj = null;
  5688. if (GM_getValue("new_battle", "")) {
  5689. battleObj = JSON.parse(GM_getValue("new_battle", ""));
  5690. }
  5691. // console.log(battleObj);
  5692. const storedProfileList = JSON.parse(GM_getValue("profile_export_list", "[]"));
  5693. // console.log(storedProfileList);
  5694.  
  5695. const BLANK_PLAYER_JSON = `{\"player\":{\"attackLevel\":1,\"magicLevel\":1,\"powerLevel\":1,\"rangedLevel\":1,\"defenseLevel\":1,\"staminaLevel\":1,\"intelligenceLevel\":1,\"equipment\":[]},\"food\":{\"/action_types/combat\":[{\"itemHrid\":\"\"},{\"itemHrid\":\"\"},{\"itemHrid\":\"\"}]},\"drinks\":{\"/action_types/combat\":[{\"itemHrid\":\"\"},{\"itemHrid\":\"\"},{\"itemHrid\":\"\"}]},\"abilities\":[{\"abilityHrid\":\"\",\"level\":\"1\"},{\"abilityHrid\":\"\",\"level\":\"1\"},{\"abilityHrid\":\"\",\"level\":\"1\"},{\"abilityHrid\":\"\",\"level\":\"1\"},{\"abilityHrid\":\"\",\"level\":\"1\"}],\"triggerMap\":{},\"zone\":\"/actions/combat/fly\",\"simulationTime\":\"100\",\"houseRooms\":{\"/house_rooms/dairy_barn\":0,\"/house_rooms/garden\":0,\"/house_rooms/log_shed\":0,\"/house_rooms/forge\":0,\"/house_rooms/workshop\":0,\"/house_rooms/sewing_parlor\":0,\"/house_rooms/kitchen\":0,\"/house_rooms/brewery\":0,\"/house_rooms/laboratory\":0,\"/house_rooms/observatory\":0,\"/house_rooms/dining_room\":0,\"/house_rooms/library\":0,\"/house_rooms/dojo\":0,\"/house_rooms/gym\":0,\"/house_rooms/armory\":0,\"/house_rooms/archery_range\":0,\"/house_rooms/mystical_study\":0}}`;
  5696.  
  5697. const exportObj = {};
  5698. exportObj[1] = BLANK_PLAYER_JSON;
  5699. exportObj[2] = BLANK_PLAYER_JSON;
  5700. exportObj[3] = BLANK_PLAYER_JSON;
  5701. exportObj[4] = BLANK_PLAYER_JSON;
  5702. exportObj[5] = BLANK_PLAYER_JSON;
  5703.  
  5704. let isParty = false;
  5705. const playerIDs = ["Player 1", "Player 2", "Player 3", "Player 4", "Player 5"];
  5706. const importedPlayerPositions = [false, false, false, false, false];
  5707. let zone = "/actions/combat/fly";
  5708. let isZoneDungeon = false;
  5709.  
  5710. if (!characterObj?.partyInfo?.partySlotMap) {
  5711. exportObj[1] = JSON.stringify(constructSelfPlayerExportObjFromInitCharacterData(characterObj, clientObj));
  5712. playerIDs[0] = characterObj.character.name;
  5713. importedPlayerPositions[0] = true;
  5714. // Zone
  5715. for (const action of characterObj.characterActions) {
  5716. if (action && action.actionHrid.includes("/actions/combat/")) {
  5717. zone = action.actionHrid;
  5718. isZoneDungeon = clientObj.actionDetailMap[action.actionHrid]?.combatZoneInfo?.isDungeon;
  5719. break;
  5720. }
  5721. }
  5722. } else {
  5723. isParty = true;
  5724. let i = 1;
  5725. for (const member of Object.values(characterObj.partyInfo.partySlotMap)) {
  5726. if (member.characterID) {
  5727. if (member.characterID === characterObj.character.id) {
  5728. exportObj[i] = JSON.stringify(constructSelfPlayerExportObjFromInitCharacterData(characterObj, clientObj));
  5729. playerIDs[i - 1] = characterObj.character.name;
  5730. importedPlayerPositions[i - 1] = true;
  5731. } else {
  5732. const profileList = storedProfileList.filter((item) => item.characterID === member.characterID);
  5733. if (profileList.length !== 1) {
  5734. console.log("Can not find stored profile for " + member.characterID);
  5735. playerIDs[i - 1] = isZH ? "需要点开资料" : "Open profile in game";
  5736. i++;
  5737. continue;
  5738. }
  5739. const profile = profileList[0];
  5740.  
  5741. const battlePlayerList = battleObj.players.filter((item) => item.character.id === member.characterID);
  5742. let battlePlayer = null;
  5743. if (battlePlayerList.length === 1) {
  5744. battlePlayer = battlePlayerList[0];
  5745. }
  5746.  
  5747. exportObj[i] = JSON.stringify(constructPlayerExportObjFromStoredProfile(profile, clientObj, battlePlayer));
  5748. playerIDs[i - 1] = profile.characterName;
  5749. importedPlayerPositions[i - 1] = true;
  5750. }
  5751. }
  5752. i++;
  5753. }
  5754.  
  5755. // Zone
  5756. zone = characterObj.partyInfo?.party?.actionHrid;
  5757. isZoneDungeon = clientObj.actionDetailMap[zone]?.combatZoneInfo?.isDungeon;
  5758. }
  5759.  
  5760. return [exportObj, playerIDs, importedPlayerPositions, zone, isZoneDungeon, isParty];
  5761. }
  5762.  
  5763. function constructSelfPlayerExportObjFromInitCharacterData(characterObj, clientObj) {
  5764. const playerObj = {};
  5765. playerObj.player = {};
  5766.  
  5767. // Levels
  5768. for (const skill of characterObj.characterSkills) {
  5769. if (skill.skillHrid.includes("stamina")) {
  5770. playerObj.player.staminaLevel = skill.level;
  5771. } else if (skill.skillHrid.includes("intelligence")) {
  5772. playerObj.player.intelligenceLevel = skill.level;
  5773. } else if (skill.skillHrid.includes("attack")) {
  5774. playerObj.player.attackLevel = skill.level;
  5775. } else if (skill.skillHrid.includes("power")) {
  5776. playerObj.player.powerLevel = skill.level;
  5777. } else if (skill.skillHrid.includes("defense")) {
  5778. playerObj.player.defenseLevel = skill.level;
  5779. } else if (skill.skillHrid.includes("ranged")) {
  5780. playerObj.player.rangedLevel = skill.level;
  5781. } else if (skill.skillHrid.includes("magic")) {
  5782. playerObj.player.magicLevel = skill.level;
  5783. }
  5784. }
  5785.  
  5786. // Items
  5787. playerObj.player.equipment = [];
  5788. for (const item of characterObj.characterItems) {
  5789. if (!item.itemLocationHrid.includes("/item_locations/inventory")) {
  5790. playerObj.player.equipment.push({
  5791. itemLocationHrid: item.itemLocationHrid,
  5792. itemHrid: item.itemHrid,
  5793. enhancementLevel: item.enhancementLevel,
  5794. });
  5795. }
  5796. }
  5797.  
  5798. // Food
  5799. playerObj.food = {};
  5800. playerObj.food["/action_types/combat"] = [];
  5801. for (const food of characterObj.actionTypeFoodSlotsMap["/action_types/combat"]) {
  5802. if (food) {
  5803. playerObj.food["/action_types/combat"].push({
  5804. itemHrid: food.itemHrid,
  5805. });
  5806. } else {
  5807. playerObj.food["/action_types/combat"].push({
  5808. itemHrid: "",
  5809. });
  5810. }
  5811. }
  5812.  
  5813. // Drinks
  5814. playerObj.drinks = {};
  5815. playerObj.drinks["/action_types/combat"] = [];
  5816. for (const drink of characterObj.actionTypeDrinkSlotsMap["/action_types/combat"]) {
  5817. if (drink) {
  5818. playerObj.drinks["/action_types/combat"].push({
  5819. itemHrid: drink.itemHrid,
  5820. });
  5821. } else {
  5822. playerObj.drinks["/action_types/combat"].push({
  5823. itemHrid: "",
  5824. });
  5825. }
  5826. }
  5827.  
  5828. // Abilities
  5829. playerObj.abilities = [
  5830. {
  5831. abilityHrid: "",
  5832. level: "1",
  5833. },
  5834. {
  5835. abilityHrid: "",
  5836. level: "1",
  5837. },
  5838. {
  5839. abilityHrid: "",
  5840. level: "1",
  5841. },
  5842. {
  5843. abilityHrid: "",
  5844. level: "1",
  5845. },
  5846. {
  5847. abilityHrid: "",
  5848. level: "1",
  5849. },
  5850. ];
  5851. let normalAbillityIndex = 1;
  5852. for (const ability of characterObj.combatUnit.combatAbilities) {
  5853. if (ability && clientObj.abilityDetailMap[ability.abilityHrid].isSpecialAbility) {
  5854. playerObj.abilities[0] = {
  5855. abilityHrid: ability.abilityHrid,
  5856. level: ability.level,
  5857. };
  5858. } else if (ability) {
  5859. playerObj.abilities[normalAbillityIndex++] = {
  5860. abilityHrid: ability.abilityHrid,
  5861. level: ability.level,
  5862. };
  5863. }
  5864. }
  5865.  
  5866. // TriggerMap
  5867. playerObj.triggerMap = { ...characterObj.abilityCombatTriggersMap, ...characterObj.consumableCombatTriggersMap };
  5868.  
  5869. // HouseRooms
  5870. playerObj.houseRooms = {};
  5871. for (const house of Object.values(characterObj.characterHouseRoomMap)) {
  5872. playerObj.houseRooms[house.houseRoomHrid] = house.level;
  5873. }
  5874.  
  5875. return playerObj;
  5876. }
  5877.  
  5878. function constructPlayerExportObjFromStoredProfile(profile, clientObj, battlePlayer) {
  5879. const playerObj = {};
  5880. playerObj.player = {};
  5881.  
  5882. // Levels
  5883. for (const skill of profile.profile.characterSkills) {
  5884. if (skill.skillHrid.includes("stamina")) {
  5885. playerObj.player.staminaLevel = skill.level;
  5886. } else if (skill.skillHrid.includes("intelligence")) {
  5887. playerObj.player.intelligenceLevel = skill.level;
  5888. } else if (skill.skillHrid.includes("attack")) {
  5889. playerObj.player.attackLevel = skill.level;
  5890. } else if (skill.skillHrid.includes("power")) {
  5891. playerObj.player.powerLevel = skill.level;
  5892. } else if (skill.skillHrid.includes("defense")) {
  5893. playerObj.player.defenseLevel = skill.level;
  5894. } else if (skill.skillHrid.includes("ranged")) {
  5895. playerObj.player.rangedLevel = skill.level;
  5896. } else if (skill.skillHrid.includes("magic")) {
  5897. playerObj.player.magicLevel = skill.level;
  5898. }
  5899. }
  5900.  
  5901. // Items
  5902. playerObj.player.equipment = [];
  5903. if (profile.profile.wearableItemMap) {
  5904. for (const key in profile.profile.wearableItemMap) {
  5905. const item = profile.profile.wearableItemMap[key];
  5906. playerObj.player.equipment.push({
  5907. itemLocationHrid: item.itemLocationHrid,
  5908. itemHrid: item.itemHrid,
  5909. enhancementLevel: item.enhancementLevel,
  5910. });
  5911. }
  5912. }
  5913.  
  5914. // Food and drinks
  5915. playerObj.food = {};
  5916. playerObj.food["/action_types/combat"] = [];
  5917. playerObj.drinks = {};
  5918. playerObj.drinks["/action_types/combat"] = [];
  5919.  
  5920. if (battlePlayer?.combatConsumables) {
  5921. for (const foodOrDrink of battlePlayer.combatConsumables) {
  5922. if (foodOrDrink.itemHrid.includes("coffee")) {
  5923. playerObj.drinks["/action_types/combat"].push({
  5924. itemHrid: foodOrDrink.itemHrid,
  5925. });
  5926. } else {
  5927. playerObj.food["/action_types/combat"].push({
  5928. itemHrid: foodOrDrink.itemHrid,
  5929. });
  5930. }
  5931. }
  5932. } else {
  5933. // Assume food and drinks based on equipted weapon
  5934. const weapon =
  5935. profile.profile.wearableItemMap &&
  5936. (profile.profile.wearableItemMap["/item_locations/main_hand"]?.itemHrid ||
  5937. profile.profile.wearableItemMap["/item_locations/two_hand"]?.itemHrid);
  5938. if (weapon) {
  5939. if (weapon.includes("shooter") || weapon.includes("bow")) {
  5940. // 远程
  5941. // xp,超远,暴击
  5942. playerObj.drinks["/action_types/combat"].push({
  5943. itemHrid: "/items/wisdom_coffee",
  5944. });
  5945. playerObj.drinks["/action_types/combat"].push({
  5946. itemHrid: "/items/super_ranged_coffee",
  5947. });
  5948. playerObj.drinks["/action_types/combat"].push({
  5949. itemHrid: "/items/critical_coffee",
  5950. });
  5951. // 2红1蓝
  5952. playerObj.food["/action_types/combat"].push({
  5953. itemHrid: "/items/spaceberry_donut",
  5954. });
  5955. playerObj.food["/action_types/combat"].push({
  5956. itemHrid: "/items/spaceberry_cake",
  5957. });
  5958. playerObj.food["/action_types/combat"].push({
  5959. itemHrid: "/items/star_fruit_yogurt",
  5960. });
  5961. } else if (weapon.includes("boomstick") || weapon.includes("staff") || weapon.includes("trident")) {
  5962. // 法师
  5963. // xp,超魔,吟唱
  5964. playerObj.drinks["/action_types/combat"].push({
  5965. itemHrid: "/items/wisdom_coffee",
  5966. });
  5967. playerObj.drinks["/action_types/combat"].push({
  5968. itemHrid: "/items/super_magic_coffee",
  5969. });
  5970. playerObj.drinks["/action_types/combat"].push({
  5971. itemHrid: "/items/channeling_coffee",
  5972. });
  5973. // 1红2蓝
  5974. playerObj.food["/action_types/combat"].push({
  5975. itemHrid: "/items/spaceberry_cake",
  5976. });
  5977. playerObj.food["/action_types/combat"].push({
  5978. itemHrid: "/items/star_fruit_gummy",
  5979. });
  5980. playerObj.food["/action_types/combat"].push({
  5981. itemHrid: "/items/star_fruit_yogurt",
  5982. });
  5983. } else if (weapon.includes("bulwark")) {
  5984. // 双手盾 精暮光
  5985. // xp,超防,超耐
  5986. playerObj.drinks["/action_types/combat"].push({
  5987. itemHrid: "/items/wisdom_coffee",
  5988. });
  5989. playerObj.drinks["/action_types/combat"].push({
  5990. itemHrid: "/items/super_defense_coffee",
  5991. });
  5992. playerObj.drinks["/action_types/combat"].push({
  5993. itemHrid: "/items/super_stamina_coffee",
  5994. });
  5995. // 2红1蓝
  5996. playerObj.food["/action_types/combat"].push({
  5997. itemHrid: "/items/spaceberry_donut",
  5998. });
  5999. playerObj.food["/action_types/combat"].push({
  6000. itemHrid: "/items/spaceberry_cake",
  6001. });
  6002. playerObj.food["/action_types/combat"].push({
  6003. itemHrid: "/items/star_fruit_yogurt",
  6004. });
  6005. } else {
  6006. // 战士
  6007. // xp,超力,迅捷
  6008. playerObj.drinks["/action_types/combat"].push({
  6009. itemHrid: "/items/wisdom_coffee",
  6010. });
  6011. playerObj.drinks["/action_types/combat"].push({
  6012. itemHrid: "/items/super_power_coffee",
  6013. });
  6014. playerObj.drinks["/action_types/combat"].push({
  6015. itemHrid: "/items/swiftness_coffee",
  6016. });
  6017. // 2红1蓝
  6018. playerObj.food["/action_types/combat"].push({
  6019. itemHrid: "/items/spaceberry_donut",
  6020. });
  6021. playerObj.food["/action_types/combat"].push({
  6022. itemHrid: "/items/spaceberry_cake",
  6023. });
  6024. playerObj.food["/action_types/combat"].push({
  6025. itemHrid: "/items/star_fruit_yogurt",
  6026. });
  6027. }
  6028. }
  6029. }
  6030.  
  6031. // Abilities
  6032. playerObj.abilities = [
  6033. {
  6034. abilityHrid: "",
  6035. level: "1",
  6036. },
  6037. {
  6038. abilityHrid: "",
  6039. level: "1",
  6040. },
  6041. {
  6042. abilityHrid: "",
  6043. level: "1",
  6044. },
  6045. {
  6046. abilityHrid: "",
  6047. level: "1",
  6048. },
  6049. {
  6050. abilityHrid: "",
  6051. level: "1",
  6052. },
  6053. ];
  6054. if (profile.profile.equippedAbilities) {
  6055. let normalAbillityIndex = 1;
  6056. for (const ability of profile.profile.equippedAbilities) {
  6057. if (ability && clientObj.abilityDetailMap[ability.abilityHrid].isSpecialAbility) {
  6058. playerObj.abilities[0] = {
  6059. abilityHrid: ability.abilityHrid,
  6060. level: ability.level,
  6061. };
  6062. } else if (ability) {
  6063. playerObj.abilities[normalAbillityIndex++] = {
  6064. abilityHrid: ability.abilityHrid,
  6065. level: ability.level,
  6066. };
  6067. }
  6068. }
  6069. }
  6070.  
  6071. // TriggerMap
  6072. // Ignored. The game does not provide access to other players' trigger settings.
  6073.  
  6074. // HouseRooms
  6075. playerObj.houseRooms = {};
  6076. for (const house of Object.values(profile.profile.characterHouseRoomMap)) {
  6077. playerObj.houseRooms[house.houseRoomHrid] = house.level;
  6078. }
  6079.  
  6080. return playerObj;
  6081. }
  6082.  
  6083. async function observeResultsForAmvoidguy() {
  6084. let resultDiv = document.querySelector(`div.row`)?.querySelectorAll(`div.col-md-5`)?.[2]?.querySelector(`div.row > div.col-md-5`);
  6085. while (!resultDiv) {
  6086. await new Promise((resolve) => setTimeout(resolve, 100));
  6087. resultDiv = document.querySelector(`div.row`)?.querySelectorAll(`div.col-md-5`)?.[2]?.querySelector(`div.row > div.col-md-5`);
  6088. }
  6089.  
  6090. const deathDiv = document.querySelector(`div#simulationResultPlayerDeaths`);
  6091. const expDiv = document.querySelector(`div#simulationResultExperienceGain`);
  6092. const consumeDiv = document.querySelector(`div#simulationResultConsumablesUsed`);
  6093. deathDiv.style.backgroundColor = "#FFEAE9";
  6094. deathDiv.style.color = "black";
  6095. expDiv.style.backgroundColor = "#CDFFDD";
  6096. expDiv.style.color = "black";
  6097. consumeDiv.style.backgroundColor = "#F0F8FF";
  6098. consumeDiv.style.color = "black";
  6099.  
  6100. let div = document.createElement("div");
  6101. div.id = "tillLevel";
  6102. div.style.backgroundColor = "#FFFFE0";
  6103. div.style.color = "black";
  6104. div.textContent = "";
  6105. resultDiv.append(div);
  6106.  
  6107. new MutationObserver((mutationsList) => {
  6108. mutationsList.forEach((mutation) => {
  6109. if (mutation.addedNodes.length >= 3) {
  6110. handleResultForAmvoidguy(mutation.addedNodes, div);
  6111. }
  6112. });
  6113. }).observe(expDiv, { childList: true, subtree: true });
  6114. }
  6115.  
  6116. function handleResultForAmvoidguy(expNodes, parentDiv) {
  6117. const isZHIn3rdPartyWebsites = localStorage.getItem("i18nextLng")?.toLowerCase()?.startsWith("zh");
  6118.  
  6119. let perHourGainExp = {
  6120. stamina: 0,
  6121. intelligence: 0,
  6122. attack: 0,
  6123. power: 0,
  6124. defense: 0,
  6125. ranged: 0,
  6126. magic: 0,
  6127. };
  6128.  
  6129. expNodes.forEach((expNode) => {
  6130. if (getOriTextFromElement(expNode.children[0]).includes("Stamina") || getOriTextFromElement(expNode.children[0]).includes("耐力")) {
  6131. perHourGainExp.stamina = Number(expNode.children[1].textContent);
  6132. } else if (
  6133. getOriTextFromElement(expNode.children[0]).includes("Intelligence") ||
  6134. getOriTextFromElement(expNode.children[0]).includes("智力")
  6135. ) {
  6136. perHourGainExp.intelligence = Number(expNode.children[1].textContent);
  6137. } else if (getOriTextFromElement(expNode.children[0]).includes("Attack") || getOriTextFromElement(expNode.children[0]).includes("攻击")) {
  6138. perHourGainExp.attack = Number(expNode.children[1].textContent);
  6139. } else if (getOriTextFromElement(expNode.children[0]).includes("Power") || getOriTextFromElement(expNode.children[0]).includes("力量")) {
  6140. perHourGainExp.power = Number(expNode.children[1].textContent);
  6141. } else if (
  6142. getOriTextFromElement(expNode.children[0]).includes("Defense") ||
  6143. getOriTextFromElement(expNode.children[0]).includes("防御")
  6144. ) {
  6145. perHourGainExp.defense = Number(expNode.children[1].textContent);
  6146. } else if (getOriTextFromElement(expNode.children[0]).includes("Ranged") || getOriTextFromElement(expNode.children[0]).includes("远程")) {
  6147. perHourGainExp.ranged = Number(expNode.children[1].textContent);
  6148. } else if (getOriTextFromElement(expNode.children[0]).includes("Magic") || getOriTextFromElement(expNode.children[0]).includes("魔法")) {
  6149. perHourGainExp.magic = Number(expNode.children[1].textContent);
  6150. }
  6151. });
  6152.  
  6153. let data = GM_getValue("init_character_data", null);
  6154. let obj = JSON.parse(data);
  6155. if (!obj || !obj.characterSkills || !obj.currentTimestamp) {
  6156. console.error("handleResult no character localstorage");
  6157. return;
  6158. }
  6159.  
  6160. let skillLevels = {};
  6161. for (const skill of obj.characterSkills) {
  6162. if (skill.skillHrid.includes("stamina")) {
  6163. skillLevels.stamina = {};
  6164. skillLevels.stamina.skillName = "Stamina";
  6165. skillLevels.stamina.skillZhName = "耐力";
  6166. skillLevels.stamina.currentLevel = skill.level;
  6167. skillLevels.stamina.currentExp = skill.experience;
  6168. } else if (skill.skillHrid.includes("intelligence")) {
  6169. skillLevels.intelligence = {};
  6170. skillLevels.intelligence.skillName = "Intelligence";
  6171. skillLevels.intelligence.skillZhName = "智力";
  6172. skillLevels.intelligence.currentLevel = skill.level;
  6173. skillLevels.intelligence.currentExp = skill.experience;
  6174. } else if (skill.skillHrid.includes("attack")) {
  6175. skillLevels.attack = {};
  6176. skillLevels.attack.skillName = "Attack";
  6177. skillLevels.attack.skillZhName = "攻击";
  6178. skillLevels.attack.currentLevel = skill.level;
  6179. skillLevels.attack.currentExp = skill.experience;
  6180. } else if (skill.skillHrid.includes("power")) {
  6181. skillLevels.power = {};
  6182. skillLevels.power.skillName = "Power";
  6183. skillLevels.power.skillZhName = "力量";
  6184. skillLevels.power.currentLevel = skill.level;
  6185. skillLevels.power.currentExp = skill.experience;
  6186. } else if (skill.skillHrid.includes("defense")) {
  6187. skillLevels.defense = {};
  6188. skillLevels.defense.skillName = "Defense";
  6189. skillLevels.defense.skillZhName = "防御";
  6190. skillLevels.defense.currentLevel = skill.level;
  6191. skillLevels.defense.currentExp = skill.experience;
  6192. } else if (skill.skillHrid.includes("ranged")) {
  6193. skillLevels.ranged = {};
  6194. skillLevels.ranged.skillName = "Ranged";
  6195. skillLevels.ranged.skillZhName = "远程";
  6196. skillLevels.ranged.currentLevel = skill.level;
  6197. skillLevels.ranged.currentExp = skill.experience;
  6198. } else if (skill.skillHrid.includes("magic")) {
  6199. skillLevels.magic = {};
  6200. skillLevels.magic.skillName = "Magic";
  6201. skillLevels.magic.skillZhName = "魔法";
  6202. skillLevels.magic.currentLevel = skill.level;
  6203. skillLevels.magic.currentExp = skill.experience;
  6204. }
  6205. }
  6206.  
  6207. const skillNamesInOrder = ["stamina", "intelligence", "attack", "power", "defense", "ranged", "magic"];
  6208. let hTMLStr = "";
  6209. for (const skill of skillNamesInOrder) {
  6210. hTMLStr += `<div id="${"inputDiv_" + skill}" style="display: flex; justify-content: flex-end">${
  6211. isZHIn3rdPartyWebsites ? skillLevels[skill].skillZhName : skillLevels[skill].skillName
  6212. }${isZHIn3rdPartyWebsites ? "到" : " to level "}<input id="${"input_" + skill}" type="number" value="${
  6213. skillLevels[skill].currentLevel + 1
  6214. }" min="${skillLevels[skill].currentLevel + 1}" max="200">${isZHIn3rdPartyWebsites ? "" : ""}</div>`;
  6215. }
  6216.  
  6217. hTMLStr += `<div id="script_afterDays" style="display: flex; justify-content: flex-end"><input id="script_afterDays_input" type="number" value="1" min="0" max="200">${
  6218. isZHIn3rdPartyWebsites ? "天后" : "days after"
  6219. }</div>`;
  6220.  
  6221. hTMLStr += `<div id="needDiv"></div>`;
  6222. hTMLStr += `<div id="needListDiv"></div>`;
  6223. parentDiv.innerHTML = hTMLStr;
  6224.  
  6225. for (const skill of skillNamesInOrder) {
  6226. const skillDiv = parentDiv.querySelector(`div#${"inputDiv_" + skill}`);
  6227. const skillInput = parentDiv.querySelector(`input#${"input_" + skill}`);
  6228. skillInput.onchange = () => {
  6229. calculateTill(skill, skillInput, skillLevels, parentDiv, perHourGainExp, isZHIn3rdPartyWebsites);
  6230. };
  6231. skillInput.addEventListener("keyup", function (evt) {
  6232. calculateTill(skill, skillInput, skillLevels, parentDiv, perHourGainExp, isZHIn3rdPartyWebsites);
  6233. });
  6234. skillDiv.onclick = () => {
  6235. calculateTill(skill, skillInput, skillLevels, parentDiv, perHourGainExp, isZHIn3rdPartyWebsites);
  6236. };
  6237. }
  6238.  
  6239. const daysAfterDiv = parentDiv.querySelector(`div#script_afterDays`);
  6240. const daysAfterInput = parentDiv.querySelector(`input#script_afterDays_input`);
  6241. daysAfterInput.onchange = () => {
  6242. calculateAfterDays(daysAfterInput, skillLevels, parentDiv, perHourGainExp, skillNamesInOrder, isZHIn3rdPartyWebsites);
  6243. };
  6244. daysAfterInput.addEventListener("keyup", function (evt) {
  6245. calculateAfterDays(daysAfterInput, skillLevels, parentDiv, perHourGainExp, skillNamesInOrder, isZHIn3rdPartyWebsites);
  6246. });
  6247. daysAfterDiv.onclick = () => {
  6248. calculateAfterDays(daysAfterInput, skillLevels, parentDiv, perHourGainExp, skillNamesInOrder, isZHIn3rdPartyWebsites);
  6249. };
  6250.  
  6251. // 提取成本和收益
  6252. const expensesSpan = document.querySelector(`span#expensesSpan`);
  6253. const revenueSpan = document.querySelector(`span#revenueSpan`);
  6254. const profitSpan = document.querySelector(`span#profitPreview`);
  6255. const expenseDiv = document.querySelector(`div#script_expense`);
  6256. const revenueDiv = document.querySelector(`div#script_revenue`);
  6257. if (expenseDiv && expenseDiv) {
  6258. expenseDiv.textContent = expensesSpan.parentNode.textContent;
  6259. revenueDiv.textContent = revenueSpan.parentNode.textContent;
  6260. } else {
  6261. profitSpan.parentNode.insertAdjacentHTML(
  6262. "beforeend",
  6263. `<div id="script_expense" style="background-color: #DCDCDC; color: black;">${expensesSpan.parentNode.textContent}</div><div id="script_revenue" style="background-color: #DCDCDC; color: black;">${revenueSpan.parentNode.textContent}</div>`
  6264. );
  6265. }
  6266. }
  6267.  
  6268. function calculateAfterDays(daysAfterInput, skillLevels, parentDiv, perHourGainExp, skillNamesInOrder, isZHIn3rdPartyWebsites) {
  6269. const initData_levelExperienceTable = JSON.parse(GM_getValue("init_client_data", null)).levelExperienceTable;
  6270. const days = Number(daysAfterInput.value);
  6271. parentDiv.querySelector(`div#needDiv`).textContent = `${isZHIn3rdPartyWebsites ? "" : "After"} ${days} ${
  6272. isZHIn3rdPartyWebsites ? "天后:" : "days: "
  6273. }`;
  6274. const listDiv = parentDiv.querySelector(`div#needListDiv`);
  6275.  
  6276. let html = "";
  6277. let resultLevels = {};
  6278. for (const skillName of skillNamesInOrder) {
  6279. for (const skill of Object.values(skillLevels)) {
  6280. if (skill.skillName.toLowerCase() === skillName.toLowerCase()) {
  6281. const exp = skill.currentExp + perHourGainExp[skill.skillName.toLowerCase()] * days * 24;
  6282. let level = 1;
  6283. while (initData_levelExperienceTable[level] < exp) {
  6284. level++;
  6285. }
  6286. level--;
  6287. const minExpAtLevel = initData_levelExperienceTable[level];
  6288. const maxExpAtLevel = initData_levelExperienceTable[level + 1] - 1;
  6289. const expSpanInLevel = maxExpAtLevel - minExpAtLevel;
  6290. const levelPercentage = Number(((exp - minExpAtLevel) / expSpanInLevel) * 100).toFixed(1);
  6291. resultLevels[skillName.toLowerCase()] = level;
  6292. html += `<div>${isZHIn3rdPartyWebsites ? skill.skillZhName : skill.skillName} ${isZHIn3rdPartyWebsites ? "" : "level"} ${level} ${
  6293. isZHIn3rdPartyWebsites ? "级" : ""
  6294. } ${levelPercentage}%</div>`;
  6295. break;
  6296. }
  6297. }
  6298. }
  6299. const combatLevel =
  6300. 0.2 * (resultLevels.stamina + resultLevels.intelligence + resultLevels.defense) +
  6301. 0.4 * Math.max(0.5 * (resultLevels.attack + resultLevels.power), resultLevels.ranged, resultLevels.magic);
  6302. html += `<div>${isZHIn3rdPartyWebsites ? "战斗等级:" : "Combat level: "} ${combatLevel.toFixed(1)}</div>`;
  6303. listDiv.innerHTML = html;
  6304. }
  6305.  
  6306. function calculateTill(skillName, skillInputElem, skillLevels, parentDiv, perHourGainExp, isZHIn3rdPartyWebsites) {
  6307. const initData_levelExperienceTable = JSON.parse(GM_getValue("init_client_data", null)).levelExperienceTable;
  6308. const targetLevel = Number(skillInputElem.value);
  6309. parentDiv.querySelector(`div#needDiv`).textContent = `${
  6310. isZHIn3rdPartyWebsites ? skillLevels[skillName].skillZhName : skillLevels[skillName].skillName
  6311. } ${isZHIn3rdPartyWebsites ? "到" : "to level"} ${targetLevel} ${isZHIn3rdPartyWebsites ? "级 还需:" : " takes: "}`;
  6312. const listDiv = parentDiv.querySelector(`div#needListDiv`);
  6313.  
  6314. const currentLevel = Number(skillLevels[skillName].currentLevel);
  6315. const currentExp = Number(skillLevels[skillName].currentExp);
  6316. if (targetLevel > currentLevel && targetLevel <= 200) {
  6317. if (perHourGainExp[skillName] === 0) {
  6318. listDiv.innerHTML = isZHIn3rdPartyWebsites ? "永远" : "Forever";
  6319. } else {
  6320. let needExp = initData_levelExperienceTable[targetLevel] - currentExp;
  6321. let needHours = needExp / perHourGainExp[skillName];
  6322. let html = "";
  6323. html += `<div>[${hoursToReadableString(needHours)}]</div>`;
  6324.  
  6325. const consumeDivs = document.querySelectorAll(`div#simulationResultConsumablesUsed div.row`);
  6326. for (const elem of consumeDivs) {
  6327. const conName = elem.children[0].textContent;
  6328. const conPerHour = Number(elem.children[1].textContent);
  6329. html += `<div>${conName} ${Number(conPerHour * needHours).toFixed(0)}</div>`;
  6330. }
  6331.  
  6332. listDiv.innerHTML = html;
  6333. }
  6334. } else {
  6335. listDiv.innerHTML = isZHIn3rdPartyWebsites ? "输入错误" : "Input error";
  6336. }
  6337. }
  6338.  
  6339. function addImportButtonForMooneycalc() {
  6340. const checkElem = () => {
  6341. const selectedElement = document.querySelector(`div[role="tablist"]`);
  6342. if (selectedElement) {
  6343. clearInterval(timer);
  6344. const button = document.createElement("button");
  6345. selectedElement.parentNode.insertBefore(button, selectedElement.nextSibling);
  6346. button.textContent = isZH
  6347. ? "导入人物数据 (刷新游戏网页更新人物数据)"
  6348. : "Import character settings (Refresh game page to update character settings)";
  6349. button.style.backgroundColor = SCRIPT_COLOR_MAIN;
  6350. button.style.color = "black";
  6351. button.style.padding = "5px";
  6352. button.onclick = function () {
  6353. console.log("Mooneycalc-Importer: Button onclick");
  6354. importDataForMooneycalc(button);
  6355. return false;
  6356. };
  6357. }
  6358. };
  6359. let timer = setInterval(checkElem, 200);
  6360. }
  6361.  
  6362. async function importDataForMooneycalc(button) {
  6363. const characterData = JSON.parse(GM_getValue("init_character_data", ""));
  6364. console.log(characterData);
  6365. if (!characterData || !characterData.characterSkills || !characterData.currentTimestamp) {
  6366. button.textContent = isZH ? "错误:没有人物数据" : "Error: no character settings found";
  6367. return;
  6368. }
  6369.  
  6370. const ls = constructMooneycalcLocalStorage(characterData);
  6371. localStorage.setItem("settings", ls);
  6372.  
  6373. button.textContent = isZH ? "已导入" : "Imported";
  6374. await new Promise((r) => setTimeout(r, 500));
  6375. location.reload();
  6376. }
  6377.  
  6378. function constructMooneycalcLocalStorage(characterData) {
  6379. const ls = localStorage.getItem("settings");
  6380. let lsObj = JSON.parse(ls);
  6381.  
  6382. // 人物技能等级
  6383. lsObj.state.settings.levels = {};
  6384. for (const skill of characterData.characterSkills) {
  6385. lsObj.state.settings.levels[skill.skillHrid] = skill.level;
  6386. }
  6387.  
  6388. // 社区全局buff
  6389. lsObj.state.settings.communityBuffs = {};
  6390. for (const buff of characterData.communityBuffs) {
  6391. lsObj.state.settings.communityBuffs[buff.hrid] = buff.level;
  6392. }
  6393.  
  6394. // 装备 & 装备强化等级
  6395. lsObj.state.settings.equipment = {};
  6396. lsObj.state.settings.equipmentLevels = {};
  6397. for (const item of characterData.characterItems) {
  6398. if (item.itemLocationHrid !== "/item_locations/inventory") {
  6399. lsObj.state.settings.equipment[item.itemLocationHrid.replace("item_locations", "equipment_types")] = item.itemHrid;
  6400. lsObj.state.settings.equipmentLevels[item.itemLocationHrid.replace("item_locations", "equipment_types")] = item.enhancementLevel;
  6401. }
  6402. }
  6403.  
  6404. // 房子
  6405. lsObj.state.settings.houseRooms = {};
  6406. for (const house of Object.values(characterData.characterHouseRoomMap)) {
  6407. lsObj.state.settings.houseRooms[house.houseRoomHrid] = house.level;
  6408. }
  6409.  
  6410. return JSON.stringify(lsObj);
  6411. }
  6412.  
  6413. function hoursToReadableString(hours) {
  6414. const sec = hours * 60 * 60;
  6415. if (sec >= 86400) {
  6416. return Number(sec / 86400).toFixed(1) + (isZH ? " 天" : " days");
  6417. }
  6418. const d = new Date(Math.round(sec * 1000));
  6419. function pad(i) {
  6420. return ("0" + i).slice(-2);
  6421. }
  6422. let str = d.getUTCHours() + "h " + pad(d.getUTCMinutes()) + "m " + pad(d.getUTCSeconds()) + "s";
  6423. return str;
  6424. }
  6425.  
  6426. function addExportButton(obj) {
  6427. const checkElem = () => {
  6428. const selectedElement = document.querySelector(`div.SharableProfile_overviewTab__W4dCV`);
  6429. if (selectedElement) {
  6430. clearInterval(timer);
  6431.  
  6432. const button = document.createElement("button");
  6433. selectedElement.appendChild(button);
  6434. button.textContent = isZH ? "导出人物到剪贴板" : "Export to clipboard";
  6435. button.style.borderRadius = "5px";
  6436. button.style.height = "30px";
  6437. button.style.backgroundColor = SCRIPT_COLOR_MAIN;
  6438. button.style.color = "black";
  6439. button.style.boxShadow = "none";
  6440. button.style.border = "0px";
  6441. button.onclick = function () {
  6442. let exportString = "";
  6443. const playerID = obj.profile.characterSkills[0].characterID;
  6444. const clientObj = JSON.parse(GM_getValue("init_client_data", ""));
  6445. const characterObj = JSON.parse(GM_getValue("init_character_data", ""));
  6446.  
  6447. if (playerID === characterObj.character.id) {
  6448. exportString = JSON.stringify(constructSelfPlayerExportObjFromInitCharacterData(characterObj, clientObj));
  6449. } else {
  6450. const storedProfileList = JSON.parse(GM_getValue("profile_export_list", "[]"));
  6451. const profileList = storedProfileList.filter((item) => item.characterID === playerID);
  6452. let profile = null;
  6453. if (profileList.length !== 1) {
  6454. console.log("Can not find stored profile for " + playerID);
  6455. return;
  6456. }
  6457. profile = profileList[0];
  6458.  
  6459. let battlePlayer = null;
  6460. if (GM_getValue("new_battle", "")) {
  6461. const battleObj = JSON.parse(GM_getValue("new_battle", ""));
  6462. const battlePlayerList = battleObj.players.filter((item) => item.character.id === playerID);
  6463. if (battlePlayerList.length === 1) {
  6464. battlePlayer = battlePlayerList[0];
  6465. }
  6466. }
  6467.  
  6468. exportString = JSON.stringify(constructPlayerExportObjFromStoredProfile(profile, clientObj, battlePlayer));
  6469. }
  6470.  
  6471. console.log(exportString);
  6472. navigator.clipboard.writeText(exportString);
  6473. button.textContent = isZH ? "已复制" : "Copied";
  6474. return false;
  6475. };
  6476. return false;
  6477. }
  6478. };
  6479. let timer = setInterval(checkElem, 200);
  6480. }
  6481. })();