miao-plugin/models/Weapon.js
Kokomi a009b9678d * 增加3.6新圣遗物数据及资源
* 增加绮良良的角色信息,可通过`#绮良良天赋`、`#绮良良图鉴`等查看
2023-04-13 03:44:56 +08:00

163 lines
3.7 KiB
JavaScript

import Base from './Base.js'
import { Data } from '#miao'
import { weaponData, weaponAbbr, weaponAlias, weaponType, weaponSet } from '../resources/meta/weapon/index.js'
import lodash from 'lodash'
class Weapon extends Base {
constructor (name) {
super(name)
let meta = weaponData[name]
if (!meta) {
return false
}
let cache = this._getCache(`weapon:${name}`)
if (cache) {
return cache
}
this.id = meta.id
this.name = meta.name
this.meta = meta
this.type = meta.type
this.star = meta.star
return this._cache()
}
get abbr () {
return weaponAbbr[this.name] || this.name
}
get title () {
return this.name
}
get img () {
return `meta/weapon/${this.type}/${this.name}/icon.webp`
}
get imgs () {
return {
icon: `meta/weapon/${this.type}/${this.name}/icon.webp`,
icon2: `meta/weapon/${this.type}/${this.name}/awaken.webp`,
gacha: `meta/weapon/${this.type}/${this.name}/gacha.webp`
}
}
get icon () {
return this.img
}
get detail () {
return this.getDetail()
}
get maxLv () {
return this.star <= 2 ? 70 : 90
}
get maxPromote () {
return this.star <= 2 ? 4 : 6
}
get maxAffix () {
let datas = this.detail?.affixData?.datas || {}
return (datas['0'] && datas['0'][4]) ? 5 : 1
}
static isWeaponSet (name) {
return weaponSet.includes(name)
}
static get (name, type = '') {
name = lodash.trim(name)
if (weaponAlias[name]) {
return new Weapon(weaponAlias[name])
}
if (type) {
let name2 = name + (weaponType[type] || type)
if (weaponAlias[name2]) {
return new Weapon(weaponAlias[name2])
}
}
return false
}
static async forEach (fn, type = '') {
for (let name in weaponData) {
let ds = weaponData[name]
let w = Weapon.get(ds.name)
if (!w || (type && type !== w.type)) {
continue
}
await fn(w)
}
}
getDetail () {
if (this._detail) {
return this._detail
}
const path = 'resources/meta/weapon'
try {
this._detail = Data.readJSON(`${path}/${this.type}/${this.name}/data.json`, 'miao')
} catch (e) {
console.log(e)
}
return this._detail
}
calcAttr (level, promote = -1) {
let lvLeft = 1
let lvRight = 20
let lvStep = [1, 20, 40, 50, 60, 70, 80, 90]
let currPromote = 0
for (let idx = 0; idx < lvStep.length - 1; idx++) {
if (promote === -1 || (currPromote === promote)) {
if (level >= lvStep[idx] && level <= lvStep[idx + 1]) {
lvLeft = lvStep[idx]
lvRight = lvStep[idx + 1]
break
}
}
currPromote++
}
let wAttr = this?.detail?.attr || {}
let wAtk = wAttr.atk || {}
let valueLeft = wAtk[lvLeft + '+'] || wAtk[lvLeft] || {}
let valueRight = wAtk[lvRight] || {}
let atkBase = valueLeft * 1 + ((valueRight - valueLeft) * (level - lvLeft) / (lvRight - lvLeft))
let wBonus = wAttr.bonusData || {}
valueLeft = wBonus[lvLeft + '+'] || wBonus[lvLeft]
valueRight = wBonus[lvRight]
let stepCount = Math.ceil((lvRight - lvLeft) / 5)
let valueStep = (valueRight - valueLeft) / stepCount
let value = valueLeft + (stepCount - Math.ceil((lvRight - level) / 5)) * valueStep
return {
atkBase,
attr: {
key: wAttr.bonusKey,
value
}
}
}
getAffixInfo (affix) {
let d = this.getDetail()
let ad = this.detail.affixData
let txt = ad.text
lodash.forEach(ad.datas, (ds, idx) => {
txt = txt.replace(`$[${idx}]`, ds[affix - 1])
})
return {
name: d.name,
star: d.star,
desc: d.desc,
imgs: this.imgs,
affix,
affixTitle: d.affixTitle,
affixDetail: txt
}
}
}
export default Weapon