miao-plugin/models/artis/Artis.js
2023-11-13 02:18:45 +08:00

290 lines
6.5 KiB
JavaScript
Raw Permalink 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 { Artifact, ArtifactSet } from '#miao.models'
import { Data, Format } from '#miao'
import Base from '../Base.js'
import ArtisAttr from './ArtisAttr.js'
import ArtisSet from './ArtisSet.js'
import ArtisMark from './ArtisMark.js'
export default class Artis extends Base {
constructor (game = 'gs', isProfile = false) {
super()
this.game = game
this.artis = {}
this.isProfile = !!isProfile
}
// 获取圣遗物套装数据
getSetData () {
return ArtisSet.getSetData(this)
}
get sets () {
return this.getSetData().sets || {}
}
get names () {
return this.getSetData().names || []
}
// 有圣遗物数据
get hasArtis () {
return !lodash.isEmpty(this.artis)
}
_get (key) {
let artis = this.artis
switch (key) {
case 'length':
return lodash.keys(artis).length
}
if (artis[key]) {
return artis[key]
}
}
forEach (fn) {
lodash.forEach(this.artis, (ds, idx) => {
if (ds.name) {
return fn(ds, idx)
}
})
}
eachIdx (fn) {
for (let idx = 1; idx <= (this.isGs ? 5 : 6); idx++) {
this.artis[idx] = this.artis[idx] || {}
let ret = fn(this.artis[idx], idx)
if (ret === false) {
break
}
}
}
setArtisData (ds = {}) {
this.eachIdx((arti, idx) => {
this.setArtis(idx, ds[idx] || ds[`arti${idx}`] || {})
})
}
getDetail () {
let ret = {}
for (let idx = 1; idx <= 5; idx++) {
let ds = this.artis[idx]
if (ds && (ds.name || ds.id)) {
let artis = Artifact.get(ds)
if (!artis) {
continue
}
let tmp = {
...artis?.getData('img,name,set'),
level: ds.level || 1
}
if (ds.main && ds.attrs) {
tmp.main = ds.main || null
tmp.attrs = []
for (let attrIdx in ds.attrs || []) {
if (ds.attrs[attrIdx]) {
tmp.attrs.push(ArtisMark.formatAttr(ds.attrs[attrIdx]))
}
}
}
ret[idx] = tmp
}
}
return ret
}
eachArtisSet (fn) {
ArtifactSet.eachSet(this.sets, fn, this.game)
}
// 有圣遗物词条
get hasAttr () {
return ArtisAttr.hasAttr(this)
}
setArtisBase (idx = 1, ds = {}) {
this.artis[idx] = this.artis[idx] || {}
let arti = this.artis[idx]
if (this.isSr) {
let artiObj = Artifact.get(ds.id, this.game)
if (!artiObj) {
return false
}
arti.id = artiObj.id || ds.id || arti.id || ''
arti.name = artiObj.name || arti.name || ''
arti.set = artiObj.setName || arti.set || ''
arti.level = ds.level || arti.level || 1
arti.star = artiObj.getStarById(ds.id) || arti.star || 5
} else {
arti.name = ds.name || arti.name || ''
arti.set = ds.set || Artifact.getSetNameByArti(arti.name) || ''
arti.level = ds.level || 1
arti.star = ds.star || 5
}
}
setArtis (idx = 1, ds = {}) {
idx = idx.toString().replace('arti', '') * 1 || 1
this.setArtisBase(idx, ds)
if (!this.isProfile) {
return
}
let arti = this.artis[idx]
if (!ds.attrIds || !ds.mainId) {
return false
}
arti.mainId = ds.mainId
arti.attrIds = ds.attrIds
let artiObj = Artifact.get(arti.id || arti.name, this.game)
if (!artiObj) {
return false
}
let attr = artiObj.getAttrData(arti, idx, this.game)
if (!attr) {
console.log('attr id error', ds.main, ds.mainId, idx, arti.level, arti.star)
return false
}
arti.main = attr.main
arti.attrs = attr.attrs
}
// 获取保存数据
toJSON () {
let ret = {}
this.eachIdx((ds, idx) => {
let key = this.isGs ? 'name' : 'id'
let tmp = {
level: ds.level || 1
}
if (!ds[key]) {
return true
}
tmp[key] = ds[key]
if (this.isGs) {
tmp.star = ds.star || 5
}
// 如果不为面板数据则不保存mainId和attrIds
if (!this.isProfile) {
ret[idx] = tmp
return true
}
if (!ds.mainId || !ds.attrIds) {
return true
}
ret[idx] = tmp
tmp.mainId = ds.mainId || ds.main?.id
if (this.isSr) {
tmp.attrIds = []
lodash.forEach(ds.attrs, (as) => {
tmp.attrIds.push([as?.id || '', as?.count || 1, as?.step || 0].join(','))
})
} else {
tmp.attrIds = ds.attrIds
}
})
return ret
}
// 获取指定idx的主词条
getMainAttr (idx = '') {
if (!idx) {
let ret = {}
this.eachIdx((arti, idx) => {
ret[idx] = this.getMainAttr(idx)
})
return ret
}
let main = this.artis[idx]?.main
if (!main) {
return ''
}
return main.key || ''
}
is (check, pos = '') {
if (pos) {
return this.isAttr(check, pos)
}
let sets = this.getSetData()?.abbrs || []
let ret = false
Data.eachStr(check, (s) => {
if (sets.includes(s)) {
ret = true
return false
}
})
return ret
}
isAttr (attr, pos = '') {
let mainAttr = this.getMainAttr()
let check = true
pos = pos || (this.isGs ? '3,4,5' : '3,4,5,6')
let dmgIdx = this.isGs ? 4 : 5
let attrs = attr.split(',')
Data.eachStr(pos.toString(), (p) => {
let posAttr = mainAttr[p]
if (!attrs.includes(posAttr)) {
if (p === dmgIdx && attrs.includes('dmg') && Format.isElem(posAttr)) {
return true
}
/* if (/Plus$/.test(posAttr) && attrs.includes(posAttr.replace('Pct', ''))) {
return true
} */
return check = false
}
})
return check
}
isSameArtis (target) {
let k = (ds) => [ds?.name || '', ds?.level || '', ds?.star || ''].join('|')
let ret = true
this.eachIdx((ds, idx) => {
if (k(ds) !== k(target[idx])) {
return ret = false
}
})
return ret
}
getAllAttr () {
let ret = {}
let add = (ds) => {
if (!ds) {
return
}
let key = ds.key
if (!ret[key]) {
ret[key] = {
key,
value: 0,
upNum: 0,
eff: 0
}
}
let tmp = ret[key]
tmp.value += ds.value
if (ds.eff && ds.upNum) {
tmp.eff += ds.eff
tmp.upNum += ds.upNum
}
}
this.forEach((arti) => {
// add(arti.main)
lodash.forEach(arti.attrs, (attr) => {
add(attr)
})
})
ret = lodash.sortBy(lodash.values(ret), ['eff']).reverse()
return ArtisMark.formatArti(ret, false, false, this.game)
}
}