From bc04f1dcd064be99a8c3e8a53bfb8c6cb90647a2 Mon Sep 17 00:00:00 2001 From: a376148946 <376148946@qq.com> Date: Fri, 26 Jul 2024 13:48:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E6=B7=BB=E5=8A=A0[=E8=89=BE?= =?UTF-8?q?=E8=8E=B2]=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/panel.js | 10 ++ model/damage/avatar.js | 117 +++++++++++++++++++++++ model/damage/base.js | 93 ++++++++++++++++++ model/damage/relice.js | 38 ++++++++ model/damage/role.js | 143 ++++++++++++++++++++++++++++ model/damage/weapon.js | 26 +++++ resources/map/Avatarid2Element.json | 25 +++++ resources/map/Property2Name.json | 21 ++++ resources/map/SkillData.json | 25 +++++ resources/map/weapon_effect.json | 20 ++++ resources/panel/card.css | 12 +++ resources/panel/card.html | 23 +++++ resources/panel/card.scss | 12 +++ 13 files changed, 565 insertions(+) create mode 100644 model/damage/avatar.js create mode 100644 model/damage/base.js create mode 100644 model/damage/relice.js create mode 100644 model/damage/role.js create mode 100644 model/damage/weapon.js create mode 100644 resources/map/Avatarid2Element.json create mode 100644 resources/map/Property2Name.json create mode 100644 resources/map/SkillData.json create mode 100644 resources/map/weapon_effect.json diff --git a/apps/panel.js b/apps/panel.js index 7e0c480..2e0d9c6 100644 --- a/apps/panel.js +++ b/apps/panel.js @@ -2,8 +2,11 @@ import { ZZZPlugin } from '../lib/plugin.js'; import render from '../lib/render.js'; import { rulePrefix } from '../lib/common.js'; import { getPanelList, refreshPanel, getPanel } from '../lib/avatar.js'; +import { getDamage } from '../model/damage/base.js'; import settings from '../lib/settings.js'; import _ from 'lodash'; +import { getMapData } from '../utils/file.js'; +const skilldict = getMapData('SkillData'); export class Panel extends ZZZPlugin { constructor() { @@ -89,6 +92,12 @@ export class Panel extends ZZZPlugin { await this.reply(`未找到角色${name}的面板信息,请先刷新面板`); return; } + let damagelist = []; + if (skilldict[data.id]){ + damagelist = await getDamage(data); + }else{ + damagelist = 0 + } const timer = setTimeout(() => { if (this?.reply) { this.reply('查询成功,正在下载图片资源,请稍候。'); @@ -99,6 +108,7 @@ export class Panel extends ZZZPlugin { const finalData = { uid: uid, charData: data, + damagelist: damagelist, }; await render(this.e, 'panel/card.html', finalData); } diff --git a/model/damage/avatar.js b/model/damage/avatar.js new file mode 100644 index 0000000..6738491 --- /dev/null +++ b/model/damage/avatar.js @@ -0,0 +1,117 @@ +import { getMapData } from '../../utils/file.js'; +import { calculate_damage } from './role.js'; +const skilldict = getMapData('SkillData'); + +export const get_let_value = async (let_list, name) => { + if (let_list[name]) { + return let_list[name] + } + return 0 +} + +export const Avatar = async (data, base_detail, bonus_detail) => { + let damagelist = [] + if (data.id == 1191){ + /** 处理命座加成 */ + if (data.rank >= 1){ + let CriticalChanceBase = await get_let_value(bonus_detail, 'CriticalChanceBase'); + bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.12; + } + if (data.rank >= 2){ + let EUP_DmgAdd = await get_let_value(bonus_detail, 'EUP_DmgAdd'); + bonus_detail['EUP_DmgAdd'] = EUP_DmgAdd + 0.6; + } + if (data.rank >= 6){ + let PenRatio = await get_let_value(bonus_detail, 'PenRatioBase'); + bonus_detail['PenRatioBase'] = PenRatio + 0.2; + + let C_DmgAdd = await get_let_value(bonus_detail, 'C_DmgAdd'); + bonus_detail['C_DmgAdd'] = C_DmgAdd + 2.5; + } + + /** 处理天赋加成 */ + /** 获取天赋等级与加成倍率 */ + let CDB = await getskilllevelnum(data.id, data.skills, 'T', 'T') + let C_CriticalDamageBase = await get_let_value(bonus_detail, 'C_CriticalDamageBase'); + bonus_detail['C_CriticalDamageBase'] = C_CriticalDamageBase + CDB; + let A_CriticalDamageBase = await get_let_value(bonus_detail, 'A_CriticalDamageBase'); + bonus_detail['A_CriticalDamageBase'] = A_CriticalDamageBase + CDB; + + let IceDmgAdd = await get_let_value(bonus_detail, 'Ice_DmgAdd'); + bonus_detail['Ice_DmgAdd'] = IceDmgAdd + 0.3; + + /** 计算伤害 */ + /** 计算普攻伤害 */ + let skill_multiplier1 = await getskilllevelnum(data.id, data.skills, 'A', 'A') + let damagelist1 = await calculate_damage(base_detail, bonus_detail, "A", "A", "Ice", skill_multiplier1, data.level) + let damage1 = { + title: '普通攻击:急冻修剪法', + value: damagelist1 + } + damagelist.push(damage1) + + /** 计算冲刺伤害 */ + let skill_multiplier2 = await getskilllevelnum(data.id, data.skills, 'C', 'C') + let damagelist2 = await calculate_damage(base_detail, bonus_detail, "C", "C", "Ice", skill_multiplier2, data.level) + let damage2 = { + title: '冲刺攻击:冰渊潜袭', + value: damagelist2 + } + damagelist.push(damage2) + + /** 计算特殊技伤害 */ + let skill_multiplier3 = await getskilllevelnum(data.id, data.skills, 'E', 'EH') + let damagelist3 = await calculate_damage(base_detail, bonus_detail, "E", "EH", "Ice", skill_multiplier3, data.level) + let damage3 = { + title: '强化特殊技:横扫', + value: damagelist3 + } + damagelist.push(damage3) + + let skill_multiplier4 = await getskilllevelnum(data.id, data.skills, 'E', 'ES') + let damagelist4 = await calculate_damage(base_detail, bonus_detail, "E", "ES", "Ice", skill_multiplier4, data.level) + let damage4 = { + title: '强化特殊技:鲨卷风', + value: damagelist4 + } + damagelist.push(damage4) + + /** 计算连携技伤害 */ + let skill_multiplier5 = await getskilllevelnum(data.id, data.skills, 'R', 'RL') + let damagelist5 = await calculate_damage(base_detail, bonus_detail, "RL", "RL", "Ice", skill_multiplier5, data.level) + let damage5 = { + title: '连携技:雪崩', + value: damagelist5 + } + damagelist.push(damage5) + + /** 计算终结技伤害 */ + let skill_multiplier6 = await getskilllevelnum(data.id, data.skills, 'R', 'R') + let damagelist6 = await calculate_damage(base_detail, bonus_detail, "R", "R", "Ice", skill_multiplier6, data.level) + let damage6 = { + title: '连携技:雪崩', + value: damagelist6 + } + damagelist.push(damage6) + + logger.debug('伤害', damagelist); + } + return damagelist; +}; + +export const avatar_ability = async (data, base_detail, bonus_detail) => { + const damagelist = await Avatar(data, base_detail, bonus_detail); + return damagelist; +} + +export const getskilllevelnum = async (avatarId, skills, skilltype, skillname) => { + let skill_typeid = 0 + if (skilltype == 'A') skill_typeid = 0; + else if(skilltype == 'C') skill_typeid = 2; + else if(skilltype == 'E') skill_typeid = 1; + else if(skilltype == 'R') skill_typeid = 3; + else if(skilltype == 'L') skill_typeid = 6; + else if(skilltype == 'T') skill_typeid = 5; + let skilllevel = Number(skills.find(property => property.skill_type === skill_typeid)?.level || 1) - 1; + return skilldict[avatarId][skillname][skilllevel]; +} diff --git a/model/damage/base.js b/model/damage/base.js new file mode 100644 index 0000000..80638ba --- /dev/null +++ b/model/damage/base.js @@ -0,0 +1,93 @@ +import { getMapData } from '../../utils/file.js'; +import { relice_ability } from './relice.js'; +import { weapon_ability } from './weapon.js'; +import { avatar_ability } from './avatar.js'; +const propertyData = getMapData('Property2Name'); +const elementData = getMapData('Avatarid2Element'); + +/** + * 获取某个角色的伤害 + * @param {ZZZAvatarInfo} data + * @returns {Promise} + logger.debug(xxx) + */ +export const getDamage = async (data) => { + /** 处理基础数据 */ + const retuan_detail = await get_base_info(data.properties,data.equip); + let base_detail = retuan_detail['base_detail']; + let bonus_detail = retuan_detail['bonus_detail']; + let set_detail = retuan_detail['set_detail']; + + /** 处理驱动盘套装加成 */ + let set_detailkeys = Object.keys(set_detail) + for (const set_id of set_detailkeys){ + let set_num = Number(set_detail[set_id]) + if (set_num >= 2)( + bonus_detail = await relice_ability(set_id, set_num, base_detail, bonus_detail) + ) + } + logger.debug('bonus_detail', bonus_detail); + + /** 处理音频加成 */ + bonus_detail = await weapon_ability(data.weapon, base_detail, bonus_detail) + logger.debug('bonus_detail', bonus_detail); + + /** 处理角色加成 */ + let damagelist = await avatar_ability(data, base_detail, bonus_detail) + return damagelist +}; + +/** + * 获取某个角色面包数据 + * @param {ZZZAvatarInfo} properties_l + * @param {ZZZAvatarInfo} equip + * @returns base_detail + */ +export const get_base_info = async (properties_l, equip) => { + let retuan_detail = {} + let base_detail = {} + base_detail['hp'] = Number(properties_l.find(property => property.property_name === '生命值').final); + base_detail['attack'] = Number(properties_l.find(property => property.property_name === '攻击力').final); + base_detail['defence'] = Number(properties_l.find(property => property.property_name === '防御力').final); + base_detail['ImpactRatio'] = Number(properties_l.find(property => property.property_name === '冲击力').final); + base_detail['CriticalChanceBase'] = Number(properties_l.find(property => property.property_name === '暴击率').final.replace('%', ''))/100; + base_detail['CriticalDamageBase'] = Number(properties_l.find(property => property.property_name === '暴击伤害').final.replace('%', ''))/100; + base_detail['ElementAbnormalPower'] = Number(properties_l.find(property => property.property_name === '异常掌控').final); + base_detail['ElementMystery'] = Number(properties_l.find(property => property.property_name === '异常精通').final); + base_detail['PenRatioBase'] = Number(properties_l.find(property => property.property_name === '穿透率').final.replace('%', ''))/100; + base_detail['SpGetRatio'] = Number(properties_l.find(property => property.property_name === '能量自动回复').final); + logger.debug('base_detail', base_detail); + retuan_detail['base_detail'] = base_detail + + /** 计算伤害加成与穿透值 + * 穿透值23203 + * 伤害加成31503-31703 + */ + let bonus_detail = {} + /** 计算套装数量 */ + let set_detail = {} + for (let equip_detail of equip){ + bonus_detail['PenDelta'] = await get_let_value(bonus_detail, 'PenDelta') + Number(equip_detail.properties.find(property => property.property_id === 23203)?.base || 0); + if (equip_detail.equipment_type == 5){ + let propname = propertyData[String(equip_detail.main_properties[0].property_id)][1]; + if (propname.includes('属性伤害提高')) { + let propenname = propertyData[String(equip_detail.main_properties[0].property_id)][0]; + bonus_detail[propenname] = await get_let_value(bonus_detail, propenname) + Number(equip_detail.main_properties[0].base.replace('%', ''))/100; + } + } + let suit_id = String(equip_detail.equip_suit.suit_id) + set_detail[suit_id] = await get_let_value(set_detail, suit_id) + 1 + } + logger.debug('bonus_detail', bonus_detail); + retuan_detail['bonus_detail'] = bonus_detail + logger.debug('set_detail', set_detail); + retuan_detail['set_detail'] = set_detail + return retuan_detail; +} + +export const get_let_value = async (let_list, name) => { + if (let_list[name]) { + return let_list[name] + } + return 0 +} \ No newline at end of file diff --git a/model/damage/relice.js b/model/damage/relice.js new file mode 100644 index 0000000..219863f --- /dev/null +++ b/model/damage/relice.js @@ -0,0 +1,38 @@ +export const get_let_value = async (let_list, name) => { + if (let_list[name]) { + return let_list[name] + } + return 0 +} + +export const Relic = async (set_id, set_num, base_detail, bonus_detail) => { + if (set_id == '31100'){ + if (set_num >= 4){ + let R_DmgAdd = await get_let_value(bonus_detail, 'R_DmgAdd'); + bonus_detail['R_DmgAdd'] = R_DmgAdd + 0.2; + let AttackAddedRatio = await get_let_value(bonus_detail, 'AttackAddedRatio'); + bonus_detail['AttackAddedRatio'] = AttackAddedRatio + 0.15; + logger.debug('relicGetter,4,R_DmgAdd'); + } + }else if(set_id == '32500'){ + if (set_num >= 2){ + let IceDmgAdd = await get_let_value(bonus_detail, 'Ice_DmgAdd'); + bonus_detail['Ice_DmgAdd'] = IceDmgAdd + 0.1; + logger.debug('32500,2,Ice_DmgAdd'); + } + if (set_num >= 4){ + let A_DmgAdd = await get_let_value(bonus_detail, 'A_DmgAdd'); + bonus_detail['A_DmgAdd'] = A_DmgAdd + 0.4; + let C_DmgAdd = await get_let_value(bonus_detail, 'C_DmgAdd'); + bonus_detail['C_DmgAdd'] = C_DmgAdd + 0.4; + logger.debug('32500,4,A_DmgAdd'); + logger.debug('32500,4,C_DmgAdd'); + } + } + return bonus_detail; +} + +export const relice_ability = async (set_id, set_num, base_detail, bonus_detail) => { + bonus_detail = await Relic(set_id, set_num, base_detail, bonus_detail); + return bonus_detail; +} diff --git a/model/damage/role.js b/model/damage/role.js new file mode 100644 index 0000000..bf5807a --- /dev/null +++ b/model/damage/role.js @@ -0,0 +1,143 @@ +export const get_let_value = async (let_list, name) => { + if (let_list[name]) { + return let_list[name] + } + return 0 +} + +export const calculate_damage = async (base_detail, bonus_detail, skill_type, add_skill_type, avatar_element, skill_multiplier, level) => { + let merged_attr = await merge_attribute(base_detail, bonus_detail) + logger.debug('merged_attr', merged_attr); + + let attack = merged_attr.attack + logger.debug('攻击区', attack); + + let defence_multiplier = await get_defence_multiplier(merged_attr, level); + logger.debug('防御区', defence_multiplier); + + let injury_area = await get_injury_area(merged_attr, skill_type, add_skill_type, avatar_element); + logger.debug('增伤区', injury_area); + + let damage_ratio = await get_damage_ratio(merged_attr, skill_type, add_skill_type, avatar_element); + logger.debug('易伤区', damage_ratio); + + let critical_damage_base = await get_critical_damage_base(merged_attr, skill_type, add_skill_type, avatar_element); + logger.debug('爆伤区', critical_damage_base); + + let critical_chance_base = await get_critical_chance_base(merged_attr, skill_type, add_skill_type, avatar_element); + logger.debug('暴击区', critical_chance_base); + + let qiwang_damage = critical_chance_base * critical_damage_base + logger.debug('暴击期望', qiwang_damage); + + let damagelist = {} + let damage_cd = attack * skill_multiplier * defence_multiplier * injury_area * damage_ratio * critical_damage_base * 1.2 * 1.5 + let damage_qw = attack * skill_multiplier * defence_multiplier * injury_area * damage_ratio * qiwang_damage * 1.2 * 1.5 + damagelist['cd'] = damage_cd + damagelist['qw'] = damage_qw + return damagelist +}; + +export const get_critical_chance_base = async (merged_attr, skill_type, add_skill_type, avatar_element) => { + let critical_chance_base = await get_let_value(merged_attr, 'CriticalChanceBase') + let merged_attrkey = Object.keys(merged_attr) + for (const attr of merged_attrkey){ + if (attr.search('_CriticalChanceBase') != -1) { + let attr_name = attr.split('_CriticalChanceBase')[0] + if ([skill_type, add_skill_type, 'All', avatar_element].includes(attr_name)) { + logger.debug(attr + '对' + attr_name + '有' + merged_attr[attr] + '暴击加成') + critical_chance_base = critical_chance_base + merged_attr[attr] + } + } + } + critical_chance_base = Math.min(1, critical_chance_base) + return critical_chance_base +} + +export const get_critical_damage_base = async (merged_attr, skill_type, add_skill_type, avatar_element) => { + let critical_damage_base = await get_let_value(merged_attr, 'CriticalDamageBase') + let merged_attrkey = Object.keys(merged_attr) + for (const attr of merged_attrkey){ + if (attr.search('_CriticalDamageBase') != -1) { + let attr_name = attr.split('_CriticalDamageBase')[0] + if ([skill_type, add_skill_type, 'All', avatar_element].includes(attr_name)) { + logger.debug(attr + '对' + attr_name + '有' + merged_attr[attr] + '爆伤加成') + critical_damage_base = critical_damage_base + merged_attr[attr] + } + } + } + return critical_damage_base + 1 +} + +export const get_damage_ratio = async (merged_attr, skill_type, add_skill_type, avatar_element) => { + let damage_ratio = await get_let_value(merged_attr, 'DmgRatio') + let merged_attrkey = Object.keys(merged_attr) + for (const attr of merged_attrkey){ + if (attr.search('_DmgRatio') != -1) { + let attr_name = attr.split('_DmgRatio')[0] + if ([skill_type, add_skill_type, 'All', avatar_element].includes(attr_name)) { + logger.debug(attr + '对' + attr_name + '有' + merged_attr[attr] + '易伤加成') + damage_ratio = damage_ratio + merged_attr[attr] + } + } + } + return damage_ratio + 1 +} + +export const get_injury_area = async (merged_attr, skill_type, add_skill_type, avatar_element) => { + let injury_area = 1.0 + let merged_attrkey = Object.keys(merged_attr) + for (const attr of merged_attrkey){ + if (attr.search('_DmgAdd') != -1) { + let attr_name = attr.split('_DmgAdd')[0] + if ([skill_type, add_skill_type, 'All', avatar_element].includes(attr_name)) { + logger.debug(attr + '对' + attr_name + '有' + merged_attr[attr] + '增伤') + injury_area = injury_area + merged_attr[attr] + } + } + } + return injury_area +} + +export const get_defence_multiplier = async (merged_attr, level) => { + /** 计算防御基础值 */ + let defadd = (0.155 * (level * level)) + (3.12 * level) + 46.95 + /** 计算降防 */ + let ignore_defence = 1.0 + if (merged_attr.ignore_defence) { + ignore_defence = 1 - merged_attr.ignore_defence + } + /** 计算穿透率 */ + let penratio = 1.0 + if (merged_attr.PenRatioBase) { + penratio = 1 - merged_attr.PenRatioBase + } + /** 计算穿透值 */ + let pendelta = await get_let_value(merged_attr, 'PenDelta') + /** 计算防御乘区 */ + let defence_multiplier = defadd / (defadd + ((defadd * ignore_defence) * penratio - pendelta)) + return defence_multiplier + +} + +export const merge_attribute = async (base_detail, bonus_detail) => { + let merged_attr = {} + let bonus_detailkey = Object.keys(bonus_detail) + for (const merged of bonus_detailkey){ + if (merged.search('Attack') != -1 || merged.search('Defence') != -1 || merged.search('HP') != -1) { + continue + } else if (merged.search('Base') != -1) { + merged_attr[merged] = await get_let_value(base_detail, merged) + await get_let_value(bonus_detail, merged) + } else { + merged_attr[merged] = await get_let_value(bonus_detail, merged) + } + } + merged_attr['hp'] = await get_let_value(bonus_detail, 'HPDelta') + await get_let_value(base_detail, 'hp') * (await get_let_value(bonus_detail, 'HPAddedRatio') + 1) + merged_attr['attack'] = await get_let_value(bonus_detail, 'AttackDelta') + await get_let_value(base_detail, 'attack') * (await get_let_value(bonus_detail, 'AttackAddedRatio') + 1) + merged_attr['defence'] = await get_let_value(bonus_detail, 'DefenceDelta') + await get_let_value(base_detail, 'defence') * (await get_let_value(bonus_detail, 'DefenceAddedRatio') + 1) + merged_attr['CriticalChanceBase'] = await get_let_value(bonus_detail, 'CriticalChanceBase') + await get_let_value(base_detail, 'CriticalChanceBase') + merged_attr['CriticalDamageBase'] = await get_let_value(bonus_detail, 'CriticalDamageBase') + await get_let_value(base_detail, 'CriticalDamageBase') + merged_attr['PenRatioBase'] = await get_let_value(bonus_detail, 'PenRatioBase') + await get_let_value(base_detail, 'PenRatioBase') + return merged_attr +} + diff --git a/model/damage/weapon.js b/model/damage/weapon.js new file mode 100644 index 0000000..752aead --- /dev/null +++ b/model/damage/weapon.js @@ -0,0 +1,26 @@ +import { getMapData } from '../../utils/file.js'; +const weapon_effect = getMapData('weapon_effect'); + +export const get_let_value = async (let_list, name) => { + if (let_list[name]) { + return let_list[name] + } + return 0 +} + +export const Weapon = async (equipment, base_detail, bonus_detail) => { + if (equipment.id == 14119){ + let IceDmgAdd = await get_let_value(bonus_detail, 'Ice_DmgAdd'); + bonus_detail['Ice_DmgAdd'] = IceDmgAdd + weapon_effect['14119']['Param']['IceDmgAdd'][equipment.star - 1]; + logger.debug('14119,IceDmgAdd'); + + let CriticalChanceBase = await get_let_value(bonus_detail, 'CriticalChanceBase'); + bonus_detail['CriticalChanceBase'] = CriticalChanceBase + weapon_effect['14119']['Param']['CriticalChanceBase'][equipment.star - 1]; + } + return bonus_detail; +}; + +export const weapon_ability = async (equipment, base_detail, bonus_detail) => { + bonus_detail = await Weapon(equipment, base_detail, bonus_detail); + return bonus_detail; +} diff --git a/resources/map/Avatarid2Element.json b/resources/map/Avatarid2Element.json new file mode 100644 index 0000000..a871a7f --- /dev/null +++ b/resources/map/Avatarid2Element.json @@ -0,0 +1,25 @@ +{ + "1011": "Electric", + "1021": "Physical", + "1031": "Ether", + "1041": "Fire", + "1061": "Physical", + "1081": "Physical", + "1091": "Ice", + "1101": "Fire", + "1111": "Electric", + "1121": "Fire", + "1131": "Ice", + "1141": "Ice", + "1151": "Fire", + "1161": "Electric", + "1181": "Electric", + "1191": "Ice", + "1201": "Ether", + "1211": "Electric", + "1221": "Ether", + "1241": "Ether", + "1251": "Electric", + "1271": "Electric", + "1281": "Physical" +} diff --git a/resources/map/Property2Name.json b/resources/map/Property2Name.json new file mode 100644 index 0000000..92a03f8 --- /dev/null +++ b/resources/map/Property2Name.json @@ -0,0 +1,21 @@ +{ + "12102":["AttackAddedRatio","攻击力百分比"], + "12103":["AttackDelta","攻击力"], + "11102":["HPAddedRatio","生命值百分比"], + "11103":["HPDelta","生命值"], + "13102":["DefenceAddedRatio","防御力百分比"], + "13103":["DefenceDelta","防御力"], + "20103":["CriticalChanceBase","暴击率"], + "21103":["CriticalDamageBase","暴击伤害"], + "12202":["ImpactRatio","冲击力"], + "31203":["ElementMystery","异常精通"], + "31403":["ElementAbnormalPower","异常精通"], + "23203":["PenDelta","穿透值"], + "30502":["SpGetRatio","能量恢复"], + "23103":["PenRatioBase","穿透率"], + "31703":["IceAddedRatio","冰属性伤害提高"], + "31603":["FireAddedRatio","火属性伤害提高"], + "31503":["PhysicalAddedRatio","物理属性伤害提高"], + "31803":["ElectricAddedRatio","电属性伤害提高"], + "31903":["EtherAddedRatio","以太属性伤害提高"] +} \ No newline at end of file diff --git a/resources/map/SkillData.json b/resources/map/SkillData.json new file mode 100644 index 0000000..241095b --- /dev/null +++ b/resources/map/SkillData.json @@ -0,0 +1,25 @@ +{ + "1191": { + "A": [ + 4.962,5.414,5.866,6.318,6.77,7.22,7.674,8.126,8.578,9.03,9.482,9.934,10.386,10.838,11.29,11.742 + ], + "C": [ + 1.582,1.726,1.87,2.014,2.158,2.302,2.446,2.59,2.734,2.878,3.022,3.166,3.31,3.454,3.598,3.742 + ], + "ES": [ + 5.533,6.036,6.539,7.042,7.545,8.048,8.551,9.054,9.557,10.06,10.56,11.066,11.569,12.072,12.575,13.078 + ], + "EH": [ + 3.772,4.115,4.458,4.801,5.144,5.487,5.83,6.173,6.516,6.859,7.202,7.545,7.888,8.231,8.574,8.917 + ], + "R": [ + 18.908,20.627,22.346,24.065,25.784,27.503,29.222,30.941,32.66,34.379,36.098,37.817,39.536,41.255,42.974,44.693 + ], + "RL": [ + 7.946,8.669,9.392,10.115,10.838,11.561,12.284,13.007,13.73,14.453,15.176,15.898,16.622,17.345,18.068,18.791 + ], + "T": [ + 0.5, 0.583, 0.666, 0.75, 0.833, 0.916, 1 + ] + } +} diff --git a/resources/map/weapon_effect.json b/resources/map/weapon_effect.json new file mode 100644 index 0000000..97a0a84 --- /dev/null +++ b/resources/map/weapon_effect.json @@ -0,0 +1,20 @@ +{ + "14119": { + "Param": { + "IceDmgAdd": [ + 0.25, + 0.315, + 0.38, + 0.445, + 0.5 + ], + "CriticalChanceBase": [ + 0.2, + 0.25, + 0.3, + 0.35, + 0.4 + ] + } + } +} diff --git a/resources/panel/card.css b/resources/panel/card.css index 509b669..f037c97 100644 --- a/resources/panel/card.css +++ b/resources/panel/card.css @@ -617,4 +617,16 @@ z-index: 5; } +.damagelist th { + text-align: center; + padding: 0.3em 0.3em; + width:33%; +} + +.damagelist td { + text-align: center; + padding: 0.3em 0.3em; + width:33%; +} + /*# sourceMappingURL=card.css.map */ diff --git a/resources/panel/card.html b/resources/panel/card.html index 2127abd..4151806 100644 --- a/resources/panel/card.html +++ b/resources/panel/card.html @@ -177,6 +177,29 @@ <% } %> + {{if damagelist}} +
+ <% include(sys.specialTitle, {en: 'DAMAGE' , cn: '伤害统计' }) %> +
+ + + + + + + + + + {{each damagelist damage}} + + + + + + {{/each}} + +
类型暴击伤害期望伤害
{{damage.title}}{{damage.value.cd.toFixed(0)}}{{damage.value.qw.toFixed(0)}}
+ {{/if}} {{/block}} \ No newline at end of file diff --git a/resources/panel/card.scss b/resources/panel/card.scss index 2b4cc03..16a19fd 100644 --- a/resources/panel/card.scss +++ b/resources/panel/card.scss @@ -475,3 +475,15 @@ position: relative; z-index: 5; } +.damagelist { + th { + text-align: center; + padding: 0.3em 0.3em; + width:33%; + } + td { + text-align: center; + padding: 0.3em 0.3em; + width:33%; + } +} \ No newline at end of file