diff --git a/assets/script/game/common/HeroSkillText.ts b/assets/script/game/common/HeroSkillText.ts new file mode 100644 index 00000000..1f12f9e9 --- /dev/null +++ b/assets/script/game/common/HeroSkillText.ts @@ -0,0 +1,415 @@ +/** + * @file HeroSkillText.ts + * @description 英雄技能文案生成器(heroInfo 内联描述模板驱动) + * + * 与 HeroSkillDesc(SkillDescSet 中央模板表)并列的新一代文案层: + * - 描述模板直接配置在 heroInfo(HSkillInfo.desc / LvSkillEntry.desc / LvTriggerEntry.desc), + * "同一底座技能、不同英雄语境"的表述差异在英雄配置处表达; + * - 数值永远从 mergeSkillParams 合并后的实时配置取值(占位符渲染), + * 改 overrides 数值文案自动同步,杜绝"改数值忘改文案"漂移; + * - 英雄当前等级取自 SingletonModuleComp 的局外成长等级(smc.getHeroOuterLv)。 + * + * 两个输出(均为富文本 BBCode,RichText 直接可用): + * 1. buildHeroSkillDesc(heroUuid) —— 当前局外等级下各技能最大生效档的完整说明 + * 2. buildHeroSkillTierDesc(heroUuid, skillUuid) —— 指定技能各阶段说明: + * slv1 给完整能力 + 激活英雄等级;slv2+ 给相对上一级的提升 + 解锁英雄等级 + * + * 占位符规范(模板作者可用,渲染时数值片段自动绿色高亮): + * {target} 目标语义(自身/敌方/全体友方/N名队友…,与 SCastSystem 目标选取一致) + * {dur} 计时 buff 持续秒数(buff_duration 优先,回退 BuffList 默认) + * {buff_value} 计时 buff 修饰数值(tick 类取绝对值展示,modifiers 类保留正负号) + * {字段名} 合并后技能配置数值(ap/para/frz/stun/crt/bck/hit_count/num/summon_count…) + * + * 依赖:heroSet(配置与 resolver)、SkillSet/BuffSet/SkillDescSet(底座)、smc(局外等级)。 + * HeroSkillDesc.ts 暂时保留兼容旧 UI 引用,待迁移完成后移除。 + */ +import { + HeroInfo, SkillTriggerType, SkillTriggerName, HSkillInfo, LvSkillEntry, LvTriggerEntry, + TriggerGrouped, resolveSkillOverrides, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, + getGroupedTriggerName, getFieldSkillName, getReviveSkillName, +} from "./config/heroSet"; +import { SkillSet, mergeSkillParams, SkillConfig, SkillKind, TGroup, FieldSkillSet } from "./config/SkillSet"; +import { BuffList } from "./config/BuffSet"; +import { FieldDescSet, FieldValueFmt } from "./config/SkillDescSet"; +import { FacSet } from "./config/GameSet"; +import { smc } from "./SingletonModuleComp"; + +/* ==================== 富文本片段(与 HeroSkillDesc 同配色,保证新旧面板视觉一致) ==================== */ + +/** 富文本数值高亮色(鲜亮绿色) */ +const RICH_VALUE_COLOR = "#3CE66E"; +/** 数值描边色(深绿,衬托亮绿填充) */ +const RICH_VALUE_OUTLINE = "#145A32"; +/** 技能名高亮色(蜜桃橙) */ +const RICH_NAME_COLOR = "#F8C471"; +/** 技能名描边色(深褐) */ +const RICH_NAME_OUTLINE = "#6E2C00"; + +/** 数值富文本片段:亮绿填充 + 深绿描边 */ +function valueRich(text: string | number): string { + return `${text}`; +} + +/** 技能名富文本片段:「技能名」蜜桃橙填充 + 深褐描边 */ +function skillNameRich(name: string): string { + return `「${name}」`; +} + +/* ==================== 模板渲染基础 ==================== */ + +/** 需要遍历的触发技能类型(field/revive 结构不同,单独处理) */ +const TRIGGER_KEYS: SkillTriggerType[] = [ + SkillTriggerType.Call, + SkillTriggerType.Dead, + SkillTriggerType.FStart, + SkillTriggerType.Atking, + SkillTriggerType.Atked, +]; + +/** 占位符模式:{target}/{dur}/{buff_value}/{技能字段名} */ +const PLACEHOLDER_PATTERN = /\{(\w+)\}/g; + +/** + * 解析目标描述文本(与战斗 SCastSystem 目标选取语义严格一致) + */ +function buildTargetDesc(skill: SkillConfig): string { + switch (skill.TGroup) { + case TGroup.Self: + return "自身"; + case TGroup.Enemy: + return "敌方"; + case TGroup.Ally: + case TGroup.All: + return "全体友方"; + case TGroup.Team: { + const n = Math.max(1, Math.floor(skill.hit_count ?? 1)); + // 治疗类命中低血量队友 + if (skill.kind === SkillKind.Heal) { + return n > 1 ? `${n}名低血量队友` : "低血量队友"; + } + return `${n}名队友`; + } + default: + return "全体友方"; + } +} + +/** 计时 buff 生效时长(overrides.buff_duration 优先,回退 BuffList 默认) */ +function getBuffDuration(skill: SkillConfig): number { + if (skill.timed_buff_id === undefined) return 0; + return skill.buff_duration ?? BuffList[skill.timed_buff_id]?.duration ?? 0; +} + +/** 计时 buff 修饰数值(tick 类伤害取绝对值展示;modifiers 类保留正负号表达增减) */ +function getBuffValue(skill: SkillConfig): number { + if (skill.timed_buff_id === undefined) return skill.buff_value ?? 0; + if (skill.buff_value !== undefined) return skill.buff_value; + const buff = BuffList[skill.timed_buff_id]; + if (!buff) return 0; + if (buff.modifiers?.length) return buff.modifiers[0].value; + if (buff.tick) return Math.abs(buff.tick.damage_or_heal); + return 0; +} + +/** + * 渲染 heroInfo 内联描述模板:数值占位符替换为合并后配置实时值并绿色高亮。 + * Why: 数值不写死在模板里,overrides 调整档位数值时文案自动同步。 + * @param tmpl 描述模板(含占位符) + * @param skill mergeSkillParams 合并后的技能配置 + */ +function renderDesc(tmpl: string, skill: SkillConfig): string { + return tmpl.replace(PLACEHOLDER_PATTERN, (raw, key: string) => { + if (key === "target") return buildTargetDesc(skill); + if (key === "dur") return valueRich(getBuffDuration(skill)); + if (key === "buff_value") return valueRich(getBuffValue(skill)); + const v = (skill as unknown as Record)[key]; + // 未定义数值字段按 0 渲染,避免面板出现 undefined(模板与配置不匹配的兜底) + return v === undefined ? valueRich(0) : valueRich(String(v)); + }); +} + +/** 无模板时兜底:回退底座技能的 info 备注 */ +function fallbackDesc(skill: SkillConfig): string { + return String(skill.info ?? ""); +} + +/** 取英雄展示等级:英雄用局外成长等级(smc),怪物无成长直接用配置 lv */ +function getHeroDisplayLv(heroUuid: number, configLv: number, fac: FacSet): number { + if (fac !== FacSet.HERO) return Math.max(1, configLv); + return Math.max(1, smc.getHeroOuterLv(heroUuid)); +} + +/* ==================== 输出一:当前等级最大生效档说明 ==================== */ + +/** + * 输出一:英雄当前局外等级下,全部技能最大生效档的完整说明(富文本)。 + * + * 覆盖:普攻/大招(skills,resolve ≤lv 最大档)、5 类触发技能、驻场光环(field)、 + * 复活(revive)。每行 = 「技能名」+ 触发语境 + 模板渲染后的效果文本(数值高亮)。 + * + * @param heroUuid 英雄 uuid(HeroInfo key) + * @param showName 是否包含「技能名」片段(面板 true,紧凑卡片 false) + * @returns 多行富文本串,\n 分隔;英雄不存在时返回 "" + */ +export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true): string { + const hero = HeroInfo[heroUuid]; + if (!hero) return ""; + const lv = getHeroDisplayLv(heroUuid, hero.lv, hero.fac); + const lines: string[] = []; + const nameSeg = (n: string) => (showName && n ? `${skillNameRich(n)} ` : ""); + + // ---- 普攻/大招(skills):resolve 当前等级生效档,渲染该档模板 ---- + for (const key in hero.skills) { + const hSkill = hero.skills[key]; + if (!hSkill) continue; + const base = SkillSet[hSkill.uuid]; + if (!base) continue; + const skill = mergeSkillParams(base, resolveSkillOverrides(hSkill, lv)); + // 生效档(≤lv 最大档):取其 s_lv 与 desc;未配置 desc 的档位继承上一档模板 + let entry: LvSkillEntry | undefined; + let inheritDesc = hSkill.desc; + for (const e of hSkill.lv_entries ?? []) { + if (e.lv <= lv) { + if (!entry || e.lv > entry.lv) entry = e; + if (e.desc) inheritDesc = e.desc; + } + } + const sLv = entry?.s_lv ?? hSkill.lv; + const text = inheritDesc ? renderDesc(inheritDesc, skill) : fallbackDesc(skill); + lines.push(`${nameSeg(hSkill.name ?? base.name)}Lv.${valueRich(sLv)}: ${text}`); + } + + // ---- 5 类标准触发技能:resolve 当前等级生效档 ---- + for (const type of TRIGGER_KEYS) { + const grouped = hero[type] as TriggerGrouped | undefined; + if (!grouped) continue; + for (const item of resolveTriggerByLv(grouped, lv)) { + const base = SkillSet[item.s_uuid]; + if (!base) continue; + const skill = mergeSkillParams(base, item.overrides); + // 档位模板继承链:组内 ≤lv 档依次覆盖(后配置的生效),缺省回退第 1 档 + const entries = grouped[item.s_uuid] ?? []; + let tmpl: string | undefined; + for (const e of entries) { + if (e.lv <= lv && e.desc) tmpl = e.desc; + } + tmpl = tmpl ?? entries[0]?.desc; + const text = tmpl ? renderDesc(tmpl, skill) : fallbackDesc(skill); + // 进击/受击带触发次数,拼为"攻击3次";其余用触发类型简称 + const trig = type === SkillTriggerType.Atking || type === SkillTriggerType.Atked + ? `${SkillTriggerName[type]}${valueRich(item.t_num)}次` + : SkillTriggerName[type]; + lines.push(`${nameSeg(getGroupedTriggerName(grouped, item.s_uuid))}${trig}, ${text}`); + } + } + + // ---- 驻场光环(field):查 FieldDescSet 按 type 渲染,数值实时高亮 ---- + 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}`; + lines.push(`${nameSeg(getFieldSkillName(entry.uuid))}${desc.verb}${valueRich(val)}`); + } + + // ---- 复活(revive):次数复刻战斗公式 r_num + floor((lv-1)*upr) ---- + const revive = resolveReviveByLv(hero.revive, lv); + if (revive) { + const count = revive.r_num + Math.floor((lv - 1) * revive.upr); + const hpPct = SkillSet[revive.s_uuid]?.ap ?? 0; + lines.push(`${nameSeg(getReviveSkillName())}每回合可复活${valueRich(count)}次, 死亡后以${valueRich(`${Math.round(hpPct)}%`)}生命原地重生`); + } + + return lines.join("\n"); +} + +/* ==================== 输出二:指定技能各阶段(分档)说明 ==================== */ + +/** 一个技能等级档位的统一结构(普攻 lv_entries 与触发技能 LvTriggerEntry 归一) */ +interface ISkillTierInfo { + /** 技能等级(展示用,取 s_lv,缺省按档位序号) */ + sLv: number; + /** 该档生效的英雄等级(激活/解锁提示) */ + heroLv: number; + /** 合并底座后的完整技能配置 */ + skill: SkillConfig; + /** 该档描述模板(继承链解析后) */ + desc?: string; + /** 触发技能档位的触发次数(普攻无) */ + tNum: number; +} + +/** 相邻档 diff 参与展示的字段(排除动画/弹道/特效等玩家无感字段),t_num 为触发技能专有 */ +const DIFF_KEYS: string[] = [ + "ap", "hit_count", "num", "summon_count", "crt", "frz", "stun", "para", + "bck", "bck_chance", "buff_duration", "buff_value", "t_num", "timed_buff_id", +]; + +/** diff 字段的称谓与单位("新增/漂移"描述共用) */ +const DIFF_META: Record = { + ap: { label: "伤害", unit: "%" }, + hit_count: { label: "命中", unit: "次" }, + num: { label: "双发", unit: "次" }, + summon_count: { label: "召唤数", unit: "" }, + crt: { label: "暴击", unit: "%" }, + frz: { label: "冰冻", unit: "%" }, + stun: { label: "击晕", unit: "%" }, + para: { label: "麻痹", unit: "%" }, + bck: { label: "击退", unit: "" }, + bck_chance: { label: "击退概率", unit: "%" }, + buff_duration: { label: "持续", unit: "秒" }, + buff_value: { label: "增益强度", unit: "" }, + t_num: { label: "触发次数", unit: "次" }, +}; + +/** 读取档位某展示字段的实时值(t_num/buff_value 走专用取值) */ +function getTierValue(tier: ISkillTierInfo, key: string): number { + if (key === "t_num") return tier.tNum; + if (key === "buff_value") return getBuffValue(tier.skill); + const v = (tier.skill as unknown as Record)[key]; + return typeof v === "number" ? v : 0; +} + +/** + * 相邻两档 diff:数值漂移(差值)+ 新功能(上级为 0 本级新增)+ 计时 buff 增减。 + * Why: slv2+ 只描述"多得到了什么",让玩家一眼看清每级提升。 + */ +function buildTierDiff(prev: ISkillTierInfo, cur: ISkillTierInfo): string[] { + const parts: string[] = []; + for (const key of DIFF_KEYS) { + // 计时 buff 增减单独处理:展示 buff 名而非内部 id + if (key === "timed_buff_id") { + const pb = prev.skill.timed_buff_id ?? 0; + const cb = cur.skill.timed_buff_id ?? 0; + if (pb === cb) continue; + if (!pb && cb) parts.push(`新增${valueRich(BuffList[cb]?.name ?? "计时增益")}`); + else if (pb && !cb) parts.push(`移除${valueRich(BuffList[pb]?.name ?? "计时增益")}`); + else parts.push(`${valueRich(BuffList[pb]?.name ?? "计时增益")}→${valueRich(BuffList[cb]?.name ?? "计时增益")}`); + continue; + } + const meta = DIFF_META[key]; + if (!meta) continue; + const pv = getTierValue(prev, key); + const cv = getTierValue(cur, key); + if (cv === pv) continue; + if (pv === 0 && cv > 0) { + parts.push(`新增${meta.label}${valueRich(`${cv}${meta.unit}`)}`); + } else { + const d = cv - pv; + parts.push(`${meta.label}${valueRich(`${d > 0 ? "+" : ""}${d}${meta.unit}`)}`); + } + } + return parts; +} + +/** 收集普攻/大招(skills)的全部等级档位(slv 升序,模板走继承链) */ +function collectSkillTiers(hSkill: HSkillInfo): ISkillTierInfo[] { + const base = SkillSet[hSkill.uuid]; + if (!base) return []; + const entries = [...(hSkill.lv_entries ?? [])].sort((a, b) => (a.s_lv ?? 0) - (b.s_lv ?? 0)); + const tiers: ISkillTierInfo[] = []; + // slv1 = 基础档(底座 + 基础 overrides),激活等级取 s_lv≤1 档的 lv(缺省 1) + const lv1 = entries.find(e => (e.s_lv ?? 0) <= 1); + tiers.push({ + sLv: lv1?.s_lv ?? 1, + heroLv: lv1?.lv ?? 1, + skill: mergeSkillParams(base, hSkill.overrides), + desc: lv1?.desc ?? hSkill.desc, + tNum: 0, + }); + // slv2+ = lv_entries 各档(与基础 overrides 浅合并,档位字段优先) + for (const e of entries) { + if ((e.s_lv ?? 0) < 2) continue; + tiers.push({ + sLv: e.s_lv ?? 0, + heroLv: e.lv, + skill: mergeSkillParams(mergeSkillParams(base, hSkill.overrides), e.overrides), + desc: e.desc, + tNum: 0, + }); + } + // 模板继承链:未配置 desc 的档位沿用上一档模板(机制不变仅数值变化的档位免配) + let inherit: string | undefined; + for (const t of tiers) { + if (t.desc) inherit = t.desc; + else t.desc = inherit; + } + return tiers; +} + +/** + * 输出二:指定技能的各阶段说明(富文本)。 + * + * 输出结构(按技能等级升序,通用支持任意档数): + * - slv1:完整能力 + 数值 +(英雄X级激活) + * - slv2+:相对上一级的提升(数值漂移/新增效果/计时 buff 增减)+(英雄Y级解锁) + * + * 技能定位顺序:hero.skills[skillUuid](普攻/大招)→ 5 类触发技能组 → 未找到返回 ""。 + * Why: 同一底座技能可能被多个英雄以不同 overrides 引用,必须以英雄语境取档。 + * + * @param heroUuid 英雄 uuid(HeroInfo key) + * @param skillUuid 技能 uuid(skills key 或触发组 s_uuid) + * @param showName 是否包含「技能名」片段 + * @returns 多行富文本串,\n 分隔;技能不属于该英雄时返回 "" + */ +export function buildHeroSkillTierDesc(heroUuid: number, skillUuid: number, showName: boolean = true): string { + const hero = HeroInfo[heroUuid]; + if (!hero) return ""; + + let name = ""; + let tiers: ISkillTierInfo[] = []; + let triggerLabel = ""; + + const hSkill = hero.skills?.[skillUuid]; + if (hSkill) { + // 普攻/大招路径 + name = hSkill.name ?? SkillSet[skillUuid]?.name ?? ""; + tiers = collectSkillTiers(hSkill); + } else { + // 触发技能路径:在 5 类触发组中定位 s_uuid + for (const type of TRIGGER_KEYS) { + const grouped = hero[type] as TriggerGrouped | undefined; + const entries = grouped?.[skillUuid]; + if (!grouped || !entries?.length) continue; + const base = SkillSet[skillUuid]; + if (!base) return ""; + const sorted = [...entries].sort((a, b) => (a.s_lv ?? 0) - (b.s_lv ?? 0)); + name = getGroupedTriggerName(grouped, skillUuid); + let inherit: string | undefined; + tiers = sorted.map((e: LvTriggerEntry, i: number) => { + if (e.desc) inherit = e.desc; + return { + sLv: e.s_lv ?? (i + 1), + heroLv: e.lv, + skill: mergeSkillParams(base, e.overrides), + desc: e.desc ?? inherit, + tNum: e.t_num, + }; + }); + triggerLabel = (type === SkillTriggerType.Atking || type === SkillTriggerType.Atked) + ? `${SkillTriggerName[type]}${valueRich(sorted[0].t_num)}次` + : SkillTriggerName[type]; + break; + } + } + if (tiers.length === 0) return ""; + + const nameSeg = showName && name ? `${skillNameRich(name)} ` : ""; + const lines: string[] = []; + for (let i = 0; i < tiers.length; i++) { + const t = tiers[i]; + const head = `${nameSeg}Lv.${valueRich(t.sLv)}(英雄${valueRich(t.heroLv)}级${i === 0 ? "激活" : "解锁"})`; + if (i === 0) { + // 技能 1 级:完整能力 + 数值(含激活英雄等级) + const text = t.desc ? renderDesc(t.desc, t.skill) : fallbackDesc(t.skill); + lines.push(`${head}: ${triggerLabel ? `${triggerLabel}, ` : ""}${text}`); + } else { + // 技能 2 级起:相对上一级的提升 + 解锁英雄等级 + const diff = buildTierDiff(tiers[i - 1], t); + lines.push(`${head}: ${diff.length > 0 ? diff.join(",") : "无变化"}`); + } + } + return lines.join("\n"); +} diff --git a/assets/script/game/common/config/HeroSkillDesc.ts b/assets/script/game/common/config/HeroSkillDesc.ts index c1385706..7d5a655b 100644 --- a/assets/script/game/common/config/HeroSkillDesc.ts +++ b/assets/script/game/common/config/HeroSkillDesc.ts @@ -2,6 +2,11 @@ * @file HeroSkillDesc.ts * @description 英雄技能/能力描述的【唯一文字表达标准层】 * +* @deprecated 已被 HeroSkillText.ts(heroInfo 内联 desc 模板驱动)取代。 +* 本文件暂时保留兼容旧 UI 引用(HerosListComp/CHeroComp/HeroBoxComp/HeroMoreCom/ +* SCardComp/ItemListComp/IBoxComp/EquipListComp/SinfoComp),待各面板迁移至 +* buildHeroSkillDesc / buildHeroSkillTierDesc 后移除。新代码请勿再引用本模块。 +* * 设计目标: * heroSet / SkillSet 中的 info / infos 仅作"基础备注",不再承担面板展示。 * 所有功能性描述(触发技能、驻场光环、复活、等级额外属性加成)统一由本模块 @@ -30,7 +35,7 @@ */ import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, resolveSkillOverrides, getGroupedTriggerName, getFieldSkillName, getReviveSkillName, HGrowType, calcGrowBonus, HSkillInfo } from "./heroSet"; import { FieldSkillSet, mergeSkillParams, SkillConfig, SkillKind, SkillOverrides, SkillSet, TGroup } from "./SkillSet"; -import { FieldDescSet, FieldValueFmt, SkillDescSet } from "./SkillDescSet"; +import { FieldDescSet, FieldValueFmt, SkillDescSet, SkillDescConfig } from "./SkillDescSet"; import { BuffList } from "./BuffSet"; import { Attrs } from "./HeroAttrs"; import { CardConfig } from "./CardSet"; @@ -203,8 +208,8 @@ function makeLine(head: string, rendered: string): ISkillLine { * overrides 仅给 timed_buff_id 而未覆写 buff_value / buff_duration 时, * 从 BuffList[timed_buff_id] 取默认值,保证 1 级基础档文案完整。 */ -function buildEffectLine(head: string, skill: SkillConfig): ISkillLine { - const desc = SkillDescSet[skill.uuid]; +function buildEffectLine(head: string, skill: SkillConfig, descOverride?: SkillDescConfig): ISkillLine { + const desc = descOverride ?? SkillDescSet[skill.uuid]; // 未入表技能回退基础备注 info,无法抽出数值,整行不高亮 if (!desc) return { prefix: `${head}${String(skill.info ?? "")}`, value: "", suffix: "" }; @@ -541,6 +546,24 @@ export function buildSingleSkillRich(skillUuid: number, overrides?: SkillOverrid return cdTag ? `${nameTag} ${cdTag}\n${effect}` : `${nameTag}\n${effect}`; } +/** + * 单个技能纯效果富文本(SInfo 提升面板用):不含技能名与 Lv 前缀,仅输出效果描述。 + * @param skillUuid SkillSet 技能 UUID + * @param overrides 可选覆写参数 + * @param desc 可选 SkillDescConfig(heroSet 技能项自带说明,优先于 SkillDescSet) + * @returns 单行富文本串:如 "造成攻击力250%的伤害" + */ +export function buildEffectOnlyRich(skillUuid: number, overrides?: SkillOverrides, desc?: SkillDescConfig): string { + const base = SkillSet[skillUuid]; + if (!base) return "未知技能"; + const skill = mergeSkillParams(base, overrides); + const line = buildEffectLine("", skill, desc); + const prefix = line.prefix.replace(SKILL_NAME_PATTERN, (m, g1) => skillNameRich(g1)); + return line.value + ? `${prefix}${valueRich(line.value)}${line.suffix}` + : `${prefix}${line.suffix}`; +} + /** * 装备/驻场光环详情富文本:展示全部词条,数值绿色高亮。 * @param entries 驻场光环词条数组(uuid 指向 FieldSkillSet 底座,value 为生效数值) diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 707d054d..0b2f3372 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -328,6 +328,8 @@ export interface HSkillInfo { cd: number; // 技能cd ccd: number; // 占位当前cd,用于cd计时 overrides?: SkillOverrides; // 角色专属参数覆盖(全等级生效,作为底) + /** 技能描述模板(基础档):占位符 {target}/{dur}/{技能字段名},由 HeroSkillText 渲染合并后实时数值 */ + desc?: string; lv_entries?: LvSkillEntry[]; // 按英雄等级分档(按 lv 升序,运行时取 ≤英雄等级 的最大档) } @@ -339,6 +341,8 @@ export interface LvSkillEntry { lv: number; // 达到该英雄等级时此档生效 s_lv?: SkillLv; // 此档对应的技能等级(标注用) overrides: SkillOverrides; // 此档注入的效果 + /** 此档描述模板:缺省继承上一档模板;新增机制的档位(如附加中毒)需单独配置 */ + desc?: string; } /** @@ -351,6 +355,8 @@ export interface LvTriggerEntry { name?: string; // 该 s_uuid 触发技能组的对外展示名(写在第 1 档,作为组名) t_num: number; overrides?: SkillOverrides; + /** 此档描述模板:缺省回退该组第 1 档 desc;由 HeroSkillText 渲染合并后实时数值 */ + desc?: string; } /** @@ -411,21 +417,22 @@ export const HeroInfo: Record = { uuid: 5001, name: "紫电魔女", path: "hm1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def, skills: { // 普攻:紫魔球底座 + overrides 注入麻痹 - 6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 } }, + 6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,{para}%概率麻痹目标" }, // 大招:大能量波,独立 cd,按英雄等级分档成长 6203: { uuid: 6203, name: "能量波", lv: 1, cd: 8, ccd: 0, overrides: { ap: 250, bck: 30, para: 40, summon_count: 1 }, + desc: "释放{summon_count}道能量波,对{target}造成攻击力{ap}%伤害,击退{bck},{para}%概率麻痹", lv_entries: [ { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 250, bck: 60, para: 40, summon_count: 1 } }, - { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 300, bck: 90, timed_buff_id: 7005, para: 50, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7025, para: 70, summon_count: 3 } }, + { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 300, bck: 90, timed_buff_id: 7005, para: 50, summon_count: 2 }, desc: "释放{summon_count}道能量波,对{target}造成攻击力{ap}%伤害,击退{bck},{para}%概率麻痹,并使目标中毒(每0.5秒受到{buff_value}点毒伤,持续{dur}秒)" }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7025, para: 70, summon_count: 3 }, desc: "释放{summon_count}道能量波,对{target}造成攻击力{ap}%伤害,击退{bck},{para}%概率麻痹,并使目标麻痹{dur}秒(技能CD减速50%)" }, ], }, }, atking: { 6010: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "雷霆万钧", t_num: 3, overrides: { para: 100 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "雷霆万钧", t_num: 3, overrides: { para: 100 }, desc: "释放紫魔球轰击{target},{para}%概率麻痹目标" }, ], }, field: [ @@ -437,21 +444,22 @@ export const HeroInfo: Record = { 5002: { uuid: 5002, name: "刀刀暴击", path: "hk2", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 15, def: HERO_ROLE_BASE[HRole.Warrior].def, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" }, // 大招:光闪,独立 cd,按英雄等级分档成长 6100: { uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: { ap: 150 }, + desc: "斩出光闪,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7007 } }, - { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, hit_count: 8, num: 1 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 360, bck: 50 } }, + { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7007 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" }, + { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, hit_count: 8, num: 1 }, desc: "斩出光闪,对{target}连击{hit_count}次,每次造成攻击力{ap}%伤害,并双发{num}次" }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 360, bck: 50 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害,并击退{bck}" }, ], }, }, atking: { 6004: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "致命节奏", t_num: 3, overrides: { crt: 30 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "致命节奏", t_num: 3, overrides: { crt: 30 }, desc: "释放斩击,{crt}%概率造成暴击" }, ], }, field: [ @@ -463,26 +471,27 @@ export const HeroInfo: Record = { 5003: { uuid: 5003, name: "格挡反杀", path: "hk4", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 10, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 5, def: HERO_ROLE_BASE[HRole.Warrior].def + 5, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥刀对{target}造成攻击力{ap}%伤害" }, // 大招:闪电斩,独立 cd,按英雄等级分档成长 6103: { uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: { ap: 150, para: 40, summon_count: 1 }, + desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹", lv_entries: [ - { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006, para: 40, summon_count: 1 } }, + { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006, para: 40, summon_count: 1 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标攻击力{buff_value}%(持续{dur}秒)" }, { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, timed_buff_id: 7006, buff_value: -15, para: 50, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, hit_count: 6, bck: 40, para: 60, summon_count: 3 } }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, hit_count: 6, bck: 40, para: 60, summon_count: 3 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害(命中{hit_count}次),{para}%概率麻痹,击退{bck}" }, ], }, }, atked: { 6301: [ - { lv: 5, s_lv: SkillLv.Lv1, name: "罗生门", t_num: 4, overrides: { TGroup: TGroup.Self, ap: 2 } }, + { lv: 5, s_lv: SkillLv.Lv1, name: "罗生门", t_num: 4, overrides: { TGroup: TGroup.Self, ap: 2 }, desc: "{target}获得{ap}次格挡护盾" }, ], }, fstart: { 6200: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "三十六烦恼凤", t_num: 1, overrides: { ap: 500 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "三十六烦恼凤", t_num: 1, overrides: { ap: 500 }, desc: "入场释放剑气,对{target}造成攻击力{ap}%伤害" }, ], }, field: [ @@ -494,21 +503,22 @@ export const HeroInfo: Record = { 5004: { uuid: 5004, name: "冻住不谢", path: "hm2", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp, ap: HERO_ROLE_BASE[HRole.Mage].ap + 5, def: HERO_ROLE_BASE[HRole.Mage].def + 5, skills: { - 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "射出寒冰珠,对{target}造成攻击力{ap}%伤害" }, // 大招:大能量波,独立 cd,按英雄等级分档成长 6203: { uuid: 6203, name: "能量波", lv: 1, cd: 8, ccd: 0, overrides: { ap: 150, summon_count: 1 }, + desc: "释放能量波,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, frz: 15, summon_count: 1 } }, - { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, frz: 30, hit_count: 8, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, timed_buff_id: 7003, summon_count: 3 } }, + { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, frz: 15, summon_count: 1 }, desc: "释放能量波,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻" }, + { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, frz: 30, hit_count: 8, summon_count: 2 }, desc: "释放能量波,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻,命中{hit_count}次" }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, timed_buff_id: 7003, summon_count: 3 }, desc: "释放{summon_count}道能量波,对{target}造成攻击力{ap}%伤害,并冰冻目标{dur}秒" }, ], }, }, atking: { 6009: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "霜寒之触", t_num: 3, overrides: { timed_buff_id: 7003 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "霜寒之触", t_num: 3, overrides: { timed_buff_id: 7003 }, desc: "释放寒气,冰冻{target}{dur}秒" }, ], }, field: [ @@ -520,11 +530,12 @@ export const HeroInfo: Record = { 5005: { uuid: 5005, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 20, ap: HERO_ROLE_BASE[HRole.Tank].ap, def: HERO_ROLE_BASE[HRole.Tank].def + 10, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥剑对{target}造成攻击力{ap}%伤害" }, // 大招位辅助技能:护盾,按英雄等级分档成长(护盾层数) 6301: { uuid: 6301, name: "叠甲", lv: 1, cd: 8, ccd: 0, overrides: { TGroup: TGroup.Self, ap: 3, summon_count: 1 }, + desc: "{target}获得{ap}次格挡护盾", lv_entries: [ { lv: 3, s_lv: SkillLv.Lv2, overrides: { TGroup: TGroup.Self, ap: 5, summon_count: 1 } }, { lv: 5, s_lv: SkillLv.Lv3, overrides: { TGroup: TGroup.Self, ap: 6, summon_count: 2 } }, @@ -534,17 +545,17 @@ export const HeroInfo: Record = { }, atked: { 6004: [ - { lv: 5, s_lv: SkillLv.Lv1, name: "反击减攻", t_num: 4, overrides: { timed_buff_id: 7006 } }, + { lv: 5, s_lv: SkillLv.Lv1, name: "反击减攻", t_num: 4, overrides: { timed_buff_id: 7006 }, desc: "反击使攻击者攻击力{buff_value}%,持续{dur}秒" }, ], }, fstart: { 6412: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "铁壁壁垒", t_num: 1, overrides: { TGroup: TGroup.Team, ap: 50 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "铁壁壁垒", t_num: 1, overrides: { TGroup: TGroup.Team, ap: 50 }, desc: "{target}防御提升{ap}点" }, ], }, dead: { 6302: [ - { lv: 7, s_lv: SkillLv.Lv1, name: "死亡缠绕", t_num: 1, overrides: { TGroup: TGroup.Ally, ap: 200 } }, + { lv: 7, s_lv: SkillLv.Lv1, name: "死亡缠绕", t_num: 1, overrides: { TGroup: TGroup.Ally, ap: 200 }, desc: "死亡时为{target}回复攻击力{ap}%生命" }, ], }, field: [ @@ -560,26 +571,27 @@ export const HeroInfo: Record = { 5006: { uuid: 5006, name: "光明奶爸", path: "hh1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 15, ap: HERO_ROLE_BASE[HRole.Support].ap, def: HERO_ROLE_BASE[HRole.Support].def + 10, skills: { - 6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0 }, + 6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, desc: "投掷药瓶,对{target}造成攻击力{ap}%伤害" }, // 大招:治疗,独立 cd,按英雄等级分档成长 6302: { uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: { TGroup: TGroup.Team, ap: 300, summon_count: 1 }, + desc: "为{target}回复攻击力{ap}%生命", lv_entries: [ { lv: 3, s_lv: SkillLv.Lv2, overrides: { TGroup: TGroup.Team, ap: 400, summon_count: 1 } }, { lv: 5, s_lv: SkillLv.Lv3, overrides: { TGroup: TGroup.Team, ap: 450, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { TGroup: TGroup.Team, ap: 450, timed_buff_id: 7010, summon_count: 3 } }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { TGroup: TGroup.Team, ap: 450, timed_buff_id: 7010, summon_count: 3 }, desc: "为{target}回复攻击力{ap}%生命,并附加再生(每0.5秒回复{buff_value}点生命,持续{dur}秒)" }, ], }, }, atking: { 6302: [ - { lv: 5, s_lv: SkillLv.Lv1, name: "圣洁之锤", t_num: 3, overrides: { TGroup: TGroup.Self, ap: 100 } }, + { lv: 5, s_lv: SkillLv.Lv1, name: "圣洁之锤", t_num: 3, overrides: { TGroup: TGroup.Self, ap: 100 }, desc: "释放圣光,为{target}回复攻击力{ap}%生命" }, ], }, fstart: { 6412: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "圣光庇佑", t_num: 1, overrides: { TGroup: TGroup.Team, ap: 30 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "圣光庇佑", t_num: 1, overrides: { TGroup: TGroup.Team, ap: 30 }, desc: "{target}防御提升{ap}点" }, ], }, field: [ @@ -591,21 +603,22 @@ export const HeroInfo: Record = { 5007: { uuid: 5007, name: "微醺战神", path: "hk3", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 15, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 10, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥拳对{target}造成攻击力{ap}%伤害" }, // 大招:气斩,独立 cd,按英雄等级分档成长 6101: { uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: { ap: 150, summon_count: 1 }, + desc: "斩出气刃,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7002, summon_count: 1 } }, - { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, bck: 60, timed_buff_id: 7002, buff_value: 20, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 220, bck: 80, summon_count: 3 } }, + { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7002, summon_count: 1 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)" }, + { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, bck: 60, timed_buff_id: 7002, buff_value: 20, summon_count: 2 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 220, bck: 80, summon_count: 3 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck}" }, ], }, }, atking: { 6004: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 }, desc: "重击{target},击退{bck}" }, ], }, // card_lv 3:lv9 无光环,改为基础属性+50% @@ -617,21 +630,22 @@ export const HeroInfo: Record = { 5008: { uuid: 5008, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Melee, grow_type: HGrowType.Warrior, role: HRole.Warrior, hp: HERO_ROLE_BASE[HRole.Warrior].hp + 5, ap: HERO_ROLE_BASE[HRole.Warrior].ap + 20, def: HERO_ROLE_BASE[HRole.Warrior].def, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" }, // 大招:开山斧,独立 cd,按英雄等级分档成长 6104: { uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: { ap: 300, summon_count: 1 }, + desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害", lv_entries: [ - { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 300, stun: 20, summon_count: 1 } }, - { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 350, stun: 35, hit_count: 8, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7004, summon_count: 3 } }, + { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 300, stun: 20, summon_count: 1 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,{stun}%概率击晕" }, + { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 350, stun: 35, hit_count: 8, summon_count: 2 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,{stun}%概率击晕,命中{hit_count}次" }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7004, summon_count: 3 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,并击晕目标{dur}秒" }, ], }, }, atking: { 6004: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "火眼金睛", t_num: 3, overrides: { crt: 25 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "火眼金睛", t_num: 3, overrides: { crt: 25 }, desc: "释放斩击,{crt}%概率造成暴击" }, ], }, field: [ @@ -643,27 +657,28 @@ export const HeroInfo: Record = { 5009: { uuid: 5009, name: "铁壳斧弟", path: "hc1", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Melee, grow_type: HGrowType.Tank, role: HRole.Tank, hp: HERO_ROLE_BASE[HRole.Tank].hp + 10, ap: HERO_ROLE_BASE[HRole.Tank].ap + 5, def: HERO_ROLE_BASE[HRole.Tank].def + 15, skills: { - 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 }, + 6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, desc: "挥斧对{target}造成攻击力{ap}%伤害" }, // 大招:气斩,独立 cd,按英雄等级分档成长 6101: { uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: { ap: 150, summon_count: 1 }, + desc: "斩出气刃,对{target}造成攻击力{ap}%伤害", lv_entries: [ { lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 180, summon_count: 1 } }, { lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 200, summon_count: 2 } }, - { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 220, bck: 40, summon_count: 3 } }, + { lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 220, bck: 40, summon_count: 3 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck}" }, ], }, }, atking: { 6302: [ - { lv: 5, s_lv: SkillLv.Lv1, name: "嗜血战斧", t_num: 4, overrides: { TGroup: TGroup.Self, ap: 120 } }, + { lv: 5, s_lv: SkillLv.Lv1, name: "嗜血战斧", t_num: 4, overrides: { TGroup: TGroup.Self, ap: 120 }, desc: "释放嗜血斩击,为{target}回复攻击力{ap}%生命" }, ], }, atked: { // 坚硬皮肤:借 6513 防御爆发底座注入 7023 防御强化(+50%,可无限叠层) 6513: [ - { lv: 2, s_lv: SkillLv.Lv1, name: "坚硬皮肤", t_num: 2, overrides: { TGroup: TGroup.Self, timed_buff_id: 7023, buff_duration: 10 } }, + { lv: 2, s_lv: SkillLv.Lv1, name: "坚硬皮肤", t_num: 2, overrides: { TGroup: TGroup.Self, timed_buff_id: 7023, buff_duration: 10 }, desc: "{target}防御提升{buff_value}%,持续{dur}秒" }, ], }, // card_lv 3:lv9 无光环,改为基础属性+50%