mirror of
https://github.com/yoimiya-kokomi/miao-plugin.git
synced 2024-11-16 04:35:42 +00:00
增加 #雷神伤害
功能
* 可计算圣遗物副词条置换带来的伤害变化,可用于圣遗物副词条侧重方向的参考 * 可以查看指定角色伤害计算的Buff列表
This commit is contained in:
parent
ec47c08bee
commit
9765c5af18
14
CHANGELOG.md
14
CHANGELOG.md
@ -1,13 +1,15 @@
|
||||
# 1.2.3
|
||||
# 1.3.0
|
||||
|
||||
* `#角色面板` 增加伤害计算功能
|
||||
* 目前支持角色:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华
|
||||
* 增加 `#雷神伤害` 功能
|
||||
* 可计算圣遗物副词条置换带来的伤害变化,可用于圣遗物副词条侧重方向的参考
|
||||
* 可以查看指定角色伤害计算的Buff列表
|
||||
* `#角色面板` 伤害计算新增部分角色
|
||||
* 目前支持:雷神、胡桃、魈、神子、甘雨、宵宫、公子、绫人、绫华
|
||||
* `#角色面板` 功能升级
|
||||
* 优化无角色面板数据时的引导
|
||||
* 优化返回的图像格式及分辨率,平衡响应速度及显示效果
|
||||
* 增加 `#甘雨伤害` 命令,可以查看伤害计算的具体Buff效果。后续会完善计算逻辑
|
||||
* 增加 `#圣遗物列表` 命令,对已经获取面板的所有角色圣遗物进行评分,并展示高评分的圣遗物列表
|
||||
* 增加 `#角色面板列表` 命令,查看已经获取面板的角色列表
|
||||
* 增加 `#圣遗物列表` 功能,对已经获取面板的所有角色圣遗物进行评分,并展示高评分的圣遗物列表
|
||||
* 增加 `#角色面板列表` / `#角色面板帮助` 命令
|
||||
* 增加 `#更新胡桃面板` 命令,获取单个角色面板数据,每天可更新5次
|
||||
* 更改 `#更新全部面板` 命令,获取角色展柜全部8个角色,每天可更新3次
|
||||
|
||||
|
@ -64,13 +64,17 @@ export async function character(e, { render, User }) {
|
||||
|
||||
let mode = 'card';
|
||||
let name = msg.replace(/#|老婆|老公|[1|2|5][0-9]{8}/g, "").trim();
|
||||
let dmgRet = /伤害(\d?)$/.exec(msg), dmgIdx = 0;
|
||||
|
||||
if (/(详情|详细|面板|面版)$/.test(msg) && !/更新/.test(msg)) {
|
||||
mode = 'profile';
|
||||
name = name.replace(/(详情|详细|面板|面版)/, "").trim();
|
||||
} else if (/伤害$/.test(msg)) {
|
||||
} else if (dmgRet) {
|
||||
mode = 'dmg';
|
||||
name = name.replace(/伤害/, "").trim();
|
||||
name = name.replace(/伤害[0-5]?/, "").trim();
|
||||
if (dmgRet[1]) {
|
||||
dmgIdx = dmgRet[1] * 1;
|
||||
}
|
||||
} else if (/(详情|详细|面板|面版)更新$/.test(msg) || (/更新/.test(msg) && /(详情|详细|面板|面版)$/.test(msg))) {
|
||||
mode = "refresh";
|
||||
name = name.replace(/详情|详细|面板|面版|更新/g, "").trim();
|
||||
@ -84,7 +88,7 @@ export async function character(e, { render, User }) {
|
||||
|
||||
|
||||
if (mode === "profile" || mode === "dmg") {
|
||||
return renderProfile(e, char, render, mode);
|
||||
return renderProfile(e, char, render, mode, { dmgIdx });
|
||||
} else if (mode === "refresh") {
|
||||
e.avatar = char.id;
|
||||
await getProfile(e);
|
||||
@ -564,7 +568,7 @@ async function getAvatar(e, char, MysApi) {
|
||||
}
|
||||
|
||||
|
||||
export async function renderProfile(e, char, render, mode = "profile") {
|
||||
export async function renderProfile(e, char, render, mode = "profile", params = {}) {
|
||||
|
||||
if (['荧', '空', '主角', '旅行者'].includes(char.name)) {
|
||||
e.reply("暂不支持主角的面板信息查看");
|
||||
@ -660,7 +664,15 @@ export async function renderProfile(e, char, render, mode = "profile") {
|
||||
|
||||
let enemyLv = await selfUser.getCfg(`char.enemyLv`, 91);
|
||||
let dmgMsg = [], dmgData = [];
|
||||
let dmgCalc = await Calc.calcData({ profile, char, avatar, talentData: talent, enemyLv });
|
||||
let dmgCalc = await Calc.calcData({
|
||||
profile,
|
||||
char,
|
||||
avatar,
|
||||
talentData: talent,
|
||||
enemyLv,
|
||||
mode,
|
||||
...params
|
||||
});
|
||||
if (dmgCalc && dmgCalc.ret) {
|
||||
lodash.forEach(dmgCalc.ret, (ds) => {
|
||||
ds.dmg = Format.comma(ds.dmg, 0);
|
||||
@ -673,6 +685,20 @@ export async function renderProfile(e, char, render, mode = "profile") {
|
||||
})
|
||||
}
|
||||
|
||||
if (mode === "dmg") {
|
||||
let basic = dmgCalc.dmgCfg.basicRet;
|
||||
lodash.forEach(dmgCalc.dmgRet, (row) => {
|
||||
lodash.forEach(row, (ds) => {
|
||||
ds.val = (ds.avg > basic.avg ? "+" : "") + Format.comma(ds.avg - basic.avg);
|
||||
ds.dmg = Format.comma(ds.dmg, 0);
|
||||
ds.avg = Format.comma(ds.avg, 0);
|
||||
|
||||
})
|
||||
});
|
||||
basic.dmg = Format.comma(basic.dmg);
|
||||
basic.avg = Format.comma(basic.avg);
|
||||
}
|
||||
|
||||
let base64 = await render("character", "detail", {
|
||||
save_id: uid,
|
||||
uid: uid,
|
||||
@ -685,6 +711,8 @@ export async function renderProfile(e, char, render, mode = "profile") {
|
||||
elem: char.elem,
|
||||
dmgData,
|
||||
dmgMsg,
|
||||
dmgRet: dmgCalc.dmgRet,
|
||||
dmgCfg: dmgCalc.dmgCfg,
|
||||
reliquaries,
|
||||
enemyLv,
|
||||
totalMark: c(totalMark, 1),
|
||||
|
@ -11,6 +11,17 @@ const eleMap = {
|
||||
Pyro: "火"
|
||||
}
|
||||
|
||||
const attrMap = {
|
||||
atk: { type: "pct", val: 5.83, title: "大攻击", text: "5.8%" },
|
||||
hp: { type: "pct", val: 5.83, title: "大生命", text: "5.8%" },
|
||||
def: { type: "pct", val: 7.29, title: "大防御", text: "7.3%" },
|
||||
recharge: { type: "plus", val: 6.48, title: "元素充能", text: "6.5%" },
|
||||
mastery: { type: "plus", val: 23.31, title: "元素精通", text: "23.3" },
|
||||
cpct: { type: "plus", val: 3.89, title: "暴击率", text: "3.9%" },
|
||||
cdmg: { type: "plus", val: 7.77, title: "暴击伤害", text: "7.8%" },
|
||||
}
|
||||
|
||||
|
||||
let Calc = {
|
||||
|
||||
async getCharCalcRule(name) {
|
||||
@ -19,16 +30,22 @@ let Calc = {
|
||||
const cfgPath = `${_path}/plugins/miao-plugin/resources/meta/character/${name}/calc.js`;
|
||||
|
||||
|
||||
let details, buffs = [], defParams = {};
|
||||
let details, buffs = [], defParams = {}, defDmgIdx = -1, mainAttr = "atk,cpct,cdmg";
|
||||
if (fs.existsSync(cfgPath)) {
|
||||
let fileData = await import (`file://${cfgPath}`);
|
||||
details = fileData.details || false;
|
||||
buffs = fileData.buffs || [];
|
||||
defParams = fileData.defParams || {};
|
||||
if (fileData.defDmgIdx) {
|
||||
defDmgIdx = fileData.defDmgIdx;
|
||||
}
|
||||
if (fileData.mainAttr) {
|
||||
mainAttr = fileData.mainAttr;
|
||||
}
|
||||
}
|
||||
|
||||
if (details) {
|
||||
return { details, buffs, defParams }
|
||||
return { details, buffs, defParams, defDmgIdx, mainAttr }
|
||||
}
|
||||
return false;
|
||||
},
|
||||
@ -159,11 +176,18 @@ let Calc = {
|
||||
}
|
||||
},
|
||||
|
||||
calcAttr(originalAttr, buffs, meta, params = {}) {
|
||||
calcAttr(originalAttr, buffs, meta, params = {}, incAttr = '', reduceAttr = '') {
|
||||
let attr = lodash.merge({}, originalAttr);
|
||||
|
||||
let msg = [];
|
||||
|
||||
if (incAttr && attrMap[incAttr]) {
|
||||
let aCfg = attrMap[incAttr];
|
||||
attr[incAttr][aCfg.type] += aCfg.val;
|
||||
}
|
||||
if (reduceAttr && attrMap[reduceAttr]) {
|
||||
let aCfg = attrMap[reduceAttr];
|
||||
attr[reduceAttr][aCfg.type] -= aCfg.val;
|
||||
}
|
||||
|
||||
lodash.forEach(buffs, (buff) => {
|
||||
let ds = Calc.getDs(attr, meta, params);
|
||||
@ -284,52 +308,9 @@ let Calc = {
|
||||
})
|
||||
return retBuffs;
|
||||
},
|
||||
async calcData({ profile, char, avatar, talentData, enemyLv = 91 }) {
|
||||
let charCalcData = await Calc.getCharCalcRule(char.name);
|
||||
|
||||
//avatar.element;
|
||||
|
||||
if (!charCalcData) {
|
||||
return false;
|
||||
}
|
||||
let talent = Calc.talent(talentData, char);
|
||||
|
||||
let meta = {
|
||||
cons: avatar.actived_constellation_num * 1,
|
||||
talent
|
||||
}
|
||||
|
||||
let { buffs, details, defParams } = charCalcData;
|
||||
|
||||
defParams = defParams || {};
|
||||
|
||||
let originalAttr = Calc.attr(profile, avatar);
|
||||
|
||||
let weaponBuffs = await Calc.weapon(avatar.weapon.name);
|
||||
let reliBuffs = await Calc.reliquaries(avatar.reliquaries);
|
||||
buffs = lodash.concat(buffs, weaponBuffs, reliBuffs);
|
||||
|
||||
lodash.forEach(buffs, (buff) => {
|
||||
buff.sort = lodash.isUndefined(buff.sort) ? 1 : buff.sort
|
||||
});
|
||||
|
||||
buffs = lodash.sortBy(buffs, ["sort"]);
|
||||
|
||||
let { msg } = Calc.calcAttr(originalAttr, buffs, meta, defParams || {});
|
||||
|
||||
let ret = [];
|
||||
|
||||
lodash.forEach(details, (detail) => {
|
||||
|
||||
let params = lodash.merge({}, defParams, detail.params || {});
|
||||
|
||||
let { attr } = Calc.calcAttr(originalAttr, buffs, meta, params);
|
||||
|
||||
if (detail.check && !detail.check(Calc.getDs(attr, meta, params))) {
|
||||
return;
|
||||
}
|
||||
|
||||
let dmg = function (pctNum = 0, talent = false, ele = false) {
|
||||
getDmgFn({ attr, avatar, enemyLv }) {
|
||||
return function (pctNum = 0, talent = false, ele = false) {
|
||||
let { atk, dmg, cdmg, cpct } = attr;
|
||||
// 攻击区
|
||||
let atkNum = (atk.base + atk.plus + atk.base * atk.pct / 100);
|
||||
@ -406,21 +387,114 @@ let Calc = {
|
||||
|
||||
return ret;
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
async calcData({ profile, char, avatar, talentData, enemyLv = 91, mode = 'profile', dmgIdx = 0 }) {
|
||||
let charCalcData = await Calc.getCharCalcRule(char.name);
|
||||
|
||||
//avatar.element;
|
||||
|
||||
if (!charCalcData) {
|
||||
return false;
|
||||
}
|
||||
let talent = Calc.talent(talentData, char);
|
||||
|
||||
let meta = {
|
||||
cons: avatar.actived_constellation_num * 1,
|
||||
talent
|
||||
}
|
||||
|
||||
let { buffs, details, defParams, mainAttr, defDmgIdx } = charCalcData;
|
||||
|
||||
defParams = defParams || {};
|
||||
|
||||
let originalAttr = Calc.attr(profile, avatar);
|
||||
|
||||
let weaponBuffs = await Calc.weapon(avatar.weapon.name);
|
||||
let reliBuffs = await Calc.reliquaries(avatar.reliquaries);
|
||||
buffs = lodash.concat(buffs, weaponBuffs, reliBuffs);
|
||||
|
||||
lodash.forEach(buffs, (buff) => {
|
||||
buff.sort = lodash.isUndefined(buff.sort) ? 1 : buff.sort
|
||||
});
|
||||
|
||||
buffs = lodash.sortBy(buffs, ["sort"]);
|
||||
|
||||
let { msg } = Calc.calcAttr(originalAttr, buffs, meta, defParams || {});
|
||||
|
||||
let ret = [], detailMap = [], dmgRet = [], dmgDetail = {};
|
||||
|
||||
|
||||
lodash.forEach(details, (detail, detailSysIdx) => {
|
||||
let params = lodash.merge({}, defParams, detail.params || {});
|
||||
let { attr } = Calc.calcAttr(originalAttr, buffs, meta, params);
|
||||
if (detail.check && !detail.check(Calc.getDs(attr, meta, params))) {
|
||||
return;
|
||||
}
|
||||
let dmg = Calc.getDmgFn({ attr, avatar, enemyLv }),
|
||||
basicDmgRet;
|
||||
if (detail.dmg) {
|
||||
let dmgRet = detail.dmg({ attr, talent }, dmg);
|
||||
basicDmgRet = detail.dmg({ attr, talent }, dmg);
|
||||
detail.userIdx = detailMap.length;
|
||||
detailMap.push(detail);
|
||||
ret.push({
|
||||
title: detail.title,
|
||||
...dmgRet
|
||||
...basicDmgRet
|
||||
})
|
||||
}
|
||||
})
|
||||
return {
|
||||
ret,
|
||||
msg
|
||||
}
|
||||
|
||||
if (mode === "dmg") {
|
||||
let detail;
|
||||
if (dmgIdx && detailMap[dmgIdx - 1]) {
|
||||
detail = detailMap[dmgIdx - 1];
|
||||
} else if (!lodash.isUndefined(defDmgIdx) && details[defDmgIdx]) {
|
||||
detail = details[defDmgIdx];
|
||||
} else {
|
||||
detail = detailMap[0];
|
||||
}
|
||||
|
||||
dmgDetail = {
|
||||
title: detail.title,
|
||||
userIdx: detail.userIdx,
|
||||
basicRet: lodash.merge({}, ret[detail.userIdx]),
|
||||
attr: []
|
||||
};
|
||||
|
||||
|
||||
mainAttr = mainAttr.split(",");
|
||||
let params = lodash.merge({}, defParams, detail.params || {});
|
||||
let basicDmg = dmgDetail.basicRet;
|
||||
lodash.forEach(mainAttr, (reduceAttr) => {
|
||||
dmgDetail.attr.push(attrMap[reduceAttr])
|
||||
let rowData = [];
|
||||
lodash.forEach(mainAttr, (incAttr) => {
|
||||
if (incAttr === reduceAttr) {
|
||||
rowData.push({ type: 'na' });
|
||||
return;
|
||||
}
|
||||
let { attr } = Calc.calcAttr(originalAttr, buffs, meta, params, incAttr, reduceAttr);
|
||||
let dmg = Calc.getDmgFn({ attr, avatar, enemyLv });
|
||||
if (detail.dmg) {
|
||||
let dmgCalcRet = detail.dmg({ attr, talent }, dmg);
|
||||
rowData.push({
|
||||
type: dmgCalcRet.avg === basicDmg.avg ? "avg" : (dmgCalcRet.avg > basicDmg.avg ? "gt" : "lt"),
|
||||
...dmgCalcRet
|
||||
})
|
||||
}
|
||||
})
|
||||
dmgRet.push(rowData);
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
ret,
|
||||
msg,
|
||||
dmgRet,
|
||||
dmgCfg: dmgDetail
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 请将此文件复制一份,命名为 config.js 放置在miao-plugin的根目录
|
||||
* 申请API Token请在Bot群内联系 @喵喵 或者 @九章
|
||||
* 由于服务侧压力过大,目前已经暂停 #角色面板 token的发放,请见谅~
|
||||
* */
|
||||
|
||||
export const config = {
|
||||
|
4
index.js
4
index.js
@ -37,7 +37,7 @@ export {
|
||||
|
||||
let rule = {
|
||||
character: {
|
||||
reg: "^#(喵喵)?(更新)?(.*)(详情|详细|面板|面版|伤害)?(更新)?$",
|
||||
reg: "^#(喵喵)?(更新)?(.*)(详情|详细|面板|面版|伤害[1-7]?)?(更新)?$",
|
||||
describe: "【#角色】角色详情",
|
||||
},
|
||||
getArtis: {
|
||||
@ -95,7 +95,7 @@ lodash.forEach(rule, (r) => {
|
||||
|
||||
export { rule };
|
||||
|
||||
console.log("喵喵插件初始化~");
|
||||
console.log(`喵喵插件${currentVersion}初始化~`);
|
||||
|
||||
setTimeout(async function () {
|
||||
let msgStr = await redis.get("miao:restart-msg");
|
||||
|
@ -318,6 +318,41 @@ body {
|
||||
.dmg-cont {
|
||||
display: table;
|
||||
width: calc(100% - 25px);
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.dmg-mode .dmg-list .cont-footer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.cont-title {
|
||||
background: rgba(0, 0, 0, .4);
|
||||
color: #d3bc8e;
|
||||
font-family: YS;
|
||||
padding: 10px 20px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.cont-title span {
|
||||
font-size: 12px;
|
||||
color: #aaa;
|
||||
margin-left: 10px;
|
||||
font-family: Number, YS;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cont-footer {
|
||||
padding: 10px 15px;
|
||||
font-size: 12px;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
font-family: YS;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cont-table {
|
||||
display: table;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dmg-cont .tr {
|
||||
@ -360,6 +395,30 @@ body {
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.profile-mode .dmg-idx {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.profile-mode .dmg-title {
|
||||
width: 33.3333%;
|
||||
}
|
||||
|
||||
.dmg-mode .dmg-idx {
|
||||
display: table-cell;
|
||||
width: 5%;
|
||||
min-width: initial;
|
||||
padding-right: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dmg-mode .dmg-title {
|
||||
width: 31%;
|
||||
min-width: initial;
|
||||
text-align: left;
|
||||
padding-left: 10px;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
|
||||
.dmg .value {
|
||||
text-align: center;
|
||||
@ -369,7 +428,7 @@ body {
|
||||
font-size: 18px;
|
||||
font-family: Number;
|
||||
line-height: 40px;
|
||||
width: 33.333%
|
||||
width: 32%
|
||||
}
|
||||
|
||||
.dmg-notice {
|
||||
@ -651,11 +710,16 @@ body {
|
||||
font-family: Number, YS;
|
||||
font-size: 13px;
|
||||
font-weight: normal;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.dmg-msg .thead > div {
|
||||
text-align: left;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.dmg-msg .th {
|
||||
width: 33%;
|
||||
text-align: left;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.dmg-msg .tr .td {
|
||||
@ -670,6 +734,84 @@ body {
|
||||
}
|
||||
|
||||
|
||||
.dmg-calc {
|
||||
|
||||
}
|
||||
|
||||
.dmg-calc .thead {
|
||||
|
||||
}
|
||||
|
||||
.dmg-calc .thead > div {
|
||||
line-height: initial;
|
||||
}
|
||||
|
||||
.dmg-calc .cont-table div {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dmg-calc .title {
|
||||
text-align: center;
|
||||
padding-right: 0;
|
||||
min-width: 70px;
|
||||
|
||||
}
|
||||
|
||||
.dmg-calc .td {
|
||||
padding: 5px 0;
|
||||
}
|
||||
|
||||
.dmg-calc strong {
|
||||
font-weight: normal;
|
||||
display: block;
|
||||
font-family: Number, YS;
|
||||
}
|
||||
|
||||
.dmg-calc span {
|
||||
font-size: 12px;
|
||||
color: #aaa;
|
||||
font-family: Number, YS;
|
||||
}
|
||||
|
||||
.dmg-calc .na,
|
||||
.dmg-calc .eq {
|
||||
background: rgba(50, 50, 50, .5);
|
||||
}
|
||||
|
||||
.dmg-calc .na {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.dmg-calc .lt {
|
||||
background: rgba(23, 112, 41, 0.5);
|
||||
}
|
||||
|
||||
.dmg-calc .gt {
|
||||
background: rgba(112, 23, 23, 0.5);
|
||||
}
|
||||
|
||||
.dmg-desc {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.dmg-desc ul {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.dmg-desc ul li {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.dmg-desc strong {
|
||||
color: #d3bc8e;
|
||||
display: inline;
|
||||
padding: 0 3px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
|
||||
.artis .stat span {
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
|
@ -6,7 +6,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/common/common.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/character/detail.css"/>
|
||||
</head>
|
||||
<body {{cfgScale}} class="elem_{{elem}} char-{{name}}">
|
||||
<body {{cfgScale}} class="elem_{{elem}} char-{{name}} {{mode}}-mode">
|
||||
<div class="container" id="container">
|
||||
<div class="basic">
|
||||
<div class="main-pic"
|
||||
@ -49,21 +49,30 @@
|
||||
</div>
|
||||
</div>
|
||||
{{if dmgData.length > 0}}
|
||||
<div class="dmg-cont cont">
|
||||
<div class="dmg-cont dmg-list cont">
|
||||
<div class="cont-title">
|
||||
伤害计算<span>目标为{{enemyLv}}级小宝,如需调整等级可使用 #敌人等级{{enemyLv}} 来进行设置</span>
|
||||
</div>
|
||||
<div class="cont-table">
|
||||
<div class="tr thead">
|
||||
<div class="title">伤害类型</div>
|
||||
<div class="title dmg-idx">#</div>
|
||||
<div class="title dmg-title">伤害类型</div>
|
||||
<div>暴击伤害</div>
|
||||
<div>平均伤害(计算暴击率)</div>
|
||||
</div>
|
||||
{{each dmgData dmg idx}}
|
||||
<div class="dmg tr">
|
||||
<div class="title">{{dmg.title}}</div>
|
||||
<div class="title dmg-idx">{{idx+1}}</div>
|
||||
<div class="title dmg-title">{{dmg.title}}</div>
|
||||
<div class="value">{{dmg.dmg}}</div>
|
||||
<div class="value">{{dmg.avg}}</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
<div class="dmg-notice">目标为{{enemyLv}}级小宝,如需调整等级可使用 #敌人等级{{enemyLv}} 来进行设置</div>
|
||||
<div class="cont-footer dmg-desc">
|
||||
使用命令<strong>#{{name}}伤害</strong>可以查看伤害详情,使用命令<strong>#角色面板帮助</strong>可查看帮助说明
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if mode === "profile"}}
|
||||
@ -110,13 +119,59 @@
|
||||
{{/if}}
|
||||
|
||||
{{if mode === "dmg"}}
|
||||
<div class="dmg-cont dmg-msg cont">
|
||||
<div class="tr thead">
|
||||
|
||||
{{if dmgCfg && dmgCfg.attr && dmgCfg.attr.length>0}}
|
||||
<div class="dmg-calc dmg-cont cont">
|
||||
<div class="cont-title">
|
||||
词条伤害计算<span>#{{name}}伤害{{dmgCfg.userIdx+1}}: 当前计算为[{{dmgCfg.title}}]的 平均伤害</span>
|
||||
</div>
|
||||
<div class="cont-table">
|
||||
<div class="tr thead ">
|
||||
<div class="td">词条变化</div>
|
||||
{{each dmgCfg.attr attr}}
|
||||
<div class="td">
|
||||
<strong>{{attr.title}}</strong>
|
||||
<span>+{{attr.text}}</span>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{each dmgRet row rowIdx}}
|
||||
<div class="tr">
|
||||
<div class="title">
|
||||
Buff列表
|
||||
<strong>{{dmgCfg.attr[rowIdx].title}}</strong>
|
||||
<span>-{{dmgCfg.attr[rowIdx].text}}</span>
|
||||
</div>
|
||||
<div class="info">部分Buff的触发条件以及层数可能影响实际伤害结果</div>
|
||||
{{each row cell colIdx}}
|
||||
{{if cell.type === "na"}}
|
||||
<div class="td na">
|
||||
<strong>-</strong>
|
||||
<span>{{dmgCfg.basicRet.avg}}/{{dmgCfg.basicRet.dmg}}</span>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="td {{cell.type}}">
|
||||
<strong>{{cell.val}}</strong>
|
||||
<span>{{cell.avg}}/{{cell.dmg}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
<div class="cont-footer dmg-desc">
|
||||
<ul>
|
||||
<li>大数字的含义为圣遗物副词条置换后<strong>平均伤害</strong>的变化,下方的详情数字为<strong>平均伤害</strong>/<strong>暴击伤害</strong>。</li>
|
||||
<li><strong>平均伤害</strong>:是将暴击率计算在内的伤害期望,能反映综合的输出能力,不等于实际伤害数字。</li>
|
||||
<li>可用于评估当前面板下圣遗物副词条的侧重方向。实际游戏情况更加复杂,结果供参考~</li>
|
||||
<li>如需更换计算的伤害类型,可使用命令 <strong>#{{name}}伤害+序号</strong>来切换,序号参见伤害计算板块</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="dmg-cont dmg-msg cont">
|
||||
<div class="cont-title">Buff列表<span>部分Buff的触发条件以及层数可能影响实际伤害结果</span></div>
|
||||
<div class="cont-table">
|
||||
{{each dmgMsg msg}}
|
||||
<div class="tr">
|
||||
<div class="th">{{msg[0]}}</div>
|
||||
@ -124,6 +179,7 @@
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="copyright">Created By Yunzai-Bot & Miao-Plugin</div>
|
||||
</div>
|
||||
|
@ -14,6 +14,8 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.q['技能伤害'] + talent.q['天狐霆雷伤害'] * 3, 'q')
|
||||
}];
|
||||
|
||||
export const mainAttr = "atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
title: `被动天赋:基于元素精通提高杀生樱伤害[eDmg]%`,
|
||||
data: {
|
||||
|
@ -1,6 +1,6 @@
|
||||
export const details = [{
|
||||
title: "开E后首段普攻",
|
||||
params: { num: 1},
|
||||
params: { num: 1 },
|
||||
dmg: ({ talent }, dmg) => dmg(talent.a['一段伤害'], 'a')
|
||||
}, {
|
||||
title: "开E满Buff普攻尾箭",
|
||||
@ -8,10 +8,12 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.a['五段伤害'], 'a')
|
||||
}, {
|
||||
title: "开E满Buff尾箭蒸发",
|
||||
params: { num: 10},
|
||||
params: { num: 10 },
|
||||
dmg: ({ talent }, dmg) => dmg(talent.a['五段伤害'], 'a', 'zf')
|
||||
}];
|
||||
|
||||
export const mainAttr = "atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
title: "焰硝庭火舞:开启E后额外提升普通[aMulti]%伤害",
|
||||
data: {
|
||||
|
@ -15,6 +15,9 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.q['冰棱伤害'], 'q')
|
||||
}];
|
||||
|
||||
export const defDmgIdx = 2;
|
||||
export const mainAttr = "atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
cons: 1,
|
||||
title: "甘雨1命:霜华失命中减少敌人15%冰抗",
|
||||
@ -27,4 +30,7 @@ export const buffs = [{
|
||||
data: {
|
||||
dmg: ({ params }) => params.q ? 25 : 0
|
||||
}
|
||||
}, {
|
||||
title: "元素精通:融化伤害提高[rh]%",
|
||||
mastery: "rh"
|
||||
}];
|
@ -10,6 +10,8 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.q['水花剑伤害'], 'q')
|
||||
}];
|
||||
|
||||
export const defDmgIdx = 1;
|
||||
export const mainAttr = "hp,atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
cons: 2,
|
||||
|
@ -9,6 +9,7 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.q['切割伤害'], 'q')
|
||||
}];
|
||||
|
||||
export const mainAttr = "atk,cpct,cdmg";
|
||||
|
||||
export const buffs = [{
|
||||
passive: 1,
|
||||
|
@ -9,6 +9,9 @@ export const details = [{
|
||||
dmg: ({ talent, attr }, dmg) => dmg(talent.q["低血量时技能伤害"], "q")
|
||||
}];
|
||||
|
||||
export const defDmgIdx = 1;
|
||||
export const mainAttr = "hp,atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
title: "蝶引来生:开E获得[atkPlus]点攻击力加成",
|
||||
data: {
|
||||
|
@ -12,6 +12,8 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.q['技能伤害·近战'], 'q','zf')
|
||||
}];
|
||||
|
||||
export const mainAttr = "atk,cpct,cdmg,mastery";
|
||||
|
||||
export const buffs = [{
|
||||
title: "元素精通:蒸发伤害提高[zf]%",
|
||||
mastery: "zf"
|
||||
|
@ -26,6 +26,9 @@ export const defParams = {
|
||||
type: 0
|
||||
};
|
||||
|
||||
export const defDmgIdx = 1;
|
||||
export const mainAttr = "atk,cpct,cdmg,recharge";
|
||||
|
||||
export const buffs = [
|
||||
{
|
||||
title: `恶曜开眼:开E元素爆发伤害提升[qDmg]%`,
|
||||
@ -39,7 +42,7 @@ export const buffs = [
|
||||
}
|
||||
}, {
|
||||
check: ({ cons }) => cons >= 2,
|
||||
title: "雷神2命:大招无视敌人[qDef]%防御力",
|
||||
title: "雷神2命:大招无视敌人[qIgnore]%防御力",
|
||||
data: {
|
||||
"qIgnore": 60
|
||||
}
|
||||
|
@ -19,6 +19,8 @@ export const details = [{
|
||||
dmg: ({ talent }, dmg) => dmg(talent.a["低空/高空坠地冲击伤害"][1], "a3")
|
||||
}];
|
||||
|
||||
export const defDmgIdx = 3;
|
||||
export const mainAttr = "atk,cpct,cdmg";
|
||||
|
||||
export const defParams = {
|
||||
layer: 0
|
||||
|
@ -543,10 +543,7 @@ let sword = {
|
||||
"磐岩结绿": [{
|
||||
title: "基于生命值上限提高攻击力[atkPlus]",
|
||||
data: {
|
||||
atkPlus: ({ attr, calc, refine }) => {
|
||||
console.log('panyan', calc(attr.hp), step(1.2)[refine]);
|
||||
return calc(attr.hp) * step(1.2)[refine] / 100
|
||||
}
|
||||
atkPlus: ({ attr, calc, refine }) => calc(attr.hp) * step(1.2)[refine] / 100
|
||||
}
|
||||
}],
|
||||
"斫峰之刃": [{
|
||||
|
Loading…
Reference in New Issue
Block a user