feat(hero/skill): add skill level override resolution logic

1. 新增resolveSkillOverrides工具函数实现技能等级分档覆盖逻辑
2. 为所有英雄/怪物技能模块添加运行时overrides分档处理
3. 扩展技能描述系统以展示分档后的技能等级
4. 新增技能分档配置类型定义与注释
This commit is contained in:
panFD
2026-08-16 20:51:58 +08:00
parent 4388a1ed3a
commit aec84d169f
7 changed files with 77 additions and 10 deletions

View File

@@ -28,7 +28,7 @@
* - SkillDescSet:结构化描述模板
* - FieldSkillSet驻场技能、BuffList计时 buff 默认值兜底、Attrs属性枚举
*/
import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, getTriggerSkillName, HGrowType, calcGrowBonus } from "./heroSet";
import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, resolveSkillOverrides, getTriggerSkillName, HGrowType, calcGrowBonus, HSkillInfo } from "./heroSet";
import { FieldSkillSet, mergeSkillParams, SkillConfig, SkillKind, SkillOverrides, SkillSet, TGroup } from "./SkillSet";
import { FieldDescSet, FieldValueFmt, SkillDescSet } from "./SkillDescSet";
import { BuffList } from "./BuffSet";
@@ -42,6 +42,8 @@ import { CardConfig } from "./CardSet";
export interface ISkillDescSource {
/** 当前等级(用于 resolve 触发技能/光环/复活取档;静态 heroInfo 恒为 1 */
lv?: number;
/** 携带技能(普攻技能,支持 lv_entries 按等级分档 resolve */
skills?: Record<number, HSkillInfo>;
call?: TriggerGrouped;
dead?: TriggerGrouped;
fstart?: TriggerGrouped;
@@ -368,6 +370,24 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho
const lines: ISkillLine[] = [];
const lv = Math.max(1, source.lv ?? 1);
// ---- 普攻技能skills按英雄等级 resolve 分档 overrides ----
if (source.skills) {
for (const key in source.skills) {
const hSkill = source.skills[key];
if (!hSkill) continue;
const base = SkillSet[hSkill.uuid];
if (!base) continue;
const overrides = resolveSkillOverrides(hSkill, lv);
const skill = mergeSkillParams(base, overrides);
// 技能等级展示lv_entries 有档时取档位 s_lv否则用运行时 lv
const sLv = hSkill.lv_entries?.length
? (hSkill.lv_entries.filter(e => e.lv <= lv).pop()?.s_lv ?? hSkill.lv)
: hSkill.lv;
const nameSeg = showName ? `${base.name}` : "";
lines.push(buildEffectLine(`Lv${sLv}: ${nameSeg}`, skill));
}
}
// ---- 6 种标准触发技能 ----
for (const key of TRIGGER_KEYS) {
const grouped = source[key] as TriggerGrouped | undefined;
@@ -569,6 +589,24 @@ export function buildSkillDescMoreRich(source: ISkillDescSource, showName: boole
return highlightDuration(text);
};
// ---- 普攻技能skills按英雄等级 resolve 分档 overrides展示当前生效档 ----
if (source.skills) {
for (const key in source.skills) {
const hSkill = source.skills[key];
if (!hSkill) continue;
const base = SkillSet[hSkill.uuid];
if (!base) continue;
const overrides = resolveSkillOverrides(hSkill, lv);
const skill = mergeSkillParams(base, overrides);
// 技能等级展示lv_entries 有档时取档位 s_lv否则用运行时 lv
const sLv = hSkill.lv_entries?.length
? (hSkill.lv_entries.filter(e => e.lv <= lv).pop()?.s_lv ?? hSkill.lv)
: hSkill.lv;
const head = showName ? `${base.name}」 Lv.${sLv}: ` : `Lv.${sLv}: `;
lines.push(effectRich(buildEffectLine(head, skill)));
}
}
for (const key of TRIGGER_KEYS) {
const grouped = source[key] as TriggerGrouped | undefined;
if (!grouped) continue;