/** * @file SkillDescSet.ts * @description 技能描述结构化配置表(方案 B:独立描述表,纯 UI 用) * * 职责: * 为触发技能提供"结构化字段 + 占位符模板",供 HeroSkillDesc.buildSkillDesc * 在合并 overrides 后动态拼出效果文案。杜绝 SkillConfig.info 写死数值导致的 * "改数值忘改文案"漂移。 * * 关键设计: * - 与 SkillSet 同 key(skill uuid),但只覆盖需要描述的触发技能; * 普攻/怪物技能不入表,由生成器回退旧 info 兜底。 * - 数值永远从 mergeSkillParams 后的实时 skill 取值(permField/timedField), * overrides 改了数值,文案自动同步。 * - 永久模式(overrides 直接改写 ap 等)与计时模式(overrides 走 timed_buff_id) * 分别用 templPerm / templTimed 两套模板。 * * 模板占位符: * {target} 目标(自身/随机N名队友/全体友方/敌方) * {value} 取值(来自 permField 或 timedField 指向的字段) * {unit} 单位(""/%/次) * {verb} 效果动词(攻击力/暴击率/护盾…) * {dur} 持续时间秒数(计时模式用,取 buff_duration) */ import { FieldSkillType, SkillOverrides } from "./SkillSet"; /** * 单个技能的结构化描述配置 */ export interface SkillDescConfig { /** 效果动词,如 "攻击力"/"暴击率"/"护盾" */ verb: string; /** 单位,如 ""/"%"/"次" */ unit: string; /** 永久模式取值字段(overrides 直接改写的字段),通常 "ap" */ permField: keyof SkillOverrides; /** 计时模式取值字段(overrides 走 timed_buff_id 时),通常 "buff_value" */ timedField?: keyof SkillOverrides; /** 永久模式文案模板 */ templPerm: string; /** 计时模式文案模板(含 {dur}),不填则该技能不支持计时模式 */ templTimed?: string; } /** * 技能描述表,key = SkillSet 的技能 uuid * 首批覆盖现役英雄涉及的触发技能;未入表技能由生成器回退 skill.info */ export const SkillDescSet: Record = { // 6301 护盾:ap = 可格挡次数 6301: { verb: "", unit: "次", permField: "ap", templPerm: "{target}获得{value}{unit}格挡护盾", }, // 6302 治疗:ap = 攻击力百分比 6302: { verb: "", unit: "", permField: "ap", templPerm: "{target}回复攻击力{value}%生命", }, // 6401 攻击强化:永久 ap=攻击点;计时 buff_value=攻击点 6401: { verb: "攻击力", unit: "", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}+{value}", templTimed: "{target}{verb}+{value},持续{dur}秒", }, // 6402 生命强化:ap = 最大生命点 6402: { verb: "最大生命", unit: "", permField: "ap", templPerm: "{target}{verb}+{value}", }, // 6403 暴击强化:永久 ap=暴击%;计时 buff_value=暴击% 6403: { verb: "暴击率", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}+{value}{unit}", templTimed: "{target}{verb}+{value}{unit},持续{dur}秒", }, // 6404 暴伤强化:ap = 暴击伤害% 6404: { verb: "暴击伤害", unit: "%", permField: "ap", templPerm: "{target}{verb}+{value}{unit}", }, // 6405 击晕强化:ap = 击晕概率% 6405: { verb: "击晕概率", unit: "%", permField: "ap", templPerm: "{target}{verb}+{value}{unit}", }, // 6408 穿刺强化:ap = 穿刺概率% 6408: { verb: "穿刺概率", unit: "%", permField: "ap", templPerm: "{target}{verb}+{value}{unit}", }, // 6409 风怒强化:ap = 风怒次数 6409: { verb: "风怒次数", unit: "次", permField: "ap", templPerm: "{target}{verb}+{value}{unit}", }, // 6501 复活:ap = 复活生命值百分比 6501: { verb: "", unit: "", permField: "ap", templPerm: "{target}以{value}%生命复活", }, // ==================== 技能商店范围攻击卡(6201-6206):ap = 单段伤害 ==================== // 注:暴击/冰冻/击晕/击退等附加概率由 buildCardDescRich 扫描 crt/frz/stun/bck 动态追加,不在模板写死 6201: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, 6202: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, 6203: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, 6204: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, 6205: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, 6206: { verb: "", unit: "", permField: "ap", templPerm: "每段造成{value}点伤害", }, // ==================== 计时性强化技能(6502-6511,药水底座,走 timed_buff_id) ==================== // 数值取自 BuffList 默认修饰值或药水卡 overrides.buff_value,持续时间取 BuffList.duration 6502: { verb: "", unit: "", permField: "ap", timedField: "buff_value", templPerm: "{target}回复生命", templTimed: "{target}每秒回复{value}点生命,持续{dur}秒", }, 6503: { verb: "攻击力提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6504: { verb: "暴击率提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6505: { verb: "击退概率提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6506: { verb: "穿透概率提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6507: { verb: "攻击速度提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6508: { verb: "风怒概率提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6509: { verb: "击晕概率提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6510: { verb: "击晕抗性提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, 6511: { verb: "冰冻抗性提升", unit: "%", permField: "ap", timedField: "buff_value", templPerm: "{target}{verb}{value}{unit}", templTimed: "{target}{verb}{value}{unit},持续{dur}秒", }, }; /** * 驻场光环数值格式:比例型(value 0.1 → +10%)或整数型(value 1 → +1) */ export enum FieldValueFmt { /** 比例:value*100 取整 + "%"(如 0.1 → "+10%") */ Percent = 1, /** 整数:直接 +N(如 1 → "+1") */ Int = 2, /** 整数减:直接 -N(如 1 → "-1",用于费用减免) */ IntMinus = 3, } /** * 单个驻场光环的结构化描述配置(文字表达标准层统一称谓) */ export interface FieldDescConfig { /** 效果动词,如 "英雄攻击力"/"召唤触发技能次数" */ verb: string; /** 数值格式(决定 value 如何渲染为高亮片段) */ fmt: FieldValueFmt; } /** * 驻场光环描述表,key = FieldSkillType。 * 数值永远取 FieldSkillConfig.value 实时渲染,替代手写 info,杜绝漂移。 */ export const FieldDescSet: Record = { [FieldSkillType.SummonCount]: { verb: "召唤触发技能次数", fmt: FieldValueFmt.Int }, [FieldSkillType.DeadCount]: { verb: "死亡触发技能次数", fmt: FieldValueFmt.Int }, [FieldSkillType.StartCount]: { verb: "战斗开始触发技能次数", fmt: FieldValueFmt.Int }, [FieldSkillType.EndCount]: { verb: "战斗结束触发技能次数", fmt: FieldValueFmt.Int }, [FieldSkillType.WaveGold]: { verb: "每回合金币收益", fmt: FieldValueFmt.Int }, [FieldSkillType.SellGold]: { verb: "卖出英雄金币", fmt: FieldValueFmt.Int }, [FieldSkillType.WaveHeal]: { verb: "战斗结束生命回复量", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroAtk]: { verb: "英雄攻击力", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroStun]: { verb: "英雄击晕概率", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroCrit]: { verb: "英雄暴击率", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroCritDamage]: { verb: "英雄暴击伤害", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroSpeed]: { verb: "英雄攻击速度", fmt: FieldValueFmt.Percent }, [FieldSkillType.BuyDiscount]: { verb: "购买卡牌费用", fmt: FieldValueFmt.IntMinus }, [FieldSkillType.RefreshDiscount]: { verb: "刷新卡牌费用", fmt: FieldValueFmt.IntMinus }, [FieldSkillType.HeroHp]: { verb: "英雄最大生命", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroWindFury]: { verb: "英雄风怒概率", fmt: FieldValueFmt.Percent }, [FieldSkillType.HeroPuncture]: { verb: "英雄穿刺概率", fmt: FieldValueFmt.Percent }, [FieldSkillType.AtkCount]: { verb: "攻击触发技能次数", fmt: FieldValueFmt.Int }, [FieldSkillType.BeAtkCount]: { verb: "被攻击触发技能次数", fmt: FieldValueFmt.Int }, };