refactor(skillDesc): 重构技能描述系统,统一技能命名规则

1.  移除旧的TriggerSkillNameSet,改为从HeroInfo配置读取技能展示名
2.  新增buildSkillTierDescRich方法,实现技能等级分段展示
3.  废弃heroInfo.infos字段,使用动态生成的技能描述替代
4.  新增技能名配置字段,统一主技能和触发技能的展示逻辑
This commit is contained in:
pan
2026-08-27 10:56:37 +08:00
parent 1375712f90
commit 04835e29f6
2 changed files with 227 additions and 198 deletions

View File

@@ -28,7 +28,7 @@
* - SkillDescSet:结构化描述模板
* - FieldSkillSet(驻场技能)、BuffList(计时 buff 默认值兜底)、Attrs(属性枚举)
*/
import { SkillTriggerName, SkillTriggerType, TriggerGrouped, LvTriggerEntry, LvFieldEntry, LvReviveEntry, LvBonusEntry, FieldEntry, resolveTriggerByLv, resolveFieldByLv, resolveReviveByLv, resolveSkillOverrides, getTriggerSkillName, HGrowType, calcGrowBonus, HSkillInfo } from "./heroSet";
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 { BuffList } from "./BuffSet";
@@ -383,7 +383,7 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho
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}」 ` : "";
const nameSeg = showName ? `「${hSkill.name ?? base.name}」 ` : "";
lines.push(buildEffectLine(`Lv${sLv}: ${nameSeg}`, skill));
}
}
@@ -404,8 +404,8 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho
if (!base) continue;
const skill = mergeSkillParams(base, item.overrides);
const trigger = needCount ? `${name}×${item.t_num}` : name;
// 触发语境专属名称(如 atked.6301=不屈壁垒),未配置回退通用名
const nameSeg = showName ? `「${getTriggerSkillName(key, item.s_uuid)}」 ` : "";
// 触发技能名走 HeroInfo 语境配置(如 atked.6301=不屈壁垒),未配置回退 SkillSet 内部名
const nameSeg = showName ? `「${getGroupedTriggerName(grouped, item.s_uuid)}」 ` : "";
lines.push(buildEffectLine(`${trigger}:${nameSeg}`, skill));
}
continue;
@@ -418,7 +418,7 @@ function buildSkillLines(source: ISkillDescSource, showName: boolean = true, sho
const base = SkillSet[Number(sKey)];
if (!base) continue;
const sorted = [...entries].sort((a, b) => a.lv - b.lv);
const nameSeg = showName ? `「${getTriggerSkillName(key, Number(sKey))}」 ` : "";
const nameSeg = showName ? `「${getGroupedTriggerName(grouped, Number(sKey))}」 ` : "";
const headOf = (e: LvTriggerEntry) => `Lv${e.lv}: ${needCount ? `${name}×${e.t_num}` : name} ${nameSeg}`;
// 取当前等级生效档(≤lv 的最大档)
@@ -602,7 +602,7 @@ export function buildSkillDescMoreRich(source: ISkillDescSource, showName: boole
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}: `;
const head = showName ? `「${hSkill.name ?? base.name}」 Lv.${sLv}: ` : `Lv.${sLv}: `;
lines.push(effectRich(buildEffectLine(head, skill)));
}
}
@@ -620,8 +620,8 @@ export function buildSkillDescMoreRich(source: ISkillDescSource, showName: boole
const base = SkillSet[sUuid];
if (!base) continue;
const sorted = [...entries].sort((a, b) => a.lv - b.lv);
// 技能名走触发语境专属命名(如 atked.6301=不屈壁垒)
const skillName = getTriggerSkillName(key, sUuid);
// 技能名走 HeroInfo 触发语境配置(如 atked.6301=不屈壁垒)
const skillName = getGroupedTriggerName(grouped, sUuid);
// 当前生效档(≤lv 最大档),未激活则用最低档
let activeIdx = -1;
@@ -645,7 +645,7 @@ export function buildSkillDescMoreRich(source: ISkillDescSource, showName: boole
const fieldEntries = source[SkillTriggerType.Field] as LvFieldEntry[] | undefined;
if (fieldEntries?.length) {
for (const entry of resolveFieldByLv(fieldEntries, lv)) {
const baseName = getTriggerSkillName(SkillTriggerType.Field, entry.uuid);
const baseName = getFieldSkillName(entry.uuid);
const line = buildFieldLine("", entry, showName, baseName);
if (line) lines.push(effectRich(line));
}
@@ -655,7 +655,7 @@ export function buildSkillDescMoreRich(source: ISkillDescSource, showName: boole
// 血量百分比来自 SkillSet[s_uuid].ap(运行时口径),upr 是每级追加次数,不在此展示
const revive = resolveReviveByLv(source[SkillTriggerType.Revive] as LvReviveEntry[] | undefined, lv);
if (revive) {
const reviveName = getTriggerSkillName(SkillTriggerType.Revive, revive.s_uuid);
const reviveName = getReviveSkillName();
const reviveHpPct = SkillSet[revive.s_uuid]?.ap ?? 50;
lines.push(showName
? `${skillNameRich(reviveName)}: 每回合拥有${valueRich(revive.r_num)}次重生机会, 死亡后以${valueRich(`${Math.round(reviveHpPct)}%`)}血量原地重生`
@@ -757,3 +757,164 @@ export function buildCardDescRich(card: CardConfig): string {
return card.info || "";
}
/* =====================================================================================
* 按技能等级分段说明(升级引导 / 图鉴逐档预览)
*
* 与 buildSkillDesc(当前等级)/ buildSkillDescRich(全档位合并单行)并列的第三种模式:
* 每个技能按等级档位逐段输出 —— 技能 Lv1 给完整能力+数值,Lv2 起只给相对上一级的
* 「数值漂移 + 新功能」,让玩家一眼看清每一级"多得到了什么"。
* ===================================================================================*/
/** 参与"新功能/数值漂移"对比的展示字段(排除动画/弹道/特效等玩家无感字段) */
const DIFF_DISPLAY_KEYS: (keyof SkillOverrides)[] = [
"ap", "hit_count", "num", "summon_count", "crt", "frz", "stun", "para",
"bck", "bck_chance", "timed_buff_id", "buff_value", "buff_duration",
];
/** 概率/次数类展示字段的单位与称谓(新功能标记 + 数值漂移描述共用) */
const DIFF_FIELD_META: Partial<Record<keyof SkillOverrides, { label: string; unit: string }>> = {
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: "秒" },
};
/** 一个技能的等级档位(统一普攻 lv_entries 与触发技能 LvTriggerEntry 两种结构) */
interface ISkillTier {
/** 技能等级(展示用,取 s_lv,缺省按档位序号) */
sLv: number;
/** 该档生效的英雄等级(解锁提示) */
heroLv: number;
/** 合并底座后的完整技能配置 */
skill: SkillConfig;
}
/** 收集普攻/主技能的全部等级档位(按 sLv 升序)。Lv1=基础档(底+基础 overrides),Lv2+=lv_entries 各档 */
function collectTiers(base: SkillConfig, baseOverrides: SkillOverrides | undefined,
entries: { lv: number; s_lv?: number; overrides?: SkillOverrides }[]): ISkillTier[] {
const tiers: ISkillTier[] = [];
// Lv1 = 基础档(底 + 基础 overrides)
const lv1Entry = entries.find(e => (e.s_lv ?? 0) === 1);
tiers.push({
sLv: lv1Entry?.s_lv ?? 1,
heroLv: lv1Entry?.lv ?? 1,
skill: mergeSkillParams(base, baseOverrides),
});
// Lv2+ = lv_entries 中 s_lv≥2 的档(与基础档浅合并,档位优先)
for (const e of entries) {
const sLv = e.s_lv ?? 0;
if (sLv < 2) continue;
tiers.push({ sLv, heroLv: e.lv, skill: mergeSkillParams(mergeSkillParams(base, baseOverrides), e.overrides) });
}
return tiers.sort((a, b) => a.sLv - b.sLv);
}
/** 相邻两档的 diff:数值漂移(ap 等差值)+ 新功能(上级没有的 timed_buff/暴击/冰冻等) */
function buildTierDiff(prev: SkillConfig, cur: SkillConfig): string[] {
const parts: string[] = [];
for (const key of DIFF_DISPLAY_KEYS) {
const pv = (prev[key as keyof SkillConfig] as number | undefined) ?? 0;
const cv = (cur[key as keyof SkillConfig] as number | undefined) ?? 0;
if (cv === pv) continue;
// 新功能:上级为 0/无,本档新增(含 timed_buff_id 新注入)
if (key === "timed_buff_id") {
if (cv > 0 && pv === 0) parts.push(`新增${valueRich("计时增益")}`);
continue;
}
const meta = DIFF_FIELD_META[key];
if (!meta) continue;
if (pv === 0 && cv > 0) {
parts.push(`新增${meta.label}${valueRich(`${cv}${meta.unit}`)}`);
} else {
const diff = cv - pv;
const sign = diff > 0 ? "+" : "";
parts.push(`${meta.label}${valueRich(`${sign}${diff}${meta.unit}`)}`);
}
}
return parts;
}
/** 单个技能的分段说明行(Lv1 完整 / Lv2+ diff),返回富文本行数组 */
function buildTierLines(name: string, tiers: ISkillTier[], headPrefix: string): string[] {
const lines: string[] = [];
for (let i = 0; i < tiers.length; i++) {
const t = tiers[i];
const head = `${skillNameRich(name)} ${valueRich(`Lv.${t.sLv}`)}${headPrefix}`;
if (i === 0) {
// 技能 1 级:完整能力 + 数值
const line = buildEffectLine("", t.skill);
const effect = `${line.prefix}${line.value ? valueRich(line.value) : ""}${line.suffix}`;
lines.push(`${head}: ${highlightDuration(effect)}`);
} else {
// 技能 2 级起:相对上一级的数值漂移 + 新功能
const diff = buildTierDiff(tiers[i - 1].skill, t.skill);
const unlock = t.heroLv > 1 ? `(英雄${valueRich(t.heroLv)}级解锁)` : "";
lines.push(diff.length > 0
? `${head}${unlock}: ${diff.join(",")}`
: `${head}${unlock}: 无变化`);
}
}
return lines;
}
/**
* 按技能等级分段输出说明(富文本)。
*
* 两种对外说明模式的第二种(第一种为 buildSkillDesc/buildSkillDescMoreRich 的"当前等级"模式):
* 每个技能逐档输出 —— Lv1 给完整能力与数值,Lv2 起给相对上一级的提升(数值漂移 + 新功能),
* 并标注解锁所需英雄等级。适合升级引导、图鉴逐档预览。
*
* @param source 英雄数据源(heroInfo 静态配置 或 HeroAttrsComp 运行时配置)
* @returns 多行富文本串,\n 分隔;按技能分组、组内按技能等级升序
*/
export function buildSkillTierDescRich(source: ISkillDescSource): string {
const lines: string[] = [];
// ---- 普攻/主技能(skills):lv_entries 分档 ----
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 entries = hSkill.lv_entries ?? [];
// 无分档的单档技能只出 Lv1 完整行
const tiers = collectTiers(base, hSkill.overrides, entries);
lines.push(...buildTierLines(hSkill.name ?? base.name, tiers, ""));
}
}
// ---- 触发技能(atking/atked/dead/fstart/call):LvTriggerEntry 分档 ----
for (const key of TRIGGER_KEYS) {
const grouped = source[key] as TriggerGrouped | undefined;
if (!grouped) continue;
const trigName = SkillTriggerName[key] ?? key;
const needCount = key === SkillTriggerType.Atking || key === SkillTriggerType.Atked;
for (const sKey in grouped) {
const entries = grouped[sKey];
if (!entries?.length) continue;
const base = SkillSet[Number(sKey)];
if (!base) continue;
const sorted = [...entries].sort((a, b) => (a.s_lv ?? 0) - (b.s_lv ?? 0));
const name = getGroupedTriggerName(grouped, Number(sKey));
// 触发技能以第 1 档为基础档,逐档 diff(t_num 变化并入新功能/数值漂移)
const tiers: ISkillTier[] = sorted.map((e, i) => ({
sLv: e.s_lv ?? (i + 1),
heroLv: e.lv,
skill: mergeSkillParams(base, e.overrides),
}));
const headPrefix = needCount && sorted[0] ? ` ${trigName}${valueRich(sorted[0].t_num)}次` : ` ${trigName}`;
lines.push(...buildTierLines(name, tiers, headPrefix));
}
}
return lines.join("\n");
}

View File

@@ -1,4 +1,4 @@
import { v3 } from "cc"
import { v3 } from "cc"
import { BoxSet, FacSet, FightSet } from "./GameSet"
import { SkillOverrides, TGroup, SkillSet, FieldSkillSet, SkillConfig, SkillKind, FieldSkillConfig, FieldSkillType, mergeSkillParams } from "./SkillSet"
import { BuffList, BuffConfig, ModOp } from "./BuffSet"
@@ -220,75 +220,37 @@ export enum SkillLv {
}
/**
* 触发技能标准命名表(按触发方式 → 技能ID 分组命名)。
* 同一技能在不同触发语境下使用不同名称,贴合流派语义:
* atked=战士反击系 / atking=刺客·射手追击系 / dead=死亡遗产系 / fstart=法师战吼系 / revive=涅槃。
* 命名参考主流 Roguelike/自走棋技能风格(盾墙、复仇、嗜血、战吼、遗志、凤凰涅槃等)。
* 触发技能对外命名规则:
* 英雄除普攻外的技能(atked/atking/dead/fstart/revive)命名统一收敛进各英雄 HeroInfo 配置
* (HSkillInfo.name 给普攻/主技能命名;LvTriggerEntry.name 给触发技能组命名,写在该组第 1 档)。
* 天赋由 TalentSet 自行命名;SkillSet.name 仅作内部底座代号,不直接对外展示。
*/
export const TriggerSkillNameSet: Record<string, Record<number, string>> = {
[SkillTriggerType.Atked]: {
6301: "不屈壁垒", // 受击获得护盾,越挨打越硬
6302: "嗜血反击", // 受击恢复生命
6401: "愈战愈勇", // 受击永久提升攻击
6402: "钢筋铁骨", // 受击永久提升生命
6403: "复仇之心", // 受击限时提升暴击
6404: "以牙还牙", // 受击限时提升暴伤
6405: "震慑反扑", // 受击限时提升击晕
},
[SkillTriggerType.Atking]: {
6301: "攻守兼备", // 攻击为自己叠加护盾
6302: "治愈祷言", // 攻击治疗低血队友
6401: "嗜血连击", // 攻击永久提升攻击(滚雪球)
6403: "致命节奏", // 攻击限时提升暴击
6404: "猎手直觉", // 攻击提升暴伤
},
[SkillTriggerType.Dead]: {
6301: "守护遗志", // 死亡全队获得护盾
6401: "英魂永驻", // 死亡全队提升攻击
6402: "生命馈赠", // 死亡全队提升生命
6403: "致命遗产", // 死亡全队提升暴击
6404: "破灭遗产", // 死亡全队提升暴伤
6405: "震撼遗言", // 死亡全队提升击晕
},
[SkillTriggerType.FStart]: {
6301: "圣光护盾", // 开局全队护盾
6401: "破晓战吼", // 开局全队攻击提升
6402: "活力祝福", // 开局全队生命提升
},
[SkillTriggerType.Revive]: {
6501: "凤凰涅槃", // 死亡后原地复活
},
// 驻场光环(field):英雄语境专属命名,名字直接带"光环"便于玩家理解
[SkillTriggerType.Field]: {
7002: "攻击光环", // 英雄攻击力提升
7003: "击晕光环", // 英雄击晕概率提升
7004: "暴击光环", // 英雄暴击率提升
7005: "暴伤光环", // 英雄暴击伤害提升
7006: "攻速光环", // 英雄攻击速度提升
7007: "生命光环", // 英雄最大生命提升
// 风怒机制已停用: 7008 风怒光环名称已移除
// 7008: "风怒光环", // 英雄风怒概率提升
7009: "穿刺光环", // 英雄穿刺概率提升
},
/**
* 查询触发技能组的对外展示名(英雄语境,来自 HeroInfo 配置)。
* @param grouped 触发技能分组配置(某英雄某触发类型的 TriggerGrouped)
* @param s_uuid 技能ID
* @returns 该组第 1 档 name;未配置时回退 SkillSet 内部名
*/
export function getGroupedTriggerName(grouped: TriggerGrouped | undefined, s_uuid: number): string {
const entries = grouped?.[s_uuid];
if (entries?.length && entries[0].name) return entries[0].name;
return SkillSet[s_uuid]?.name ?? "";
}
/**
* 查询触发技能在指定触发语境下的标准名称。
* @param type 触发类型(SkillTriggerType)
* @param s_uuid 技能ID
* @returns 语境专属名称;未配置时回退 SkillSet 通用名称
* 查询驻场光环词条的对外展示名(英雄语境,FieldSkillSet 底座名已自带"光环"后缀)。
* @param uuid 光环 uuid(指向 FieldSkillSet 底座)
*/
export function getTriggerSkillName(type: SkillTriggerType, s_uuid: number): string {
const group = TriggerSkillNameSet[type];
if (group) {
const direct = group[s_uuid];
if (direct) return direct;
}
// 驻场光环 uuid 存于 FieldSkillSet,触发技能存于 SkillSet,分别兜底
if (type === SkillTriggerType.Field) {
return FieldSkillSet[s_uuid]?.name ?? "";
}
return SkillSet[s_uuid]?.name ?? "";
export function getFieldSkillName(uuid: number): string {
return FieldSkillSet[uuid]?.name ?? "";
}
/**
* 查询复活技能的对外展示名(英雄语境,固定"凤凰涅槃")。
* 复活底座 6501 在英雄语境下统一为涅槃语义,不暴露 SkillSet 内部名。
*/
export function getReviveSkillName(): string {
return "凤凰涅槃";
}
/**
@@ -323,7 +285,10 @@ export interface heroInfo {
ap_bonus?: LvBonusEntry[]; // 额外攻击加成(按 lv 升序,运行时累加 ≤英雄等级 的所有档)
hp_bonus?: LvBonusEntry[]; // 额外生命加成(按 lv 升序,运行时累加 ≤英雄等级 的所有档)
info: string; // 描述文案
/** 分级能力说明,索引0=1级,依次递增;信息面板逐条展示各等级技能与能力 */
/**
* @deprecated 已废弃:无任何 UI/运行时读取。技能提升说明由 HeroSkillDesc 依据
* 结构化配置动态生成(含数值漂移与新功能),请勿再填充此字段。
*/
infos?: string[];
}
@@ -358,6 +323,7 @@ export const HeroCardPoolList: HeroCardPoolEntry[] = [];
*/
export interface HSkillInfo {
uuid: number; // 唯一标识(技能6000段等)
name?: string; // 对外展示的技能名(普攻/主技能);缺省时回退 SkillSet 内部名
lv: number; // 技能等级
cd: number; // 技能cd
ccd: number; // 占位当前cd,用于cd计时
@@ -382,6 +348,7 @@ export interface LvSkillEntry {
export interface LvTriggerEntry {
lv: number; // 达到该英雄等级时解锁此档
s_lv?: SkillLv; // 此档对应的技能等级(标注用,便于面板显示"技能Lv.x")
name?: string; // 该 s_uuid 触发技能组的对外展示名(写在第 1 档,作为组名)
t_num: number;
overrides?: SkillOverrides;
}
@@ -447,7 +414,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { ap: 100, para: 30 } },
// 大招:大能量波,独立 cd,按英雄等级分档成长
6203: {
uuid: 6203, lv: 1, cd: 8, ccd: 0,
uuid: 6203, name: "能量波", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 250, bck: 30, para: 40, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 250, bck: 60, para: 40, summon_count: 1 } },
@@ -458,23 +425,12 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6010: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { para: 100 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "雷霆万钧", t_num: 3, overrides: { para: 100 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7002, value: 0.15 }] },
],
infos: [
"解锁紫魔球:造成攻击力100%的伤害,30%概率麻痹",
"解锁能量波:对敌人造成攻击力250%的伤害并击退30,40%概率麻痹",
"电击精通:普攻每3次必定麻痹目标",
"能量波强化:击退提升至60",
"雷暴领域:能量波附带中毒,伤害300%且击退90,50%概率麻痹",
"—",
"雷霆万钧:能量波伤害400%,命中附加麻痹(70%概率)",
"—",
"魔女威压:全队攻击光环+15%",
],
info: "",
},
// 5002 刀刀暴击 — atking 暴击 + 大招 6100 光闪(出血/多段)+ 暴击/暴伤双光环(剑圣复刻)
@@ -484,7 +440,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:光闪,独立 cd,按英雄等级分档成长
6100: {
uuid: 6100, lv: 1, cd: 8, ccd: 0,
uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 150 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7007 } },
@@ -495,23 +451,12 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6004: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { crt: 30 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "致命节奏", t_num: 3, overrides: { crt: 30 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7004, value: 0.12 }, { uuid: 7005, value: 0.2 }] },
],
infos: [
"解锁攻击:造成攻击力100%的伤害",
"解锁光闪:对周围敌人造成攻击力150%的伤害",
"致命节奏:普攻每3次暴击强化(暴击+30)",
"刃之血:光闪附加出血",
"分身斩:光闪伤害180%,8命中并双发",
"—",
"剑刃风暴:光闪伤害360%并击退全体敌人50",
"—",
"剑圣之意:全队暴击光环+12%、暴伤光环+20%",
],
info: "",
},
// 5003 格挡反杀 — fstart 剑气 + atked 护盾 + 大招 6103 闪电斩(减攻)(剑豪复刻)
@@ -521,7 +466,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:闪电斩,独立 cd,按英雄等级分档成长
6103: {
uuid: 6103, lv: 1, cd: 8, ccd: 0,
uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 150, para: 40, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006, para: 40, summon_count: 1 } },
@@ -532,28 +477,17 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atked: {
6301: [
{ lv: 5, s_lv: SkillLv.Lv1, 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 } },
],
},
fstart: {
6200: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 1, overrides: { ap: 500 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "三十六烦恼凤", t_num: 1, overrides: { ap: 500 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7018, value: 1 }] },
],
infos: [
"解锁攻击:造成攻击力100%的伤害",
"解锁闪电斩:对周围敌人造成攻击力150%的伤害,40%概率麻痹",
"三十六烦恼凤:入场释放高伤剑气(攻击力500%)",
"闪电斩强化:命中降低敌方攻击",
"罗生门:受击每4次获得2层护盾,闪电斩伤害180%且减攻强化(50%概率麻痹)",
"—",
"炼狱鬼斩:闪电斩伤害200%,6命中并击退40(60%概率麻痹)",
"—",
"攻击强化:攻击触发技能次数+1",
],
info: "",
},
// 5004 冻住不谢 — atking 冰冻 + 大招 6203 大能量波(冰冻链)+ 击晕光环(巫妖王复刻)
@@ -563,7 +497,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6009: { uuid: 6009, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:大能量波,独立 cd,按英雄等级分档成长
6203: {
uuid: 6203, lv: 1, cd: 8, ccd: 0,
uuid: 6203, name: "能量波", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 150, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, frz: 15, summon_count: 1 } },
@@ -574,23 +508,12 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6009: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { timed_buff_id: 7003 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "霜寒之触", t_num: 3, overrides: { timed_buff_id: 7003 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7003, value: 0.1 }] },
],
infos: [
"解锁蓝魔球:造成攻击力100%的伤害",
"解锁能量波:直线能量伤害150%",
"霜寒之触:普攻每3次附加冰冻(≈33%概率)",
"霜冻连锁:能量波15%概率冰冻",
"连环霜冻:能量波冰冻30%,8命中且伤害180%",
"—",
"绝对零度:能量波伤害200%且命中必冰冻",
"—",
"冰霜领域:全队击晕光环+10%",
],
info: "",
},
// 5005 叠甲骑士 — 护盾大招 + fstart 防御 + dead 治疗 + revive 回光返照(黑暗骑士复刻)
@@ -600,7 +523,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招位辅助技能:护盾,按英雄等级分档成长(护盾层数)
6301: {
uuid: 6301, lv: 1, cd: 8, ccd: 0,
uuid: 6301, name: "叠甲", lv: 1, cd: 8, ccd: 0,
overrides: { TGroup: TGroup.Self, ap: 3, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { TGroup: TGroup.Self, ap: 5, summon_count: 1 } },
@@ -611,17 +534,17 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atked: {
6004: [
{ lv: 5, s_lv: SkillLv.Lv1, t_num: 4, overrides: { timed_buff_id: 7006 } },
{ lv: 5, s_lv: SkillLv.Lv1, name: "反击减攻", t_num: 4, overrides: { timed_buff_id: 7006 } },
],
},
fstart: {
6412: [
{ lv: 2, s_lv: SkillLv.Lv1, 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 } },
],
},
dead: {
6302: [
{ lv: 7, s_lv: SkillLv.Lv1, 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 } },
],
},
field: [
@@ -631,17 +554,6 @@ export const HeroInfo: Record<number, heroInfo> = {
revive: [
{ lv: 7, s_uuid: 6501, r_num: 1, upr: 0 },
],
infos: [
"解锁攻击与护盾:自身获得3层抵挡护盾",
"铁壁壁垒:入场全队防御+50",
"护盾强化:护盾层数提升至5",
"—",
"反击减攻:受击每4次附加减攻,护盾层数6",
"—",
"死亡缠绕+回光返照:死亡治疗最低血友军,濒死回血续命;护盾层数8",
"—",
"不朽甲胄:全队生命光环+15%、受击触发次数+1",
],
info: "",
},
// 5006 光明奶爸 — 治疗大招 + atking 自疗 + fstart 防御 + 生命光环(光明骑士复刻)
@@ -651,7 +563,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6012: { uuid: 6012, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0 },
// 大招:治疗,独立 cd,按英雄等级分档成长
6302: {
uuid: 6302, lv: 1, cd: 8, ccd: 0,
uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0,
overrides: { TGroup: TGroup.Team, ap: 300, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { TGroup: TGroup.Team, ap: 400, summon_count: 1 } },
@@ -662,28 +574,17 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6302: [
{ lv: 5, s_lv: SkillLv.Lv1, 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 } },
],
},
fstart: {
6412: [
{ lv: 2, s_lv: SkillLv.Lv1, 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 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7007, value: 0.15 }] },
],
infos: [
"解锁红药瓶:造成攻击力100%的伤害",
"解锁治疗:恢复全队生命(攻击力300%)",
"圣光庇佑:入场全队防御+30",
"治疗强化:治疗量提升至400%",
"圣洁之锤:攻击每3次自疗(攻击力100%),治疗量450%",
"—",
"生命灌注:治疗附带再生(持续回血)",
"—",
"光明领域:全队生命光环+15%",
],
info: "",
},
// 5007 微醺战神 — atking 击退 + 大招 6101 气斩(易伤),lv9 属性补偿(酒仙复刻)
@@ -693,7 +594,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:气斩,独立 cd,按英雄等级分档成长
6101: {
uuid: 6101, lv: 1, cd: 8, ccd: 0,
uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 150, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7002, summon_count: 1 } },
@@ -704,23 +605,12 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6004: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { bck: 40 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "雷霆一击", t_num: 3, overrides: { bck: 40 } },
],
},
// card_lv 3:lv9 无光环,改为基础属性+50%
ap_bonus: [{ lv: 9, value: 0.5 }],
hp_bonus: [{ lv: 9, value: 0.5 }],
infos: [
"解锁攻击:造成攻击力100%的伤害",
"解锁气斩:对周围敌人造成攻击力150%的伤害",
"雷霆一击:普攻每3次附加击退40",
"醉拳浸染:气斩附加易伤",
"酒劲上头:气斩伤害180%,击退60且易伤强化",
"—",
"醉里乾坤:气斩伤害220%,击退80",
"—",
"千杯不醉:基础攻击与生命+50%",
],
info: "",
},
// 5008 眩晕暴击哥 — atking 暴击 + 大招 6104 开山斧(击晕)+ 暴伤光环(齐天大圣复刻)
@@ -730,7 +620,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:开山斧,独立 cd,按英雄等级分档成长
6104: {
uuid: 6104, lv: 1, cd: 8, ccd: 0,
uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 300, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 300, stun: 20, summon_count: 1 } },
@@ -741,23 +631,12 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6004: [
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { crt: 25 } },
{ lv: 2, s_lv: SkillLv.Lv1, name: "火眼金睛", t_num: 3, overrides: { crt: 25 } },
],
},
field: [
{ lv: 9, uuids: [{ uuid: 7005, value: 0.25 }] },
],
infos: [
"解锁攻击:造成攻击力100%的伤害",
"解锁开山斧:劈向前方敌人造成攻击力300%的伤害",
"火眼金睛:普攻每3次暴击强化(暴击+25)",
"金箍棒影:开山斧20%概率击晕",
"大圣之怒:开山斧击晕35%,8命中且伤害350%",
"—",
"定海神针:开山斧伤害400%且命中必击晕",
"—",
"斗战胜意:全队暴伤光环+25%",
],
info: "",
},
// 5009 铁壳斧弟 — atked 叠防 + atking 自疗 + 大招 6101 气斩,lv9 属性补偿(斧小王复刻)
@@ -767,7 +646,7 @@ export const HeroInfo: Record<number, heroInfo> = {
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0 },
// 大招:气斩,独立 cd,按英雄等级分档成长
6101: {
uuid: 6101, lv: 1, cd: 8, ccd: 0,
uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0,
overrides: { ap: 150, summon_count: 1 },
lv_entries: [
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 180, summon_count: 1 } },
@@ -778,29 +657,18 @@ export const HeroInfo: Record<number, heroInfo> = {
},
atking: {
6302: [
{ lv: 5, s_lv: SkillLv.Lv1, 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 } },
],
},
atked: {
// 坚硬皮肤:借 6513 防御爆发底座注入 7023 防御强化(+50%,可无限叠层)
6513: [
{ lv: 2, s_lv: SkillLv.Lv1, 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 } },
],
},
// card_lv 3:lv9 无光环,改为基础属性+50%
ap_bonus: [{ lv: 9, value: 0.5 }],
hp_bonus: [{ lv: 9, value: 0.5 }],
infos: [
"解锁攻击:造成攻击力100%的伤害",
"解锁气斩:对周围敌人造成攻击力150%的伤害",
"坚硬皮肤:受击每2次叠加防御强化(持续10秒,可叠层)",
"气斩强化:伤害180%",
"嗜血战斧:攻击每4次自疗(攻击力120%),气斩伤害200%",
"—",
"奋力一掷:气斩伤害220%并击退40",
"—",
"铁壳觉醒:基础攻击与生命+50%",
],
info: "",
},