refactor(skill): 优化技能文本展示逻辑,移除冗余的技能名前缀
1. 调整英雄技能描述文本,移除技能描述中重复的前置动作描述,统一文本风格 2. 重构技能文本生成代码,删除组内多技能时自动添加技能名前缀的逻辑,简化显示逻辑 3. 清理冗余的空行与注释,优化代码结构 4. 调整部分英雄技能的冷却时间配置,修正格式细节
This commit is contained in:
@@ -196,8 +196,6 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s
|
||||
if (!grouped) continue;
|
||||
const items = resolveTriggerByLv(grouped, lv);
|
||||
if (items.length === 0) continue;
|
||||
// 组内多个技能时,各效果片段带自身技能名区分
|
||||
const headOf = (s_uuid: number) => (items.length > 1 ? skillNameRich(getGroupedTriggerName(grouped, s_uuid)) : "");
|
||||
const parts: string[] = [];
|
||||
for (const item of items) {
|
||||
const base = SkillSet[item.s_uuid];
|
||||
@@ -215,7 +213,7 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s
|
||||
const trig = type === SkillTriggerType.Atking || type === SkillTriggerType.Atked
|
||||
? `${SkillTriggerName[type]}${valueRich(item.t_num)}次`
|
||||
: SkillTriggerName[type];
|
||||
parts.push(`${headOf(item.s_uuid)}${trig}, ${text}`);
|
||||
parts.push(`${trig}, ${text}`);
|
||||
}
|
||||
// dead 组内的复活效果(revive_hp / revive_count)并入同一行
|
||||
if (type === SkillTriggerType.Dead) {
|
||||
@@ -224,7 +222,7 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s
|
||||
const reviveCount = item.overrides?.revive_count ?? 0;
|
||||
if (reviveHp === undefined || reviveCount <= 0) continue;
|
||||
const text = `每回合可复活${valueRich(reviveCount)}次, 死亡后以${valueRich(`${Math.round(reviveHp)}%`)}生命原地重生`;
|
||||
parts.push(`${headOf(item.s_uuid)}${SkillTriggerName[SkillTriggerType.Dead]}, ${text}`);
|
||||
parts.push(`${SkillTriggerName[SkillTriggerType.Dead]}, ${text}`);
|
||||
}
|
||||
}
|
||||
if (parts.length === 0) continue;
|
||||
@@ -233,18 +231,15 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s
|
||||
}
|
||||
|
||||
// ---- 驻场光环(field):整组视为一个技能,组内多词条合并为一行 ----
|
||||
const fieldItems = resolveFieldByLv(hero.field, lv);
|
||||
const fieldParts: string[] = [];
|
||||
for (const entry of fieldItems) {
|
||||
for (const entry of resolveFieldByLv(hero.field, lv)) {
|
||||
const fs = FieldSkillSet[entry.uuid];
|
||||
const desc = fs ? FieldDescSet[fs.type] : undefined;
|
||||
if (!fs || !desc) continue;
|
||||
const val = desc.fmt === FieldValueFmt.Percent
|
||||
? `+${Math.round(entry.value * 100)}%`
|
||||
: desc.fmt === FieldValueFmt.IntMinus ? `-${entry.value}` : `+${entry.value}`;
|
||||
// 组内多个词条时带各自词条名区分
|
||||
const head = fieldItems.length > 1 ? skillNameRich(entry.name ?? fs.name) : "";
|
||||
fieldParts.push(`${head}${desc.verb}${valueRich(val)}`);
|
||||
fieldParts.push(`${desc.verb}${valueRich(val)}`);
|
||||
}
|
||||
if (fieldParts.length > 0) {
|
||||
// 组名取组内首个自定义名(getFieldGroupName)
|
||||
@@ -580,12 +575,6 @@ export function buildHeroSkillTierLines(heroUuid: number, skillUuid: number, slo
|
||||
function collectFieldGroupTierLines(hero: heroInfo): HeroSkillTierLine[] {
|
||||
const tiers = [...(hero.field ?? [])].sort((a, b) => a.lv - b.lv);
|
||||
if (tiers.length === 0) return [];
|
||||
// 组内词条数 >1 时每行带词条名区分
|
||||
const uuidSet = new Set<number>();
|
||||
for (const t of tiers) {
|
||||
for (const u of t.uuids) uuidSet.add(u.uuid);
|
||||
}
|
||||
const multi = uuidSet.size > 1;
|
||||
|
||||
const lines: HeroSkillTierLine[] = [];
|
||||
let prev: FieldEntry[] = [];
|
||||
@@ -595,14 +584,13 @@ function collectFieldGroupTierLines(hero: heroInfo): HeroSkillTierLine[] {
|
||||
const fs = FieldSkillSet[entry.uuid];
|
||||
const descCfg = fs ? FieldDescSet[fs.type] : undefined;
|
||||
if (!fs || !descCfg) continue;
|
||||
const head = multi ? `${entry.name ?? fs.name}: ` : "";
|
||||
const before = prev.find(p => p.uuid === entry.uuid);
|
||||
if (!before) {
|
||||
// 新词条:完整效果(动词 + 数值高亮)
|
||||
parts.push(`${head}${descCfg.verb}${buildFieldValueRich(entry.uuid, entry.value)}`);
|
||||
parts.push(`${descCfg.verb}${buildFieldValueRich(entry.uuid, entry.value)}`);
|
||||
} else if (before.value !== entry.value) {
|
||||
// 已有词条:数值由旧值提升至新值
|
||||
parts.push(`${head}${descCfg.verb}${buildFieldValueRich(entry.uuid, before.value)}提升至${buildFieldValueRich(entry.uuid, entry.value)}`);
|
||||
parts.push(`${descCfg.verb}${buildFieldValueRich(entry.uuid, before.value)}提升至${buildFieldValueRich(entry.uuid, entry.value)}`);
|
||||
}
|
||||
}
|
||||
lines.push({ sLv: i + 1, heroLv: e.lv, text: e.desc ?? parts.join("\n") });
|
||||
@@ -638,7 +626,7 @@ function mergeTierLinesByHeroLv(groups: HeroSkillTierLine[][]): HeroSkillTierLin
|
||||
*
|
||||
* 每个触发槽位(atking/dead/fstart/atked/call/field)整组视为一个技能:
|
||||
* 组内各 s_uuid 分别生成分档行后按解锁英雄等级阈值合并(同阈值文本换行拼接),
|
||||
* 组内多个技能时每行带各自技能名区分;驻场光环按词条维度合并。
|
||||
* 说明内只保留组名与效果文本,不再显示组内子技能名;驻场光环按词条维度合并。
|
||||
* 每档附带解锁英雄等级,调用方对比 smc.getHeroOuterLv 判定激活状态。
|
||||
*
|
||||
* @param heroUuid 英雄 uuid(HeroInfo key)
|
||||
@@ -652,20 +640,11 @@ export function buildHeroGroupTierLines(heroUuid: number, slot: SkillTriggerType
|
||||
|
||||
const grouped = hero[slot] as TriggerGrouped | undefined;
|
||||
if (!grouped) return [];
|
||||
const keys = Object.keys(grouped).map(Number);
|
||||
const lineGroups: HeroSkillTierLine[][] = [];
|
||||
for (const sUuid of keys) {
|
||||
for (const sUuid of Object.keys(grouped).map(Number)) {
|
||||
const hit = collectTriggerTiers(hero, slot, sUuid);
|
||||
if (!hit) continue;
|
||||
const lines = buildTierLines(hit.tiers, hit.label);
|
||||
// 组内多个技能时每行带各自技能名区分
|
||||
if (keys.length > 1) {
|
||||
const name = getGroupedTriggerName(grouped, sUuid);
|
||||
for (const line of lines) {
|
||||
line.text = `${skillNameRich(name)}${line.text}`;
|
||||
}
|
||||
}
|
||||
lineGroups.push(lines);
|
||||
lineGroups.push(buildTierLines(hit.tiers, hit.label));
|
||||
}
|
||||
return mergeTierLinesByHeroLv(lineGroups);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user