import lodash from 'lodash' import Character from '../models/Character.js' import meta from './enka-meta.js' import cmeta from './enka-char.js' import _Data from '../Data.js' import moment from 'moment' moment.locale('zh-cn') let _path = process.cwd() let relis = _Data.readJSON(`${_path}/plugins/miao-plugin/resources/meta/reliquaries/`, 'data.json') || {} let relisMap = {} lodash.forEach(relis, (ds) => { relisMap[ds.name] = ds }) 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: '物理伤害加成', HEAL_ADD: '治疗加成', ELEMENT_MASTERY: '元素精通', CRITICAL: '暴击率', CRITICAL_HURT: '暴击伤害', CHARGE_EFFICIENCY: '充能效率' } let Data = { getData (uid, data) { let ret = { uid, chars: {} } lodash.forEach({ name: 'nickname', avatar: 'profilePicture.avatarId', lv: 'level' }, (src, key) => { ret[key] = lodash.get(data.playerInfo, src, '') }) lodash.forEach(data.avatarInfoList, (ds) => { let char = Data.getAvatar(ds) ret.chars[char.id] = char }) return ret }, getAvatar (data) { let char = Character.get(data.avatarId) let now = moment() let ret = { id: data.avatarId, name: char ? char.name : '', dataSource: 'enka', updateTime: now.format('YYYY-MM-DD HH:mm:ss'), lv: data.propMap['4001'].val * 1, fetter: data.fetterInfo.expLevel, attr: Data.getAttr(data.fightPropMap), weapon: Data.getWeapon(data.equipList), artis: Data.getArtifact(data.equipList), cons: data.talentIdList ? data.talentIdList.length : 0, talent: Data.getTalent(char.id, data.skillLevelMap, data.proudSkillExtraLevelMap || {}) } return Data.dataFix(ret) }, getAttr (data) { let ret = {} let attrKey = { // atk: 2001, atkBase: 4, def: 2002, defBase: 7, hp: 2000, hpBase: 1, mastery: 28, cRate: { src: 20, pct: true }, cDmg: { src: 22, pct: true }, hInc: { 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.dmgBonus = maxDmg * 100 ret.phyBonus = 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 = meta[flat.setNameTextMapHash] || '' let setCfg = relisMap[setName] || { name: '', sets: {} } let artiCfg = setCfg.sets[`arti${idx}`] || { name: '' } ret[`arti${idx}`] = { name: artiCfg.name, set: setCfg.name, 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: meta[flat.nameTextMapHash], star: flat.rankLevel, level: weapon.level, promote: weapon.promoteLevel, affix: (lodash.values(weapon.affixMap)[0] || 0) + 1 } }, getTalent (charid, ds = {}, ext = {}) { let cm = cmeta[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] = { level_original: lv, level_current: lv } }) lodash.forEach(ext, (lv, id) => { let key = idxMap[id] if (ret[key]) { ret[key].level_current = ret[key].level_current + lv } }) return ret }, dataFix (ret) { if (ret._fix) { return ret } let { attr, id } = ret id = id * 1 switch (id) { case 10000052: // 雷神被动加成fix attr.dmgBonus = Math.max(0, attr.dmgBonus - (attr.recharge - 100) * 0.4) break case 10000041: // 莫娜被动fix attr.dmgBonus = Math.max(0, attr.dmgBonus - attr.recharge * 0.2) break /* case 10000060: // 夜兰被动fix attr.hp = attr.hp - attr.hpBase * 0.3 break; */ } ret._fix = true return ret } } export default Data