星铁面板初步支持展示武器数据

This commit is contained in:
Kokomi 2023-05-20 02:50:39 +08:00
parent 2a21366e1a
commit 1dddda52f7
46 changed files with 1477 additions and 192 deletions

View File

@ -1,3 +1,9 @@
# 2.4.0 Dev
* 尚未完成不推荐切换至Dev
* 初步支持星铁面板数据获取与展示
* 面板属性计算暂未包含武器及圣遗物Buff面板数据暂不准确
# 2.3.8 # 2.3.8
* 面板服务增加由**Snap Hutao**提供的Enka转发代理可通过`#喵喵设置面板服务4`进行选择 * 面板服务增加由**Snap Hutao**提供的Enka转发代理可通过`#喵喵设置面板服务4`进行选择

View File

@ -142,9 +142,15 @@ let ProfileDetail = {
lodash.forEach((game === 'gs' ? 'cpct,cdmg,recharge,dmg' : 'cpct,cdmg,recharge,dmg,effPct,stance').split(','), (key) => { lodash.forEach((game === 'gs' ? 'cpct,cdmg,recharge,dmg' : 'cpct,cdmg,recharge,dmg,effPct,stance').split(','), (key) => {
let fn = Format.pct let fn = Format.pct
let key2 = key let key2 = key
if (key === 'dmg' && a.phy > a.dmg) { if (key === 'dmg') {
if (game === 'gs') {
if (a.phy > a.dmg) {
key2 = 'phy' key2 = 'phy'
} }
} else {
key2 = Format.elem(char.elem, '', 'sr')
}
}
attr[key] = fn(a[key2]) attr[key] = fn(a[key2])
attr[`${key}Base`] = fn(base[key2]) attr[`${key}Base`] = fn(base[key2])
attr[`${key}Plus`] = fn(a[key2] - base[key2]) attr[`${key}Plus`] = fn(a[key2] - base[key2])
@ -170,11 +176,13 @@ let ProfileDetail = {
let artisDetail = profile.getArtisMark() let artisDetail = profile.getArtisMark()
let artisKeyTitle = ProfileArtis.getArtisKeyTitle(game) let artisKeyTitle = ProfileArtis.getArtisKeyTitle(game)
let data = profile.getData('name,abbr,cons,level,talent,dataSource,updateTime,imgs,costumeSplash')
data.weapon = profile.getWeaponDetail()
let renderData = { let renderData = {
save_id: uid, save_id: uid,
uid, uid,
game, game,
data: profile.getData('name,abbr,cons,level,weapon,talent,dataSource,updateTime,imgs,costumeSplash'), data,
attr, attr,
elem: char.elem, elem: char.elem,
dmgCalc, dmgCalc,

View File

@ -41,9 +41,9 @@ lodash.forEach(elemAliasSR, (txt, key) => {
const Elem = { const Elem = {
// 根据名称获取元素key // 根据名称获取元素key
elem (elem = '', defElem = '') { elem (elem = '', defElem = '', game = 'gs') {
elem = elem.toLowerCase() elem = elem.toLowerCase()
return elemMap[elem] || defElem return (game === 'gs' ? elemMap : elemMapSR)[elem] || defElem
}, },
// 根据key获取元素名 // 根据key获取元素名

View File

@ -4,11 +4,11 @@
* */ * */
export const miaoApi = { export const miaoApi = {
listApi: ({ url, uid, diyCfg }) => { listApi: ({ url, uid, diyCfg, game = 'gs' }) => {
let qq = /\d{5,12}/.test(diyCfg.qq) ? diyCfg.qq : 'none' let qq = /\d{5,12}/.test(diyCfg.qq) ? diyCfg.qq : 'none'
let token = diyCfg.token let token = diyCfg.token
url = url || 'http://miaoapi.cn/' url = url || 'http://miaoapi.cn/'
return `${url}profile/data?uid=${uid}&qq=${qq}&token=${token}&version=2` return `${url}profile/data?uid=${uid}&qq=${qq}&token=${token}&version=2&game=${game}`
} }
} }
@ -36,8 +36,8 @@ export const hutaoApi = {
} }
} }
export const luluApi = { export const homoApi = {
url: 'https://mhy.fuckmys.tk/sr_info', url: 'https://api.mihomo.me/sr_info',
listApi: ({ url, uid, diyCfg }) => { listApi: ({ url, uid, diyCfg }) => {
return `${url}/${uid}` return `${url}/${uid}`
} }

View File

@ -111,7 +111,6 @@ class Artifact extends Base {
} }
getAttrData (mainId, attrData, level = 1, star = 5, idx = 1) { getAttrData (mainId, attrData, level = 1, star = 5, idx = 1) {
let mainKey = metaDataSR.mainIdx[idx][mainId] let mainKey = metaDataSR.mainIdx[idx][mainId]
let starCfg = metaDataSR.starData[star] let starCfg = metaDataSR.starData[star]
let mainCfg = starCfg.main[mainKey] let mainCfg = starCfg.main[mainKey]
@ -125,11 +124,21 @@ class Artifact extends Base {
} }
let attrs = [] let attrs = []
lodash.forEach(attrData, (ds) => { lodash.forEach(attrData, (ds) => {
let _ds = ds
if (lodash.isString(ds)) {
console.log('str subids', ds)
let [id, count, step] = ds.split(',')
ds = { id, count, step }
}
let attrCfg = starCfg.sub[ds.id] let attrCfg = starCfg.sub[ds.id]
if (!attrCfg) {
console.log('not found attr', ds, _ds)
return true
}
attrs.push({ attrs.push({
...ds, ...ds,
key: attrCfg.key, key: attrCfg?.key,
value: attrCfg.base * ds.count + attrCfg.step * ds.step value: attrCfg?.base * ds.count + attrCfg.step * ds.step
}) })
}) })
return { return {

View File

@ -83,7 +83,7 @@ export default class AvatarArtis extends Base {
arti.main = attr.main || arti.main || {} arti.main = attr.main || arti.main || {}
arti.attrs = attr.attrs || arti.attrs || {} arti.attrs = attr.attrs || arti.attrs || {}
} else { } else {
console.log('attr id error', ds.main, arti.level, arti.star) console.log('attr id error', ds.main, ds.mainId, idx, arti.level, arti.star)
} }
} }
return return
@ -163,11 +163,11 @@ export default class AvatarArtis extends Base {
tmp.mainId = ds.main?.id tmp.mainId = ds.main?.id
tmp.attrs = [] tmp.attrs = []
lodash.forEach(ds.attrs, (as) => { lodash.forEach(ds.attrs, (as) => {
tmp.attrs.push({ tmp.attrs.push([
id: as?.id, as?.id || '',
count: as?.count, as?.count || 1,
step: as?.step as?.step || 0
}) ].join(','))
}) })
} else { } else {
tmp.name = ds.name || '' tmp.name = ds.name || ''

View File

@ -2,7 +2,7 @@ import lodash from 'lodash'
import Base from './Base.js' import Base from './Base.js'
import moment from 'moment' import moment from 'moment'
import { Character, AvatarArtis, ProfileData, Weapon } from './index.js' import { Character, AvatarArtis, ProfileData, Weapon } from './index.js'
import { Data } from '#miao' import { Data, Format } from '#miao'
import AttrCalc from './profile/AttrCalc.js' import AttrCalc from './profile/AttrCalc.js'
import Profile from './player/Profile.js' import Profile from './player/Profile.js'
@ -66,7 +66,7 @@ export default class AvatarData extends Base {
mgg: 'MiniGG-Api', mgg: 'MiniGG-Api',
hutao: 'Hutao-Enka', hutao: 'Hutao-Enka',
mys: '米游社', mys: '米游社',
lulu: '路路Api' homo: 'Mihomo'
}[this._source] || this._source }[this._source] || this._source
} }
@ -161,6 +161,24 @@ export default class AvatarData extends Base {
} }
} }
getWeaponDetail () {
if (this.isGs) {
return this.weapon
}
let ret = {
...this.weapon
}
let wData = Weapon.get(ret.id, this.game)
ret.splash = wData.imgs.gacha
let attrs = wData.calcAttr(ret.level, ret.promote)
lodash.forEach(attrs, (val, key) => {
attrs[key] = Format.comma(val, 1)
})
ret.attrs = attrs
ret.desc = wData.getAffixDesc(ret.affix)
return ret
}
setTalent (ds = false, mode = 'original', updateTime = '') { setTalent (ds = false, mode = 'original', updateTime = '') {
const now = this._now || (new Date()) * 1 const now = this._now || (new Date()) * 1
if (ds) { if (ds) {

View File

@ -23,7 +23,7 @@ export default class Player extends Base {
if (!uid) { if (!uid) {
return false return false
} }
let cacheObj = this._getCache(`player:${uid}`) let cacheObj = this._getCache(`player:${game}:${uid}`)
if (cacheObj) { if (cacheObj) {
return cacheObj return cacheObj
} }

View File

@ -1,5 +1,6 @@
import lodash from 'lodash' import lodash from 'lodash'
import Base from './Base.js' import Base from './Base.js'
import { Format } from '#miao'
const baseAttr = { const baseAttr = {
gs: 'atk,def,hp,mastery,recharge,cpct,cdmg,dmg,phy,heal,shield'.split(','), gs: 'atk,def,hp,mastery,recharge,cpct,cdmg,dmg,phy,heal,shield'.split(','),
@ -14,14 +15,14 @@ class ProfileAttr extends Base {
constructor (data = null, game = 'gs') { constructor (data = null, game = 'gs') {
super() super()
this.game = game this.game = game
this.init(data) this.init(data, this.game)
} }
static create (data = null, game = 'gs') { static create (data = null, game = 'gs') {
return new ProfileAttr(data, game) return new ProfileAttr(data, game)
} }
init (data) { init (data, game = 'gs') {
// 基础属性 // 基础属性
this._attr = {} this._attr = {}
this._base = {} this._base = {}
@ -35,6 +36,16 @@ class ProfileAttr extends Base {
} }
base[key] = 0 base[key] = 0
}) })
if (game === 'sr') {
Format.eachElem((key) => {
attr[key] = {
base: 0,
plus: 0,
pct: 0
}
base[key] = 0
}, game)
}
if (data) { if (data) {
this.setAttr(data, true) this.setAttr(data, true)
} }

View File

@ -2,20 +2,21 @@ import Base from './Base.js'
import fetch from 'node-fetch' import fetch from 'node-fetch'
export default class ProfileReq extends Base { export default class ProfileReq extends Base {
constructor (e) { constructor (e, game = 'gs') {
super() super()
this.e = e this.e = e
this.game = game
this.uid = e.uid this.uid = e.uid
} }
static create (e) { static create (e, game = 'gs') {
if (!e || !e.uid) { if (!e || !e.uid) {
return false return false
} }
if (e.uid * 1 < 100000005) { if (e.uid * 1 < 100000005) {
return false return false
} }
return new ProfileReq(e) return new ProfileReq(e, game)
} }
async setCd (seconds = 60) { async setCd (seconds = 60) {
@ -65,9 +66,10 @@ export default class ProfileReq extends Base {
async requestProfile (player, serv) { async requestProfile (player, serv) {
let self = this let self = this
console.log('self.game', self.game)
this.serv = serv this.serv = serv
let uid = this.uid let uid = this.uid
let reqParam = await serv.getReqParam(uid) let reqParam = await serv.getReqParam(uid, self.game)
let cdTime = await this.inCd() let cdTime = await this.inCd()
if (cdTime && !process.argv.includes('web-debug')) { if (cdTime && !process.argv.includes('web-debug')) {
// return this.err(`请求过快,请${cdTime}秒后重试..`) // return this.err(`请求过快,请${cdTime}秒后重试..`)
@ -107,7 +109,7 @@ export default class ProfileReq extends Base {
self._isReq = false self._isReq = false
data = {} data = {}
} }
data = await serv.response(data, this) data = await serv.response(data, this, self.game)
// 设置CD // 设置CD
cdTime = serv.getCdTime(data) cdTime = serv.getCdTime(data)
if (cdTime) { if (cdTime) {

View File

@ -31,14 +31,15 @@ export default class ProfileServ extends Base {
} }
// 请求当前面板服务 // 请求当前面板服务
async getReqParam (uid) { async getReqParam (uid, game = 'gs') {
let url = this.getCfg('url') let url = this.getCfg('url')
let profileApi = this.getCfg('listApi') let profileApi = this.getCfg('listApi')
let cfg = this._cfg let cfg = this._cfg
let api = profileApi({ let api = profileApi({
url, url,
uid: uid, uid: uid,
diyCfg: this.diyCfg diyCfg: this.diyCfg,
game
}) })
let param = {} let param = {}
@ -53,11 +54,11 @@ export default class ProfileServ extends Base {
} }
} }
async response (data, req) { async response (data, req, game = 'gs') {
// 处理返回 // 处理返回
let cfg = this._cfg let cfg = this._cfg
if (cfg.response) { if (cfg.response) {
return await cfg.response.call(this, data, req) return await cfg.response.call(this, data, req, game)
} }
} }

View File

@ -1,5 +1,5 @@
import Base from './Base.js' import Base from './Base.js'
import { Data } from '#miao' import { Data, Format } from '#miao'
import { weaponData, weaponAbbr, weaponAlias, weaponType, weaponSet } from '../resources/meta/weapon/index.js' import { weaponData, weaponAbbr, weaponAlias, weaponType, weaponSet } from '../resources/meta/weapon/index.js'
import { weaponData as weaponDataSR, weaponAlias as weaponAliasSR } from '../resources/meta-sr/weapon/index.js' import { weaponData as weaponDataSR, weaponAlias as weaponAliasSR } from '../resources/meta-sr/weapon/index.js'
@ -111,7 +111,6 @@ class Weapon extends Base {
const path = this.isGs ? 'resources/meta/weapon' : 'resources/meta-sr/weapon' const path = this.isGs ? 'resources/meta/weapon' : 'resources/meta-sr/weapon'
try { try {
this._detail = Data.readJSON(`${path}/${this.type}/${this.name}/data.json`, 'miao') this._detail = Data.readJSON(`${path}/${this.type}/${this.name}/data.json`, 'miao')
console.log(`${path}/${this.type}/${this.name}/data.json`)
} catch (e) { } catch (e) {
console.log(e) console.log(e)
} }
@ -186,6 +185,26 @@ class Weapon extends Base {
affixDetail: txt affixDetail: txt
} }
} }
getAffixDesc (affix = 1) {
let skill = this.detail.skill
let { name, desc, tables } = skill
let reg = /\$(\d)\[[i|f1]\](\%?)/g
let ret
while ((ret = reg.exec(desc)) !== null) {
let idx = ret[1]
let pct = ret[2]
let value = tables[idx - 1][affix - 1]
if (pct === '%') {
value = Format.percent(value)
}
desc = desc.replaceAll(ret[0], value)
}
return {
name: skill.name,
desc
}
}
} }
export default Weapon export default Weapon

View File

@ -1,12 +1,11 @@
import lodash from 'lodash' import lodash from 'lodash'
import EnkaData from './EnkaData.js'
import { Data } from '#miao' import { Data } from '#miao'
import { Character } from '#miao.models' import { Character } from '#miao.models'
export default { export default {
id: 'lulu', id: 'homo',
name: '路路Api', name: 'Mihomo',
cfgKey: 'luluApi', cfgKey: 'homoApi',
// 处理请求参数 // 处理请求参数
async request (api) { async request (api) {
let params = { let params = {
@ -41,7 +40,7 @@ export default {
try { try {
player.setBasicData(Data.getData(data, 'name:NickName,face:HeadIconID,level:Level,word:WorldLevel,sign:Signature')) player.setBasicData(Data.getData(data, 'name:NickName,face:HeadIconID,level:Level,word:WorldLevel,sign:Signature'))
lodash.forEach(data.avatars, (ds, id) => { lodash.forEach(data.avatars, (ds, id) => {
let ret = LuluData.setAvatar(player, ds) let ret = HomoData.setAvatar(player, ds)
if (ret) { if (ret) {
player._update.push(ds.AvatarID) player._update.push(ds.AvatarID)
} }
@ -57,7 +56,7 @@ export default {
} }
} }
const LuluData = { const HomoData = {
setAvatar (player, data) { setAvatar (player, data) {
let char = Character.get(data.AvatarID) let char = Character.get(data.AvatarID)
if (!char) { if (!char) {
@ -69,16 +68,15 @@ const LuluData = {
promote: data.Promotion, promote: data.Promotion,
cons: data.Rank || 0, cons: data.Rank || 0,
weapon: Data.getData(data.EquipmentID, 'id:ID,promote:Promotion,level:Level,affix:Rank'), weapon: Data.getData(data.EquipmentID, 'id:ID,promote:Promotion,level:Level,affix:Rank'),
...LuluData.getTalent(data.BehaviorList, char), ...HomoData.getTalent(data.BehaviorList, char),
artis: LuluData.getArtis(data.RelicList) artis: HomoData.getArtis(data.RelicList)
} }
avatar.setAvatar(setData, 'lulu') avatar.setAvatar(setData, 'homo')
return avatar return avatar
}, },
getTalent (ds, char) { getTalent (ds, char) {
let talent = {} let talent = {}
let trees = [] let trees = []
let talentId = char.talentId
lodash.forEach(ds, (d) => { lodash.forEach(ds, (d) => {
let key = char.getTalentKey(d.BehaviorID) let key = char.getTalentKey(d.BehaviorID)
if (key || d.Level > 1) { if (key || d.Level > 1) {
@ -102,15 +100,10 @@ const LuluData = {
if (!s.SubAffixID) { if (!s.SubAffixID) {
return true return true
} }
tmp.attrs.push({ tmp.attrs.push([s.SubAffixID, s.Cnt, s.Step || 0].join(','))
id: s.SubAffixID,
count: s.Cnt,
step: s.Step || 0
})
}) })
ret[ds.Type] = tmp ret[ds.Type] = tmp
}) })
console.log(lodash.keys(ret))
return ret return ret
} }
} }

View File

@ -10,10 +10,13 @@ export default {
api = this.getCfg('api') || api api = this.getCfg('api') || api
return { api } return { api }
}, },
async response (data, req) { async response (data, req, game = 'gs') {
if (data.status !== 0) { if (data.status !== 0) {
return req.err(data.msg || 'error', 60) return req.err(data.msg || 'error', 60)
} }
if (game === 'sr') {
return data.data
}
if (data.version === 2) { if (data.version === 2) {
data = data.data || {} data = data.data || {}
if (!data.avatars || data.avatars.length === 0) { if (!data.avatars || data.avatars.length === 0) {
@ -22,32 +25,18 @@ export default {
data.version = 2 data.version = 2
return data return data
} else { } else {
data = data.data || {}
if (!data.showAvatarInfoList || data.showAvatarInfoList.length === 0) {
return req.err('empty', 5 * 60) return req.err('empty', 5 * 60)
} }
return data
}
}, },
updatePlayer (player, data) { updatePlayer (player, data) {
if (data.version === 2) {
player.setBasicData(data) player.setBasicData(data)
lodash.forEach(data.avatars, (avatar) => { lodash.forEach(data.avatars, (avatar) => {
let ret = MiaoData.setAvatarNew(player, avatar) let ret = MiaoData.setAvatar(player, avatar)
if (ret) { if (ret) {
player._update.push(ret.id) player._update.push(ret.id)
} }
}) })
} else {
player.setBasicData(Data.getData(data, 'name:nickname,face:profilePicture.avatarId,card:nameCardID,level,word:worldLevel,sign:signature'))
lodash.forEach(data.showAvatarInfoList, (ds) => {
let ret = MiaoData.setAvatar(player, ds)
if (ret) {
player._update.push(ret.id)
}
})
}
}, },
// 获取冷却时间 // 获取冷却时间

View File

@ -7,44 +7,24 @@ let MiaoData = {
setAvatar (player, ds) { setAvatar (player, ds) {
let char = Character.get(ds.id) let char = Character.get(ds.id)
let avatar = player.getAvatar(ds.id, true) let avatar = player.getAvatar(ds.id, true)
let talentRet = MiaoData.getTalent(char.id, ds.skill)
avatar.setAvatar({
level: ds.level,
cons: ds.constellationNum || 0,
promote: ds.promoteLevel,
fetter: ds.fetterLevel,
costume: char.checkCostume(ds.costumeID) ? ds.costumeID : 0,
elem: talentRet.elem,
weapon: MiaoData.getWeapon(ds.weapon),
talent: talentRet.talent,
artis: MiaoData.getArtifact(ds.reliquary)
}, 'miao')
return avatar
},
setAvatarNew (player, ds) { if (player.isSr) {
let char = Character.get(ds.id) avatar.setAvatar({
let avatar = player.getAvatar(ds.id, true) ...ds,
let talentRet = MiaoData.getTalentNew(char.id, ds.talent) ...MiaoData.getTalentSR(char, ds.talent)
}, 'miao')
} else {
let talentRet = MiaoData.getTalent(char, ds.talent)
avatar.setAvatar({ avatar.setAvatar({
...ds, ...ds,
elem: talentRet.elem, elem: talentRet.elem,
talent: talentRet.talent talent: talentRet.talent
}, 'miao') }, 'miao')
}
return avatar return avatar
}, },
getWeapon (weapon) { getTalent (char, data = {}) {
return {
name: weapon.name,
level: weapon.level,
promote: weapon.promoteLevel,
affix: (weapon.affixLevel || 0) + 1
}
},
getTalentNew (charid, data = {}) {
let char = Character.get(charid)
let { talentId = {}, talentElem = {} } = char.meta let { talentId = {}, talentElem = {} } = char.meta
let elem = '' let elem = ''
let idx = 0 let idx = 0
@ -67,70 +47,18 @@ let MiaoData = {
} }
}, },
getTalent (charid, data = {}) { getTalentSR (char, data) {
let char = Character.get(charid) let talent = {}
let { talentId = {}, talentElem = {} } = char.meta let trees = []
let elem = '' lodash.forEach(data, (lv, id) => {
let idx = 0 let key = char.getTalentKey(id)
let ret = {} if (key || lv > 1) {
lodash.forEach(data, (ds) => { talent[key || id] = lv
let key
if (talentId[ds.id]) {
key = talentId[ds.id]
elem = elem || talentElem[ds.id]
ret[key] = {
level: ds.level
}
} else { } else {
key = ['a', 'e', 'q'][idx++] trees.push(id)
ret[key] = ret[key] || {
level: ds.level
}
} }
}) })
return { return { talent, trees }
talent: ret,
elem
}
},
getArtifact (data) {
let ret = {}
let get = function (d) {
if (!d) {
return []
}
let name = d.name
name = name.replace('FIGHT_PROP_', '')
if (!attrMap[name]) {
return []
}
let value = d.value
if (value && value < 1) {
value = value * 100
}
return { key: attrMap[name], value }
}
lodash.forEach(data, (ds) => {
let sub = ds.appendAffix || []
let idx = artisIdxMap[ds.type]
if (!idx) {
return
}
ret[idx] = {
name: ds.name,
level: ds.level,
star: ds.rank,
main: get(ds.mainAffix),
attrs: [
get(sub[0]),
get(sub[1]),
get(sub[2]),
get(sub[3])
]
}
})
return ret
} }
} }
export default MiaoData export default MiaoData

View File

@ -6,7 +6,7 @@ import enkaApi from './EnkaApi.js'
import miaoApi from './MiaoApi.js' import miaoApi from './MiaoApi.js'
import mggApi from './MggApi.js' import mggApi from './MggApi.js'
import hutaoApi from './HutaoApi.js' import hutaoApi from './HutaoApi.js'
import luluApi from './LuluApi.js' import homoApi from './HomoApi.js'
import lodash from 'lodash' import lodash from 'lodash'
@ -21,7 +21,7 @@ const Profile = {
mgg: mggApi, mgg: mggApi,
enka: enkaApi, enka: enkaApi,
hutao: hutaoApi, hutao: hutaoApi,
lulu: luluApi homo: homoApi
}[key]) }[key])
} }
return Profile.servs[key] return Profile.servs[key]
@ -34,9 +34,6 @@ const Profile = {
* @returns {ProfileServ} * @returns {ProfileServ}
*/ */
getServ (uid, game = 'gs') { getServ (uid, game = 'gs') {
if (game === 'sr') {
return Profile.serv('lulu')
}
let token = diyCfg?.miaoApi?.token let token = diyCfg?.miaoApi?.token
let qq = diyCfg?.miaoApi?.qq let qq = diyCfg?.miaoApi?.qq
let hasToken = !!(qq && token && token.length === 32 && !/^test/.test(token)) let hasToken = !!(qq && token && token.length === 32 && !/^test/.test(token))
@ -48,6 +45,14 @@ const Profile = {
let servCfg = Cfg.get('profileServer', '0').toString() || '0' let servCfg = Cfg.get('profileServer', '0').toString() || '0'
servCfg = servCfg[servIdx] || servCfg[0] || '0' servCfg = servCfg[servIdx] || servCfg[0] || '0'
if (game === 'sr') {
console.log(servCfg, hasToken)
if ((servCfg === '0' || servCfg === '1') && hasToken) {
return Profile.serv('miao')
}
return Profile.serv('homo')
}
if ((servCfg === '0' || servCfg === '1') && hasToken) { if ((servCfg === '0' || servCfg === '1') && hasToken) {
return Profile.serv('miao') return Profile.serv('miao')
} }
@ -72,18 +77,18 @@ const Profile = {
return false return false
} }
player._update = [] player._update = []
console.log('player game', player.game)
let { uid, e } = player let { uid, e } = player
if (uid.toString().length !== 9 || !e) { if (uid.toString().length !== 9 || !e) {
return false return false
} }
let req = ProfileReq.create(e) let req = ProfileReq.create(e, player.game)
if (!req) { if (!req) {
return false return false
} }
console.log('game', player.game)
let serv = Profile.getServ(uid, player.game) let serv = Profile.getServ(uid, player.game)
try { try {
await req.requestProfile(player, serv) await req.requestProfile(player, serv, player.game)
player._profile = new Date() * 1 player._profile = new Date() * 1
player.save() player.save()
return player._update.length return player._update.length
@ -101,7 +106,7 @@ const Profile = {
return true return true
} }
// 检查数据源 // 检查数据源
if (!avatar._source || !['enka', 'change', 'miao', 'mgg', 'hutao', 'lulu'].includes(avatar._source)) { if (!avatar._source || !['enka', 'change', 'miao', 'mgg', 'hutao', 'homo'].includes(avatar._source)) {
return false return false
} }

View File

@ -57,7 +57,6 @@ class AttrCalc {
* @returns {{}} * @returns {{}}
*/ */
calc () { calc () {
console.log('calc,hahahaha')
this.attr = ProfileAttr.create({}, this.game) this.attr = ProfileAttr.create({}, this.game)
if (this.isGs) { if (this.isGs) {
this.addAttr('recharge', 100, true) this.addAttr('recharge', 100, true)
@ -77,9 +76,6 @@ class AttrCalc {
addAttr (key, val, isBase = false) { addAttr (key, val, isBase = false) {
if (key === 'cpct') {
console.log('isCpct', val, isBase)
}
this.attr.addAttr(key, val, isBase) this.attr.addAttr(key, val, isBase)
} }
@ -88,7 +84,7 @@ class AttrCalc {
* @param affix * @param affix
*/ */
setCharAttr (affix = '') { setCharAttr (affix = '') {
let { char, level, promote } = this.profile let { char, level, promote, trees } = this.profile
let metaAttr = char.detail?.attr || {} let metaAttr = char.detail?.attr || {}
let self = this let self = this
if (this.isSr) { if (this.isSr) {
@ -98,6 +94,14 @@ class AttrCalc {
k = k + (['hp', 'atk', 'def'].includes(k) ? 'Base' : '') k = k + (['hp', 'atk', 'def'].includes(k) ? 'Base' : '')
self.addAttr(k, v, true) self.addAttr(k, v, true)
}) })
let tree = char.detail?.tree || {}
lodash.forEach(trees || [], (tid) => {
let tCfg = tree[tid]
if (tCfg) {
self.addAttr(tCfg.key, tCfg.value)
}
})
return return
} }
@ -231,7 +235,6 @@ class AttrCalc {
if (!key) { if (!key) {
return false return false
} }
console.log(key, ds.value)
if (['atk', 'hp', 'def'].includes(key)) { if (['atk', 'hp', 'def'].includes(key)) {
key = key + 'Pct' key = key + 'Pct'
} }

View File

@ -78,7 +78,7 @@
</div> </div>
<div class="copyright data-source"> <div class="copyright data-source">
数据源:{{ {miao:'喵喵API', 'enka':'Enka.Network', 'mgg':'MiniGG-API', mys:'米游社', 'hutao':'Hutao-Enka', 'lulu':'路路Api' 数据源:{{ {miao:'喵喵API', 'enka':'Enka.Network', 'mgg':'MiniGG-API', mys:'米游社', 'hutao':'Hutao-Enka', 'homo':'Mihomo'
}[data.source]||data.source }} {{data.updateTime}} }[data.source]||data.source }} {{data.updateTime}}
</div> </div>
{{else}} {{else}}

View File

@ -832,4 +832,102 @@ body {
.game-sr .artis-weapon { .game-sr .artis-weapon {
display: none; display: none;
} }
.sr-weapon {
margin: 0 15px 5px 10px;
border-radius: 10px;
background: url("../common/cont/card-bg.png") top left repeat-x;
background-size: auto 150%;
position: relative;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, 0.8);
overflow: hidden;
display: table;
color: #fff;
min-height: 120px;
width: calc(100% - 25px);
}
.sr-weapon .weapon-img {
display: table-cell;
width: 185px;
height: 100%;
min-height: 120px;
background-size: 100% auto;
background-position: 0 5%;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, 0.8);
}
.sr-weapon .weapon-info {
display: table-cell;
padding: 10px 10px 5px 15px;
}
.sr-weapon .weapon-title span {
font-size: 14px;
}
.sr-weapon .weapon-title strong {
color: #d3bc8e;
font-weight: normal;
}
.sr-weapon .weapon-attr {
font-size: 12px;
height: 25px;
line-height: 25px;
display: flex;
}
.sr-weapon .weapon-attr .attr {
padding-left: 22px;
padding-right: 7px;
margin-right: 10px;
position: relative;
line-height: 22px;
height: 22px;
font-size: 12px;
color: #ffe699;
display: inline-block;
border-radius: 4px;
background: rgba(0, 0, 0, 0.5);
text-align: center;
}
.sr-weapon .weapon-attr .attr span {
font-size: 12px;
display: none;
}
.sr-weapon .weapon-attr .attr:before {
content: "";
display: inline-block;
width: 22px;
height: 22px;
background-size: auto 100%;
background-position: top center;
vertical-align: middle;
position: absolute;
left: 0;
top: 0;
}
.sr-weapon .weapon-attr .i-hp:before {
background-image: url('../meta-sr/public/icons/attr-hp.webp');
}
.sr-weapon .weapon-attr .i-atk:before {
background-image: url('../meta-sr/public/icons/attr-atk.webp');
}
.sr-weapon .weapon-attr .i-def:before {
background-image: url('../meta-sr/public/icons/attr-def.webp');
}
.sr-weapon .weapon-desc {
margin-top: 7px;
font-size: 12px;
font-weight: normal;
color: #fff;
white-space: break-spaces;
text-shadow: 0 0 1px rgba(0, 0, 0, 0.7), 1px 1px 3px rgba(0, 0, 0, 0.4);
}
.sr-weapon .weapon-desc nobr {
color: #ffe699;
display: inline-block;
border-radius: 4px;
font-size: 12px;
height: 16px;
line-height: 16px;
background: rgba(0, 0, 0, 0.5);
text-align: center;
padding: 0 3px;
margin: 0 2px;
}
/*# sourceMappingURL=profile-detail.css.map */ /*# sourceMappingURL=profile-detail.css.map */

View File

@ -110,9 +110,35 @@
<!-- 【 武器+圣遗物列表】 --> <!-- 【 武器+圣遗物列表】 -->
<div> <div>
{{if game === 'sr'}}
<div class="cont">
<div class="cont-footer dmg-desc">
<strong>面板数据尚未完全计算全部Buff面板不准确</strong>
</div>
</div>
<div class="sr-weapon">
<div class="weapon-img" style="background-image:url({{_res_path}}{{weapon.splash}})"></div>
<div class="weapon-info">
<div class="weapon-title">
<strong>{{weapon.name}}</strong>
<span>Lv.{{weapon.level}}</span>
<span>叠影{{weapon.affix}}阶</span>
</div>
<div class="weapon-attr">
{{set a = weapon.attrs}}
<div class="attr i-hp"><span>生命</span>{{a.hp}}</div>
<div class="attr i-atk"><span>攻击</span>{{a.atk}}</div>
<div class="attr i-def"><span>防御</span>{{a.def}}</div>
</div>
<div class="weapon-desc">{{@weapon.desc?.desc}}</div>
</div>
</div>
{{/if}}
{{if mode === "profile"}} {{if mode === "profile"}}
{{set ad = artisDetail}} {{set ad = artisDetail}}
<div class="artis"> <div class="artis">
{{ if game === 'gs' }}
<div class="artis-weapon"> <div class="artis-weapon">
<div class="item weapon"> <div class="item weapon">
<div class="img" style="background-image:url({{_res_path}}{{weapon.img}})"></div> <div class="img" style="background-image:url({{_res_path}}{{weapon.img}})"></div>
@ -131,6 +157,7 @@
</div> </div>
</div> </div>
</div> </div>
{{/if}}
{{each ad.artis ds idx}} {{each ad.artis ds idx}}
<div class="item arti"> <div class="item arti">
{{if ds && ds.name && ds.main && ds.main.key && ds.main.key!="undefined"}} {{if ds && ds.name && ds.main && ds.main.key && ds.main.key!="undefined"}}

View File

@ -1047,3 +1047,121 @@ body {
display: none; display: none;
} }
} }
.sr-weapon {
margin: 0 15px 5px 10px;
border-radius: 10px;
background: url("../common/cont/card-bg.png") top left repeat-x;
background-size: auto 150%;
position: relative;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, .8);
overflow: hidden;
display: table;
color: #fff;
min-height: 120px;
width: calc(100% - 25px);
.weapon-img {
display: table-cell;
width: 185px;
height: 100%;
min-height: 120px;
background-size: 100% auto;
background-position: 0 5%;
box-shadow: 0 0 1px 0 #ccc, 2px 2px 4px 0 rgba(50, 50, 50, .8);
}
.weapon-info {
display: table-cell;
padding: 10px 10px 5px 15px;
}
.weapon-title {
span {
font-size: 14px;
}
strong {
color: #d3bc8e;
font-weight: normal;
}
}
.weapon-attr {
font-size: 12px;
height: 25px;
line-height: 25px;
display: flex;
.attr {
padding-left: 22px;
padding-right: 7px;
margin-right: 10px;
position: relative;
line-height: 22px;
height: 22px;
font-size: 12px;
color: #ffe699;
display: inline-block;
border-radius: 4px;
background: rgba(0, 0, 0, 0.5);
text-align: center;
span {
font-size: 12px;
display: none;
}
&:before {
content: "";
display: inline-block;
width: 22px;
height: 22px;
background-size: auto 100%;
background-position: top center;
vertical-align: middle;
position: absolute;
left: 0;
top: 0;
}
}
.i-hp:before {
background-image: url('../meta-sr/public/icons/attr-hp.webp')
}
.i-atk:before {
background-image: url('../meta-sr/public/icons/attr-atk.webp')
}
.i-def:before {
background-image: url('../meta-sr/public/icons/attr-def.webp')
}
}
.weapon-desc {
margin-top: 7px;
font-size: 12px;
font-weight: normal;
color: #fff;
white-space: break-spaces;
text-shadow: 0 0 1px rgba(0, 0, 0, 0.7), 1px 1px 3px rgba(0, 0, 0, 0.4);
nobr {
color: #ffe699;
display: inline-block;
border-radius: 4px;
font-size: 12px;
height: 16px;
line-height: 16px;
background: rgba(0, 0, 0, 0.5);
text-align: center;
padding: 0 3px;
margin: 0 2px;
}
}
}

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1001201": {
"key": "ice",
"value": 3.1999999890103936
},
"1001202": {
"key": "def",
"value": 5.000000004656613
},
"1001203": {
"key": "ice",
"value": 3.1999999890103936
},
"1001204": {
"key": "effDef",
"value": 4.00000000372529
},
"1001205": {
"key": "ice",
"value": 4.799999948590994
},
"1001206": {
"key": "effDef",
"value": 6.0000000055879354
},
"1001207": {
"key": "def",
"value": 7.499999972060323
},
"1001208": {
"key": "ice",
"value": 4.799999948590994
},
"1001209": {
"key": "ice",
"value": 6.399999978020787
},
"1001210": {
"key": "def",
"value": 10.000000009313226
}
},
"treeData": {
"877640": { "877640": {
"id": 877640, "id": 877640,
"type": "skill", "type": "skill",

View File

@ -377,6 +377,48 @@
} }
}, },
"tree": { "tree": {
"1002201": {
"key": "wind",
"value": 3.1999999890103936
},
"1002202": {
"key": "atk",
"value": 4.00000000372529
},
"1002203": {
"key": "wind",
"value": 3.1999999890103936
},
"1002204": {
"key": "def",
"value": 5.000000004656613
},
"1002205": {
"key": "wind",
"value": 4.799999948590994
},
"1002206": {
"key": "atk",
"value": 6.0000000055879354
},
"1002207": {
"key": "wind",
"value": 4.799999948590994
},
"1002208": {
"key": "def",
"value": 7.499999972060323
},
"1002209": {
"key": "atk",
"value": 8.00000000745058
},
"1002210": {
"key": "wind",
"value": 6.399999978020787
}
},
"treeData": {
"124180": { "124180": {
"id": 124180, "id": 124180,
"type": "buff", "type": "buff",

View File

@ -377,6 +377,48 @@
} }
}, },
"tree": { "tree": {
"1106201": {
"key": "ice",
"value": 3.1999999890103936
},
"1106202": {
"key": "atk",
"value": 4.00000000372529
},
"1106203": {
"key": "ice",
"value": 3.1999999890103936
},
"1106204": {
"key": "effPct",
"value": 4.00000000372529
},
"1106205": {
"key": "ice",
"value": 4.799999948590994
},
"1106206": {
"key": "atk",
"value": 6.0000000055879354
},
"1106207": {
"key": "ice",
"value": 4.799999948590994
},
"1106208": {
"key": "effPct",
"value": 6.0000000055879354
},
"1106209": {
"key": "atk",
"value": 8.00000000745058
},
"1106210": {
"key": "ice",
"value": 6.399999978020787
}
},
"treeData": {
"660958": { "660958": {
"id": 660958, "id": 660958,
"type": "skill", "type": "skill",

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1202201": {
"key": "atk",
"value": 4.00000000372529
},
"1202202": {
"key": "def",
"value": 5.000000004656613
},
"1202203": {
"key": "atk",
"value": 4.00000000372529
},
"1202204": {
"key": "elec",
"value": 3.1999999890103936
},
"1202205": {
"key": "atk",
"value": 6.0000000055879354
},
"1202206": {
"key": "def",
"value": 7.499999972060323
},
"1202207": {
"key": "atk",
"value": 6.0000000055879354
},
"1202208": {
"key": "elec",
"value": 4.799999948590994
},
"1202209": {
"key": "def",
"value": 10.000000009313226
},
"1202210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"264650": { "264650": {
"id": 264650, "id": 264650,
"type": "buff", "type": "buff",

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1107201": {
"key": "atk",
"value": 4.00000000372529
},
"1107202": {
"key": "phy",
"value": 3.1999999890103936
},
"1107203": {
"key": "atk",
"value": 4.00000000372529
},
"1107204": {
"key": "hp",
"value": 4.00000000372529
},
"1107205": {
"key": "atk",
"value": 6.0000000055879354
},
"1107206": {
"key": "phy",
"value": 4.799999948590994
},
"1107207": {
"key": "atk",
"value": 6.0000000055879354
},
"1107208": {
"key": "hp",
"value": 6.0000000055879354
},
"1107209": {
"key": "phy",
"value": 6.399999978020787
},
"1107210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"864032": { "864032": {
"id": 864032, "id": 864032,
"type": "buff", "type": "buff",

View File

@ -458,6 +458,48 @@
} }
}, },
"tree": { "tree": {
"1005201": {
"key": "atk",
"value": 4.00000000372529
},
"1005202": {
"key": "stance",
"value": 5.299999983981252
},
"1005203": {
"key": "atk",
"value": 4.00000000372529
},
"1005204": {
"key": "hp",
"value": 4.00000000372529
},
"1005205": {
"key": "atk",
"value": 6.0000000055879354
},
"1005206": {
"key": "stance",
"value": 8.00000000745058
},
"1005207": {
"key": "atk",
"value": 6.0000000055879354
},
"1005208": {
"key": "hp",
"value": 6.0000000055879354
},
"1005209": {
"key": "stance",
"value": 10.699999961070716
},
"1005210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"227636": { "227636": {
"id": 227636, "id": 227636,
"type": "skill", "type": "skill",

View File

@ -377,13 +377,55 @@
} }
}, },
"tree": { "tree": {
"1003201": {
"key": "fire",
"value": 3.1999999890103936
},
"1003202": {
"key": "atk",
"value": 4.00000000372529
},
"1003203": {
"key": "fire",
"value": 3.1999999890103936
},
"1003204": {
"key": "effDef",
"value": 4.00000000372529
},
"1003205": {
"key": "fire",
"value": 4.799999948590994
},
"1003206": {
"key": "atk",
"value": 6.0000000055879354
},
"1003207": {
"key": "fire",
"value": 4.799999948590994
},
"1003208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1003209": {
"key": "atk",
"value": 8.00000000745058
},
"1003210": {
"key": "fire",
"value": 6.399999978020787
}
},
"treeData": {
"202642": { "202642": {
"id": 202642, "id": 202642,
"type": "skill", "type": "skill",
"root": true, "root": true,
"name": "星火", "name": "星火",
"levelReq": 0, "levelReq": 0,
"desc": "施放攻击后,有<nobr>50.0%</nobr>的基础概率使敌方目标陷入灼烧状态,持续<nobr>2</nobr>回合。<br />灼烧状态下,敌方目标每回合开始时受到等同于姬子<nobr>30.0%</nobr>攻击力的<span style=\"color:#F84F36;\">火</span>属性持续伤害。", "desc": "施放攻击后,有<nobr>50.0%</nobr>的基础概率使敌方目标陷入灼烧状态,持续<nobr>2</nobr>回合。<br />灼烧状态下,敌方目标每回合开始时受到等同于姬子<nobr>30.0%</nobr>攻击力的<span>火</span>属性持续伤害。",
"cost": { "cost": {
"29328": 5000, "29328": 5000,
"635675": 3, "635675": 3,

View File

@ -440,6 +440,48 @@
} }
}, },
"tree": { "tree": {
"1105201": {
"key": "hp",
"value": 4.00000000372529
},
"1105202": {
"key": "effDef",
"value": 4.00000000372529
},
"1105203": {
"key": "hp",
"value": 4.00000000372529
},
"1105204": {
"key": "def",
"value": 5.000000004656613
},
"1105205": {
"key": "hp",
"value": 6.0000000055879354
},
"1105206": {
"key": "effDef",
"value": 6.0000000055879354
},
"1105207": {
"key": "hp",
"value": 6.0000000055879354
},
"1105208": {
"key": "def",
"value": 7.499999972060323
},
"1105209": {
"key": "effDef",
"value": 8.00000000745058
},
"1105210": {
"key": "hp",
"value": 8.00000000745058
}
},
"treeData": {
"506326": { "506326": {
"id": 506326, "id": 506326,
"type": "buff", "type": "buff",

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1101201": {
"key": "wind",
"value": 3.1999999890103936
},
"1101202": {
"key": "cdmg",
"value": 5.299999983981252
},
"1101203": {
"key": "wind",
"value": 3.1999999890103936
},
"1101204": {
"key": "effDef",
"value": 4.00000000372529
},
"1101205": {
"key": "wind",
"value": 4.799999948590994
},
"1101206": {
"key": "cdmg",
"value": 8.00000000745058
},
"1101207": {
"key": "wind",
"value": 4.799999948590994
},
"1101208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1101209": {
"key": "cdmg",
"value": 10.699999961070716
},
"1101210": {
"key": "wind",
"value": 6.399999978020787
}
},
"treeData": {
"189034": { "189034": {
"id": 189034, "id": 189034,
"type": "buff", "type": "buff",

View File

@ -356,6 +356,48 @@
} }
}, },
"tree": { "tree": {
"1102201": {
"key": "atk",
"value": 4.00000000372529
},
"1102202": {
"key": "cdmg",
"value": 5.299999983981252
},
"1102203": {
"key": "atk",
"value": 4.00000000372529
},
"1102204": {
"key": "def",
"value": 5.000000004656613
},
"1102205": {
"key": "atk",
"value": 6.0000000055879354
},
"1102206": {
"key": "cdmg",
"value": 8.00000000745058
},
"1102207": {
"key": "atk",
"value": 6.0000000055879354
},
"1102208": {
"key": "def",
"value": 7.499999972060323
},
"1102209": {
"key": "cdmg",
"value": 10.699999961070716
},
"1102210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"310962": { "310962": {
"id": 310962, "id": 310962,
"type": "skill", "type": "skill",
@ -397,7 +439,7 @@
"root": true, "root": true,
"name": "割裂", "name": "割裂",
"levelReq": 0, "levelReq": 0,
"desc": "增幅状态下希儿的<span style=\"color:#7788ff;\">量子</span>抗性穿透提高<nobr>20.0%</nobr>。", "desc": "增幅状态下希儿的<span>量子</span>抗性穿透提高<nobr>20.0%</nobr>。",
"cost": { "cost": {
"29328": 20000, "29328": 20000,
"125435": 1, "125435": 1,

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1103201": {
"key": "cpct",
"value": 2.699999953620136
},
"1103202": {
"key": "effPct",
"value": 4.00000000372529
},
"1103203": {
"key": "cpct",
"value": 2.699999953620136
},
"1103204": {
"key": "effDef",
"value": 4.00000000372529
},
"1103205": {
"key": "cpct",
"value": 4.00000000372529
},
"1103206": {
"key": "effPct",
"value": 6.0000000055879354
},
"1103207": {
"key": "cpct",
"value": 4.00000000372529
},
"1103208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1103209": {
"key": "effPct",
"value": 8.00000000745058
},
"1103210": {
"key": "cpct",
"value": 5.299999983981252
}
},
"treeData": {
"514036": { "514036": {
"id": 514036, "id": 514036,
"type": "buff", "type": "buff",

View File

@ -461,6 +461,48 @@
} }
}, },
"tree": { "tree": {
"1209201": {
"key": "atk",
"value": 4.00000000372529
},
"1209202": {
"key": "ice",
"value": 3.1999999890103936
},
"1209203": {
"key": "atk",
"value": 4.00000000372529
},
"1209204": {
"key": "hp",
"value": 4.00000000372529
},
"1209205": {
"key": "atk",
"value": 6.0000000055879354
},
"1209206": {
"key": "ice",
"value": 4.799999948590994
},
"1209207": {
"key": "atk",
"value": 6.0000000055879354
},
"1209208": {
"key": "hp",
"value": 6.0000000055879354
},
"1209209": {
"key": "ice",
"value": 6.399999978020787
},
"1209210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"84865": { "84865": {
"id": 84865, "id": 84865,
"type": "buff", "type": "buff",
@ -482,7 +524,7 @@
"root": true, "root": true,
"name": "颁冰", "name": "颁冰",
"levelReq": 0, "levelReq": 0,
"desc": "施放攻击后,对携带<span style=\"color:#47C7FD;\">冰</span>属性弱点的敌方目标造成等同于彦卿<nobr>30.0%</nobr>攻击力的<span style=\"color:#47C7FD;\">冰</span>属性附加伤害。", "desc": "施放攻击后,对携带<span>冰</span>属性弱点的敌方目标造成等同于彦卿<nobr>30.0%</nobr>攻击力的<span>冰</span>属性附加伤害。",
"cost": { "cost": {
"29328": 5000, "29328": 5000,
"270195": 1, "270195": 1,

View File

@ -356,6 +356,48 @@
} }
}, },
"tree": { "tree": {
"1204201": {
"key": "atk",
"value": 4.00000000372529
},
"1204202": {
"key": "cpct",
"value": 2.699999953620136
},
"1204203": {
"key": "atk",
"value": 4.00000000372529
},
"1204204": {
"key": "def",
"value": 5.000000004656613
},
"1204205": {
"key": "atk",
"value": 6.0000000055879354
},
"1204206": {
"key": "cpct",
"value": 4.00000000372529
},
"1204207": {
"key": "atk",
"value": 6.0000000055879354
},
"1204208": {
"key": "def",
"value": 7.499999972060323
},
"1204209": {
"key": "cpct",
"value": 5.299999983981252
},
"1204210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"56195": { "56195": {
"id": 56195, "id": 56195,
"type": "skill", "type": "skill",

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1104201": {
"key": "ice",
"value": 3.1999999890103936
},
"1104202": {
"key": "effDef",
"value": 4.00000000372529
},
"1104203": {
"key": "ice",
"value": 3.1999999890103936
},
"1104204": {
"key": "def",
"value": 5.000000004656613
},
"1104205": {
"key": "ice",
"value": 4.799999948590994
},
"1104206": {
"key": "effDef",
"value": 6.0000000055879354
},
"1104207": {
"key": "ice",
"value": 4.799999948590994
},
"1104208": {
"key": "def",
"value": 7.499999972060323
},
"1104209": {
"key": "effDef",
"value": 8.00000000745058
},
"1104210": {
"key": "ice",
"value": 6.399999978020787
}
},
"treeData": {
"303252": { "303252": {
"id": 303252, "id": 303252,
"type": "skill", "type": "skill",

View File

@ -377,13 +377,55 @@
} }
}, },
"tree": { "tree": {
"1108201": {
"key": "atk",
"value": 4.00000000372529
},
"1108202": {
"key": "effPct",
"value": 4.00000000372529
},
"1108203": {
"key": "atk",
"value": 4.00000000372529
},
"1108204": {
"key": "effDef",
"value": 4.00000000372529
},
"1108205": {
"key": "atk",
"value": 6.0000000055879354
},
"1108206": {
"key": "effPct",
"value": 6.0000000055879354
},
"1108207": {
"key": "atk",
"value": 6.0000000055879354
},
"1108208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1108209": {
"key": "effPct",
"value": 8.00000000745058
},
"1108210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"285968": { "285968": {
"id": 285968, "id": 285968,
"type": "skill", "type": "skill",
"root": true, "root": true,
"name": "圈套", "name": "圈套",
"levelReq": 0, "levelReq": 0,
"desc": "天赋使敌方陷入<span style=\"color:#00FF9C;\">风</span>化状态的持续时间延长<nobr>1</nobr>回合。", "desc": "天赋使敌方陷入<span>风</span>化状态的持续时间延长<nobr>1</nobr>回合。",
"cost": { "cost": {
"29328": 4000, "29328": 4000,
"270195": 1, "270195": 1,
@ -400,7 +442,7 @@
"root": true, "root": true,
"name": "加料", "name": "加料",
"levelReq": 0, "levelReq": 0,
"desc": "<span style=\"color:#00FF9C;\">风</span>化状态下的敌方目标对桑博造成的伤害降低<nobr>15.0%</nobr>。", "desc": "<span>风</span>化状态下的敌方目标对桑博造成的伤害降低<nobr>15.0%</nobr>。",
"cost": { "cost": {
"29328": 128000, "29328": 128000,
"125435": 1, "125435": 1,

View File

@ -398,6 +398,48 @@
} }
}, },
"tree": { "tree": {
"1004201": {
"key": "atk",
"value": 4.00000000372529
},
"1004202": {
"key": "imaginary",
"value": 3.1999999890103936
},
"1004203": {
"key": "atk",
"value": 4.00000000372529
},
"1004204": {
"key": "effDef",
"value": 4.00000000372529
},
"1004205": {
"key": "atk",
"value": 6.0000000055879354
},
"1004206": {
"key": "imaginary",
"value": 4.799999948590994
},
"1004207": {
"key": "atk",
"value": 6.0000000055879354
},
"1004208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1004209": {
"key": "imaginary",
"value": 6.399999978020787
},
"1004210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"149174": { "149174": {
"id": 149174, "id": 149174,
"type": "buff", "type": "buff",

View File

@ -461,6 +461,48 @@
} }
}, },
"tree": { "tree": {
"1211201": {
"key": "hp",
"value": 4.00000000372529
},
"1211202": {
"key": "def",
"value": 5.000000004656613
},
"1211203": {
"key": "hp",
"value": 4.00000000372529
},
"1211204": {
"key": "effDef",
"value": 4.00000000372529
},
"1211205": {
"key": "hp",
"value": 6.0000000055879354
},
"1211206": {
"key": "def",
"value": 7.499999972060323
},
"1211207": {
"key": "hp",
"value": 6.0000000055879354
},
"1211208": {
"key": "effDef",
"value": 6.0000000055879354
},
"1211209": {
"key": "def",
"value": 10.000000009313226
},
"1211210": {
"key": "hp",
"value": 8.00000000745058
}
},
"treeData": {
"671251": { "671251": {
"id": 671251, "id": 671251,
"type": "skill", "type": "skill",

View File

@ -376,6 +376,48 @@
} }
}, },
"tree": { "tree": {
"1206201": {
"key": "atk",
"value": 4.00000000372529
},
"1206202": {
"key": "hp",
"value": 4.00000000372529
},
"1206203": {
"key": "atk",
"value": 4.00000000372529
},
"1206204": {
"key": "def",
"value": 5.000000004656613
},
"1206205": {
"key": "atk",
"value": 6.0000000055879354
},
"1206206": {
"key": "hp",
"value": 6.0000000055879354
},
"1206207": {
"key": "atk",
"value": 6.0000000055879354
},
"1206208": {
"key": "def",
"value": 7.499999972060323
},
"1206209": {
"key": "hp",
"value": 8.00000000745058
},
"1206210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"614646": { "614646": {
"id": 614646, "id": 614646,
"type": "buff", "type": "buff",

View File

@ -395,6 +395,48 @@
} }
}, },
"tree": { "tree": {
"1203201": {
"key": "atk",
"value": 4.00000000372529
},
"1203202": {
"key": "hp",
"value": 4.00000000372529
},
"1203203": {
"key": "atk",
"value": 4.00000000372529
},
"1203204": {
"key": "def",
"value": 5.000000004656613
},
"1203205": {
"key": "atk",
"value": 6.0000000055879354
},
"1203206": {
"key": "hp",
"value": 6.0000000055879354
},
"1203207": {
"key": "atk",
"value": 6.0000000055879354
},
"1203208": {
"key": "def",
"value": 7.499999972060323
},
"1203209": {
"key": "hp",
"value": 8.00000000745058
},
"1203210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"343112": { "343112": {
"id": 343112, "id": 343112,
"type": "skill", "type": "skill",

View File

@ -356,13 +356,55 @@
} }
}, },
"tree": { "tree": {
"1009201": {
"key": "fire",
"value": 3.1999999890103936
},
"1009202": {
"key": "def",
"value": 5.000000004656613
},
"1009203": {
"key": "fire",
"value": 3.1999999890103936
},
"1009204": {
"key": "cpct",
"value": 2.699999953620136
},
"1009205": {
"key": "fire",
"value": 4.799999948590994
},
"1009206": {
"key": "def",
"value": 7.499999972060323
},
"1009207": {
"key": "fire",
"value": 4.799999948590994
},
"1009208": {
"key": "cpct",
"value": 4.00000000372529
},
"1009209": {
"key": "def",
"value": 10.000000009313226
},
"1009210": {
"key": "fire",
"value": 6.399999978020787
}
},
"treeData": {
"177648": { "177648": {
"id": 177648, "id": 177648,
"type": "skill", "type": "skill",
"root": true, "root": true,
"name": "火花", "name": "火花",
"levelReq": 0, "levelReq": 0,
"desc": "施放普攻时,有<nobr>80.0%</nobr>的基础概率使敌方目标陷入灼烧状态,持续<nobr>3</nobr>回合。<br />灼烧状态下,敌方目标每回合开始时受到等同于艾丝妲普攻<nobr>50.0%</nobr>的<span style=\"color:#F84F36;\">火</span>属性持续伤害。", "desc": "施放普攻时,有<nobr>80.0%</nobr>的基础概率使敌方目标陷入灼烧状态,持续<nobr>3</nobr>回合。<br />灼烧状态下,敌方目标每回合开始时受到等同于艾丝妲普攻<nobr>50.0%</nobr>的<span>火</span>属性持续伤害。",
"cost": { "cost": {
"29328": 4000, "29328": 4000,
"635670": 2, "635670": 2,
@ -397,7 +439,7 @@
"root": true, "root": true,
"name": "点燃", "name": "点燃",
"levelReq": 0, "levelReq": 0,
"desc": "艾丝妲在场时,我方全体的<span style=\"color:#F84F36;\">火</span>属性伤害提高<nobr>18.0%</nobr>。", "desc": "艾丝妲在场时,我方全体的<span>火</span>属性伤害提高<nobr>18.0%</nobr>。",
"cost": { "cost": {
"29328": 16000, "29328": 16000,
"125435": 1, "125435": 1,

View File

@ -450,6 +450,48 @@
} }
}, },
"tree": { "tree": {
"1109201": {
"key": "atk",
"value": 4.00000000372529
},
"1109202": {
"key": "hp",
"value": 4.00000000372529
},
"1109203": {
"key": "atk",
"value": 4.00000000372529
},
"1109204": {
"key": "cdmg",
"value": 5.299999983981252
},
"1109205": {
"key": "atk",
"value": 6.0000000055879354
},
"1109206": {
"key": "hp",
"value": 6.0000000055879354
},
"1109207": {
"key": "atk",
"value": 6.0000000055879354
},
"1109208": {
"key": "cdmg",
"value": 8.00000000745058
},
"1109209": {
"key": "hp",
"value": 8.00000000745058
},
"1109210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"489042": { "489042": {
"id": 489042, "id": 489042,
"type": "buff", "type": "buff",

View File

@ -500,6 +500,48 @@
} }
}, },
"tree": { "tree": {
"1006201": {
"key": "atk",
"value": 4.00000000372529
},
"1006202": {
"key": "effPct",
"value": 4.00000000372529
},
"1006203": {
"key": "atk",
"value": 4.00000000372529
},
"1006204": {
"key": "quantum",
"value": 3.1999999890103936
},
"1006205": {
"key": "atk",
"value": 6.0000000055879354
},
"1006206": {
"key": "effPct",
"value": 6.0000000055879354
},
"1006207": {
"key": "atk",
"value": 6.0000000055879354
},
"1006208": {
"key": "quantum",
"value": 4.799999948590994
},
"1006209": {
"key": "effPct",
"value": 8.00000000745058
},
"1006210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"474176": { "474176": {
"id": 474176, "id": 474176,
"type": "buff", "type": "buff",

View File

@ -377,6 +377,48 @@
} }
}, },
"tree": { "tree": {
"1008201": {
"key": "atk",
"value": 4.00000000372529
},
"1008202": {
"key": "effDef",
"value": 4.00000000372529
},
"1008203": {
"key": "atk",
"value": 4.00000000372529
},
"1008204": {
"key": "hp",
"value": 4.00000000372529
},
"1008205": {
"key": "atk",
"value": 6.0000000055879354
},
"1008206": {
"key": "effDef",
"value": 6.0000000055879354
},
"1008207": {
"key": "atk",
"value": 6.0000000055879354
},
"1008208": {
"key": "hp",
"value": 6.0000000055879354
},
"1008209": {
"key": "effDef",
"value": 8.00000000745058
},
"1008210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"99186": { "99186": {
"id": 99186, "id": 99186,
"type": "buff", "type": "buff",

View File

@ -396,6 +396,48 @@
} }
}, },
"tree": { "tree": {
"1201201": {
"key": "atk",
"value": 4.00000000372529
},
"1201202": {
"key": "quantum",
"value": 3.1999999890103936
},
"1201203": {
"key": "atk",
"value": 4.00000000372529
},
"1201204": {
"key": "def",
"value": 5.000000004656613
},
"1201205": {
"key": "atk",
"value": 6.0000000055879354
},
"1201206": {
"key": "quantum",
"value": 4.799999948590994
},
"1201207": {
"key": "atk",
"value": 6.0000000055879354
},
"1201208": {
"key": "def",
"value": 7.499999972060323
},
"1201209": {
"key": "quantum",
"value": 6.399999978020787
},
"1201210": {
"key": "atk",
"value": 8.00000000745058
}
},
"treeData": {
"668114": { "668114": {
"id": 668114, "id": 668114,
"type": "skill", "type": "skill",

View File

@ -356,6 +356,48 @@
} }
}, },
"tree": { "tree": {
"1013201": {
"key": "ice",
"value": 3.1999999890103936
},
"1013202": {
"key": "def",
"value": 5.000000004656613
},
"1013203": {
"key": "ice",
"value": 3.1999999890103936
},
"1013204": {
"key": "cpct",
"value": 2.699999953620136
},
"1013205": {
"key": "ice",
"value": 4.799999948590994
},
"1013206": {
"key": "def",
"value": 7.499999972060323
},
"1013207": {
"key": "ice",
"value": 4.799999948590994
},
"1013208": {
"key": "cpct",
"value": 4.00000000372529
},
"1013209": {
"key": "def",
"value": 10.000000009313226
},
"1013210": {
"key": "ice",
"value": 6.399999978020787
}
},
"treeData": {
"205779": { "205779": {
"id": 205779, "id": 205779,
"type": "skill", "type": "skill",