miao-plugin/models/character/CharMeta.js

190 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 角色资料数据相关
* */
import lodash from 'lodash'
import { Material } from '../index.js'
import { Format } from '#miao'
// 角色排序
export const charPosIdx = {
1: '宵宫,雷神,胡桃,甘雨,优菈,一斗,公子,绫人,魈,可莉,迪卢克,凝光,刻晴,辛焱,烟绯,雷泽',
2: '夜兰,八重,九条,行秋,香菱,安柏,凯亚,丽莎,北斗,菲谢尔,重云,罗莎莉亚,埃洛伊',
3: '申鹤,莫娜,早柚,云堇,久岐忍,五郎,砂糖,万叶,温迪',
4: '班尼特,心海,琴,芭芭拉,七七,迪奥娜,托马,空,荧,阿贝多,钟离'
}
export const baseAttrName = {
hp: '基础生命',
atk: '基础攻击',
def: '基础防御'
}
export const growAttrName = {
atkPct: '大攻击',
hpPct: '大生命',
defPct: '大防御',
cpct: '暴击',
cdmg: '爆伤',
recharge: '充能',
mastery: '精通',
heal: '治疗',
phy: '物伤'
}
const mKeys = [{
key: 'gem',
num: '1/9/9/6'
}, {
key: 'boss',
num: '46',
check: (char) => !char.isTraveler
}, {
key: 'normal',
num: '18/30/36'
}, {
key: 'specialty',
num: '168'
}, {
key: 'talent'
}, {
key: 'weekly',
star: 5
}]
let item = (type, lv, num) => {
return { type, lv, num }
}
let gem = (lv = 1, num = 1) => item('gem', lv, num)
let sp = (num) => item('specialty', 1, num)
let normal = (lv, num) => item('normal', lv, num)
let boss = (num) => item('boss', 1, num)
let money = (num) => item('money', 1, num)
const lvKeys = [{
lv: '1'
}, {
lv: '20'
}, {
lv: '20+',
items: [gem(1, 1), sp(3), normal(1, 3), money(2)]
}, {
lv: '40',
total: [gem(1, 1), sp(3), normal(1, 3), money(2)]
}, {
lv: '40+',
items: [gem(2, 3), boss(2), sp(10), normal(1, 15), money(4)]
}, {
lv: '50',
total: [gem(1, 1), gem(2, 3), boss(2), sp(13), normal(1, 18), money(6)]
}, {
lv: '50+',
items: [gem(2, 6), boss(4), sp(20), normal(2, 12), money(6)],
}, {
lv: '60',
total: [gem(1, 1), gem(2, 9), boss(6), sp(33), normal(1, 18), normal(2, 12), money(12)]
}, {
lv: '60+',
items: [gem(3, 3), boss(8), sp(30), normal(2, 18), money(8)],
}, {
lv: '70',
total: [gem(1, 1), gem(2, 9), gem(3, 3), boss(14), sp(63), normal(1, 18), normal(2, 30), money(20)]
}, {
lv: '70+',
items: [gem(3, 6), boss(12), sp(45), normal(3, 12), money(10)],
}, {
lv: '80',
total: [gem(1, 1), gem(2, 9), gem(3, 9), boss(26), sp(108), normal(1, 18), normal(2, 30), normal(3, 12), money(30)]
}, {
lv: '80+',
items: [gem(4, 6), boss(20), sp(60), normal(3, 24), money(12)]
}, {
lv: '90',
total: [gem(1, 1), gem(2, 9), gem(3, 9), gem(4, 6), boss(46), sp(168), normal(1, 18), normal(2, 30), normal(3, 36), money(42)]
}]
const CharMeta = {
getAttrList (base, grow, elem = '') {
let ret = []
lodash.forEach(base, (v, k) => {
ret.push({
title: baseAttrName[k],
value: Format.comma(v, 1)
})
})
ret.push({
title: '成长·' + (grow.key === 'dmg' ? `${elem}` : growAttrName[grow.key]),
value: grow.value.toString().length > 10 ? Format.comma(grow.value, 1) : grow.value
})
return ret
},
getMaterials (char, type = 'all') {
let ds = char.materials
let ret = []
lodash.forEach(mKeys, (cfg) => {
let title = ds[cfg.key]
let mat = Material.get(title)
if (!mat) {
return true
}
if (cfg.check && !cfg.check(char)) {
return true
}
if (type !== 'all' && mat.type !== type) {
return true
}
ret.push({
...mat.getData('label,star,icon,type'),
num: cfg.num || mat.source || ''
})
})
return type === 'all' ? ret : ret[0]
},
getDesc (desc) {
desc = desc.replace(/。$/, '')
desc = desc.replace('</br>', '')
desc = desc.replace(/[。,]/g, '')
desc = desc.replace('——', ',——')
let len = desc.length
if (len < 25) {
return desc
}
if (/-/.test(desc)) {
let idx = desc.indexOf('—')
return [desc.substr(0, idx), desc.substr(idx, desc.length)].join('</br>')
}
desc = desc.split('')
return CharMeta.getDescLine(desc)
},
getDescLine (inputs) {
let lens = []
let len = 0
let descs = []
const maxChars = 26
for (let desc of inputs) {
if (len + desc.length < maxChars * 2) {
lens.push(desc.length)
descs.push(desc)
len += desc.length
} else {
break
}
}
if (len <= maxChars - 6) {
return descs.join('')
}
let ret = [[], []]
let idx = 0
for (let desc of descs) {
if (ret[idx].join(' ').length + desc.length > maxChars) {
idx++
}
ret[idx] = ret[idx] || []
ret[idx].push(desc)
if (descs.length === 2) {
idx++
}
}
return ret[0].join('') + '</br>' + ret[1].join('')
}
}
export default CharMeta