2022-06-03 09:13:12 +00:00
|
|
|
import lodash from "lodash";
|
|
|
|
import Character from "../models/Character.js";
|
2022-06-20 22:55:08 +00:00
|
|
|
import meta from "./enka-meta.js";
|
|
|
|
import cmeta from "./enka-char.js";
|
2022-06-03 09:13:12 +00:00
|
|
|
import _Data from "../Data.js";
|
2022-06-04 21:29:24 +00:00
|
|
|
import moment from "moment";
|
|
|
|
|
|
|
|
moment.locale("zh-cn");
|
2022-06-03 09:13:12 +00:00
|
|
|
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);
|
2022-06-04 21:29:24 +00:00
|
|
|
let now = moment();
|
2022-06-03 09:13:12 +00:00
|
|
|
let ret = {
|
|
|
|
id: data["avatarId"],
|
|
|
|
name: char ? char.name : "",
|
|
|
|
dataSource: "enka",
|
2022-06-04 21:29:24 +00:00
|
|
|
updateTime: now.format("YYYY-MM-DD HH:mm:ss"),
|
2022-06-03 09:13:12 +00:00
|
|
|
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)) {
|
2022-06-03 09:20:23 +00:00
|
|
|
cfg = { src: cfg };
|
2022-06-03 09:13:12 +00:00
|
|
|
}
|
|
|
|
let val = data[cfg.src] || 0;
|
|
|
|
if (cfg.pct) {
|
|
|
|
val = val * 100
|
|
|
|
}
|
|
|
|
ret[key] = val;
|
|
|
|
});
|
2022-06-03 19:00:23 +00:00
|
|
|
ret.atk = data['4'] * (1 + (data['6'] || 0)) + (data['5'] || 0);
|
2022-06-03 09:13:12 +00:00
|
|
|
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 || {}, sub = flat.reliquarySubstats || [];
|
|
|
|
let idx = artiIdx[flat.equipType];
|
|
|
|
if (!idx) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let setName = meta[flat.setNameTextMapHash] || "";
|
2022-06-03 09:20:23 +00:00
|
|
|
let setCfg = relisMap[setName] || { name: "", sets: {} },
|
|
|
|
artiCfg = setCfg.sets[`arti${idx}`] || { name: "" };
|
2022-06-03 09:13:12 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
})
|
2022-06-03 09:20:23 +00:00
|
|
|
let { weapon, flat } = ds;
|
2022-06-03 09:13:12 +00:00
|
|
|
return {
|
|
|
|
name: meta[flat.nameTextMapHash],
|
|
|
|
star: flat.rankLevel,
|
2022-06-04 21:29:24 +00:00
|
|
|
level: weapon.level,
|
2022-06-03 09:13:12 +00:00
|
|
|
promote: weapon.promoteLevel,
|
2022-06-03 09:20:23 +00:00
|
|
|
affix: (lodash.values(weapon.affixMap)[0] || 0) + 1
|
2022-06-03 09:13:12 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
getTalent(charid, ds = {}, ext = {}) {
|
|
|
|
let cm = cmeta[charid] || {};
|
|
|
|
let cn = cm.Skills || {}, ce = cm.ProudMap;
|
|
|
|
let idx = 1;
|
2022-06-03 09:20:23 +00:00
|
|
|
let idxMap = { 1: 'a', 2: 'e', 3: 'q', 'a': 'a', 's': 'e', 'e': 'q' };
|
2022-06-03 09:13:12 +00:00
|
|
|
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) {
|
2022-06-04 21:29:24 +00:00
|
|
|
if (ret._fix) {
|
|
|
|
return ret;
|
|
|
|
}
|
2022-06-03 09:20:23 +00:00
|
|
|
let { attr, id } = ret;
|
2022-06-03 09:13:12 +00:00
|
|
|
id = id * 1;
|
|
|
|
switch (id) {
|
|
|
|
case 10000052:
|
|
|
|
// 雷神被动加成fix
|
2022-06-05 07:53:13 +00:00
|
|
|
attr.dmgBonus = Math.max(0, attr.dmgBonus - (attr.recharge - 100) * 0.4)
|
2022-06-03 09:13:12 +00:00
|
|
|
break;
|
|
|
|
case 10000041:
|
|
|
|
// 莫娜被动fix
|
2022-06-05 07:53:13 +00:00
|
|
|
attr.dmgBonus = Math.max(0, attr.dmgBonus - attr.recharge * 0.2)
|
2022-06-03 09:13:12 +00:00
|
|
|
break;
|
2022-06-04 21:29:24 +00:00
|
|
|
/*
|
|
|
|
case 10000060:
|
|
|
|
// 夜兰被动fix
|
|
|
|
attr.hp = attr.hp - attr.hpBase * 0.3
|
|
|
|
break;
|
|
|
|
*/
|
|
|
|
|
2022-06-03 09:13:12 +00:00
|
|
|
}
|
2022-06-04 21:29:24 +00:00
|
|
|
ret._fix = true;
|
2022-06-03 09:13:12 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Data;
|