artifact_subattrs_generator.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. const ArtifactSubAttrsRaw = `101021: 生命值+24
  2. 101022: 生命值+30
  3. 201021: 生命值+50
  4. 201022: 生命值+61
  5. 201023: 生命值+72
  6. 301021: 生命值+100
  7. 301022: 生命值+115
  8. 301023: 生命值+129
  9. 301024: 生命值+143
  10. 401021: 生命值+167
  11. 401022: 生命值+191
  12. 401023: 生命值+215
  13. 401024: 生命值+239
  14. 501021: 生命值+209
  15. 501022: 生命值+239
  16. 501023: 生命值+269
  17. 501024: 生命值+299
  18. 101031: 生命值百分比+1.2%
  19. 101032: 生命值百分比+1.5%
  20. 201031: 生命值百分比+1.6%
  21. 201032: 生命值百分比+2.0%
  22. 201033: 生命值百分比+2.3%
  23. 301031: 生命值百分比+2.4%
  24. 301032: 生命值百分比+2.8%
  25. 301033: 生命值百分比+3.2%
  26. 301034: 生命值百分比+3.5%
  27. 401031: 生命值百分比+3.3%
  28. 401032: 生命值百分比+3.7%
  29. 401033: 生命值百分比+4.2%
  30. 401034: 生命值百分比+4.7%
  31. 501031: 生命值百分比+4.1%
  32. 501032: 生命值百分比+4.7%
  33. 501033: 生命值百分比+5.2%
  34. 501034: 生命值百分比+5.8%
  35. 101051: 攻击力+2
  36. 101052: 攻击力+2
  37. 201051: 攻击力+3
  38. 201052: 攻击力+4
  39. 201053: 攻击力+5
  40. 301051: 攻击力+7
  41. 301052: 攻击力+7
  42. 301053: 攻击力+8
  43. 301054: 攻击力+9
  44. 401051: 攻击力+11
  45. 401052: 攻击力+12
  46. 401053: 攻击力+14
  47. 401054: 攻击力+16
  48. 501051: 攻击力+14
  49. 501052: 攻击力+16
  50. 501053: 攻击力+18
  51. 501054: 攻击力+19
  52. 101061: 攻击力百分比+1.2%
  53. 101062: 攻击力百分比+1.5%
  54. 201061: 攻击力百分比+1.6%
  55. 201062: 攻击力百分比+2.0%
  56. 201063: 攻击力百分比+2.3%
  57. 301061: 攻击力百分比+2.4%
  58. 301062: 攻击力百分比+2.8%
  59. 301063: 攻击力百分比+3.2%
  60. 301064: 攻击力百分比+3.5%
  61. 401061: 攻击力百分比+3.3%
  62. 401062: 攻击力百分比+3.7%
  63. 401063: 攻击力百分比+4.2%
  64. 401064: 攻击力百分比+4.7%
  65. 501061: 攻击力百分比+4.1%
  66. 501062: 攻击力百分比+4.7%
  67. 501063: 攻击力百分比+5.2%
  68. 501064: 攻击力百分比+5.8%
  69. 101081: 防御力+2
  70. 101082: 防御力+2
  71. 201081: 防御力+4
  72. 201082: 防御力+5
  73. 201083: 防御力+6
  74. 301081: 防御力+8
  75. 301082: 防御力+9
  76. 301083: 防御力+10
  77. 301084: 防御力+11
  78. 401081: 防御力+13
  79. 401082: 防御力+15
  80. 401083: 防御力+17
  81. 401084: 防御力+19
  82. 501081: 防御力+16
  83. 501082: 防御力+19
  84. 501083: 防御力+21
  85. 501084: 防御力+23
  86. 101091: 防御力百分比+1.5%
  87. 101092: 防御力百分比+1.8%
  88. 201091: 防御力百分比+2.0%
  89. 201092: 防御力百分比+2.5%
  90. 201093: 防御力百分比+2.9%
  91. 301091: 防御力百分比+3.1%
  92. 301092: 防御力百分比+3.5%
  93. 301093: 防御力百分比+3.9%
  94. 301094: 防御力百分比+4.4%
  95. 401091: 防御力百分比+4.1%
  96. 401092: 防御力百分比+4.7%
  97. 401093: 防御力百分比+5.2%
  98. 401094: 防御力百分比+5.8%
  99. 501091: 防御力百分比+5.1%
  100. 501092: 防御力百分比+5.8%
  101. 501093: 防御力百分比+6.6%
  102. 501094: 防御力百分比+7.3%
  103. 101231: 元素充能效率+1.3%
  104. 101232: 元素充能效率+1.6%
  105. 201231: 元素充能效率+1.8%
  106. 201232: 元素充能效率+2.2%
  107. 201233: 元素充能效率+2.6%
  108. 301231: 元素充能效率+2.7%
  109. 301232: 元素充能效率+3.1%
  110. 301233: 元素充能效率+3.5%
  111. 301234: 元素充能效率+3.9%
  112. 401231: 元素充能效率+3.6%
  113. 401232: 元素充能效率+4.1%
  114. 401233: 元素充能效率+4.7%
  115. 401234: 元素充能效率+5.2%
  116. 501231: 元素充能效率+4.5%
  117. 501232: 元素充能效率+5.2%
  118. 501233: 元素充能效率+5.8%
  119. 501234: 元素充能效率+6.5%
  120. 101241: 元素精通+5
  121. 101242: 元素精通+6
  122. 201241: 元素精通+7
  123. 201242: 元素精通+8
  124. 201243: 元素精通+9
  125. 301241: 元素精通+10
  126. 301242: 元素精通+11
  127. 301243: 元素精通+13
  128. 301244: 元素精通+14
  129. 401241: 元素精通+13
  130. 401242: 元素精通+15
  131. 401243: 元素精通+17
  132. 401244: 元素精通+19
  133. 501241: 元素精通+16
  134. 501242: 元素精通+19
  135. 501243: 元素精通+21
  136. 501244: 元素精通+23
  137. 101201: 暴击率+0.8%
  138. 101202: 暴击率+1.0%
  139. 201201: 暴击率+1.1%
  140. 201202: 暴击率+1.3%
  141. 201203: 暴击率+1.5%
  142. 301201: 暴击率+1.6%
  143. 301202: 暴击率+1.9%
  144. 301203: 暴击率+2.1%
  145. 301204: 暴击率+2.3%
  146. 401201: 暴击率+2.2%
  147. 401202: 暴击率+2.5%
  148. 401203: 暴击率+2.8%
  149. 401204: 暴击率+3.1%
  150. 501201: 暴击率+2.7%
  151. 501202: 暴击率+3.1%
  152. 501203: 暴击率+3.5%
  153. 501204: 暴击率+3.9%
  154. 101221: 暴击伤害+1.5%
  155. 101222: 暴击伤害+1.9%
  156. 201221: 暴击伤害+2.2%
  157. 201222: 暴击伤害+2.6%
  158. 201223: 暴击伤害+3.1%
  159. 301221: 暴击伤害+3.3%
  160. 301222: 暴击伤害+3.7%
  161. 301223: 暴击伤害+4.2%
  162. 301224: 暴击伤害+4.7%
  163. 401221: 暴击伤害+4.3%
  164. 401222: 暴击伤害+5.0%
  165. 401223: 暴击伤害+5.6%
  166. 401224: 暴击伤害+6.2%
  167. 501221: 暴击伤害+5.4%
  168. 501222: 暴击伤害+6.2%
  169. 501223: 暴击伤害+7.0%
  170. 501224: 暴击伤害+7.8%`
  171. const SubAttrDefinition = {
  172. '102': {
  173. name: '生命值',
  174. percent: false,
  175. },
  176. '103': {
  177. name: '生命值百分比',
  178. percent: true,
  179. },
  180. '105': {
  181. name: '攻击力',
  182. percent: false,
  183. },
  184. '106': {
  185. name: '攻击力百分比',
  186. percent: true,
  187. },
  188. '108': {
  189. name: '防御力',
  190. percent: false,
  191. },
  192. '109': {
  193. name: '防御力百分比',
  194. percent: true,
  195. },
  196. '123': {
  197. name: '元素充能效率',
  198. percent: true,
  199. },
  200. '124': {
  201. name: '元素精通',
  202. percent: false,
  203. },
  204. '120': {
  205. name: '暴击率',
  206. percent: true,
  207. },
  208. '122': {
  209. name: '暴击伤害',
  210. percent: true,
  211. }
  212. }
  213. // 5星:初始3-4词条,强化最多5次,最多9个词条,同一个词条出现的最高数量 6 次 (9 - 4 + 1)
  214. // 4星:初始2-3词条,强化最多4次,最多7个词条,同一个词条出现的最高数量 4 次 (7 - 4 + 1)
  215. // 3星:初始1-2词条,强化最多3次,最多5个词条,同一个词条出现的最高数量 2 次 (5 - 4 + 1)
  216. // 2星:初始0-1词条,强化最多1次,最多2个词条,同一个词条出现的最高数量 1 次 (我真的日了狗了,为了测试浪费了点狗粮....谁说star * 4的,害我扔了个4级1星给3级2星,直接给我满了!2星也只能强化到4级!)
  217. // 1星:初始0词条,强化最多1次,最多1个词条,同一个词条出现的最高数量 1 次
  218. const levelUpTimes = {
  219. 5: 6,
  220. 4: 4,
  221. 3: 2,
  222. 2: 1,
  223. 1: 1,
  224. }
  225. // 把某个词条可能存在的情况打表打出来
  226. const genSubAttrsValueTable = (children, isPercent, star) => {
  227. // 圣遗物强化
  228. const maxDeep = levelUpTimes[star * 1];
  229. const ret = []
  230. for (let i = 1; i <= maxDeep; i++) { // 最大强化次数
  231. const dfs = (items, status, deep) => {
  232. // if (!ret.find(t => t.value === status.value)) { // 裁剪掉数值一样的组合,选择困难症患者福音
  233. // ret.push(status);
  234. // }
  235. // 需要找最优的词条数
  236. let found = false;
  237. ret.forEach((t, index) => {
  238. if (found) return;
  239. if (t.value === status.value) {
  240. found = true;
  241. // 如果找到了对应项
  242. if (status.codes.length < t.codes.length) {
  243. console.log(status.value, status.codes.length, t.codes.length);
  244. ret[index] = status // 替换
  245. }
  246. }
  247. })
  248. if (!found && status.value > 0) {
  249. ret.push(status); // 没有找到对应数值的时候再填数字进去
  250. }
  251. if (deep > i) { // 词条超了就退
  252. return;
  253. }
  254. children.forEach(item => { // 遍历children
  255. const nextItems = items.concat([item]);
  256. const st = {
  257. value: status.value + item.meta.valueNumber,
  258. codes: nextItems.map(t => t.value),
  259. }
  260. dfs(nextItems, st, deep + 1)
  261. });
  262. }
  263. dfs([], { value: 0, codes: [] }, 1)
  264. }
  265. ret.sort((a, b) => a.value < b.value ? -1 : 1)
  266. return ret.map(item => ({ value: isPercent ? (item.value / 10.0) : item.value, codes: item.codes }));
  267. }
  268. // 生成对应分类的代码表
  269. /*
  270. {
  271. 1: { // 品质
  272. '102': { // 大分类ID
  273. id: '102',
  274. name: '生命值',
  275. percent: false,
  276. children: [ { label: '生命值+30', value: '101022', meta: { } }, { ... } ],
  277. valueSet: [ { value: 30, codes: ['101022'] } ]
  278. },
  279. '103': { ... },
  280. ...
  281. },
  282. 2: {
  283. ...
  284. }
  285. }
  286. */
  287. const generateCategories = () => {
  288. const result = {
  289. 1: {},
  290. 2: {},
  291. 3: {},
  292. 4: {},
  293. 5: {},
  294. }
  295. for (let i = 1; i <= 5; i++) {
  296. Object.keys(SubAttrDefinition).forEach(key => {
  297. const d = SubAttrDefinition[key];
  298. result[i][key] = {
  299. id: key,
  300. name: d.name,
  301. percent: d.percent,
  302. children: [],
  303. valueSet: [],
  304. valueMax: 0,
  305. }
  306. })
  307. }
  308. const ArtifactSubAttrsTextList = ArtifactSubAttrsRaw.split('\n');
  309. ArtifactSubAttrsTextList.forEach(item => {
  310. const itemSplit = item.split(':');
  311. const code = itemSplit[0]
  312. const level = parseInt(code.substring(0, 1), 10);
  313. const groupCode = code.substring(2, 5);
  314. const nameLabel = itemSplit[1].trim().split('+')
  315. const name = nameLabel[0];
  316. const value = nameLabel[1].replace(/([^\d.]+)/g, '');
  317. const isPercent = nameLabel[1].indexOf('%') > -1;
  318. const valueNumber = isPercent ? parseInt(value.replace('.', ''), 10) : parseInt(value, 10);
  319. // 备注:所有百分比数值都人为放大10倍,以便于计算,防止浮点数精度搞事
  320. const meta = {
  321. name,
  322. value,
  323. valueNumber,
  324. group: groupCode,
  325. percent: isPercent,
  326. }
  327. result[level][groupCode].children.push({
  328. label: itemSplit[1].trim(),
  329. value: code,
  330. meta,
  331. });
  332. });
  333. for (let i = 1; i <= 5; i++) {
  334. Object.keys(SubAttrDefinition).forEach(key => {
  335. const d = SubAttrDefinition[key];
  336. result[i][key].valueSet = genSubAttrsValueTable(result[i][key].children, d.percent, i)
  337. let max = 0;
  338. result[i][key].valueSet.forEach(item => {
  339. max = Math.max(max, item.value);
  340. });
  341. result[i][key].valueMax = max;
  342. })
  343. }
  344. return result;
  345. }
  346. const fs = require('fs');
  347. fs.writeFile('./artifact_sub_attrs_map.json', JSON.stringify(generateCategories(), null,2), () => {
  348. console.log('写入完成')
  349. });