miao-plugin/models/avatar/AvatarBase.js

297 lines
7.6 KiB
JavaScript
Raw Normal View History

2023-02-08 20:55:54 +00:00
import lodash from 'lodash'
2023-10-18 17:01:11 +00:00
import Base from '../Base.js'
2023-02-08 20:55:54 +00:00
import moment from 'moment'
2023-10-18 17:01:11 +00:00
import { Character, Avatar, Weapon } from '#miao.models'
import { Data, Format } from '#miao'
2023-10-18 17:01:11 +00:00
import Attr from '../attr/Attr.js'
import Profile from '../player/Profile.js'
import Artis from '../artis/Artis.js'
2023-02-08 20:55:54 +00:00
const charKey = 'name,abbr,sName,star,imgs,face,side,gacha,weaponTypeName'.split(',')
2023-10-18 17:01:11 +00:00
export default class AvatarBase extends Base {
2023-05-20 17:14:07 +00:00
constructor (ds = {}, game = 'gs') {
2023-02-08 20:55:54 +00:00
super()
let char = Character.get({ id: ds.id, elem: ds.elem })
if (!char) {
2023-02-09 16:57:25 +00:00
return
2023-02-08 20:55:54 +00:00
}
this.id = char.id
this.char = char
2023-05-14 20:19:33 +00:00
this.game = char.game || game
2023-10-18 17:01:11 +00:00
this._mysArtis = new Artis(this.game)
2023-05-20 17:14:07 +00:00
this.setAvatar(ds)
2023-02-09 16:57:25 +00:00
}
2023-02-10 14:01:18 +00:00
get hasTalent () {
2023-02-10 13:53:57 +00:00
return this.talent && !lodash.isEmpty(this.talent) && !!this._talent
}
2023-02-10 14:01:18 +00:00
get name () {
2023-02-10 13:53:57 +00:00
return this.char?.name || ''
}
get hasData () {
return !!(this.level > 1 || this?.weapon?.name || this?.talent?.a)
}
2023-02-10 13:53:57 +00:00
// 是否是合法面板数据
2023-02-10 14:01:18 +00:00
get isProfile () {
2023-02-10 13:53:57 +00:00
return Profile.isProfile(this)
}
2023-02-10 14:01:18 +00:00
get costume () {
2023-02-10 13:53:57 +00:00
let costume = this._costume
if (lodash.isArray(costume)) {
costume = costume[0]
}
return costume
}
2023-02-10 14:01:18 +00:00
get originalTalent () {
2023-02-10 13:53:57 +00:00
return lodash.mapValues(this.talent, (ds) => ds.original)
2023-02-08 20:55:54 +00:00
}
2023-10-18 13:19:12 +00:00
// 已经到达当前等级的最大天赋
get isMaxTalent () {
let maxLv = [1, 2, 4, 6, 8, 10]?.[this.promote - 1] || 10
let minTalent = lodash.min(lodash.map(this.talent, (ds) => ds.original))
return minTalent >= maxLv
}
2023-10-18 17:01:11 +00:00
get artis () {
return this._mysArtis
}
get mysArtis () {
return this._mysArtis
}
2023-02-10 13:53:57 +00:00
/**
* 获取圣遗物套装属性
* @returns {boolean|*|{imgs: *[], names: *[], sets: {}, abbrs: *[], sName: string, name: (string|*)}|{}}
*/
2023-02-10 14:01:18 +00:00
get artisSet () {
2023-02-10 13:53:57 +00:00
return this.artis.getSetData()
}
2023-02-10 14:01:18 +00:00
get dataSource () {
2023-02-10 13:53:57 +00:00
return {
enka: 'Enka.Network',
miao: '喵喵Api',
mgg: 'MiniGG-Api',
hutao: 'Hutao-Enka',
mys: '米游社',
homo: 'Mihomo'
2023-02-10 13:53:57 +00:00
}[this._source] || this._source
}
2023-02-10 14:01:18 +00:00
get updateTime () {
2023-02-10 13:53:57 +00:00
let time = this._time
if (!time) {
return ''
}
if (lodash.isString(time)) {
return moment(time).format('MM-DD HH:mm')
}
if (lodash.isNumber(time)) {
return moment(new Date(time)).format('MM-DD HH:mm')
}
return ''
}
2023-05-20 17:14:07 +00:00
static create (ds, game = 'gs') {
2023-10-18 17:01:11 +00:00
let avatar = new AvatarBase(ds, game)
2023-02-08 20:55:54 +00:00
if (!avatar) {
return false
}
return avatar
}
2023-02-10 14:01:18 +00:00
_get (key) {
2023-02-08 20:55:54 +00:00
if (charKey.includes(key)) {
return this.char[key]
}
}
2023-02-10 14:01:18 +00:00
setAvatar (ds, source = '') {
2023-02-08 20:55:54 +00:00
this._now = new Date() * 1
this.setBasic(ds, source)
ds.weapon && this.setWeapon(ds.weapon)
2023-02-09 16:57:25 +00:00
ds.talent && this.setTalent(ds.talent, 'original', source)
2023-10-18 17:01:11 +00:00
this._mysArtis.setArtisData(ds.mysArtis || ds.artis)
2023-02-08 20:55:54 +00:00
delete this._now
}
/**
* 设置角色基础数据
* @param ds
* @param source
*/
2023-02-10 14:01:18 +00:00
setBasic (ds = {}, source = '') {
2023-02-08 20:55:54 +00:00
const now = this._now || (new Date()) * 1
this.level = ds.lv || ds.level || this.level || 1
this.cons = ds.cons || this.cons || 0
this.fetter = ds.fetter || this.fetter || 0
this._costume = ds.costume || this._costume || 0
this.elem = ds.elem || this.elem || this.char.elem || ''
2023-10-18 17:01:11 +00:00
this.promote = lodash.isUndefined(ds.promote) ? (this.promote || Attr.calcPromote(this.level)) : (ds.promote || 0)
this.trees = this.trees || []
2023-10-18 13:19:12 +00:00
this._source = ds._source || this._source || '' // 数据源
this._time = ds._time || this._time || now // 面板最后更新时间
this._update = ds._update || this._update || ds._time || now //最后更新时间包括mys
this._talent = ds._talent || this._talent || ds._time || now // 最后天赋更新时间包括mys
if (ds.trees) {
this.setTrees(ds.trees)
}
2023-02-08 20:55:54 +00:00
// 存在数据源时更新时间
if (source) {
this._update = now
if (source !== 'mys') {
this._source = source
this._time = now
} else {
this._source = this._source || source
this._time = this._source !== 'mys' ? (this._time || now) : now
}
}
}
2023-10-18 13:19:12 +00:00
// 星铁的行迹数据
setTrees (ds) {
this.trees = []
let prefix = ''
let map = {}
lodash.forEach(this.char?.detail?.tree || {}, (ds, key) => {
let ret = /(\d{4})(\d{3})/.exec(key)
if (ret && ret[1] && ret[2]) {
prefix = prefix || ret[1]
map[ret[2]] = key
}
})
if (prefix) {
for (let i = 0; i <= 3; i++) {
map[`10${i}`] = `${prefix}10${i}`
}
}
2023-10-14 13:17:27 +00:00
lodash.forEach(ds, (id) => {
let ret = /\d{4}(\d{3})/.exec(id)
this.trees.push(map[ret?.[1] || id] || id)
})
}
2023-10-18 13:19:12 +00:00
// 设置武器
2023-02-10 14:01:18 +00:00
setWeapon (ds = {}) {
let w = Weapon.get(ds.name || ds.id, this.game)
2023-02-10 13:53:57 +00:00
if (!w) {
return false
}
2023-02-08 20:55:54 +00:00
this.weapon = {
id: ds.id || w.id,
name: ds.name || w.name,
2023-02-08 20:55:54 +00:00
level: ds.level || ds.lv || 1,
2023-10-18 17:01:11 +00:00
promote: lodash.isUndefined(ds.promote) ? Attr.calcPromote(ds.level || ds.lv || 1) : (ds.promote || 0),
2023-02-08 20:55:54 +00:00
affix: ds.affix,
2023-02-10 13:53:57 +00:00
...w.getData('star,abbr,type,img')
2023-02-08 20:55:54 +00:00
}
if (this.weapon.level < 20) {
this.weapon.promote = 0
}
}
2023-10-18 13:19:12 +00:00
// 获取武器详情信息
getWeaponDetail () {
let ret = {
...this.weapon
}
if (!ret.id) {
return {}
}
let wData = Weapon.get(ret.id, this.game)
ret.splash = wData.imgs.gacha
2023-10-14 13:17:27 +00:00
let wAttr = wData.calcAttr(ret.level, ret.promote)
let attrs = {}
if (this.isSr) {
lodash.forEach(wAttr, (val, key) => {
attrs[key] = Format.comma(val, 1)
})
} else if (this.isGs) {
attrs.atkBase = Format.comma(wAttr.atkBase, 1)
if (wAttr?.attr?.key) {
let keyType = {
mastery: 'comma'
}
attrs[wAttr.attr.key] = Format[keyType[wAttr.attr.key] || 'pct'](wAttr.attr.value, 1)
}
}
ret.attrs = attrs
ret.desc = wData.getAffixDesc(ret.affix)
return ret
}
2023-10-18 13:19:12 +00:00
// 设置天赋
setTalent (ds = false, mode = 'original', updateTime = '') {
2023-02-08 20:55:54 +00:00
const now = this._now || (new Date()) * 1
if (ds) {
let ret = this.char.getAvatarTalent(ds, this.cons, mode)
if (ret) {
this.talent = ret || this.talent
// 设置天赋更新时间
this._talent = ds._talent || this._talent || ds._time || now
}
2023-02-10 14:01:18 +00:00
}
if (updateTime) {
2023-02-08 20:55:54 +00:00
this._talent = now
}
}
2023-10-18 17:01:11 +00:00
setArtis (ds) {
this.mysArtis.setArtisData(ds.mysArtis || ds.artis)
2023-02-08 20:55:54 +00:00
}
2023-02-10 14:01:18 +00:00
getProfile () {
2023-02-08 20:55:54 +00:00
if (!this.isProfile) {
return false
}
2023-10-18 17:01:11 +00:00
return Avatar.create(this, this.game)
2023-02-08 20:55:54 +00:00
}
// 判断当前profileData是否具备有效圣遗物信息
2023-02-10 14:01:18 +00:00
hasArtis () {
2023-02-09 16:57:25 +00:00
return this.isProfile && this.artis.length > 0
2023-02-08 20:55:54 +00:00
}
// toJSON 供保存使用
2023-02-10 14:01:18 +00:00
toJSON () {
let keys = this.isGs ?
'name,id,elem,level,promote,fetter,costume,cons,talent:originalTalent' :
'name,id,elem,level,promote,cons,talent:originalTalent,trees'
2023-02-08 20:55:54 +00:00
return {
...this.getData(keys),
weapon: Data.getData(this.weapon, this.isGs ? 'name,level,promote,affix' : 'id,level,promote,affix'),
2023-02-08 20:55:54 +00:00
...this.getData('artis,_source,_time,_update,_talent')
}
}
2023-02-10 14:01:18 +00:00
getDetail (keys = '') {
let imgs = this.char.getImgs(this.costume)
2023-05-14 20:19:33 +00:00
if (this.isGs) {
return {
...(this.getData(keys || 'id,name,level,star,cons,fetter,elem,abbr,weapon,talent,artisSet') || {}),
...Data.getData(imgs, 'face,qFace,side,gacha')
}
} else {
return {
...(this.getData(keys || 'id,name,level,star,cons,elem,abbr,weapon,talent,artisSet,trees') || {}),
2023-05-14 20:19:33 +00:00
...Data.getData(imgs, 'face,qFace,gacha,preview')
}
}
2023-02-08 20:55:54 +00:00
}
2023-02-10 14:01:18 +00:00
getArtisDetail () {
2023-02-09 16:57:25 +00:00
return this.artis.getDetail()
}
2023-02-08 20:55:54 +00:00
}