miao-plugin/components/models/Reliquaries2.js
yoimiya-kokomi 876b39e561 #角色面板#圣遗物列表 使用新的圣遗物评分逻辑计算评分
* 新的圣遗物评分规针对角色进行了细化,同时将得分进行了拉齐
 * 根据角色使用不同词条权重计算。感谢@糖炒栗子 @秋声 @49631073 等的权重梳理
 * 会在后续提供单独命令,供查看角色圣遗物及计算逻辑与计算逻辑
 * 因为计分逻辑变更,所以【分数值及档位】相较于升级之前可能有所变化。如有不合理计算请反馈给 @喵喵
 * 如需临时关闭新版评分,可编辑喵喵 lib/app/character.js, const isNewScore = false;
2022-06-10 04:53:38 +08:00

158 lines
4.3 KiB
JavaScript

import {
attrValue,
attrNameMap,
attrMap,
mainAttr,
subAttr,
usefulAttr
} from "../../resources/meta/reliquaries/reliquaries-mark-new.js";
import { Character } from "../models.js";
import lodash from "lodash";
let charCfg = {};
let Reliquaries = {
getCharCfg(name) {
if (charCfg[name]) {
return charCfg[name]
}
let attrWeight = usefulAttr[name] || { atk: 75, cp: 100, cd: 100 };
let attrMark = {};
let char = Character.get(name);
let baseAttr = char.lvStat.detail['90'];
lodash.forEach(attrWeight, (weight, attr) => {
attrMark[attr] = weight / attrValue[attr];
});
// let baseAttr = [400, 500, 300];
if (attrMark.hp) {
attrMark.hpPlus = attrMark.hp / baseAttr[0] * 100;
}
if (attrMark.atk) {
attrMark.atkPlus = attrMark.atk / (baseAttr[1] + 400) * 100;
}
if (attrMark.def) {
attrMark.defPlus = attrMark.def / baseAttr[2] * 100;
}
let maxMark = Reliquaries.getMaxMark(attrWeight);
let titleMark = {}, titleWeight = {};
lodash.forEach(attrMark, (mark, attr) => {
titleMark[attrMap[attr]] = mark;
titleWeight[attrMap[attr]] = attrWeight[attr] || 0;
if (/大/.test(attrMap[attr])) {
let newAttr = attrMap[attr];
let newArr = newAttr.replace("大", "小");
titleWeight[newArr] = attrWeight[attr] || 0;
}
})
charCfg[name] = {
weight: attrWeight,
mark: attrMark,
titleMap: titleMark,
titleWeight,
maxMark
};
return charCfg[name];
},
getMaxAttr(charAttr = {}, list2 = [], maxLen = 1, banAttr = "") {
let tmp = [];
lodash.forEach(list2, (attr) => {
if (attr === banAttr) return;
if (!charAttr[attr]) return;
tmp.push({ attr, mark: charAttr[attr] });
});
tmp = lodash.sortBy(tmp, "mark");
tmp = tmp.reverse();
let ret = [];
lodash.forEach(tmp, (ds) => ret.push(ds.attr));
return ret.slice(0, maxLen);
},
getMaxMark(attrWeight) {
let ret = {};
for (let idx = 1; idx <= 5; idx++) {
let totalMark = 0, mMark = 0;
let mAttr = "";
if (idx === 1) {
mAttr = "hpPlus";
} else if (idx === 2) {
mAttr = "atkPlus";
} else if (idx >= 3) {
mAttr = Reliquaries.getMaxAttr(attrWeight, mainAttr[idx])[0];
mMark = attrWeight[mAttr];
totalMark += attrWeight[mAttr] * 2;
}
let sAttr = Reliquaries.getMaxAttr(attrWeight, subAttr, 4, mAttr);
lodash.forEach(sAttr, (attr, aIdx) => {
totalMark += attrWeight[attr] * (aIdx === 0 ? 6 : 1)
});
ret[idx] = totalMark;
ret['m' + idx] = mMark;
}
return ret;
},
getAttr(ds) {
let title = ds[0]
let attr = attrNameMap[title];
if (/元素伤害/.test(title)) {
attr = "dmg";
} else if (/物理|物伤/.test(title)) {
attr = "phy"
}
return attr;
},
getAttrMark(attrMark, ds) {
if (!ds || !ds[1]) {
return 0;
}
let attr = Reliquaries.getAttr(ds);
let val = ds[1];
return (attrMark[attr] || 0) * val;
},
getMark(charCfg, posIdx, mainAttr, subAttr) {
let ret = 0;
let { mark, maxMark, weight } = charCfg;
let mAttr = Reliquaries.getAttr(mainAttr);
let fixPct = 1;
if (posIdx >= 3) {
fixPct = Math.max(0, Math.min(1, (weight[mAttr] || 0) / (maxMark['m' + posIdx])));
ret += Reliquaries.getAttrMark(mark, mainAttr) / 4
}
lodash.forEach(subAttr, (ds) => {
ret += Reliquaries.getAttrMark(mark, ds)
});
return ret * (1 + fixPct) / 2 / maxMark[posIdx] * 66;
},
getArtisMark(charName = "", artis = {}) {
let total = 0;
let charCfg = Reliquaries.getCharCfg(charName);
let ret = {}
lodash.forEach(artis, (ds, idx) => {
idx = idx.replace("arti", "");
ret[idx] = Reliquaries.getMark(charCfg, idx, ds.main, ds.attrs)
});
return ret;
},
getMarkScore(mark) {
let pct = mark;
let scoreMap = [["D", 10], ["C", 16.5], ["B", 23.1], ["A", 29.7], ["S", 36.3], ["SS", 42.9], ["SSS", 50], ["ACE", 56.1], ["ACE²", 66]];
for (let idx = 0; idx < scoreMap.length; idx++) {
if (pct < scoreMap[idx][1]) {
return scoreMap[idx][0];
}
}
},
getSet(name) {
for (let idx in meta) {
if (meta[idx].name === name) {
return meta[idx];
}
}
}
}
export default Reliquaries;