From 06ec5152a0008b2f2d50c205e105b8f040fc3e66 Mon Sep 17 00:00:00 2001 From: UCPr <2032385471@qq.com> Date: Wed, 26 Mar 2025 13:41:08 +0800 Subject: [PATCH] =?UTF-8?q?Upd=EF=BC=9A=E8=A7=92=E8=89=B2=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=B1=9E=E6=80=A7=E9=A2=9C=E8=89=B2=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E8=AF=8D=E6=9D=A1=E6=9D=83=E9=87=8D=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/score.js | 12 ++++++------ model/avatar.js | 11 ++++++++++- model/damage/BuffManager.js | 19 ++++++++++--------- model/damage/BuffManager.ts | 24 +++++++++++++----------- model/damage/Calculator.js | 15 ++++++++------- model/damage/Calculator.ts | 19 ++++++++++--------- resources/panel/card.css | 3 +++ resources/panel/card.html | 20 ++++++++++---------- resources/panel/card.scss | 4 ++++ 9 files changed, 74 insertions(+), 53 deletions(-) diff --git a/lib/score.js b/lib/score.js index 31eec39..cdc473f 100644 --- a/lib/score.js +++ b/lib/score.js @@ -6,7 +6,7 @@ import { nameToId } from './convert/property.js'; export const baseValueData = getMapData('EquipBaseValue'); const equipScore = getMapData('EquipScore'); /** @type {{ [charID: string]: { [propID: string]: number } }} */ -export const scoreData = {}; +export const scoreData = Object.create(null); for (const charName in equipScore) { // 兼容原ID格式 if (+charName) { @@ -16,17 +16,17 @@ for (const charName in equipScore) { const charID = charNameToID(charName); if (!charID) continue; - scoreData[charID] = {}; + scoreData[charID] = Object.create(null); for (const propName in equipScore[charName]) { const propID = nameToId(propName); - if (!propID) + if (!propID || !equipScore[charName][propName]) continue; scoreData[charID][propID] = equipScore[charName][propName]; }; /** 小生命、小攻击、小防御映射为大生命、大攻击、大防御的1/3 */ for (const [small, big] of [[11103, 11102], [12103, 12102], [13103, 13102]]) { - if (!scoreData[charID][small] && scoreData[charID][big]) { - scoreData[charID][small] = scoreData[charID][big] / 3; + if (scoreData[charID][big]) { + scoreData[charID][small] ??= scoreData[charID][big] / 3; }; }; }; @@ -38,7 +38,7 @@ for (const charName in equipScore) { */ export const hasScoreData = charID => { return ( - scoreData.hasOwnProperty(charID) && + scoreData[charID] && Object.keys(scoreData[charID]).length > 0 ); }; diff --git a/model/avatar.js b/model/avatar.js index be4903c..295abc3 100644 --- a/model/avatar.js +++ b/model/avatar.js @@ -9,7 +9,7 @@ import { Equip, Weapon } from './equip.js'; import { Property } from './property.js'; import { Skill } from './skill.js'; import { avatar_ability } from './damage/avatar.js'; -import { hasScoreData } from '../lib/score.js'; +import { hasScoreData, scoreData } from '../lib/score.js'; import _ from 'lodash'; import fs from 'fs'; @@ -433,6 +433,15 @@ export class ZZZAvatarInfo { return result; } + /** 面板属性label效果 */ + get_label(propID) { + const base = scoreData[this.id][propID]; + if (!base) return ''; + return base === 1 ? 'yellow' : + base >= 0.75 ? 'blue' : + base >= 0.5 ? 'white' : ''; + } + /** * 获取基础资源 * @returns {Promise} diff --git a/model/damage/BuffManager.js b/model/damage/BuffManager.js index 2fced79..462a3b6 100644 --- a/model/damage/BuffManager.js +++ b/model/damage/BuffManager.js @@ -44,8 +44,8 @@ let depth = 0, weakMapCheck = new WeakMap(); export class BuffManager { avatar; buffs = []; - setCount = {}; - defaultBuff = {}; + setCount = Object.create(null); + defaultBuff = Object.create(null); constructor(avatar) { this.avatar = avatar; } @@ -56,25 +56,26 @@ export class BuffManager { } if (!buff.name && (buff.source || this.defaultBuff.source) === 'Set' && this.defaultBuff.name && typeof buff.check === 'number') buff.name = this.defaultBuff.name + buff.check; + const oriBuff = buff; buff = _.merge({ status: true, isForever: false, - is: {}, + is: Object.create(null), ...this.defaultBuff }, buff); if (buff.isForever) buff.is.forever = true; if (buff.range && !Array.isArray(buff.range)) - buff.range = [buff.range]; + buff.range = oriBuff.range = [buff.range]; if (!buff.source) { if (buff.name.includes('核心') || buff.name.includes('天赋')) - buff.source = 'Talent'; + buff.source = oriBuff.source = 'Talent'; else if (buff.name.includes('额外能力')) - buff.source = 'Addition'; + buff.source = oriBuff.source = 'Addition'; else if (buff.name.includes('影')) - buff.source = 'Rank'; + buff.source = oriBuff.source = 'Rank'; else if (buff.name.includes('技')) - buff.source = 'Skill'; + buff.source = oriBuff.source = 'Skill'; } if (!buff.name || !buff.value || !buff.source || !buffTypeEnum[buffTypeEnum[buff.type]]) return logger.warn('无效buff:', buff); @@ -89,7 +90,7 @@ export class BuffManager { buff.check = ({ avatar, buffM, calc }) => professionCheck(avatar) && (!oriCheck || oriCheck({ avatar, buffM, calc })); } else if (buff.source === 'Rank') { - buff.check ??= +buff.name.match(/\d/)?.[0]; + buff.check ??= oriBuff.check = +buff.name.match(/\d/)?.[0]; } this.buffs.push(buff); return this.buffs; diff --git a/model/damage/BuffManager.ts b/model/damage/BuffManager.ts index 7eb5ddb..66c13fa 100644 --- a/model/damage/BuffManager.ts +++ b/model/damage/BuffManager.ts @@ -131,16 +131,16 @@ export class BuffManager { readonly avatar: ZZZAvatarInfo readonly buffs: buff[] = [] /** 套装计数 */ - setCount: { [name: string]: number } = {} - defaultBuff: { [key in keyof buff]?: buff[key] } = {} + setCount: { [name: string]: number } = Object.create(null) + defaultBuff: { [key in keyof buff]?: buff[key] } = Object.create(null) constructor(avatar: ZZZAvatarInfo) { this.avatar = avatar } - /** 注册buff */ + /** 注册并格式化buff */ new(buff: buff): buff[] - /** 注册buffs */ + /** 注册并格式化buffs */ new(buffs: buff[]): buff[] new(buff: buff | buff[]) { if (Array.isArray(buff)) { @@ -150,21 +150,22 @@ export class BuffManager { // 简化参数 if (!buff.name && (buff.source || this.defaultBuff.source) === 'Set' && this.defaultBuff.name && typeof buff.check === 'number') buff.name = this.defaultBuff.name + buff.check + const oriBuff = buff buff = _.merge({ status: true, isForever: false, - is: {}, + is: Object.create(null), ...this.defaultBuff }, buff) if (buff.isForever) buff.is.forever = true if (buff.range && !Array.isArray(buff.range)) - buff.range = [buff.range] + buff.range = oriBuff.range = [buff.range] if (!buff.source) { - if (buff.name.includes('核心') || buff.name.includes('天赋')) buff.source = 'Talent' - else if (buff.name.includes('额外能力')) buff.source = 'Addition' - else if (buff.name.includes('影')) buff.source = 'Rank' - else if (buff.name.includes('技')) buff.source = 'Skill' + if (buff.name.includes('核心') || buff.name.includes('天赋')) buff.source = oriBuff.source = 'Talent' + else if (buff.name.includes('额外能力')) buff.source = oriBuff.source = 'Addition' + else if (buff.name.includes('影')) buff.source = oriBuff.source = 'Rank' + else if (buff.name.includes('技')) buff.source = oriBuff.source = 'Skill' } if (!buff.name || !buff.value || !buff.source || !buffTypeEnum[buffTypeEnum[buff.type]]) return logger.warn('无效buff:', buff) @@ -177,8 +178,9 @@ export class BuffManager { } const oriCheck = typeof buff.check === 'function' && buff.check buff.check = ({ avatar, buffM, calc }) => professionCheck(avatar) && (!oriCheck || oriCheck({ avatar, buffM, calc })) + // 影画buff影画数检查 } else if (buff.source === 'Rank') { - buff.check ??= +buff.name.match(/\d/)!?.[0] + buff.check ??= oriBuff.check = +buff.name.match(/\d/)!?.[0] } this.buffs.push(buff) return this.buffs diff --git a/model/damage/Calculator.js b/model/damage/Calculator.js index dc01874..9e6e030 100644 --- a/model/damage/Calculator.js +++ b/model/damage/Calculator.js @@ -8,10 +8,10 @@ export class Calculator { buffM; avatar; skills = []; - cache = {}; - props = {}; + cache = Object.create(null); + props = Object.create(null); skill; - defaultSkill = {}; + defaultSkill = Object.create(null); enemy; constructor(buffM) { this.buffM = buffM; @@ -38,16 +38,17 @@ export class Calculator { skill.forEach(s => this.new(s)); return this.skills; } + const oriSkill = skill; skill = _.merge({ ...this.defaultSkill }, skill); if (!skill.element) - skill.element = elementType2element(this.avatar.element_type); + skill.element = oriSkill.element = elementType2element(this.avatar.element_type); if (!skill.name || !skill.type) return logger.warn('无效skill:', skill); if (skill.check && +skill.check) { const num = skill.check; - skill.check = ({ avatar }) => avatar.rank >= num; + skill.check = oriSkill.check = ({ avatar }) => avatar.rank >= num; } this.skills.push(skill); return this.skills; @@ -70,13 +71,13 @@ export class Calculator { logger.debug('自定义计算最终伤害:', dmg.result); return dmg; } - const props = this.props = skill.props || {}; + const props = this.props = skill.props || Object.create(null); const usefulBuffs = this.buffM.filter({ element: skill.element, range: [skill.type], redirect: skill.redirect }, this); - const areas = {}; + const areas = Object.create(null); if (skill.before) skill.before({ avatar: this.avatar, calc: this, usefulBuffs, skill, props, areas }); const isAnomaly = typeof anomalyEnum[skill.type] === 'number'; diff --git a/model/damage/Calculator.ts b/model/damage/Calculator.ts index 39c7259..6f3e752 100644 --- a/model/damage/Calculator.ts +++ b/model/damage/Calculator.ts @@ -129,11 +129,11 @@ export class Calculator { readonly buffM: BuffManager readonly avatar: ZZZAvatarInfo readonly skills: skill[] = [] - private cache: { [type: string]: damage } = {} - private props: Exclude = {} + private cache: { [type: string]: damage } = Object.create(null) + private props: Exclude = Object.create(null) /** 当前正在计算的技能 */ skill: skill - defaultSkill: { [key in keyof skill]?: skill[key] } = {} + defaultSkill: { [key in keyof skill]?: skill[key] } = Object.create(null) enemy: enemy constructor(buffM: BuffManager) { @@ -161,23 +161,24 @@ export class Calculator { } } - /** 注册skill */ + /** 注册并格式化skill */ new(skill: skill): skill[] - /** 注册skills */ + /** 注册并格式化skills */ new(skills: skill[]): skill[] new(skill: skill | skill[]) { if (Array.isArray(skill)) { skill.forEach(s => this.new(s)) return this.skills } + const oriSkill = skill skill = _.merge({ ...this.defaultSkill }, skill) - if (!skill.element) skill.element = elementType2element(this.avatar.element_type) + if (!skill.element) skill.element = oriSkill.element = elementType2element(this.avatar.element_type) if (!skill.name || !skill.type) return logger.warn('无效skill:', skill) if (skill.check && +skill.check) { const num = skill.check as unknown as number - skill.check = ({ avatar }) => avatar.rank >= num + skill.check = oriSkill.check = ({ avatar }) => avatar.rank >= num } this.skills.push(skill) return this.skills @@ -208,14 +209,14 @@ export class Calculator { logger.debug('自定义计算最终伤害:', dmg.result) return dmg } - const props = this.props = skill.props || {} + const props = this.props = skill.props || Object.create(null) /** 缩小筛选范围 */ const usefulBuffs = this.buffM.filter({ element: skill.element, range: [skill.type], redirect: skill.redirect }, this) - const areas = {} as damage['areas'] + const areas = Object.create(null) as damage['areas'] if (skill.before) skill.before({ avatar: this.avatar, calc: this, usefulBuffs, skill, props, areas }) const isAnomaly = typeof anomalyEnum[skill.type as anomaly] === 'number' if (!areas.BasicArea) { diff --git a/resources/panel/card.css b/resources/panel/card.css index b68bf56..34b89cc 100644 --- a/resources/panel/card.css +++ b/resources/panel/card.css @@ -328,6 +328,9 @@ .card .basic .info .property_info .list .properties .label.blue { color: rgb(65, 147, 237); } +.card .basic .info .property_info .list .properties .label.white { + color: rgb(233, 233, 233); +} .card .basic .info .property_info .list .properties .value { flex-grow: 0; flex-shrink: 0; diff --git a/resources/panel/card.html b/resources/panel/card.html index af38676..dfbd583 100644 --- a/resources/panel/card.html +++ b/resources/panel/card.html @@ -43,52 +43,52 @@
-
生命值
+
生命值
{{basic_properties.hpmax.final}}
-
攻击力
+
攻击力
{{basic_properties.attack.final}}
-
防御力
+
防御力
{{basic_properties.def.final}}
-
冲击力
+
冲击力
{{basic_properties.breakstun.final}}
-
暴击率
+
暴击率
{{basic_properties.crit.final}}
-
暴击伤害
+
暴击伤害
{{basic_properties.critdam.final}}
-
异常掌控
+
异常掌控
{{basic_properties.elementabnormalpower.final}}
-
异常精通
+
异常精通
{{basic_properties.elementmystery.final}}
-
穿透率
+
穿透率
{{basic_properties.penratio.final}}
-
能量回复
+
能量回复
{{basic_properties.sprecover.final}}
diff --git a/resources/panel/card.scss b/resources/panel/card.scss index a67f097..e06f608 100644 --- a/resources/panel/card.scss +++ b/resources/panel/card.scss @@ -231,6 +231,10 @@ &.blue { color: rgb(65, 147, 237); } + + &.white { + color: rgb(233, 233, 233); + } } .value {