mirror of
https://github.com/yoimiya-kokomi/miao-plugin.git
synced 2024-11-23 08:00:57 +00:00
9206a8eab3
伤害计算暂未包含3.0新元素反应,后续统一补充 草元素圣遗物识别及评分逻辑补充
204 lines
4.9 KiB
JavaScript
204 lines
4.9 KiB
JavaScript
import lodash from 'lodash'
|
|
import enkaMeta from './enka-meta.js'
|
|
import charMeta from './enka-char.js'
|
|
import { Character, Artifact, ProfileData } from '../../models/index.js'
|
|
|
|
const artiIdx = {
|
|
EQUIP_BRACER: 1,
|
|
EQUIP_NECKLACE: 2,
|
|
EQUIP_SHOES: 3,
|
|
EQUIP_RING: 4,
|
|
EQUIP_DRESS: 5
|
|
}
|
|
|
|
const attrMap = {
|
|
HP: '小生命',
|
|
HP_PERCENT: '大生命',
|
|
ATTACK: '小攻击',
|
|
ATTACK_PERCENT: '大攻击',
|
|
DEFENSE: '小防御',
|
|
DEFENSE_PERCENT: '大防御',
|
|
FIRE_ADD_HURT: '火元素伤害加成',
|
|
ICE_ADD_HURT: '冰元素伤害加成',
|
|
ROCK_ADD_HURT: '岩元素伤害加成',
|
|
ELEC_ADD_HURT: '雷元素伤害加成',
|
|
WIND_ADD_HURT: '风元素伤害加成',
|
|
WATER_ADD_HURT: '水元素伤害加成',
|
|
PHYSICAL_ADD_HURT: '物理伤害加成',
|
|
GRASS_ADD_HURT: '草元素伤害加成',
|
|
HEAL_ADD: '治疗加成',
|
|
ELEMENT_MASTERY: '元素精通',
|
|
CRITICAL: '暴击率',
|
|
CRITICAL_HURT: '暴击伤害',
|
|
CHARGE_EFFICIENCY: '充能效率'
|
|
}
|
|
|
|
let EnkaData = {
|
|
getProfile (data) {
|
|
let char = Character.get(data.avatarId)
|
|
let profile = new ProfileData({ id: char.id })
|
|
profile.setBasic({
|
|
level: data.propMap['4001'].val * 1,
|
|
cons: data.talentIdList ? data.talentIdList.length : 0,
|
|
fetter: data.fetterInfo.expLevel,
|
|
dataSource: 'enka'
|
|
})
|
|
profile.setAttr(EnkaData.getAttr(data.fightPropMap))
|
|
profile.setWeapon(EnkaData.getWeapon(data.equipList))
|
|
profile.setArtis(EnkaData.getArtifact(data.equipList))
|
|
profile.setTalent(EnkaData.getTalent(char.id, data.skillLevelMap), 'original')
|
|
return EnkaData.dataFix(profile)
|
|
},
|
|
getAttr (data) {
|
|
let ret = {}
|
|
let attrKey = {
|
|
// atk: 2001,
|
|
atkBase: 4,
|
|
def: 2002,
|
|
defBase: 7,
|
|
hp: 2000,
|
|
hpBase: 1,
|
|
mastery: 28,
|
|
cpct: {
|
|
src: 20,
|
|
pct: true
|
|
},
|
|
cdmg: {
|
|
src: 22,
|
|
pct: true
|
|
},
|
|
heal: {
|
|
src: 26,
|
|
pct: true
|
|
},
|
|
recharge: {
|
|
src: 23,
|
|
pct: true
|
|
}
|
|
}
|
|
lodash.forEach(attrKey, (cfg, key) => {
|
|
if (!lodash.isObject(cfg)) {
|
|
cfg = { src: cfg }
|
|
}
|
|
let val = data[cfg.src] || 0
|
|
if (cfg.pct) {
|
|
val = val * 100
|
|
}
|
|
ret[key] = val
|
|
})
|
|
ret.atk = data['4'] * (1 + (data['6'] || 0)) + (data['5'] || 0)
|
|
let maxDmg = 0
|
|
// 火40 水42 风44 岩45 冰46 雷46
|
|
// 41 雷
|
|
lodash.forEach('40,41,42,43,44,45,45,46'.split(','), (key) => {
|
|
maxDmg = Math.max(data[key] * 1, maxDmg)
|
|
})
|
|
// phy 30
|
|
ret.dmg = maxDmg * 100
|
|
ret.phy = data['30'] * 100
|
|
|
|
return ret
|
|
},
|
|
|
|
getArtifact (data) {
|
|
let ret = {}
|
|
|
|
let get = function (d) {
|
|
if (!d) {
|
|
return []
|
|
}
|
|
let id = d.appendPropId || d.mainPropId || ''
|
|
id = id.replace('FIGHT_PROP_', '')
|
|
if (!attrMap[id]) {
|
|
return []
|
|
}
|
|
return [attrMap[id], d.statValue]
|
|
}
|
|
lodash.forEach(data, (ds) => {
|
|
let flat = ds.flat || {}
|
|
let sub = flat.reliquarySubstats || []
|
|
let idx = artiIdx[flat.equipType]
|
|
if (!idx) {
|
|
return
|
|
}
|
|
|
|
let setName = enkaMeta[flat.setNameTextMapHash] || ''
|
|
|
|
ret[`arti${idx}`] = {
|
|
name: Artifact.getArtiBySet(setName, idx),
|
|
set: setName,
|
|
level: Math.min(20, ((ds.reliquary && ds.reliquary.level) || 1) - 1),
|
|
main: get(flat.reliquaryMainstat),
|
|
attrs: [
|
|
get(sub[0]),
|
|
get(sub[1]),
|
|
get(sub[2]),
|
|
get(sub[3])
|
|
]
|
|
}
|
|
})
|
|
return ret
|
|
},
|
|
getWeapon (data) {
|
|
let ds = {}
|
|
lodash.forEach(data, (temp) => {
|
|
if (temp.flat && temp.flat.itemType === 'ITEM_WEAPON') {
|
|
ds = temp
|
|
return false
|
|
}
|
|
})
|
|
let { weapon, flat } = ds
|
|
return {
|
|
name: enkaMeta[flat.nameTextMapHash],
|
|
star: flat.rankLevel,
|
|
level: weapon.level,
|
|
promote: weapon.promoteLevel,
|
|
affix: (lodash.values(weapon.affixMap)[0] || 0) + 1
|
|
}
|
|
},
|
|
getTalent (charid, ds = {}) {
|
|
let cm = charMeta[charid] || {}
|
|
let cn = cm.Skills || {}
|
|
let ce = cm.ProudMap
|
|
let idx = 1
|
|
let idxMap = { 1: 'a', 2: 'e', 3: 'q', a: 'a', s: 'e', e: 'q' }
|
|
lodash.forEach(cn, (n, id) => {
|
|
let nRet = /skill_(\w)/.exec(n.toLowerCase())
|
|
idxMap[id] = nRet && nRet[1] ? idxMap[nRet[1]] : idxMap[idx]
|
|
idx++
|
|
})
|
|
lodash.forEach(ce, (n, id) => {
|
|
idxMap[n] = idxMap[id]
|
|
})
|
|
let ret = {}
|
|
lodash.forEach(ds, (lv, id) => {
|
|
let key = idxMap[id]
|
|
ret[key] = {
|
|
original: lv
|
|
}
|
|
})
|
|
return ret
|
|
},
|
|
dataFix (ret) {
|
|
if (ret._fix) {
|
|
return ret
|
|
}
|
|
let { attr, id } = ret
|
|
id = id * 1
|
|
switch (id) {
|
|
case 10000052:
|
|
// 雷神被动加成fix
|
|
attr.dmg = Math.max(0, attr.dmg - (attr.recharge - 100) * 0.4)
|
|
break
|
|
case 10000041:
|
|
// 莫娜被动fix
|
|
attr.dmg = Math.max(0, attr.dmg - attr.recharge * 0.2)
|
|
break
|
|
}
|
|
ret._fix = true
|
|
return ret
|
|
}
|
|
}
|
|
|
|
export default EnkaData
|