123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- const ArtifactSubAttrsRaw = `101021: 生命值+24
- 101022: 生命值+30
- 201021: 生命值+50
- 201022: 生命值+61
- 201023: 生命值+72
- 301021: 生命值+100
- 301022: 生命值+115
- 301023: 生命值+129
- 301024: 生命值+143
- 401021: 生命值+167
- 401022: 生命值+191
- 401023: 生命值+215
- 401024: 生命值+239
- 501021: 生命值+209
- 501022: 生命值+239
- 501023: 生命值+269
- 501024: 生命值+299
- 101031: 生命值百分比+1.2%
- 101032: 生命值百分比+1.5%
- 201031: 生命值百分比+1.6%
- 201032: 生命值百分比+2.0%
- 201033: 生命值百分比+2.3%
- 301031: 生命值百分比+2.4%
- 301032: 生命值百分比+2.8%
- 301033: 生命值百分比+3.2%
- 301034: 生命值百分比+3.5%
- 401031: 生命值百分比+3.3%
- 401032: 生命值百分比+3.7%
- 401033: 生命值百分比+4.2%
- 401034: 生命值百分比+4.7%
- 501031: 生命值百分比+4.1%
- 501032: 生命值百分比+4.7%
- 501033: 生命值百分比+5.2%
- 501034: 生命值百分比+5.8%
- 101051: 攻击力+2
- 101052: 攻击力+2
- 201051: 攻击力+3
- 201052: 攻击力+4
- 201053: 攻击力+5
- 301051: 攻击力+7
- 301052: 攻击力+7
- 301053: 攻击力+8
- 301054: 攻击力+9
- 401051: 攻击力+11
- 401052: 攻击力+12
- 401053: 攻击力+14
- 401054: 攻击力+16
- 501051: 攻击力+14
- 501052: 攻击力+16
- 501053: 攻击力+18
- 501054: 攻击力+19
- 101061: 攻击力百分比+1.2%
- 101062: 攻击力百分比+1.5%
- 201061: 攻击力百分比+1.6%
- 201062: 攻击力百分比+2.0%
- 201063: 攻击力百分比+2.3%
- 301061: 攻击力百分比+2.4%
- 301062: 攻击力百分比+2.8%
- 301063: 攻击力百分比+3.2%
- 301064: 攻击力百分比+3.5%
- 401061: 攻击力百分比+3.3%
- 401062: 攻击力百分比+3.7%
- 401063: 攻击力百分比+4.2%
- 401064: 攻击力百分比+4.7%
- 501061: 攻击力百分比+4.1%
- 501062: 攻击力百分比+4.7%
- 501063: 攻击力百分比+5.2%
- 501064: 攻击力百分比+5.8%
- 101081: 防御力+2
- 101082: 防御力+2
- 201081: 防御力+4
- 201082: 防御力+5
- 201083: 防御力+6
- 301081: 防御力+8
- 301082: 防御力+9
- 301083: 防御力+10
- 301084: 防御力+11
- 401081: 防御力+13
- 401082: 防御力+15
- 401083: 防御力+17
- 401084: 防御力+19
- 501081: 防御力+16
- 501082: 防御力+19
- 501083: 防御力+21
- 501084: 防御力+23
- 101091: 防御力百分比+1.5%
- 101092: 防御力百分比+1.8%
- 201091: 防御力百分比+2.0%
- 201092: 防御力百分比+2.5%
- 201093: 防御力百分比+2.9%
- 301091: 防御力百分比+3.1%
- 301092: 防御力百分比+3.5%
- 301093: 防御力百分比+3.9%
- 301094: 防御力百分比+4.4%
- 401091: 防御力百分比+4.1%
- 401092: 防御力百分比+4.7%
- 401093: 防御力百分比+5.2%
- 401094: 防御力百分比+5.8%
- 501091: 防御力百分比+5.1%
- 501092: 防御力百分比+5.8%
- 501093: 防御力百分比+6.6%
- 501094: 防御力百分比+7.3%
- 101231: 元素充能效率+1.3%
- 101232: 元素充能效率+1.6%
- 201231: 元素充能效率+1.8%
- 201232: 元素充能效率+2.2%
- 201233: 元素充能效率+2.6%
- 301231: 元素充能效率+2.7%
- 301232: 元素充能效率+3.1%
- 301233: 元素充能效率+3.5%
- 301234: 元素充能效率+3.9%
- 401231: 元素充能效率+3.6%
- 401232: 元素充能效率+4.1%
- 401233: 元素充能效率+4.7%
- 401234: 元素充能效率+5.2%
- 501231: 元素充能效率+4.5%
- 501232: 元素充能效率+5.2%
- 501233: 元素充能效率+5.8%
- 501234: 元素充能效率+6.5%
- 101241: 元素精通+5
- 101242: 元素精通+6
- 201241: 元素精通+7
- 201242: 元素精通+8
- 201243: 元素精通+9
- 301241: 元素精通+10
- 301242: 元素精通+11
- 301243: 元素精通+13
- 301244: 元素精通+14
- 401241: 元素精通+13
- 401242: 元素精通+15
- 401243: 元素精通+17
- 401244: 元素精通+19
- 501241: 元素精通+16
- 501242: 元素精通+19
- 501243: 元素精通+21
- 501244: 元素精通+23
- 101201: 暴击率+0.8%
- 101202: 暴击率+1.0%
- 201201: 暴击率+1.1%
- 201202: 暴击率+1.3%
- 201203: 暴击率+1.5%
- 301201: 暴击率+1.6%
- 301202: 暴击率+1.9%
- 301203: 暴击率+2.1%
- 301204: 暴击率+2.3%
- 401201: 暴击率+2.2%
- 401202: 暴击率+2.5%
- 401203: 暴击率+2.8%
- 401204: 暴击率+3.1%
- 501201: 暴击率+2.7%
- 501202: 暴击率+3.1%
- 501203: 暴击率+3.5%
- 501204: 暴击率+3.9%
- 101221: 暴击伤害+1.5%
- 101222: 暴击伤害+1.9%
- 201221: 暴击伤害+2.2%
- 201222: 暴击伤害+2.6%
- 201223: 暴击伤害+3.1%
- 301221: 暴击伤害+3.3%
- 301222: 暴击伤害+3.7%
- 301223: 暴击伤害+4.2%
- 301224: 暴击伤害+4.7%
- 401221: 暴击伤害+4.3%
- 401222: 暴击伤害+5.0%
- 401223: 暴击伤害+5.6%
- 401224: 暴击伤害+6.2%
- 501221: 暴击伤害+5.4%
- 501222: 暴击伤害+6.2%
- 501223: 暴击伤害+7.0%
- 501224: 暴击伤害+7.8%`
- const SubAttrDefinition = {
- '102': {
- name: '生命值',
- percent: false,
- },
- '103': {
- name: '生命值百分比',
- percent: true,
- },
- '105': {
- name: '攻击力',
- percent: false,
- },
- '106': {
- name: '攻击力百分比',
- percent: true,
- },
- '108': {
- name: '防御力',
- percent: false,
- },
- '109': {
- name: '防御力百分比',
- percent: true,
- },
- '123': {
- name: '元素充能效率',
- percent: true,
- },
- '124': {
- name: '元素精通',
- percent: false,
- },
- '120': {
- name: '暴击率',
- percent: true,
- },
- '122': {
- name: '暴击伤害',
- percent: true,
- }
- }
- // 5星:初始3-4词条,强化最多5次,最多9个词条,同一个词条出现的最高数量 6 次 (9 - 4 + 1)
- // 4星:初始2-3词条,强化最多4次,最多7个词条,同一个词条出现的最高数量 4 次 (7 - 4 + 1)
- // 3星:初始1-2词条,强化最多3次,最多5个词条,同一个词条出现的最高数量 2 次 (5 - 4 + 1)
- // 2星:初始0-1词条,强化最多1次,最多2个词条,同一个词条出现的最高数量 1 次 (我真的日了狗了,为了测试浪费了点狗粮....谁说star * 4的,害我扔了个4级1星给3级2星,直接给我满了!2星也只能强化到4级!)
- // 1星:初始0词条,强化最多1次,最多1个词条,同一个词条出现的最高数量 1 次
- const levelUpTimes = {
- 5: 6,
- 4: 4,
- 3: 2,
- 2: 1,
- 1: 1,
- }
- // 把某个词条可能存在的情况打表打出来
- const genSubAttrsValueTable = (children, isPercent, star) => {
- // 圣遗物强化
- const maxDeep = levelUpTimes[star * 1];
- const ret = []
- for (let i = 1; i <= maxDeep; i++) { // 最大强化次数
- const dfs = (items, status, deep) => {
- // if (!ret.find(t => t.value === status.value)) { // 裁剪掉数值一样的组合,选择困难症患者福音
- // ret.push(status);
- // }
- // 需要找最优的词条数
- let found = false;
- ret.forEach((t, index) => {
- if (found) return;
- if (t.value === status.value) {
- found = true;
- // 如果找到了对应项
- if (status.codes.length < t.codes.length) {
- console.log(status.value, status.codes.length, t.codes.length);
- ret[index] = status // 替换
- }
- }
- })
- if (!found && status.value > 0) {
- ret.push(status); // 没有找到对应数值的时候再填数字进去
- }
- if (deep > i) { // 词条超了就退
- return;
- }
- children.forEach(item => { // 遍历children
- const nextItems = items.concat([item]);
- const st = {
- value: status.value + item.meta.valueNumber,
- codes: nextItems.map(t => t.value),
- }
- dfs(nextItems, st, deep + 1)
- });
- }
- dfs([], { value: 0, codes: [] }, 1)
- }
- ret.sort((a, b) => a.value < b.value ? -1 : 1)
- return ret.map(item => ({ value: isPercent ? (item.value / 10.0) : item.value, codes: item.codes }));
- }
- // 生成对应分类的代码表
- /*
- {
- 1: { // 品质
- '102': { // 大分类ID
- id: '102',
- name: '生命值',
- percent: false,
- children: [ { label: '生命值+30', value: '101022', meta: { } }, { ... } ],
- valueSet: [ { value: 30, codes: ['101022'] } ]
- },
- '103': { ... },
- ...
- },
- 2: {
- ...
- }
- }
- */
- const generateCategories = () => {
- const result = {
- 1: {},
- 2: {},
- 3: {},
- 4: {},
- 5: {},
- }
- for (let i = 1; i <= 5; i++) {
- Object.keys(SubAttrDefinition).forEach(key => {
- const d = SubAttrDefinition[key];
- result[i][key] = {
- id: key,
- name: d.name,
- percent: d.percent,
- children: [],
- valueSet: [],
- valueMax: 0,
- }
- })
- }
- const ArtifactSubAttrsTextList = ArtifactSubAttrsRaw.split('\n');
- ArtifactSubAttrsTextList.forEach(item => {
- const itemSplit = item.split(':');
- const code = itemSplit[0]
- const level = parseInt(code.substring(0, 1), 10);
- const groupCode = code.substring(2, 5);
- const nameLabel = itemSplit[1].trim().split('+')
- const name = nameLabel[0];
- const value = nameLabel[1].replace(/([^\d.]+)/g, '');
- const isPercent = nameLabel[1].indexOf('%') > -1;
- const valueNumber = isPercent ? parseInt(value.replace('.', ''), 10) : parseInt(value, 10);
- // 备注:所有百分比数值都人为放大10倍,以便于计算,防止浮点数精度搞事
- const meta = {
- name,
- value,
- valueNumber,
- group: groupCode,
- percent: isPercent,
- }
- result[level][groupCode].children.push({
- label: itemSplit[1].trim(),
- value: code,
- meta,
- });
- });
- for (let i = 1; i <= 5; i++) {
- Object.keys(SubAttrDefinition).forEach(key => {
- const d = SubAttrDefinition[key];
- result[i][key].valueSet = genSubAttrsValueTable(result[i][key].children, d.percent, i)
- let max = 0;
- result[i][key].valueSet.forEach(item => {
- max = Math.max(max, item.value);
- });
- result[i][key].valueMax = max;
- })
- }
- return result;
- }
- const fs = require('fs');
- fs.writeFile('./artifact_sub_attrs_map.json', JSON.stringify(generateCategories(), null,2), () => {
- console.log('写入完成')
- });
|