feat(map,hero): 实现英雄技能整组合并展示功能
重构英雄技能展示逻辑,支持将同一触发槽位的多个技能/光环词条合并为一个技能展示: 1. 新增触发组整组分档渲染接口,合并同槽位多技能档位数据 2. 新增组名获取函数,统一使用槽位首个自定义名称作为展示名 3. 调整图鉴面板技能列表,每个触发槽位仅展示一个合并后的图标 4. 升级技能弹窗渲染逻辑,支持整组模式下的合并说明展示 5. 优化注释与代码结构,统一技能展示口径
This commit is contained in:
@@ -14,6 +14,11 @@
|
||||
* 2. buildHeroSkillTierDesc(heroUuid, skillUuid) —— 指定技能各阶段说明:
|
||||
* slv1 给完整能力 + 激活英雄等级;slv2+ 给相对上一级的提升 + 解锁英雄等级
|
||||
*
|
||||
* 触发组口径:每个触发槽位(atking/dead/fstart/atked/call/field)整组视为一个技能,
|
||||
* 组内多个 s_uuid / 光环词条合并为一个名称(组内首个自定义名)与一套说明统一展示:
|
||||
* - buildHeroSkillDesc 中每组合并为一行(CHeroComp / HeroBoxComp 等直接消费)
|
||||
* - buildHeroGroupTierLines(heroUuid, slot) 供弹窗按整组分档渲染(SinfoComp)
|
||||
*
|
||||
* 占位符规范(模板作者可用,渲染时数值片段自动绿色高亮):
|
||||
* {target} 目标语义(自身/敌方/全体友方/N名队友…,与 SCastSystem 目标选取一致)
|
||||
* {dur} 计时 buff 持续秒数(buff_duration 优先,回退 BuffList 默认)
|
||||
@@ -24,9 +29,9 @@
|
||||
* 卡牌/道具语境描述见 config/CardSkillText.ts。
|
||||
*/
|
||||
import {
|
||||
HeroInfo, heroInfo, SkillTriggerType, SkillTriggerName, HSkillInfo, LvTriggerEntry,
|
||||
HeroInfo, heroInfo, SkillTriggerType, SkillTriggerName, HSkillInfo, LvTriggerEntry, FieldEntry,
|
||||
TriggerGrouped, resolveSkillOverrides, resolveTriggerByLv, resolveFieldByLv,
|
||||
getGroupedTriggerName, getFieldSkillName,
|
||||
getGroupedTriggerName, getFieldSkillName, getTriggerGroupName, getFieldGroupName,
|
||||
} from "./config/heroSet";
|
||||
import { SkillSet, mergeSkillParams, SkillConfig, SkillKind, TGroup, FieldSkillSet } from "./config/SkillSet";
|
||||
import { BuffList } from "./config/BuffSet";
|
||||
@@ -145,8 +150,9 @@ function getHeroDisplayLv(heroUuid: number, configLv: number, fac: FacSet): numb
|
||||
* 输出一:英雄当前局外等级下,全部技能最大生效档的完整说明(富文本)。
|
||||
*
|
||||
* 覆盖:普攻/大招(skills,resolve ≤lv 最大档)、5 类触发技能、驻场光环(field)、
|
||||
* 死亡触发(dead,含复活)。每行 = 「技能名」:(或「技能名」+ 触发语境)+ 模板渲染后的效果文本(数值高亮),
|
||||
* 不展示技能等级档号(当前档由英雄局外等级隐含决定)。
|
||||
* 死亡触发(dead,含复活)。触发槽位整组视为一个技能(组内多技能/词条合并为一行,
|
||||
* 组名取组内首个自定义名),普攻/大招仍逐技能一行。每行 = 「技能名」:(或「技能名」+
|
||||
* 触发语境)+ 模板渲染后的效果文本(数值高亮),不展示技能等级档号(当前档由英雄局外等级隐含决定)。
|
||||
*
|
||||
* Why 普攻默认隐藏:skills 首位为普攻(全英雄共有基础能力),展示场景通常只关心
|
||||
* 特色技能(大招/触发/光环),普攻行信息冗余;需要完整展示时传 showNormal=true。
|
||||
@@ -184,11 +190,16 @@ export function buildHeroSkillDesc(heroUuid: number, showName: boolean = true, s
|
||||
lines.push(head ? `${head}: ${text}` : text);
|
||||
}
|
||||
|
||||
// ---- 5 类标准触发技能:resolve 当前等级生效档 ----
|
||||
// ---- 5 类触发技能:每个触发槽位整组视为一个技能,组内多技能效果合并为一行 ----
|
||||
for (const type of TRIGGER_KEYS) {
|
||||
const grouped = hero[type] as TriggerGrouped | undefined;
|
||||
if (!grouped) continue;
|
||||
for (const item of resolveTriggerByLv(grouped, lv)) {
|
||||
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];
|
||||
if (!base) continue;
|
||||
const skill = mergeSkillParams(base, item.overrides);
|
||||
@@ -204,31 +215,40 @@ 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];
|
||||
lines.push(`${nameSeg(getGroupedTriggerName(grouped, item.s_uuid))}${trig}, ${text}`);
|
||||
parts.push(`${headOf(item.s_uuid)}${trig}, ${text}`);
|
||||
}
|
||||
// dead 组内的复活效果(revive_hp / revive_count)并入同一行
|
||||
if (type === SkillTriggerType.Dead) {
|
||||
for (const item of items) {
|
||||
const reviveHp = item.overrides?.revive_hp;
|
||||
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}`);
|
||||
}
|
||||
}
|
||||
if (parts.length === 0) continue;
|
||||
// 组名取组内首个自定义名(getTriggerGroupName)
|
||||
lines.push(`${nameSeg(getTriggerGroupName(hero, type))}${parts.join(";")}`);
|
||||
}
|
||||
|
||||
// ---- 驻场光环(field):查 FieldDescSet 按 type 渲染,数值实时高亮 ----
|
||||
for (const entry of resolveFieldByLv(hero.field, lv)) {
|
||||
// ---- 驻场光环(field):整组视为一个技能,组内多词条合并为一行 ----
|
||||
const fieldItems = resolveFieldByLv(hero.field, lv);
|
||||
const fieldParts: string[] = [];
|
||||
for (const entry of fieldItems) {
|
||||
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(hero, entry.uuid))}${desc.verb}${valueRich(val)}`);
|
||||
// 组内多个词条时带各自词条名区分
|
||||
const head = fieldItems.length > 1 ? skillNameRich(entry.name ?? fs.name) : "";
|
||||
fieldParts.push(`${head}${desc.verb}${valueRich(val)}`);
|
||||
}
|
||||
|
||||
// ---- 复活(已纳入 dead 触发组):从 dead 配置提取 revive_hp / revive_count ----
|
||||
for (const item of resolveTriggerByLv(hero.dead, lv)) {
|
||||
const reviveHp = item.overrides?.revive_hp;
|
||||
const reviveCount = item.overrides?.revive_count ?? 0;
|
||||
if (reviveHp === undefined || reviveCount <= 0) continue;
|
||||
const base = SkillSet[item.s_uuid];
|
||||
if (!base) continue;
|
||||
const skill = mergeSkillParams(base, item.overrides);
|
||||
const text = `每回合可复活${valueRich(reviveCount)}次, 死亡后以${valueRich(`${Math.round(reviveHp)}%`)}生命原地重生`;
|
||||
lines.push(`${nameSeg(getGroupedTriggerName(hero.dead!, item.s_uuid))}${SkillTriggerName[SkillTriggerType.Dead]}, ${text}`);
|
||||
if (fieldParts.length > 0) {
|
||||
// 组名取组内首个自定义名(getFieldGroupName)
|
||||
lines.push(`${nameSeg(getFieldGroupName(hero))}${fieldParts.join(",")}`);
|
||||
}
|
||||
|
||||
return lines.join("\n");
|
||||
@@ -552,6 +572,104 @@ export function buildHeroSkillTierLines(heroUuid: number, skillUuid: number, slo
|
||||
return buildTierLines(tiers, triggerLabel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 驻场光环整组分档行(hero.field 全部词条合并展示)。
|
||||
* 每档一行:新词条给完整效果(动词 + 数值),已有词条给数值提升;
|
||||
* 组内仅 1 个词条时与单词条口径一致。档位配置了 desc(LvFieldEntry.desc)时优先采用。
|
||||
*/
|
||||
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[] = [];
|
||||
tiers.forEach((e, i) => {
|
||||
const parts: string[] = [];
|
||||
for (const entry of e.uuids) {
|
||||
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)}`);
|
||||
} else if (before.value !== entry.value) {
|
||||
// 已有词条:数值由旧值提升至新值
|
||||
parts.push(`${head}${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") });
|
||||
prev = e.uuids;
|
||||
});
|
||||
return lines;
|
||||
}
|
||||
|
||||
/** 多技能档位行按解锁英雄等级合并:同阈值档位文本换行拼接,sLv 取该阈值下最大档 */
|
||||
function mergeTierLinesByHeroLv(groups: HeroSkillTierLine[][]): HeroSkillTierLine[] {
|
||||
if (groups.length === 0) return [];
|
||||
if (groups.length === 1) return groups[0];
|
||||
const byLv = new Map<number, HeroSkillTierLine[]>();
|
||||
for (const lines of groups) {
|
||||
for (const line of lines) {
|
||||
const bucket = byLv.get(line.heroLv);
|
||||
if (bucket) bucket.push(line);
|
||||
else byLv.set(line.heroLv, [line]);
|
||||
}
|
||||
}
|
||||
return [...byLv.keys()].sort((a, b) => a - b).map(heroLv => {
|
||||
const bucket = byLv.get(heroLv)!;
|
||||
return {
|
||||
sLv: Math.max(...bucket.map(l => l.sLv)),
|
||||
heroLv,
|
||||
text: bucket.map(l => l.text).join("\n"),
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出二(触发组整体):指定触发槽位整组的各等级档位说明,按解锁英雄等级升序。
|
||||
*
|
||||
* 每个触发槽位(atking/dead/fstart/atked/call/field)整组视为一个技能:
|
||||
* 组内各 s_uuid 分别生成分档行后按解锁英雄等级阈值合并(同阈值文本换行拼接),
|
||||
* 组内多个技能时每行带各自技能名区分;驻场光环按词条维度合并。
|
||||
* 每档附带解锁英雄等级,调用方对比 smc.getHeroOuterLv 判定激活状态。
|
||||
*
|
||||
* @param heroUuid 英雄 uuid(HeroInfo key)
|
||||
* @param slot 触发槽位(field 表示驻场光环整组)
|
||||
* @returns 合并后的档位行数组;该槽位未配置返回 []
|
||||
*/
|
||||
export function buildHeroGroupTierLines(heroUuid: number, slot: SkillTriggerType): HeroSkillTierLine[] {
|
||||
const hero = HeroInfo[heroUuid];
|
||||
if (!hero) return [];
|
||||
if (slot === SkillTriggerType.Field) return collectFieldGroupTierLines(hero);
|
||||
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
return mergeTierLinesByHeroLv(lineGroups);
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出二:指定技能的各阶段说明(富文本整段)。
|
||||
*
|
||||
|
||||
@@ -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"
|
||||
@@ -254,8 +254,10 @@ export enum SkillLv {
|
||||
|
||||
/**
|
||||
* 触发技能对外命名规则:
|
||||
* 英雄除普攻外的技能(atked/atking/dead/fstart/revive)命名统一收敛进各英雄 HeroInfo 配置
|
||||
* 英雄除普攻外的技能(call/atked/atking/dead/fstart)命名统一收敛进各英雄 HeroInfo 配置
|
||||
* (HSkillInfo.name 给普攻/主技能命名;LvTriggerEntry.name 给触发技能组命名,写在该组第 1 档)。
|
||||
* UI 层将每个触发槽位(atking/dead/fstart/atked/call/field)整组视为一个技能:
|
||||
* 组内多个 s_uuid / 光环词条合并为一个名称与一套说明统一展示,组名取组内首个自定义名。
|
||||
* 天赋由 TalentSet 自行命名;SkillSet.name 仅作内部底座代号,不直接对外展示。
|
||||
*/
|
||||
/**
|
||||
@@ -284,6 +286,44 @@ export function getFieldSkillName(hero: heroInfo | undefined, uuid: number): str
|
||||
return FieldSkillSet[uuid]?.name ?? "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询触发技能组(整个触发槽位)的对外统一展示名(英雄语境)。
|
||||
* Why: 每个触发槽位整组视为一个技能,组内多个 s_uuid 合并展示,需要统一组名。
|
||||
* @param hero 英雄配置
|
||||
* @param type 触发槽位(call/dead/fstart/atking/atked)
|
||||
* @returns 组内首个配置了 name 的条目名(按 s_uuid 与档位配置顺序扫描);
|
||||
* 均未配置时回退组内首个 s_uuid 的 SkillSet 底座名;组不存在返回 ""
|
||||
*/
|
||||
export function getTriggerGroupName(hero: heroInfo | undefined, type: SkillTriggerType): string {
|
||||
const grouped = hero?.[type] as TriggerGrouped | undefined;
|
||||
if (!grouped) return "";
|
||||
let firstUuid = 0;
|
||||
for (const key in grouped) {
|
||||
if (!firstUuid) firstUuid = Number(key);
|
||||
const name = grouped[key]?.[0]?.name;
|
||||
if (name) return name;
|
||||
}
|
||||
return firstUuid ? (SkillSet[firstUuid]?.name ?? "") : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询驻场光环组(hero.field 整体)的对外统一展示名(英雄语境)。
|
||||
* Why: field 槽位同样整组视为一个技能,组内多个词条合并展示,组名取首个自定义名。
|
||||
* @param hero 英雄配置(含 field 词条档位)
|
||||
* @returns 全部档位词条中首个配置 name 的(按档位 lv 与词条顺序扫描);
|
||||
* 均未配置时回退首个词条的 FieldSkillSet 底座名;无光环返回 ""
|
||||
*/
|
||||
export function getFieldGroupName(hero: heroInfo | undefined): string {
|
||||
let firstUuid = 0;
|
||||
for (const tier of hero?.field ?? []) {
|
||||
for (const entry of tier.uuids) {
|
||||
if (!firstUuid) firstUuid = entry.uuid;
|
||||
if (entry.name) return entry.name;
|
||||
}
|
||||
}
|
||||
return firstUuid ? (FieldSkillSet[firstUuid]?.name ?? "") : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 复活已纳入 dead 触发组:通过 SkillOverrides.revive_hp / revive_count 配置,
|
||||
* 不再需要独立的 revive 字段和解析函数。
|
||||
@@ -447,21 +487,23 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5001: {
|
||||
uuid: 5001, name: "叠甲骑士", path: "hk1", fac: FacSet.HERO, rarity: 1, 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, overrides: {"ap":100}, desc: "挥剑对{target}造成攻击力{ap}%伤害",
|
||||
6004: {
|
||||
uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥剑对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120} },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 } },
|
||||
],
|
||||
},
|
||||
6301: { uuid: 6301, name: "魔法盾", lv: 1, cd: 6, ccd: 0, overrides: {"ap":30,"summon_count":1}, desc: "{target}获得生命最大值{ap}%的护盾",
|
||||
6301: {
|
||||
uuid: 6301, name: "魔法盾", lv: 1, cd: 6, ccd: 0, overrides: { "ap": 30, "summon_count": 1 }, desc: "{target}获得生命最大值{ap}%的护盾",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":60,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":120,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 60, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 120, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
atked: {
|
||||
6301: [
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: {"TGroup":null,"ap":10,"summon_count":1}, desc: "全队获得本英雄生命最大值{ap}%的护盾" },
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "全体圣盾", t_num: 3, overrides: { "TGroup": null, "ap": 10, "summon_count": 1 }, desc: "全队获得本英雄生命最大值{ap}%的护盾" },
|
||||
],
|
||||
},
|
||||
info: "",
|
||||
@@ -470,21 +512,23 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5002: {
|
||||
uuid: 5002, name: "易伤剑仙", path: "hk3", fac: FacSet.HERO, rarity: 1, 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 + 5,
|
||||
skills: {
|
||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "挥拳对{target}造成攻击力{ap}%伤害",
|
||||
6004: {
|
||||
uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥拳对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"ap":120} },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "ap": 120 } },
|
||||
],
|
||||
},
|
||||
6101: { uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"timed_buff_id":7002,"summon_count":1}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
|
||||
6101: {
|
||||
uuid: 6101, name: "气斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "timed_buff_id": 7002, "summon_count": 1 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,并使目标易伤(受到伤害加深,持续{dur}秒)",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"buff_value":20,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":180,"bck":60,"buff_value":40,"summon_count":2}, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "buff_value": 20, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 180, "bck": 60, "buff_value": 40, "summon_count": 2 }, desc: "斩出气刃,对{target}造成攻击力{ap}%伤害,击退{bck},并使目标易伤(持续{dur}秒)" },
|
||||
],
|
||||
},
|
||||
},
|
||||
atking: {
|
||||
6004: [
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "奋力一击", t_num: 3, overrides: {"ap":300}, desc: "每三次攻击后立即打击{target},造成攻击力{ap}%伤害" },
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "奋力一击", t_num: 3, overrides: { "ap": 300 }, desc: "每三次攻击后立即打击{target},造成攻击力{ap}%伤害" },
|
||||
],
|
||||
},
|
||||
info: "",
|
||||
@@ -493,15 +537,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5003: {
|
||||
uuid: 5003, name: "眩晕暴击哥", path: "hk5", fac: FacSet.HERO, rarity: 1, 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 + 5,
|
||||
skills: {
|
||||
6004: { uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100}, desc: "挥斧对{target}造成攻击力{ap}%伤害",
|
||||
6004: {
|
||||
uuid: 6004, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥斧对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"stun":10}, desc: "挥斧对{target}造成攻击力{ap}%伤害,{stun}%概率击晕" },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "stun": 10 }, desc: "挥斧对{target}造成攻击力{ap}%伤害,{stun}%概率击晕" },
|
||||
],
|
||||
},
|
||||
6104: { uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: {"ap":300,"stun":100,"summon_count":1}, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
|
||||
6104: {
|
||||
uuid: 6104, name: "开山斧", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 300, "stun": 100, "summon_count": 1 }, desc: "劈出开山斧,对{target}造成攻击力{ap}%伤害,必定击晕",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":450,"stun":100,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"stun":100,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 450, "stun": 100, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "stun": 100, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -514,15 +560,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5004: {
|
||||
uuid: 5004, name: "刀刀暴击", path: "hc1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def,
|
||||
skills: {
|
||||
6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
6002: {
|
||||
uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"crt":10}, desc: "挥刀对{target}造成攻击力{ap}%伤害,{crt}%概率暴击" },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "crt": 10 }, desc: "挥刀对{target}造成攻击力{ap}%伤害,{crt}%概率暴击" },
|
||||
],
|
||||
},
|
||||
6100: { uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"summon_count":1}, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害",
|
||||
6100: {
|
||||
uuid: 6100, name: "光闪", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "summon_count": 1 }, desc: "斩出光闪,对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -535,15 +583,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5005: {
|
||||
uuid: 5005, name: "出血贼", path: "hc2", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Mid, grow_type: HGrowType.Assassin, role: HRole.Assassin, hp: HERO_ROLE_BASE[HRole.Assassin].hp, ap: HERO_ROLE_BASE[HRole.Assassin].ap + 30, def: HERO_ROLE_BASE[HRole.Assassin].def,
|
||||
skills: {
|
||||
6002: { uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: {"ap":100}, desc: "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
6002: {
|
||||
uuid: 6002, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥刀对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"timed_buff_id":7007,"buff_value":30,"buff_chance":30}, desc: "挥刀对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "timed_buff_id": 7007, "buff_value": 30, "buff_chance": 30 }, desc: "挥刀对{target}造成攻击力{ap}%伤害,{buff_chance}%概率使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
],
|
||||
},
|
||||
6103: { uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"summon_count":1}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害",
|
||||
6103: {
|
||||
uuid: 6103, name: "闪电斩", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "summon_count": 1 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":250,"timed_buff_id":7007,"summon_count":1}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":350,"para":50,"timed_buff_id":7007,"buff_value":60,"summon_count":2}, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 250, "timed_buff_id": 7007, "summon_count": 1 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 350, "para": 50, "timed_buff_id": 7007, "buff_value": 60, "summon_count": 2 }, desc: "召唤落雷斩击{target},造成攻击力{ap}%伤害,{para}%概率麻痹,并使目标出血(每0.5秒受到{buff_value}点伤害,持续{dur}秒)" },
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -556,15 +606,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5006: {
|
||||
uuid: 5006, name: "冻箭哥", path: "ha1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Archer, role: HRole.Archer, hp: HERO_ROLE_BASE[HRole.Archer].hp, ap: HERO_ROLE_BASE[HRole.Archer].ap + 30, def: HERO_ROLE_BASE[HRole.Archer].def,
|
||||
skills: {
|
||||
6006: { uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害",
|
||||
6006: {
|
||||
uuid: 6006, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":10}, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害,击退{bck}" },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 10 }, desc: "射出箭矢,对{target}造成攻击力{ap}%伤害,击退{bck}" },
|
||||
],
|
||||
},
|
||||
6150: { uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: {"ap":150,"frz":30,"summon_count":1}, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
|
||||
6150: {
|
||||
uuid: 6150, name: "万箭齐发·冰", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 150, "frz": 30, "summon_count": 1 }, desc: "万箭齐发,对{target}造成攻击力{ap}%伤害,{frz}%概率冰冻",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":200,"frz":50,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":250,"frz":70,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 200, "frz": 50, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 250, "frz": 70, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -577,15 +629,17 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5007: {
|
||||
uuid: 5007, name: "击退火女", path: "hm1", fac: FacSet.HERO, rarity: 1, 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: {
|
||||
6010: { uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: {"ap":100,"bck":30}, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
6010: {
|
||||
uuid: 6010, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow].cd, ccd: 0, overrides: { "ap": 100, "bck": 30 }, desc: "掷出紫魔球,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":40} },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 40 } },
|
||||
],
|
||||
},
|
||||
6200: { uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: {"ap":250,"bck":100,"summon_count":1}, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
6200: {
|
||||
uuid: 6200, name: "火焰喷射", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 250, "bck": 100, "summon_count": 1 }, desc: "喷出烈焰风暴,对{target}造成攻击力{ap}%伤害,击退{bck}",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":350,"bck":100,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"bck":100,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 350, "bck": 100, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "bck": 100, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
@@ -598,26 +652,28 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
5008: {
|
||||
uuid: 5008, name: "团疗奶爸", path: "hh1", fac: FacSet.HERO, rarity: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Support, role: HRole.Support, hp: HERO_ROLE_BASE[HRole.Support].hp + 10, ap: HERO_ROLE_BASE[HRole.Support].ap + 20, def: HERO_ROLE_BASE[HRole.Support].def,
|
||||
skills: {
|
||||
6011: { uuid: 6011, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: {"ap":100}, desc: "挥杖对{target}造成攻击力{ap}%伤害",
|
||||
6011: {
|
||||
uuid: 6011, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal].cd, ccd: 0, overrides: { "ap": 100 }, desc: "挥杖对{target}造成攻击力{ap}%伤害",
|
||||
lv_entries: [
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: {"bck":10}, desc: "挥杖对{target}造成攻击力{ap}%伤害,击退{bck}" },
|
||||
{ lv: 2, s_lv: SkillLv.Lv2, overrides: { "bck": 10 }, desc: "挥杖对{target}造成攻击力{ap}%伤害,击退{bck}" },
|
||||
],
|
||||
},
|
||||
6302: { uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: {"ap":300,"summon_count":1}, desc: "为{target}回复攻击力{ap}%生命",
|
||||
6302: {
|
||||
uuid: 6302, name: "治疗", lv: 1, cd: 8, ccd: 0, overrides: { "ap": 300, "summon_count": 1 }, desc: "为{target}回复攻击力{ap}%生命",
|
||||
lv_entries: [
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: {"ap":400,"summon_count":1} },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: {"ap":450,"summon_count":2} },
|
||||
{ lv: 8, s_lv: SkillLv.Lv2, overrides: { "ap": 400, "summon_count": 1 } },
|
||||
{ lv: 16, s_lv: SkillLv.Lv3, overrides: { "ap": 450, "summon_count": 2 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
atking: {
|
||||
6301: [
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: {"ap":30,"summon_count":1}, desc: "{target}获得生命最大值{ap}%的护盾" },
|
||||
{ lv: 4, s_lv: SkillLv.Lv1, name: "圣愈之盾", t_num: 3, overrides: { "ap": 30, "summon_count": 1 }, desc: "{target}获得生命最大值{ap}%的护盾" },
|
||||
],
|
||||
},
|
||||
info: "",
|
||||
},
|
||||
// @hero-setup:heroes-end
|
||||
// @hero-setup:heroes-end
|
||||
|
||||
/*
|
||||
*=============怪物配置列表================
|
||||
|
||||
Reference in New Issue
Block a user