/** * 面板圣遗物 */ 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, star: ds.star || 5 } if (!ds[key]) { return true } tmp[key] = ds[key] // 如果不为面板数据,则不保存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 Data.eachStr(pos.toString(), (p) => { let attrs = attr.split(',') if (!attrs.includes(mainAttr[p]) && (p === dmgIdx && !attrs.includes('dmg') && Format.isElem(mainAttr[p]))) { check = false return 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 } }