miao-plugin/components/models/Artifact.js
yoimiya-kokomi b9eb8695ed * #刻晴 角色卡片功能升级
* `#老婆设置刻晴,心海`不再检查是否具有角色或展示在米游社展柜
    * `#刻晴` 角色卡片优先使用面板数据进行展示,无面板数据时使用米游社数据
    * 在未能获取到角色数据时也会展示角色卡片
    * 角色卡片后续会进行样式升级,按需展示更多内容
* `#深渊出场率`增加楼层排序,以防止服务侧数据乱序导致顺序错乱
* B服面板的天赋与皇冠信息现在可以正确的展示了
2022-06-30 04:40:06 +08:00

225 lines
5.8 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";
import Format from "../Format.js";
import _Data from "../Data.js";
let _path = process.cwd();
let artis = _Data.readJSON(`${_path}/plugins/miao-plugin/resources/meta/reliquaries/`, "data.json") || {};
let artisMap = {}
lodash.forEach(artis, (ds) => {
artisMap[ds.name] = ds;
})
let charCfg = {};
let Artifact = {
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) {
// 以520作为武器白值均值计算
attrMark.atkPlus = attrMark.atk / (baseAttr[1] * 1 + 520) * 100;
}
if (attrMark.def) {
attrMark.defPlus = attrMark.def / baseAttr[2] * 100;
}
let maxMark = Artifact.getMaxMark(attrWeight);
let titleMark = {}, titleWeight = {};
lodash.forEach(attrMark, (mark, attr) => {
let aTitle = attrMap[attr].title;
if (/小/.test(aTitle)) {
return;
}
titleMark[aTitle] = mark;
titleWeight[aTitle] = attrWeight[attr] || 0;
if (/大/.test(aTitle)) {
let sTitle = aTitle.replace("大", "小");
titleWeight[sTitle] = titleWeight[aTitle];
}
})
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 = Artifact.getMaxAttr(attrWeight, mainAttr[idx])[0];
mMark = attrWeight[mAttr];
totalMark += attrWeight[mAttr] * 2;
}
let sAttr = Artifact.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 = Artifact.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 = Artifact.getAttr(mainAttr);
let fixPct = 1;
if (posIdx >= 3) {
fixPct = Math.max(0, Math.min(1, (weight[mAttr] || 0) / (maxMark['m' + posIdx])));
ret += Artifact.getAttrMark(mark, mainAttr) / 4
}
lodash.forEach(subAttr, (ds) => {
ret += Artifact.getAttrMark(mark, ds)
});
return ret * (1 + fixPct) / 2 / maxMark[posIdx] * 66;
},
getArtisMark(charName = "", artis = {}) {
let total = 0;
let charCfg = Artifact.getCharCfg(charName);
let ret = {}
lodash.forEach(artis, (ds, idx) => {
idx = idx.replace("arti", "");
ret[idx] = Artifact.getMark(charCfg, idx, ds.main, ds.attrs)
});
return ret;
},
getMarkClass(mark) {
let pct = mark;
let scoreMap = [["D", 10], ["C", 16.5], ["B", 23.1], ["A", 29.7], ["S", 36.3], ["SS", 42.9], ["SSS", 49.5], ["ACE", 56.1], ["ACE²", 66]];
for (let idx = 0; idx < scoreMap.length; idx++) {
if (pct < scoreMap[idx][1]) {
return scoreMap[idx][0];
}
}
},
getSetByArti(name) {
for (let idx in artisMap) {
for (let idx2 in artisMap[idx].sets) {
if (artisMap[idx].sets[idx2].name === name) {
return artisMap[idx];
}
}
}
return false;
},
getMeta() {
return {
attrMap
}
},
formatArti(ds, markCfg = false, isMain = false) {
if (lodash.isArray(ds[0])) {
let ret = [];
lodash.forEach(ds, (d) => {
ret.push(Artifact.formatArti(d, markCfg, isMain));
})
return ret;
}
let title = ds[0], key = "", val = ds[1], num = ds[1];
if (!title || title === "undefined") {
return [];
}
if (/伤害加成/.test(title) && val < 1) {
val = Format.pct(val * 100);
num = num * 100;
} else if (/伤害加成|大|暴|充能|治疗/.test(title)) {
val = Format.pct(val);
} else {
val = Format.comma(val, 1);
}
if (/元素伤害加成/.test(title)) {
title = title.replace("元素伤害", "伤");
key = "dmg";
} else if (title === "物理伤害加成") {
title = "物伤加成";
key = "phy";
}
key = key || attrNameMap[title];
let mark = markCfg[key] * num;
if (markCfg) {
if (isMain) {
mark = mark / 4 + 0.01;
}
mark = Format.comma(mark || 0);
}
return { title, val, mark };
},
}
export default Artifact;