mirror of
https://github.com/yoimiya-kokomi/miao-plugin.git
synced 2024-11-16 04:35:42 +00:00
274 lines
6.8 KiB
JavaScript
274 lines
6.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'
|
|
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'] || [400, 500, 300]
|
|
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 = {}
|
|
let 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;
|
|
let 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 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
|
|
},
|
|
|
|
getTotalMark (charName = '', artis) {
|
|
let artisMark = Artifact.getArtisMark(charName, artis)
|
|
let mark = 0
|
|
for (let k in artisMark) {
|
|
if (artisMark[k]) {
|
|
mark += artisMark[k]
|
|
}
|
|
}
|
|
let sets = {}
|
|
let setMap = {}
|
|
lodash.forEach(artis, (arti) => {
|
|
let setName = Artifact.getSetByArti(arti.name)?.name || 'N/A'
|
|
if (setName) {
|
|
sets[setName] = (sets[setName] || 0) + 1
|
|
}
|
|
})
|
|
for (let set in sets) {
|
|
if (sets[set] >= 4) {
|
|
setMap[set] = 4
|
|
} else if (sets[set] >= 2) {
|
|
setMap[set] = 2
|
|
}
|
|
}
|
|
let setsRet = []
|
|
lodash.forEach(setMap, (v, k) => {
|
|
let name = Artifact.getArtiBySet(k)
|
|
if (name) {
|
|
setsRet.push(name)
|
|
}
|
|
})
|
|
return {
|
|
mark: (mark || 0).toFixed(1),
|
|
markClass: Artifact.getMarkClass(mark / 5),
|
|
sets: setsRet
|
|
}
|
|
},
|
|
|
|
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
|
|
},
|
|
|
|
getArtiBySet (name, idx = 1) {
|
|
let set = artisMap[name]
|
|
if (!set) {
|
|
return ''
|
|
}
|
|
return set.sets[`arti${idx}`].name
|
|
},
|
|
|
|
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];
|
|
let key = '';
|
|
let val = ds[1];
|
|
let 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
|